[PATCH] D44951: [PPC64LE] Minor changes for Plt relocations.

Sean Fertile via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 2 12:50:14 PDT 2018


This revision was automatically updated to reflect the committed changes.
Closed by commit rL329006: [PPC64] Minor changes for Plt relocations. (authored by sfertile, committed by ).
Herald added a subscriber: MaskRay.

Changed prior to commit:
  https://reviews.llvm.org/D44951?vs=139991&id=140676#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D44951

Files:
  lld/trunk/ELF/Arch/PPC64.cpp
  lld/trunk/test/ELF/ppc64le-dynamic-relocations.s
  lld/trunk/test/ELF/ppc64le-plt-stub.s


Index: lld/trunk/test/ELF/ppc64le-dynamic-relocations.s
===================================================================
--- lld/trunk/test/ELF/ppc64le-dynamic-relocations.s
+++ lld/trunk/test/ELF/ppc64le-dynamic-relocations.s
@@ -0,0 +1,46 @@
+// REQUIRES: ppc
+// RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %s -o %t.o
+// RUN: llvm-mc -filetype=obj -triple=powerpc64le-unknown-linux %p/Inputs/shared-ppc64le.s -o %t2.o
+// RUN: ld.lld -shared %t2.o -o %t2.so
+// RUN: ld.lld %t.o %t2.so -o %t
+// RUN: llvm-readobj -dyn-relocations %t | FileCheck %s
+// RUN: llvm-objdump -D %t | FileCheck --check-prefix=DIS %s
+// RUN: llvm-readelf -dynamic-table %t | FileCheck --check-prefix=DT %s
+
+// The dynamic relocation for foo should point to 16 bytes past the start of
+// the .got.plt section.
+// CHECK: Dynamic Relocations {
+// CHECK-NEXT:    0x10020010 R_PPC64_JMP_SLOT foo 0x0
+
+// There should be 2 reserved doublewords before the first entry. The dynamic
+// linker will fill those in with the address of the resolver entry point and
+// the dynamic object identifier.
+// DIS: Disassembly of section .got.plt:
+// DIS-NEXT:  .got.plt:
+// DIS-NEXT: 10020000:       00 00 00 00  <unknown>
+// DIS-NEXT: 10020004:       00 00 00 00  <unknown>
+// DIS-NEXT: 10020008:       00 00 00 00  <unknown>
+// DIS-NEXT: 1002000c:       00 00 00 00  <unknown>
+// DIS-NEXT: 10020010:       00 00 00 00  <unknown>
+// DIS-NEXT: 10020014:       00 00 00 00  <unknown>
+
+// DT_PLTGOT should point to the start of the .got.plt section.
+// DT: 0x0000000000000003 PLTGOT               0x10020000
+
+    .text
+    .abiversion 2
+    .globl  _start
+    .p2align        4
+    .type   _start, at function
+_start:
+.Lfunc_begin0:
+.Lfunc_gep0:
+  addis 2, 12, .TOC.-.Lfunc_gep0 at ha
+  addi 2, 2, .TOC.-.Lfunc_gep0 at l
+.Lfunc_lep0:
+  .localentry     _start, .Lfunc_lep0-.Lfunc_gep0
+  bl foo
+  nop
+  li 0, 1
+  sc
+  .size _start, .-.Lfunc_begin0
Index: lld/trunk/test/ELF/ppc64le-plt-stub.s
===================================================================
--- lld/trunk/test/ELF/ppc64le-plt-stub.s
+++ lld/trunk/test/ELF/ppc64le-plt-stub.s
@@ -32,6 +32,6 @@
 // CHECK:          .plt:
 // CHECK-NEXT:            18 00 41 f8     std 2, 24(1)
 // CHECK-NEXT:            fe ff 82 3d     addis 12, 2, -2
-// CHECK-NEXT:            48 7f 8c e9     ld 12, 32584(12)
+// CHECK-NEXT:            40 7f 8c e9     ld 12, 32576(12)
 // CHECK-NEXT:            a6 03 89 7d     mtctr 12
 // CHECK:                 20 04 80 4e     bctr
Index: lld/trunk/ELF/Arch/PPC64.cpp
===================================================================
--- lld/trunk/ELF/Arch/PPC64.cpp
+++ lld/trunk/ELF/Arch/PPC64.cpp
@@ -63,16 +63,22 @@
 static uint16_t applyPPCHighesta(uint64_t V) { return (V + 0x8000) >> 48; }
 
 PPC64::PPC64() {
-  PltRel = GotRel = R_PPC64_GLOB_DAT;
+  GotRel = R_PPC64_GLOB_DAT;
   RelativeRel = R_PPC64_RELATIVE;
   GotEntrySize = 8;
   GotPltEntrySize = 8;
   PltEntrySize = 32;
   PltHeaderSize = 0;
   GotBaseSymInGotPlt = false;
   GotBaseSymOff = 0x8000;
-  if (Config->EKind == ELF64LEKind)
+
+  if (Config->EKind == ELF64LEKind) {
     GotHeaderEntriesNum = 1;
+    GotPltHeaderEntriesNum = 2;
+    PltRel = R_PPC64_JMP_SLOT;
+  } else {
+    PltRel = R_PPC64_GLOB_DAT;
+  }
 
   // We need 64K pages (at least under glibc/Linux, the loader won't
   // set different permissions on a finer granularity than that).


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D44951.140676.patch
Type: text/x-patch
Size: 3430 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180402/6643a265/attachment.bin>


More information about the llvm-commits mailing list