diff options
author | Hal Finkel <hfinkel@anl.gov> | 2015-10-12 20:58:52 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2015-10-12 20:58:52 +0000 |
commit | be0823dcc4f91e735a381ba53bd977ad7c82d0f8 (patch) | |
tree | 0e4b8e9d04802e9dab5ee6769bd7deef1f84d3ac | |
parent | 3c8cc677e6dbf29e59343142a5f1627427f58844 (diff) | |
download | bcm5719-llvm-be0823dcc4f91e735a381ba53bd977ad7c82d0f8.tar.gz bcm5719-llvm-be0823dcc4f91e735a381ba53bd977ad7c82d0f8.zip |
[ELF2] Implement PPC64TargetInfo::isRelRelative
This is essentially pattern-matching against the x86 target, and generates the
analogous PPC64 relocation.
llvm-svn: 250102
-rw-r--r-- | lld/ELF/Target.cpp | 15 | ||||
-rw-r--r-- | lld/ELF/Target.h | 1 | ||||
-rw-r--r-- | lld/test/elf2/relative-dynamic-reloc-ppc64.s | 65 |
3 files changed, 81 insertions, 0 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index df7b34cf849..8d3a3515d5a 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -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(uint32_t Type, const SymbolBody &S) const { 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; diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h index 9d3d7b9eeb9..0eb28a1a9fb 100644 --- a/lld/ELF/Target.h +++ b/lld/ELF/Target.h @@ -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 { diff --git a/lld/test/elf2/relative-dynamic-reloc-ppc64.s b/lld/test/elf2/relative-dynamic-reloc-ppc64.s new file mode 100644 index 00000000000..a8776b7b450 --- /dev/null +++ b/lld/test/elf2/relative-dynamic-reloc-ppc64.s @@ -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 |