From 365e5f69c9bdb9bd49c4f269f81344f676e0d830 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 27 Apr 2016 11:54:07 +0000 Subject: [PATCH] Simplify handling of R_PPC64_TOC. NFC. llvm-svn: 267698 --- lld/ELF/Target.cpp | 2 ++ lld/ELF/Writer.cpp | 19 +++++++++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 2ee14b8..dbc164a 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -843,6 +843,8 @@ RelExpr PPC64TargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const { switch (Type) { default: return R_ABS; + case R_PPC64_TOC: + return R_PPC_TOC; case R_PPC64_REL24: return R_PPC_PLT_OPD; } diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 8967f2c..553057f 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -424,8 +424,12 @@ static int32_t findMipsPairedAddend(const uint8_t *Buf, const uint8_t *BufLoc, // the DSO is loaded. template static bool isAbsolute(const SymbolBody &Body) { Symbol *Sym = Body.Backref; - if (Body.isUndefined() && Sym->isWeak()) - return true; // always 0 + if (Body.isUndefined()) { + if (!Sym) + return false; // undefined local. That is the dummy symbol 0. + if (Sym->isWeak()) + return true; // always 0 + } if (const auto *DR = dyn_cast>(&Body)) return DR->Section == nullptr; // Absolute symbol. return false; @@ -687,13 +691,6 @@ void Writer::scanRelocs(InputSectionBase &C, ArrayRef Rels) { continue; } - if (Config->EMachine == EM_PPC64 && RI.getType(false) == R_PPC64_TOC) { - C.Relocations.push_back({R_PPC_TOC, Type, Offset, Addend, &Body}); - AddDyn({R_PPC64_RELATIVE, C.OutSec, Offset, false, nullptr, - (uintX_t)getPPC64TocBase() + Addend}); - continue; - } - // We know that this is the final symbol. If the program being produced // is position independent, the final value is still not known. // If the relocation depends on the symbol value (not the size or distances @@ -710,8 +707,10 @@ void Writer::scanRelocs(InputSectionBase &C, ArrayRef Rels) { continue; } + if (Config->EMachine == EM_PPC64 && Type == R_PPC64_TOC) + Addend += getPPC64TocBase(); AddDyn({Target->RelativeRel, C.OutSec, Offset, true, &Body, Addend}); - C.Relocations.push_back({R_ABS, Type, Offset, Addend, &Body}); + C.Relocations.push_back({Expr, Type, Offset, Addend, &Body}); } // Scan relocations for necessary thunks. -- 2.7.4