diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index e847e85b060fe..ed53228359f86 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -887,7 +887,7 @@ static void addPltEntry(Ctx &ctx, PltSection &plt, GotPltSection &gotPlt, gotPlt.addEntry(sym); rel.addReloc({type, &gotPlt, sym.getGotPltOffset(ctx), sym.isPreemptible ? DynamicReloc::AgainstSymbol - : DynamicReloc::AddendOnlyWithTargetVA, + : DynamicReloc::AddendOnly, sym, 0, R_ABS}); } @@ -927,8 +927,8 @@ static void addGotAuthEntry(Ctx &ctx, Symbol &sym) { // Signed GOT requires dynamic relocation. ctx.in.got->getPartition(ctx).relaDyn->addReloc( - {R_AARCH64_AUTH_RELATIVE, ctx.in.got.get(), off, - DynamicReloc::AddendOnlyWithTargetVA, sym, 0, R_ABS}); + {R_AARCH64_AUTH_RELATIVE, ctx.in.got.get(), off, DynamicReloc::AddendOnly, + sym, 0, R_ABS}); } static void addTpOffsetGotEntry(Ctx &ctx, Symbol &sym) { @@ -1160,8 +1160,8 @@ void RelocationScanner::processAux(RelExpr expr, RelType type, uint64_t offset, part.relrAuthDyn->relocs.push_back({sec, sec->relocs().size() - 1}); } else { part.relaDyn->addReloc({R_AARCH64_AUTH_RELATIVE, sec, offset, - DynamicReloc::AddendOnlyWithTargetVA, sym, - addend, R_ABS}); + DynamicReloc::AddendOnly, sym, addend, + R_ABS}); } return; } diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index 16f1ab36a88b1..da0cf1298d1ab 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -1122,8 +1122,8 @@ void MipsGotSection::build() { for (const std::pair &p : got.local16) { uint64_t offset = p.second * ctx.arg.wordsize; ctx.mainPart->relaDyn->addReloc({ctx.target->relativeRel, this, offset, - DynamicReloc::AddendOnlyWithTargetVA, - *p.first.first, p.first.second, R_ABS}); + DynamicReloc::AddendOnly, *p.first.first, + p.first.second, R_ABS}); } } } @@ -1650,17 +1650,14 @@ int64_t DynamicReloc::computeAddend(Ctx &ctx) const { case Computed: llvm_unreachable("addend already computed"); case AddendOnly: - assert(sym == nullptr); - return addend; - case AgainstSymbol: - assert(sym != nullptr); - return addend; - case AddendOnlyWithTargetVA: case AgainstSymbolWithTargetVA: { uint64_t ca = inputSec->getRelocTargetVA( ctx, Relocation{expr, type, 0, addend, sym}, getOffset()); return ctx.arg.is64 ? ca : SignExtend64<32>(ca); } + case AgainstSymbol: + assert(sym != nullptr); + return addend; case MipsMultiGotPage: assert(sym == nullptr); return getMipsPageAddr(outputSec->addr) + addend; @@ -1705,8 +1702,8 @@ void RelocationBaseSection::addAddendOnlyRelocIfNonPreemptible( addReloc({dynType, &isec, offsetInSec, DynamicReloc::AgainstSymbol, sym, 0, R_ABS}); else - addReloc(DynamicReloc::AddendOnlyWithTargetVA, dynType, isec, offsetInSec, - sym, 0, R_ABS, addendRelType); + addReloc(DynamicReloc::AddendOnly, dynType, isec, offsetInSec, sym, 0, + R_ABS, addendRelType); } void RelocationBaseSection::mergeRels() { diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h index 8e069e3dd9565..8185417755d25 100644 --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -422,13 +422,10 @@ class DynamicReloc { /// The resulting dynamic relocation has already had its addend computed. /// Calling computeAddend() is an error. Only for internal use. Computed, - /// The resulting dynamic relocation does not reference a symbol (#sym must - /// be nullptr) and uses #addend as the result of computeAddend(ctx). - AddendOnly, /// The resulting dynamic relocation will not reference a symbol: #sym is /// only used to compute the addend with InputSection::getRelocTargetVA(). /// Useful for various relative and TLS relocations (e.g. R_X86_64_TPOFF64). - AddendOnlyWithTargetVA, + AddendOnly, /// The resulting dynamic relocation references symbol #sym from the dynamic /// symbol table and uses #addend as the value of computeAddend(ctx). AgainstSymbol, @@ -441,7 +438,7 @@ class DynamicReloc { /// addresses of 64kb pages that lie inside the output section. MipsMultiGotPage, }; - /// This constructor records a relocation against a symbol. + /// This constructor records a normal relocation. DynamicReloc(RelType type, const InputSectionBase *inputSec, uint64_t offsetInSec, Kind kind, Symbol &sym, int64_t addend, RelExpr expr) @@ -450,8 +447,9 @@ class DynamicReloc { /// This constructor records a relative relocation with no symbol. DynamicReloc(RelType type, const InputSectionBase *inputSec, uint64_t offsetInSec, int64_t addend = 0) - : sym(nullptr), inputSec(inputSec), offsetInSec(offsetInSec), type(type), - addend(addend), kind(AddendOnly), expr(R_ADDEND) {} + : sym(inputSec->getCtx().dummySym), inputSec(inputSec), + offsetInSec(offsetInSec), type(type), addend(addend), kind(AddendOnly), + expr(R_ADDEND) {} /// This constructor records dynamic relocation settings used by the MIPS /// multi-GOT implementation. DynamicReloc(RelType type, const InputSectionBase *inputSec, @@ -532,8 +530,8 @@ class RelocationBaseSection : public SyntheticSection { uint64_t offsetInSec, Symbol &sym, int64_t addend, RelType addendRelType, RelExpr expr) { assert(expr != R_ADDEND && "expected non-addend relocation expression"); - addReloc(DynamicReloc::AddendOnlyWithTargetVA, dynType, isec, - offsetInSec, sym, addend, expr, addendRelType); + addReloc(DynamicReloc::AddendOnly, dynType, isec, offsetInSec, sym, + addend, expr, addendRelType); } /// Add a dynamic relocation using the target address of \p sym as the addend /// if \p sym is non-preemptible. Otherwise add a relocation against \p sym. diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index c3c057812a685..2add26cfdb089 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1586,8 +1586,7 @@ template void Writer::finalizeAddressDependentContent() { if (isInt<32>(reloc.sym->getVA(ctx, reloc.addend))) return false; part.relaDyn->addReloc({R_AARCH64_AUTH_RELATIVE, elem.inputSec, - reloc.offset, - DynamicReloc::AddendOnlyWithTargetVA, + reloc.offset, DynamicReloc::AddendOnly, *reloc.sym, reloc.addend, R_ABS}); return true; });