From c12f051112fa42bf5522d909252d0ae3314adf53 Mon Sep 17 00:00:00 2001 From: Sean Fertile Date: Fri, 11 May 2018 19:31:19 +0000 Subject: [PATCH] [PPC64] isRelExpr should return true for the PPC Call Exprs. Both R_PPC_CALL and R_PPC_CALL_PLT Exprs map to the R_PPC64_REL24 relocation which has the form Sym + addend - P. Differential Revision: https://reviews.llvm.org/D46654 llvm-svn: 332127 --- lld/ELF/Relocations.cpp | 3 +- lld/test/ELF/ppc64-rel-so-local-calls.s | 87 +++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/ppc64-rel-so-local-calls.s diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index 7463129..5ac9b6f 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -328,7 +328,8 @@ static bool needsGot(RelExpr Expr) { // file (PC, or GOT for example). static bool isRelExpr(RelExpr Expr) { return isRelExprOneOf(Expr); + R_PPC_CALL, R_PPC_CALL_PLT, R_PAGE_PC, + R_RELAX_GOT_PC>(Expr); } // Returns true if a given relocation can be computed at link-time. diff --git a/lld/test/ELF/ppc64-rel-so-local-calls.s b/lld/test/ELF/ppc64-rel-so-local-calls.s new file mode 100644 index 0000000..834dbd5 --- /dev/null +++ b/lld/test/ELF/ppc64-rel-so-local-calls.s @@ -0,0 +1,87 @@ +// REQUIRES: ppc + +// RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t.o +// RUN: ld.lld -shared -z notext %t.o -o %t.so +// RUN: llvm-readelf -dyn-relocations %t.so | FileCheck %s + +// RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %s -o %t.o +// RUN: ld.lld -shared -z notext %t.o -o %t.so +// RUN: llvm-readelf -dyn-relocations %t.so | FileCheck %s + + +// CHECK-NOT: foo +// CHECK-NOT: bar + + .text + .abiversion 2 + .globl baz + .p2align 4 + .type baz,@function +baz: +.Lfunc_begin0: +.Lfunc_gep0: + addis 2, 12, .TOC.-.Lfunc_gep0@ha + addi 2, 2, .TOC.-.Lfunc_gep0@l +.Lfunc_lep0: + .localentry baz, .Lfunc_lep0-.Lfunc_gep0 + mflr 0 + std 0, 16(1) + stdu 1, -64(1) + std 30, 48(1) + std 29, 40(1) + mr 30, 3 + bl foo + mr 29, 3 + mr 3, 30 + bl bar + mullw 3, 3, 29 + ld 30, 48(1) + ld 29, 40(1) + extsw 3, 3 + addi 1, 1, 64 + ld 0, 16(1) + mtlr 0 + blr + .long 0 + .quad 0 +.Lfunc_end0: + .size baz, .Lfunc_end0-.Lfunc_begin0 + + .p2align 4 + .type foo,@function +foo: +.Lfunc_begin1: + mullw 3, 3, 3 + extsw 3, 3 + blr + .long 0 + .quad 0 +.Lfunc_end1: + .size foo, .Lfunc_end1-.Lfunc_begin1 + + .p2align 4 + .type bar,@function +bar: +.Lfunc_begin2: +.Lfunc_gep2: + addis 2, 12, .TOC.-.Lfunc_gep2@ha + addi 2, 2, .TOC.-.Lfunc_gep2@l +.Lfunc_lep2: + .localentry bar, .Lfunc_lep2-.Lfunc_gep2 + mflr 0 + std 0, 16(1) + stdu 1, -48(1) + std 30, 32(1) + mr 30, 3 + bl foo + mullw 3, 3, 30 + ld 30, 32(1) + extsw 3, 3 + addi 1, 1, 48 + ld 0, 16(1) + mtlr 0 + blr + .long 0 + .quad 0 +.Lfunc_end2: + .size bar, .Lfunc_end2-.Lfunc_begin2 -- 2.7.4