aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2019-08-29 09:21:39 +0000
committerHans Wennborg <hans@hanshq.net>2019-08-29 09:21:39 +0000
commit87a33dee5db526153c34f8ccbd7a08c240ebe27d (patch)
tree1633d88615d64394e9ea03bbb2533c3c2a5c85b9
parent420310e501703a4b294029c7b06a7a057a725862 (diff)
Merging r369184:
------------------------------------------------------------------------ r369184 | maskray | 2019-08-17 08:28:03 +0200 (Sat, 17 Aug 2019) | 9 lines [ELF][PPC] Fix getRelExpr for R_PPC64_REL16_HI Fixes https://github.com/ClangBuiltLinux/linux/issues/640 R_PPC64_REL16_HI was incorrectly computed as an R_ABS relocation. rLLD368964 made it a linker failure. Change it to use R_PC to fix the failures. Add ppc64-reloc-rel.s for these R_PPC64_REL* tests. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/lld/branches/release_90@370313 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--ELF/Arch/PPC64.cpp1
-rw-r--r--test/ELF/ppc64-reloc-rel.s58
-rw-r--r--test/ELF/ppc64-relocs.s81
3 files changed, 68 insertions, 72 deletions
diff --git a/ELF/Arch/PPC64.cpp b/ELF/Arch/PPC64.cpp
index ee5942f6f..0f382dcd6 100644
--- a/ELF/Arch/PPC64.cpp
+++ b/ELF/Arch/PPC64.cpp
@@ -569,6 +569,7 @@ RelExpr PPC64::getRelExpr(RelType type, const Symbol &s,
return R_PPC64_CALL_PLT;
case R_PPC64_REL16_LO:
case R_PPC64_REL16_HA:
+ case R_PPC64_REL16_HI:
case R_PPC64_REL32:
case R_PPC64_REL64:
return R_PC;
diff --git a/test/ELF/ppc64-reloc-rel.s b/test/ELF/ppc64-reloc-rel.s
new file mode 100644
index 000000000..3e3c5c94e
--- /dev/null
+++ b/test/ELF/ppc64-reloc-rel.s
@@ -0,0 +1,58 @@
+# REQUIRES: ppc
+
+# RUN: llvm-mc -filetype=obj -triple=powerpc64le %s -o %t.o
+# RUN: ld.lld %t.o --defsym=foo=rel16+0x8000 -o %t
+# RUN: llvm-objdump -d --no-show-raw-insn %t | FileCheck %s
+# RUN: llvm-readobj -r %t.o | FileCheck --check-prefix=REL %s
+# RUN: llvm-readelf -S %t | FileCheck --check-prefix=SEC %s
+# RUN: llvm-readelf -x .eh_frame %t | FileCheck --check-prefix=HEX %s
+
+.section .R_PPC64_REL14,"ax",@progbits
+# FIXME This does not produce a relocation
+ beq 1f
+1:
+# CHECK-LABEL: Disassembly of section .R_PPC64_REL14:
+# CHECK: bt 2, .+4
+
+.section .R_PPC64_REL16,"ax",@progbits
+.globl rel16
+rel16:
+ li 3, foo-rel16-1@ha # R_PPC64_REL16_HA
+ li 3, foo-rel16@ha
+ li 4, foo-rel16+0x7fff@h # R_PPC64_REL16_HI
+ li 4, foo-rel16+0x8000@h
+ li 5, foo-rel16-1@l # R_PPC64_REL16_LO
+ li 5, foo-rel16@l
+# CHECK-LABEL: Disassembly of section .R_PPC64_REL16:
+# CHECK: li 3, 0
+# CHECK-NEXT: li 3, 1
+# CHECK-NEXT: li 4, 0
+# CHECK-NEXT: li 4, 1
+# CHECK-NEXT: li 5, 32767
+# CHECK-NEXT: li 5, -32768
+
+.section .R_PPC64_REL24,"ax",@progbits
+ b rel16
+# CHECK-LABEL: Disassembly of section .R_PPC64_REL24:
+# CHECK: b .+67108840
+
+.section .REL32_AND_REL64,"ax",@progbits
+ .cfi_startproc
+ .cfi_personality 148, rel64
+ nop
+ .cfi_endproc
+rel64:
+ li 3, 0
+# REL: .rela.eh_frame {
+# REL-NEXT: 0x12 R_PPC64_REL64 .REL32_AND_REL64 0x4
+# REL-NEXT: 0x28 R_PPC64_REL32 .REL32_AND_REL64 0x0
+# REL-NEXT: }
+
+# SEC: .REL32_AND_REL64 PROGBITS 0000000010010020
+
+## CIE Personality Address: 0x10010020-(0x10000168+2)+4 = 0xfeba
+## FDE PC Begin: 0x10010020-(0x10000178+8) = 0xfea0
+# HEX: section '.eh_frame':
+# HEX-NEXT: 0x10000158
+# HEX-NEXT: 0x10000168 {{....}}bafe 00000000
+# HEX-NEXT: 0x10000178 {{[0-9a-f]+}} {{[0-9a-f]+}} a0fe0000
diff --git a/test/ELF/ppc64-relocs.s b/test/ELF/ppc64-relocs.s
index 5e8c529e9..8e69e08df 100644
--- a/test/ELF/ppc64-relocs.s
+++ b/test/ELF/ppc64-relocs.s
@@ -18,16 +18,9 @@ _start:
li 3,42
sc
-.section .rodata,"a",@progbits
- .p2align 2
-.LJTI0_0:
- .long .LBB0_2-.LJTI0_0
-
-.section .toc,"aw",@progbits
+.section .toc,"aw",@progbits
.L1:
-.quad 22, 37, 89, 47
-.LC0:
- .tc .LJTI0_0[TC],.LJTI0_0
+ .quad 22, 37, 89, 47
.section .R_PPC64_TOC16_LO_DS,"ax",@progbits
ld 1, .L1@toc@l(2)
@@ -53,91 +46,47 @@ _start:
# CHECK-LABEL: Disassembly of section .R_PPC64_TOC16_HA:
# CHECK: 10010018: addis 1, 2, 0
-.section .R_PPC64_REL24,"ax",@progbits
- b 1f
-1:
-
-# CHECK-LABEL: Disassembly of section .R_PPC64_REL24:
-# CHECK: 1001001c: b .+4
-
-.section .R_PPC64_REL14,"ax",@progbits
- beq 1f
-1:
-
-# CHECK-LABEL: Disassembly of section .R_PPC64_REL14:
-# CHECK: 10010020: bt 2, .+4
-
.section .R_PPC64_ADDR16_LO,"ax",@progbits
li 1, .Lfoo@l
# CHECK-LABEL: Disassembly of section .R_PPC64_ADDR16_LO:
-# CHECK: 10010024: li 1, 0
+# CHECK: li 1, 0
.section .R_PPC64_ADDR16_HI,"ax",@progbits
li 1, .Lfoo@h
# CHECK-LABEL: Disassembly of section .R_PPC64_ADDR16_HI:
-# CHECK: 10010028: li 1, 4097
+# CHECK: li 1, 4097
.section .R_PPC64_ADDR16_HA,"ax",@progbits
li 1, .Lfoo@ha
# CHECK-LABEL: Disassembly of section .R_PPC64_ADDR16_HA:
-# CHECK: 1001002c: li 1, 4097
+# CHECK: li 1, 4097
.section .R_PPC64_ADDR16_HIGHER,"ax",@progbits
li 1, .Lfoo@higher
# CHECK-LABEL: Disassembly of section .R_PPC64_ADDR16_HIGHER:
-# CHECK: 10010030: li 1, 0
+# CHECK: li 1, 0
.section .R_PPC64_ADDR16_HIGHERA,"ax",@progbits
li 1, .Lfoo@highera
# CHECK-LABEL: Disassembly of section .R_PPC64_ADDR16_HIGHERA:
-# CHECK: 10010034: li 1, 0
+# CHECK: li 1, 0
.section .R_PPC64_ADDR16_HIGHEST,"ax",@progbits
li 1, .Lfoo@highest
# CHECK-LABEL: Disassembly of section .R_PPC64_ADDR16_HIGHEST:
-# CHECK: 10010038: li 1, 0
+# CHECK: li 1, 0
.section .R_PPC64_ADDR16_HIGHESTA,"ax",@progbits
li 1, .Lfoo@highesta
# CHECK-LABEL: Disassembly of section .R_PPC64_ADDR16_HIGHESTA:
-# CHECK: 1001003c: li 1, 0
-
-.section .R_PPC64_REL32, "ax",@progbits
- addis 5, 2, .LC0@toc@ha
- ld 5, .LC0@toc@l(5)
-.LBB0_2:
- add 3, 3, 4
-
-# DATALE: '.rodata':
-# DATALE: 0x100001c8 80fe0000
-
-# DATABE: '.rodata':
-# DATABE: 0x100001c8 0000fe80
-
-# Address of rodata + value stored at rodata entry
-# should equal address of LBB0_2.
-# 0x10000190 + 0xfeb4 = 0x10010044
-# CHECK-LABEL: Disassembly of section .R_PPC64_REL32:
-# CHECK: 10010040: addis 5, 2, 0
-# CHECK: 10010044: ld 5, -32736(5)
-# CHECK: 10010048: add 3, 3, 4
-
-.section .R_PPC64_REL64, "ax",@progbits
- .cfi_startproc
- .cfi_personality 148, __foo
- li 0, 1
- li 3, 55
- sc
- .cfi_endproc
-__foo:
- li 3,0
+# CHECK: li 1, 0
.section .R_PPC64_TOC,"a",@progbits
.quad .TOC.@tocbase
@@ -150,15 +99,3 @@ __foo:
# DATABE-LABEL: section '.R_PPC64_TOC':
# DATABE: 00000000 10028000
-
-# Check that the personality (relocated by R_PPC64_REL64) in the .eh_frame
-# equals the address of __foo.
-# 0x100001ea + 0xfe6e = 0x10010058
-# DATALE: section '.eh_frame':
-# DATALE: 0x100001e8 {{....}}6efe
-
-# DATABE: section '.eh_frame':
-# DATABE: 0x100001e8 {{[0-9a-f]+ [0-9a-f]+}} fe6e{{....}}
-
-# CHECK: __foo
-# CHECK-NEXT: 10010058: li 3, 0