[PPC64] isRelExpr should return true for the PPC Call Exprs.
authorSean Fertile <sfertile@ca.ibm.com>
Fri, 11 May 2018 19:31:19 +0000 (19:31 +0000)
committerSean Fertile <sfertile@ca.ibm.com>
Fri, 11 May 2018 19:31:19 +0000 (19:31 +0000)
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
lld/test/ELF/ppc64-rel-so-local-calls.s [new file with mode: 0644]

index 7463129..5ac9b6f 100644 (file)
@@ -328,7 +328,8 @@ static bool needsGot(RelExpr Expr) {
 // file (PC, or GOT for example).
 static bool isRelExpr(RelExpr Expr) {
   return isRelExprOneOf<R_PC, R_GOTREL, R_GOTREL_FROM_END, R_MIPS_GOTREL,
-                        R_PAGE_PC, R_RELAX_GOT_PC>(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 (file)
index 0000000..834dbd5
--- /dev/null
@@ -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