| # // 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 -o %t.obj |
| # RUN: yaml2obj %S/Inputs/crt-dyn-initializer-order_1.yaml -o %t1.obj |
| # RUN: yaml2obj %S/Inputs/crt-dyn-initializer-order_2.yaml -o %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 |
| ... |