# // a.cpp # #include # #include # # template struct TemplatedObject { # static std::vector *> Instances; # TemplatedObject() { Instances.push_back(this); } # }; # # using Object = TemplatedObject<0>; # template <> std::vector Object::Instances{}; # Object idle{}; # # int main() { # if (Object::Instances.size() == 0) # std::cout << "It's broken" << std::endl; # else # std::cout << "It works!" << std::endl; # return 0; # } # // using `clang-cl /c a.cpp | lld-link a.obj` works # // using `cl /c a.cpp | lld-link a.obj` fails without lld/COFF/Writer.cpp/Writer::sortSectionChunks() # RUN: yaml2obj %s > %t.obj # RUN: yaml2obj %S/Inputs/crt-dyn-initializer-order_1.yaml > %t1.obj # RUN: yaml2obj %S/Inputs/crt-dyn-initializer-order_2.yaml > %t2.obj # CHECK: Name: .CRT # CHECK: Characteristics [ # CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA # CHECK-NEXT: IMAGE_SCN_MEM_READ # CHECK-NEXT: ] # CHECK-NEXT: SectionData ( # RUN: lld-link /out:%t.dll /entry:__ImageBase /dll %t.obj %t1.obj %t2.obj # RUN: llvm-readobj -sections -section-data %t.dll | FileCheck %s --check-prefixes CHECK,CASE1 # CASE1-NEXT: 01020304 55701011 1205 # RUN: lld-link /out:%t.dll /entry:__ImageBase /dll %t.obj %t2.obj %t1.obj # RUN: llvm-readobj -sections -section-data %t.dll | FileCheck %s --check-prefixes CHECK,CASE2 # CASE2-NEXT: 01020304 10111255 7005 # RUN: lld-link /out:%t.dll /entry:__ImageBase /dll %t1.obj %t2.obj %t.obj # RUN: llvm-readobj -sections -section-data %t.dll | FileCheck %s --check-prefixes CHECK,CASE3 # CASE3-NEXT: 01557010 11120203 0405 # RUN: lld-link /out:%t.dll /entry:__ImageBase /dll %t1.obj %t.obj %t2.obj # RUN: llvm-readobj -sections -section-data %t.dll | FileCheck %s --check-prefixes CHECK,CASE4 # CASE4-NEXT: 01557002 03041011 1205 # RUN: lld-link /out:%t.dll /entry:__ImageBase /dll %t2.obj %t1.obj %t.obj # RUN: llvm-readobj -sections -section-data %t.dll | FileCheck %s --check-prefixes CHECK,CASE5 # CASE5-NEXT: 01101112 55700203 0405 # RUN: lld-link /out:%t.dll /entry:__ImageBase /dll %t2.obj %t.obj %t1.obj # RUN: llvm-readobj -sections -section-data %t.dll | FileCheck %s --check-prefixes CHECK,CASE6 # CASE6-NEXT: 01101112 02030455 7005 # CHECK-NEXT: ) --- !COFF header: Machine: IMAGE_FILE_MACHINE_AMD64 Characteristics: [ ] sections: - Name: '.CRT$XCA' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] Alignment: 1 SectionData: 01 - Name: '.CRT$XCU' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] Alignment: 1 SectionData: 02 - Name: '.CRT$XCU' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_LNK_COMDAT ] Alignment: 1 SectionData: 03 - Name: '.CRT$XCU' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] Alignment: 1 SectionData: 04 - Name: '.CRT$XCZ' Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ] Alignment: 1 SectionData: 05 symbols: - Name: '.CRT$XCU' Value: 0 SectionNumber: 3 SimpleType: IMAGE_SYM_TYPE_NULL ComplexType: IMAGE_SYM_DTYPE_NULL StorageClass: IMAGE_SYM_CLASS_STATIC SectionDefinition: Length: 1 NumberOfRelocations: 0 NumberOfLinenumbers: 0 CheckSum: 1 Number: 2 Selection: IMAGE_COMDAT_SELECT_ASSOCIATIVE ...