diff options
| author | Hal Finkel <hfinkel@anl.gov> | 2015-10-16 21:55:40 +0000 |
|---|---|---|
| committer | Hal Finkel <hfinkel@anl.gov> | 2015-10-16 21:55:40 +0000 |
| commit | 6f97c2bc00208fbde954146104a8a8c7842e9b32 (patch) | |
| tree | 62b67d1525473096acbbbb8e061d27a991d2a7df /lld/ELF/Target.cpp | |
| parent | 3d5b48c4804f2442ed42e1e93f226f08abd7b14e (diff) | |
| download | bcm5719-llvm-6f97c2bc00208fbde954146104a8a8c7842e9b32.tar.gz bcm5719-llvm-6f97c2bc00208fbde954146104a8a8c7842e9b32.zip | |
[ELF2] getLocalRelTarget should handle R_PPC64_TOC directly
R_PPC64_TOC does not have an associated symbol, but does have a non-zero VA
that target-specific code must compute using some non-trivial rule. We
handled this as a special case in PPC64TargetInfo::relocateOne, where
we knew to write this special address, but that did not work when creating shared
libraries. The special TOC address needs to be the subject of a
R_PPC64_RELATIVE relocation, and so we also need to know how to encode this
special address in the addend of that relocation.
Thus, some target-specific logic is necessary when creating R_PPC64_RELATIVE as
well. To solve this problem, we teach getLocalRelTarget to handle R_PPC64_TOC
as a special case. This allows us to remove the special case in
PPC64TargetInfo::relocateOne (simplifying code there), and naturally allows the
existing logic to do the right thing when creating associated R_PPC64_RELATIVE
relocations for shared libraries.
llvm-svn: 250555
Diffstat (limited to 'lld/ELF/Target.cpp')
| -rw-r--r-- | lld/ELF/Target.cpp | 8 |
1 files changed, 2 insertions, 6 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 4ecc80b592c..f45b6c54c2c 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -345,7 +345,7 @@ PPC64TargetInfo::PPC64TargetInfo() { VAStart = 0x10000000; } -static uint64_t getPPC64TocBase() { +uint64_t getPPC64TocBase() { // The TOC consists of sections .got, .toc, .tocbss, .plt in that // order. The TOC starts where the first of these sections starts. @@ -426,11 +426,6 @@ void PPC64TargetInfo::relocateOne(uint8_t *Buf, uint8_t *BufEnd, uint64_t P = BaseAddr + Rel.r_offset; uint64_t TB = getPPC64TocBase(); - if (Type == R_PPC64_TOC) { - write64be(L, TB); - return; - } - // For a TOC-relative relocation, adjust the addend and proceed in terms of // the corresponding ADDR16 relocation type. switch (Type) { @@ -536,6 +531,7 @@ void PPC64TargetInfo::relocateOne(uint8_t *Buf, uint8_t *BufEnd, write64be(L, SA - P); break; case R_PPC64_ADDR64: + case R_PPC64_TOC: write64be(L, SA); break; default: |

