[lld] r374052 - [lld][Hexagon] Support PLT relocation R_HEX_B15_PCREL_X/R_HEX_B9_PCREL_X
Sid Manning via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 8 07:23:49 PDT 2019
Author: sidneym
Date: Tue Oct 8 07:23:49 2019
New Revision: 374052
URL: http://llvm.org/viewvc/llvm-project?rev=374052&view=rev
Log:
[lld][Hexagon] Support PLT relocation R_HEX_B15_PCREL_X/R_HEX_B9_PCREL_X
These are sometimes generated by tail call optimizations.
Differential Revision: https://reviews.llvm.org/D66542
Added:
lld/trunk/test/ELF/hexagon-plt.s
Modified:
lld/trunk/ELF/Arch/Hexagon.cpp
lld/trunk/test/ELF/hexagon-shared.s
Modified: lld/trunk/ELF/Arch/Hexagon.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Arch/Hexagon.cpp?rev=374052&r1=374051&r2=374052&view=diff
==============================================================================
--- lld/trunk/ELF/Arch/Hexagon.cpp (original)
+++ lld/trunk/ELF/Arch/Hexagon.cpp Tue Oct 8 07:23:49 2019
@@ -103,13 +103,13 @@ RelExpr Hexagon::getRelExpr(RelType type
case R_HEX_LO16:
return R_ABS;
case R_HEX_B9_PCREL:
- case R_HEX_B9_PCREL_X:
case R_HEX_B13_PCREL:
case R_HEX_B15_PCREL:
- case R_HEX_B15_PCREL_X:
case R_HEX_6_PCREL_X:
case R_HEX_32_PCREL:
return R_PC;
+ case R_HEX_B9_PCREL_X:
+ case R_HEX_B15_PCREL_X:
case R_HEX_B22_PCREL:
case R_HEX_PLT_B22_PCREL:
case R_HEX_B22_PCREL_X:
Added: lld/trunk/test/ELF/hexagon-plt.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/hexagon-plt.s?rev=374052&view=auto
==============================================================================
--- lld/trunk/test/ELF/hexagon-plt.s (added)
+++ lld/trunk/test/ELF/hexagon-plt.s Tue Oct 8 07:23:49 2019
@@ -0,0 +1,102 @@
+# REQUIRES: hexagon
+# RUN: echo '.globl bar, weak; .type bar, at function; .type weak, at function; bar: weak:' > %t1.s
+
+# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %t1.s -o %t1.o
+# RUN: ld.lld -shared %t1.o -soname=t1.so -o %t1.so
+# RUN: llvm-mc -mno-fixup -filetype=obj -triple=hexagon-unknown-elf %s -o %t.o
+# RUN: ld.lld %t.o %t1.so -z separate-code -o %t
+# RUN: llvm-readelf -S -s %t | FileCheck --check-prefixes=SEC,NM %s
+# RUN: llvm-readobj -r %t | FileCheck --check-prefix=RELOC %s
+# RUN: llvm-readelf -x .got.plt %t | FileCheck --check-prefix=GOTPLT %s
+# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck --check-prefixes=DIS %s
+
+# SEC: .plt PROGBITS {{0*}}00020040
+
+## A canonical PLT has a non-zero st_value. bar and weak are called but their
+## addresses are not taken, so a canonical PLT is not necessary.
+# NM: {{0*}}00000000 0 FUNC GLOBAL DEFAULT UND bar
+# NM: {{0*}}00000000 0 FUNC WEAK DEFAULT UND weak
+
+## The .got.plt slots relocated by .rela.plt point to .plt
+## This is required by glibc.
+# RELOC: .rela.plt {
+# RELOC-NEXT: 0x40078 R_HEX_JMP_SLOT bar 0x0
+# RELOC-NEXT: 0x4007C R_HEX_JMP_SLOT weak 0x0
+# RELOC-NEXT: }
+# GOTPLT: section '.got.plt'
+# GOTPLT-NEXT: 0x00040068 00000000 00000000 00000000 00000000
+# GOTPLT-NEXT: 0x00040078 00000000 00000000
+
+# DIS: _start:
+## Direct call
+## Call foo directly
+# DIS-NEXT: { call 0x2003c }
+## Call bar via plt
+# DIS-NEXT: { call 0x20060 }
+## Call weak via plt
+# DIS-NEXT: { call 0x20070 }
+# DIS-NEXT: { immext(#0)
+
+## Call foo directly
+# DIS-NEXT: if (p0) jump:nt 0x2003c }
+# DIS-NEXT: { immext(#64)
+## Call bar via plt
+# DIS-NEXT: if (p0) jump:nt 0x20060 }
+# DIS-NEXT: { immext(#64)
+## Call weak via plt
+# DIS-NEXT: if (p0) jump:nt 0x20070 }
+# DIS-NEXT: { immext(#0)
+
+## Call foo directly
+# DIS-NEXT: r0 = #0 ; jump 0x2003c }
+# DIS-NEXT: { immext(#0)
+## Call bar via plt
+# DIS-NEXT: r0 = #0 ; jump 0x20060 }
+# DIS-NEXT: { immext(#0)
+## Call weak via plt
+# DIS-NEXT: r0 = #0 ; jump 0x20070 }
+
+# DIS: foo:
+# DIS-NEXT: 2003c:
+
+
+# DIS: Disassembly of section .plt:
+
+# DIS: 00020040 .plt:
+# DIS-NEXT: 20040: { immext(#131072)
+# DIS-NEXT: 20044: r28 = add(pc,##131112) }
+# DIS-NEXT: 20048: { r14 -= add(r28,#16)
+# DIS-NEXT: 2004c: r15 = memw(r28+#8)
+# DIS-NEXT: 20050: r28 = memw(r28+#4) }
+# DIS-NEXT: 20054: { r14 = asr(r14,#2)
+# DIS-NEXT: 20058: jumpr r28 }
+# DIS-NEXT: 2005c: { trap0(#219) }
+## bar's plt slot
+# DIS-NEXT: 20060: { immext(#131072)
+# DIS-NEXT: 20064: r14 = add(pc,##131096) }
+# DIS-NEXT: 20068: { r28 = memw(r14+#0) }
+# DIS-NEXT: 2006c: { jumpr r28 }
+## weak's plt slot
+# DIS-NEXT: 20070: { immext(#131072)
+# DIS-NEXT: 20074: r14 = add(pc,##131084) }
+# DIS-NEXT: 20078: { r28 = memw(r14+#0) }
+# DIS-NEXT: 2007c: { jumpr r28 }
+
+
+.global _start, foo, bar
+.weak weak
+
+_start:
+ call foo
+ call bar
+ call weak
+ if (p0) jump foo
+ if (p0) jump bar
+ if (p0) jump weak
+ { r0 = #0; jump foo }
+ { r0 = #0; jump bar }
+ { r0 = #0; jump weak }
+
+## foo is local and non-preemptale, no PLT is generated.
+foo:
+ jumpr r31
Modified: lld/trunk/test/ELF/hexagon-shared.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/hexagon-shared.s?rev=374052&r1=374051&r2=374052&view=diff
==============================================================================
--- lld/trunk/test/ELF/hexagon-shared.s (original)
+++ lld/trunk/test/ELF/hexagon-shared.s Tue Oct 8 07:23:49 2019
@@ -1,15 +1,23 @@
# REQUIRES: hexagon
-# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %s -o %t
+# RUN: llvm-mc -mno-fixup -filetype=obj -triple=hexagon-unknown-elf %s -o %t.o
# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %S/Inputs/hexagon-shared.s -o %t2.o
# RUN: ld.lld -shared %t2.o -soname so -o %t3.so
-# RUN: ld.lld -shared %t %t3.so -o %t4.so
+# RUN: ld.lld -shared %t.o %t3.so -o %t4.so
+# RUN: ld.lld -Bsymbolic -shared %t.o %t3.so -o %t5.so
# RUN: llvm-objdump -d -j .plt %t4.so | FileCheck --check-prefix=PLT %s
# RUN: llvm-objdump -d -j .text %t4.so | FileCheck --check-prefix=TEXT %s
# RUN: llvm-objdump -D -j .got %t4.so | FileCheck --check-prefix=GOT %s
# RUN: llvm-readelf -r %t4.so | FileCheck --check-prefix=RELO %s
+# RUN: llvm-readelf -r %t5.so | FileCheck --check-prefix=SYMBOLIC %s
-.global foo
-foo:
+.global _start, foo, hidden_symbol
+.hidden hidden_symbol
+_start:
+# When -Bsymbolic is specified calls to locally resolvables should
+# not generate a plt.
+call ##foo
+# Calls to hidden_symbols should not trigger a plt.
+call ##hidden_symbol
# _HEX_32_PCREL
.word _DYNAMIC - .
@@ -17,6 +25,10 @@ call ##bar
# R_HEX_PLT_B22_PCREL
call bar at PLT
+# R_HEX_B15_PCREL_X
+if (p0) jump bar
+# R_HEX_B9_PCREL_X
+{ r0 = #0; jump bar }
# R_HEX_GOT_11_X and R_HEX_GOT_32_6_X
r2=add(pc,##_GLOBAL_OFFSET_TABLE_ at PCREL)
@@ -26,6 +38,13 @@ jumpr r0
# R_HEX_GOT_16_X
r0 = add(r1,##bar at GOT)
+# foo is local so no plt will be generated
+foo:
+ jumpr lr
+
+hidden_symbol:
+ jumpr lr
+
# R_HEX_32
.data
.global var
@@ -40,26 +59,37 @@ pvar:
.word var
.size pvar, 4
-# PLT: { immext(#131200
-# PLT: r28 = add(pc,##131252) }
-# PLT: { r14 -= add(r28,#16)
-# PLT: r15 = memw(r28+#8)
-# PLT: r28 = memw(r28+#4) }
-# PLT: { r14 = asr(r14,#2)
-# PLT: jumpr r28 }
-# PLT: { trap0(#219) }
-# PLT: immext(#131200)
-# PLT: r14 = add(pc,##131236) }
-# PLT: r28 = memw(r14+#0) }
-# PLT: jumpr r28 }
-
-# TEXT: 10218: 68 00 01 00 00010068
-# TEXT: { call 0x10270 }
-# TEXT: r0 = add(r1,##-65548) }
+
+# PLT: { immext(#131264
+# PLT-NEXT: r28 = add(pc,##131268) }
+# PLT-NEXT: { r14 -= add(r28,#16)
+# PLT-NEXT: r15 = memw(r28+#8)
+# PLT-NEXT: r28 = memw(r28+#4) }
+# PLT-NEXT: { r14 = asr(r14,#2)
+# PLT-NEXT: jumpr r28 }
+# PLT-NEXT: { trap0(#219) }
+# PLT-NEXT: immext(#131200)
+# PLT-NEXT: r14 = add(pc,##131252) }
+# PLT-NEXT: r28 = memw(r14+#0) }
+# PLT-NEXT: jumpr r28 }
+
+# TEXT: 8c 00 01 00 0001008c
+# TEXT: { call 0x102d0 }
+# TEXT: if (p0) jump:nt 0x102d0
+# TEXT: r0 = #0 ; jump 0x102d0
+# TEXT: r0 = add(r1,##-65548)
# GOT: .got:
-# GOT: 202f8: 00 00 00 00 00000000 <unknown>
+# GOT: 00 00 00 00 00000000 <unknown>
-# RELO: 000202f8 00000121 R_HEX_GLOB_DAT
-# RELO: 00030300 00000406 R_HEX_32
-# RELO: 00030314 00000122 R_HEX_JMP_SLOT
+# RELO: R_HEX_GLOB_DAT
+# RELO: R_HEX_32
+# RELO: Relocation section '.rela.plt' at offset 0x22c contains 2 entries:
+# RELO: R_HEX_JMP_SLOT {{.*}} foo
+# RELO-NEXT: R_HEX_JMP_SLOT {{.*}} bar
+# RELO-NOT: R_HEX_JMP_SLOT {{.*}} hidden
+
+# Make sure that no PLT is generated for a local call.
+# SYMBOLIC: Relocation section '.rela.plt' at offset 0x22c contains 1 entries:
+# SYMBOLIC: R_HEX_JMP_SLOT {{.*}} bar
+# SYMBOLIC-NOT: R_HEX_JMP_SLOT {{.*}} foo
More information about the llvm-commits
mailing list