| # REQUIRES: x86 |
| |
| # RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t1.obj |
| # RUN: llvm-mc -triple=x86_64-windows-gnu %S/Inputs/associative-comdat-mingw-2.s -filetype=obj -o %t2.obj |
| |
| # RUN: lld-link -lldmingw -entry:main %t1.obj %t2.obj -out:%t.gc.exe -verbose |
| # RUN: llvm-readobj -sections %t.gc.exe | FileCheck %s |
| |
| # CHECK: Sections [ |
| # CHECK: Section { |
| # CHECK: Number: 2 |
| # CHECK-LABEL: Name: .rdata (2E 72 64 61 74 61 00 00) |
| # This is the critical check to show that only *one* definition of |
| # .xdata$foo was retained. This *must* be 4. |
| # Make sure that no other .xdata sections get included, which would |
| # increase the size here. |
| # CHECK-NEXT: VirtualSize: 0x4 |
| |
| .text |
| .def main; |
| .scl 2; |
| .type 32; |
| .endef |
| .globl main |
| .p2align 4, 0x90 |
| main: |
| call foo |
| retq |
| |
| # Defines .text$foo (which has a leader symbol and is referenced like |
| # normally), and .xdata$foo (which lacks a leader symbol, which normally |
| # would be declared associative to the symbol foo). |
| # .xdata$foo should be implicitly treated as associative to foo and brought |
| # in, while .xdata$bar, implicitly associative to bar, not included, and |
| # .xdata$baz not included since there's no symbol baz. |
| |
| # GNU binutils ld doesn't do this at all, but always includes all .xdata/.pdata |
| # comdat sections, even if --gc-sections is used. |
| |
| .section .xdata$foo,"dr" |
| .linkonce discard |
| .p2align 3 |
| .long 42 |
| |
| .section .xdata$bar,"dr" |
| .linkonce discard |
| .p2align 3 |
| .long 43 |
| |
| .section .xdata$baz,"dr" |
| .linkonce discard |
| .p2align 3 |
| .long 44 |
| |
| .def foo; |
| .scl 2; |
| .type 32; |
| .endef |
| .section .text$foo,"xr",discard,foo |
| .globl foo |
| .p2align 4 |
| foo: |
| ret |
| |
| .def bar; |
| .scl 2; |
| .type 32; |
| .endef |
| .section .text$bar,"xr",discard,bar |
| .globl bar |
| .p2align 4 |
| bar: |
| ret |