| # // a.cpp | |
| # #include <iostream> | |
| # #include <vector> | |
| # | |
| # template <int Magic> struct TemplatedObject { | |
| # static std::vector<TemplatedObject<Magic> *> Instances; | |
| # TemplatedObject() { Instances.push_back(this); } | |
| # }; | |
| # | |
| # using Object = TemplatedObject<0>; | |
| # template <> std::vector<Object *> 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 | |
| ... |