# 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/comdat-jumptable2.s -filetype=obj -o %t2.obj # RUN: llvm-objdump -s %t1.obj | FileCheck --check-prefix=OBJ1 %s # RUN: llvm-objdump -s %t2.obj | FileCheck --check-prefix=OBJ2 %s # RUN: lld-link -lldmingw -entry:main %t1.obj %t2.obj -out:%t.exe # RUN: llvm-objdump -s %t.exe | FileCheck --check-prefix=EXE %s # Test linking cases where comdat functions have an associated jump table # in a non-comdat rdata (which GCC produces for functions with jump tables). # In these cases, ld.bfd keeps all rdata sections, but the relocations that # refer to discarded comdat sections just are emitted as they were originally. # In real scenarios, the jump table .rdata section should be identical across # all object files; here it is different to illustrate more clearly what # the linker actually does. # OBJ1: Contents of section .rdata: # OBJ1: 0000 aaaaaaaa 14000000 1e000000 28000000 # OBJ1: 0010 bbbbbbbb # OBJ2: Contents of section .rdata: # OBJ2: 0000 cccccccc 14000000 1e000000 28000000 # OBJ2: 0010 dddddddd # EXE: Contents of section .rdata: # EXE: 140002000 aaaaaaaa 0c100000 12100000 18100000 # EXE: 140002010 bbbbbbbb cccccccc 14000000 1e000000 # EXE: 140002020 28000000 dddddddd .section .text@comdatfunc, "x" .linkonce discard .globl comdatfunc comdatfunc: leaq .Ljumptable(%rip), %rax movslq (%rax, %rcx, 4), %rcx addq %rcx, %rax jmp *%rax .section .rdata, "dr" .long 0xaaaaaaaa .Ljumptable: .long .Ltail1-.Ljumptable .long .Ltail2-.Ljumptable .long .Ltail3-.Ljumptable .long 0xbbbbbbbb .section .text@comdatfunc, "x" # If assembled with binutils, the following line can be kept in: # .linkonce discard .Ltail1: movl $1, %eax ret .Ltail2: movl $2, %eax ret .Ltail3: movl $3, %eax ret .text .globl main main: call comdatfunc call otherfunc ret