[lld] r250102 - [ELF2] Implement PPC64TargetInfo::isRelRelative

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 12 13:58:52 PDT 2015


Author: hfinkel
Date: Mon Oct 12 15:58:52 2015
New Revision: 250102

URL: http://llvm.org/viewvc/llvm-project?rev=250102&view=rev
Log:
[ELF2] Implement PPC64TargetInfo::isRelRelative

This is essentially pattern-matching against the x86 target, and generates the
analogous PPC64 relocation.

Added:
    lld/trunk/test/elf2/relative-dynamic-reloc-ppc64.s
Modified:
    lld/trunk/ELF/Target.cpp
    lld/trunk/ELF/Target.h

Modified: lld/trunk/ELF/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=250102&r1=250101&r2=250102&view=diff
==============================================================================
--- lld/trunk/ELF/Target.cpp (original)
+++ lld/trunk/ELF/Target.cpp Mon Oct 12 15:58:52 2015
@@ -221,6 +221,7 @@ PPC64TargetInfo::PPC64TargetInfo() {
   PCRelReloc = R_PPC64_REL24;
   GotReloc = R_PPC64_GLOB_DAT;
   GotRefReloc = R_PPC64_REL64;
+  RelativeReloc = R_PPC64_RELATIVE;
   PltEntrySize = 32;
 
   // We need 64K pages (at least under glibc/Linux, the loader won't
@@ -291,6 +292,20 @@ bool PPC64TargetInfo::relocNeedsPlt(uint
   return S.isShared() || (S.isUndefined() && S.isWeak());
 }
 
+bool PPC64TargetInfo::isRelRelative(uint32_t Type) const {
+  switch (Type) {
+  default:
+    return false;
+  case R_PPC64_REL24:
+  case R_PPC64_REL14:
+  case R_PPC64_REL14_BRTAKEN:
+  case R_PPC64_REL14_BRNTAKEN:
+  case R_PPC64_REL32:
+  case R_PPC64_REL64:
+    return true;
+  }
+}
+
 void PPC64TargetInfo::relocateOne(uint8_t *Buf, const void *RelP, uint32_t Type,
                                   uint64_t BaseAddr, uint64_t SymVA) const {
   typedef ELFFile<ELF64BE>::Elf_Rela Elf_Rela;

Modified: lld/trunk/ELF/Target.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.h?rev=250102&r1=250101&r2=250102&view=diff
==============================================================================
--- lld/trunk/ELF/Target.h (original)
+++ lld/trunk/ELF/Target.h Mon Oct 12 15:58:52 2015
@@ -81,6 +81,7 @@ public:
   bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const override;
   void relocateOne(uint8_t *Buf, const void *RelP, uint32_t Type,
                    uint64_t BaseAddr, uint64_t SymVA) const override;
+  bool isRelRelative(uint32_t Type) const override;
 };
 
 class PPCTargetInfo final : public TargetInfo {

Added: lld/trunk/test/elf2/relative-dynamic-reloc-ppc64.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/relative-dynamic-reloc-ppc64.s?rev=250102&view=auto
==============================================================================
--- lld/trunk/test/elf2/relative-dynamic-reloc-ppc64.s (added)
+++ lld/trunk/test/elf2/relative-dynamic-reloc-ppc64.s Mon Oct 12 15:58:52 2015
@@ -0,0 +1,65 @@
+// RUN: llvm-mc -filetype=obj -triple=powerpc64-unknown-linux %s -o %t.o
+// RUN: ld.lld2 -shared %t.o -o %t.so
+// RUN: llvm-readobj -t -r -dyn-symbols %t.so | FileCheck %s
+
+// Test that we create R_PPC64_RELATIVE relocations but don't put any
+// symbols in the dynamic symbol table.
+
+// CHECK:      Relocations [
+// CHECK-NEXT:   Section ({{.*}}) .rela.dyn {
+// CHECK-NEXT:     0x[[FOO_ADDR:.*]] R_PPC64_RELATIVE - 0x[[FOO_ADDR]]
+// CHECK-NEXT:     0x[[BAR_ADDR:.*]] R_PPC64_RELATIVE - 0x[[BAR_ADDR]]
+// CHECK-NEXT:     0x10010 R_PPC64_RELATIVE - 0x10009
+// CHECK-NEXT:     0x{{.*}} R_PPC64_RELATIVE - 0x[[ZED_ADDR:.*]]
+// CHECK-NEXT:     0x{{.*}} R_PPC64_RELATIVE - 0x[[FOO_ADDR]]
+// CHECK-NEXT:     0x160 R_PPC64_ADDR64 external 0x0
+// CHECK-NEXT:   }
+// CHECK-NEXT: ]
+
+// CHECK:      Symbols [
+// CHECK:        Name: foo
+// CHECK-NEXT:   Value: 0x[[FOO_ADDR]]
+// CHECK:        Name: bar
+// CHECK-NEXT:   Value: 0x[[BAR_ADDR]]
+// CHECK:        Name: zed
+// CHECK-NEXT:   Value: 0x[[ZED_ADDR]]
+// CHECK:      ]
+
+// CHECK:      DynamicSymbols [
+// CHECK-NEXT:   Symbol {
+// CHECK-NEXT:     Name: @ (0)
+// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Size: 0
+// CHECK-NEXT:     Binding: Local
+// CHECK-NEXT:     Type: None
+// CHECK-NEXT:     Other: 0
+// CHECK-NEXT:     Section: Undefined
+// CHECK-NEXT:   }
+// CHECK-NEXT:   Symbol {
+// CHECK-NEXT:     Name: external@
+// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Size: 0
+// CHECK-NEXT:     Binding: Global
+// CHECK-NEXT:     Type: None
+// CHECK-NEXT:     Other: 0
+// CHECK-NEXT:     Section: Undefined
+// CHECK-NEXT:   }
+// CHECK-NEXT: ]
+
+foo:
+        .quad foo
+
+        .hidden bar
+        .global bar
+bar:
+        .quad bar
+        .quad bar + 1
+
+        .hidden zed
+        .comm zed,1
+        .quad zed
+
+        .section abc,"a"
+        .quad foo
+
+        .quad external




More information about the llvm-commits mailing list