When GCC produces a jump table as part of a comdat function, the jump table itself is produced as plain non-comdat rdata section. When linked with ld.bfd, all of those rdata sections are kept, with relocations unchanged in the sections that refer to discarded comdat sections. This has been observed with at least GCC 5.x and 7.x. Differential Revision: https://reviews.llvm.org/D52600 llvm-svn: 343422
36 lines
762 B
ArmAsm
36 lines
762 B
ArmAsm
.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 0xcccccccc
|
|
.Ljumptable:
|
|
.long .Ltail1-.Ljumptable
|
|
.long .Ltail2-.Ljumptable
|
|
.long .Ltail3-.Ljumptable
|
|
.long 0xdddddddd
|
|
|
|
.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 otherfunc
|
|
otherfunc:
|
|
call comdatfunc
|
|
ret
|