[LLD][COFF] Fix TypeServerSource matcher with more than one collision
[llvm-project.git] / lld / test / COFF / comdat-jumptable.s
blob31a7c5f6bcdf1e830a2d7304b24c00fe4e67911e
1 # REQUIRES: x86
2 # RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t1.obj
3 # RUN: llvm-mc -triple=x86_64-windows-gnu %S/Inputs/comdat-jumptable2.s -filetype=obj -o %t2.obj
5 # RUN: llvm-objdump -s %t1.obj | FileCheck --check-prefix=OBJ1 %s
6 # RUN: llvm-objdump -s %t2.obj | FileCheck --check-prefix=OBJ2 %s
8 # RUN: lld-link -lldmingw -entry:main %t1.obj %t2.obj -out:%t.exe
9 # RUN: llvm-objdump -s %t.exe | FileCheck --check-prefix=EXE %s
11 # Test linking cases where comdat functions have an associated jump table
12 # in a non-comdat rdata (which GCC produces for functions with jump tables).
13 # In these cases, ld.bfd keeps all rdata sections, but the relocations that
14 # refer to discarded comdat sections just are emitted as they were originally.
16 # In real scenarios, the jump table .rdata section should be identical across
17 # all object files; here it is different to illustrate more clearly what
18 # the linker actually does.
20 # OBJ1: Contents of section .rdata:
21 # OBJ1: 0000 aaaaaaaa 14000000 1e000000 28000000
22 # OBJ1: 0010 bbbbbbbb
24 # OBJ2: Contents of section .rdata:
25 # OBJ2: 0000 cccccccc 14000000 1e000000 28000000
26 # OBJ2: 0010 dddddddd
28 # EXE: Contents of section .rdata:
29 # EXE: 140002000 aaaaaaaa 0c100000 12100000 18100000
30 # EXE: 140002010 bbbbbbbb cccccccc 14000000 1e000000
31 # EXE: 140002020 28000000 dddddddd
34 .section .text@comdatfunc, "x"
35 .linkonce discard
36 .globl comdatfunc
37 comdatfunc:
38 leaq .Ljumptable(%rip), %rax
39 movslq (%rax, %rcx, 4), %rcx
40 addq %rcx, %rax
41 jmp *%rax
43 .section .rdata, "dr"
44 .long 0xaaaaaaaa
45 .Ljumptable:
46 .long .Ltail1-.Ljumptable
47 .long .Ltail2-.Ljumptable
48 .long .Ltail3-.Ljumptable
49 .long 0xbbbbbbbb
51 .section .text@comdatfunc, "x"
52 # If assembled with binutils, the following line can be kept in:
53 # .linkonce discard
54 .Ltail1:
55 movl $1, %eax
56 ret
57 .Ltail2:
58 movl $2, %eax
59 ret
60 .Ltail3:
61 movl $3, %eax
62 ret
65 .text
66 .globl main
67 main:
68 call comdatfunc
69 call otherfunc
70 ret