From d5d79dfd563d45eabfe9b8f5967e5ccfa5755e5c Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sat, 17 Aug 2019 06:28:03 +0000 Subject: [PATCH] [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. llvm-svn: 369184 --- lld/ELF/Arch/PPC64.cpp | 1 + lld/test/ELF/ppc64-reloc-rel.s | 58 ++++++++++++++++++++++++++++++ lld/test/ELF/ppc64-relocs.s | 81 +++++------------------------------------- 3 files changed, 68 insertions(+), 72 deletions(-) create mode 100644 lld/test/ELF/ppc64-reloc-rel.s diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp index f64ff74..15ad8db 100644 --- a/lld/ELF/Arch/PPC64.cpp +++ b/lld/ELF/Arch/PPC64.cpp @@ -573,6 +573,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/lld/test/ELF/ppc64-reloc-rel.s b/lld/test/ELF/ppc64-reloc-rel.s new file mode 100644 index 0000000..3e3c5c9 --- /dev/null +++ b/lld/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/lld/test/ELF/ppc64-relocs.s b/lld/test/ELF/ppc64-relocs.s index 5e8c529..8e69e08 100644 --- a/lld/test/ELF/ppc64-relocs.s +++ b/lld/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 -- 2.7.4