[lld] cfd3289 - [ELF] Pass Ctx & to some free functions
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Oct 6 19:36:26 PDT 2024
Author: Fangrui Song
Date: 2024-10-06T19:36:21-07:00
New Revision: cfd3289a1f9a87e220737a634904a886a82d424a
URL: https://github.com/llvm/llvm-project/commit/cfd3289a1f9a87e220737a634904a886a82d424a
DIFF: https://github.com/llvm/llvm-project/commit/cfd3289a1f9a87e220737a634904a886a82d424a.diff
LOG: [ELF] Pass Ctx & to some free functions
Added:
Modified:
lld/ELF/ARMErrataFix.cpp
lld/ELF/Arch/AArch64.cpp
lld/ELF/Arch/AMDGPU.cpp
lld/ELF/Arch/ARM.cpp
lld/ELF/Arch/AVR.cpp
lld/ELF/Arch/Hexagon.cpp
lld/ELF/Arch/LoongArch.cpp
lld/ELF/Arch/MSP430.cpp
lld/ELF/Arch/Mips.cpp
lld/ELF/Arch/PPC.cpp
lld/ELF/Arch/PPC64.cpp
lld/ELF/Arch/RISCV.cpp
lld/ELF/Arch/SPARCV9.cpp
lld/ELF/Arch/SystemZ.cpp
lld/ELF/Arch/X86.cpp
lld/ELF/Arch/X86_64.cpp
lld/ELF/Config.h
lld/ELF/InputSection.cpp
lld/ELF/LinkerScript.cpp
lld/ELF/LinkerScript.h
lld/ELF/OutputSections.cpp
lld/ELF/Symbols.cpp
lld/ELF/SyntheticSections.cpp
lld/ELF/Target.cpp
lld/ELF/Target.h
lld/ELF/Writer.cpp
lld/ELF/Writer.h
Removed:
################################################################################
diff --git a/lld/ELF/ARMErrataFix.cpp b/lld/ELF/ARMErrataFix.cpp
index 2fd191306353d4..839ab2b074bdd1 100644
--- a/lld/ELF/ARMErrataFix.cpp
+++ b/lld/ELF/ARMErrataFix.cpp
@@ -70,7 +70,8 @@ using namespace lld::elf;
class elf::Patch657417Section final : public SyntheticSection {
public:
- Patch657417Section(InputSection *p, uint64_t off, uint32_t instr, bool isARM);
+ Patch657417Section(Ctx &, InputSection *p, uint64_t off, uint32_t instr,
+ bool isARM);
void writeTo(Ctx &, uint8_t *buf) override;
@@ -133,7 +134,7 @@ static bool is32bitBranch(uint32_t instr) {
return isBcc(instr) || isB(instr) || isBL(instr) || isBLX(instr);
}
-Patch657417Section::Patch657417Section(InputSection *p, uint64_t off,
+Patch657417Section::Patch657417Section(Ctx &ctx, InputSection *p, uint64_t off,
uint32_t instr, bool isARM)
: SyntheticSection(SHF_ALLOC | SHF_EXECINSTR, SHT_PROGBITS, 4,
".text.patch"),
@@ -449,7 +450,7 @@ static void implementPatch(ScanResult sr, InputSection *isec,
: sr.rel->sym->getVA();
destIsARM = (dstSymAddr & 1) == 0;
}
- psec = make<Patch657417Section>(isec, sr.off, sr.instr, destIsARM);
+ psec = make<Patch657417Section>(ctx, isec, sr.off, sr.instr, destIsARM);
if (destIsARM) {
// The patch will be in ARM state. Use an ARM relocation and account for
// the larger ARM PC-bias of 8 rather than Thumb's 4.
@@ -467,7 +468,8 @@ static void implementPatch(ScanResult sr, InputSection *isec,
// appropriate type to the patch at patcheeOffset.
// The destination is ARM if we have a BLX.
- psec = make<Patch657417Section>(isec, sr.off, sr.instr, isBLX(sr.instr));
+ psec =
+ make<Patch657417Section>(ctx, isec, sr.off, sr.instr, isBLX(sr.instr));
RelType type;
if (isBcc(sr.instr))
type = R_ARM_THM_JUMP19;
diff --git a/lld/ELF/Arch/AArch64.cpp b/lld/ELF/Arch/AArch64.cpp
index 8e133a444e3862..33a1db86dd3c70 100644
--- a/lld/ELF/Arch/AArch64.cpp
+++ b/lld/ELF/Arch/AArch64.cpp
@@ -213,7 +213,7 @@ RelExpr AArch64::getRelExpr(RelType type, const Symbol &s,
case R_AARCH64_NONE:
return R_NONE;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -348,7 +348,7 @@ int64_t AArch64::getImplicitAddend(const uint8_t *buf, RelType type) const {
return SignExtend64<28>(getBits(read32le(buf), 0, 25) << 2);
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
diff --git a/lld/ELF/Arch/AMDGPU.cpp b/lld/ELF/Arch/AMDGPU.cpp
index 29b21f1b953989..1c20abdb82f228 100644
--- a/lld/ELF/Arch/AMDGPU.cpp
+++ b/lld/ELF/Arch/AMDGPU.cpp
@@ -193,7 +193,7 @@ RelExpr AMDGPU::getRelExpr(RelType type, const Symbol &s,
case R_AMDGPU_GOTPCREL32_HI:
return R_GOT_PC;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -213,7 +213,7 @@ int64_t AMDGPU::getImplicitAddend(const uint8_t *buf, RelType type) const {
case R_AMDGPU_RELATIVE64:
return read64(buf);
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
diff --git a/lld/ELF/Arch/ARM.cpp b/lld/ELF/Arch/ARM.cpp
index a52f53b74e7826..4e45be05e71b6c 100644
--- a/lld/ELF/Arch/ARM.cpp
+++ b/lld/ELF/Arch/ARM.cpp
@@ -191,7 +191,7 @@ RelExpr ARM::getRelExpr(RelType type, const Symbol &s,
// not ARMv4 output, we can just ignore it.
return R_NONE;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -505,7 +505,7 @@ static void stateChangeWarning(Ctx &ctx, uint8_t *loc, RelType relt,
" ; interworking not performed" + hint);
} else {
// Warn with hint on how to alter the symbol type.
- warn(getErrorLocation(loc) + "branch and link relocation: " +
+ warn(getErrorLoc(ctx, loc) + "branch and link relocation: " +
toString(relt) + " to non STT_FUNC symbol: " + s.getName() +
" interworking not performed; consider using directive '.type " +
s.getName() +
@@ -552,7 +552,7 @@ static void encodeAluGroup(uint8_t *loc, const Relocation &rel, uint64_t val,
rot = (lz + 8) << 7;
}
if (check && imm > 0xff)
- error(getErrorLocation(loc) + "unencodeable immediate " + Twine(val).str() +
+ error(getErrorLoc(ctx, loc) + "unencodeable immediate " + Twine(val).str() +
" for relocation " + toString(rel.type));
write32(loc, (read32(loc) & 0xff3ff000) | opcode | rot | (imm & 0xff));
}
@@ -863,7 +863,7 @@ void ARM::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const {
int64_t ARM::getImplicitAddend(const uint8_t *buf, RelType type) const {
switch (type) {
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
case R_ARM_ABS32:
diff --git a/lld/ELF/Arch/AVR.cpp b/lld/ELF/Arch/AVR.cpp
index cc2d9fa3daf798..24215f0b00e0d5 100644
--- a/lld/ELF/Arch/AVR.cpp
+++ b/lld/ELF/Arch/AVR.cpp
@@ -93,7 +93,7 @@ RelExpr AVR::getRelExpr(RelType type, const Symbol &s,
case R_AVR_13_PCREL:
return R_PC;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
diff --git a/lld/ELF/Arch/Hexagon.cpp b/lld/ELF/Arch/Hexagon.cpp
index ab05640c342e75..de5444c88ad159 100644
--- a/lld/ELF/Arch/Hexagon.cpp
+++ b/lld/ELF/Arch/Hexagon.cpp
@@ -153,7 +153,7 @@ RelExpr Hexagon::getRelExpr(RelType type, const Symbol &s,
case R_HEX_TPREL_LO16:
return R_TPREL;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -398,7 +398,7 @@ int64_t Hexagon::getImplicitAddend(const uint8_t *buf, RelType type) const {
case R_HEX_TPREL_32:
return SignExtend64<32>(read32(buf));
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
diff --git a/lld/ELF/Arch/LoongArch.cpp b/lld/ELF/Arch/LoongArch.cpp
index 81f4131604e115..6c910bdf07c8d5 100644
--- a/lld/ELF/Arch/LoongArch.cpp
+++ b/lld/ELF/Arch/LoongArch.cpp
@@ -165,7 +165,7 @@ static void handleUleb128(uint8_t *loc, uint64_t val) {
const char *error = nullptr;
uint64_t orig = decodeULEB128(loc, &count, nullptr, &error);
if (count > maxcount || (count == maxcount && error))
- errorOrWarn(getErrorLocation(loc) + "extra space for uleb128");
+ errorOrWarn(getErrorLoc(ctx, loc) + "extra space for uleb128");
uint64_t mask = count < maxcount ? (1ULL << 7 * count) - 1 : -1ULL;
encodeULEB128((orig + val) & mask, loc, count);
}
@@ -279,7 +279,7 @@ uint32_t LoongArch::calcEFlags() const {
int64_t LoongArch::getImplicitAddend(const uint8_t *buf, RelType type) const {
switch (type) {
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
case R_LARCH_32:
@@ -528,7 +528,7 @@ RelExpr LoongArch::getRelExpr(const RelType type, const Symbol &s,
//
// [1]: https://web.archive.org/web/20230709064026/https://github.com/loongson/LoongArch-Documentation/issues/51
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -774,7 +774,7 @@ static bool relax(InputSection &sec) {
remove = allBytes - curBytes;
// If we can't satisfy this alignment, we've found a bad input.
if (LLVM_UNLIKELY(static_cast<int32_t>(remove) < 0)) {
- errorOrWarn(getErrorLocation((const uint8_t *)loc) +
+ errorOrWarn(getErrorLoc(ctx, (const uint8_t *)loc) +
"insufficient padding bytes for " + lld::toString(r.type) +
": " + Twine(allBytes) + " bytes available for " +
"requested alignment of " + Twine(align) + " bytes");
diff --git a/lld/ELF/Arch/MSP430.cpp b/lld/ELF/Arch/MSP430.cpp
index 7563f7cfaa02c6..d2fd401835dbc6 100644
--- a/lld/ELF/Arch/MSP430.cpp
+++ b/lld/ELF/Arch/MSP430.cpp
@@ -83,7 +83,7 @@ void MSP430::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const {
break;
}
default:
- error(getErrorLocation(loc) + "unrecognized relocation " +
+ error(getErrorLoc(ctx, loc) + "unrecognized relocation " +
toString(rel.type));
}
}
diff --git a/lld/ELF/Arch/Mips.cpp b/lld/ELF/Arch/Mips.cpp
index 7a4ead338568e5..2ac37e86ec88ec 100644
--- a/lld/ELF/Arch/Mips.cpp
+++ b/lld/ELF/Arch/Mips.cpp
@@ -87,7 +87,7 @@ RelExpr MIPS<ELFT>::getRelExpr(RelType type, const Symbol &s,
// (e.g. a table of function pointers). When we encounter this, ignore the
// relocation and emit a warning instead.
if (!s.isFunc() && s.type != STT_NOTYPE) {
- warn(getErrorLocation(loc) +
+ warn(getErrorLoc(ctx, loc) +
"found R_MIPS_JALR relocation against non-function symbol " +
toString(s) + ". This is invalid and most likely a compiler bug.");
return R_NONE;
@@ -191,7 +191,7 @@ RelExpr MIPS<ELFT>::getRelExpr(RelType type, const Symbol &s,
case R_MIPS_NONE:
return R_NONE;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -473,7 +473,7 @@ int64_t MIPS<ELFT>::getImplicitAddend(const uint8_t *buf, RelType type) const {
// These relocations are defined as not having an implicit addend.
return 0;
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
@@ -501,7 +501,7 @@ calculateMipsRelChain(uint8_t *loc, RelType type, uint64_t val) {
return std::make_pair(type2, val);
if (type2 == R_MIPS_SUB && (type3 == R_MIPS_HI16 || type3 == R_MIPS_LO16))
return std::make_pair(type3, -val);
- error(getErrorLocation(loc) + "unsupported relocations combination " +
+ error(getErrorLoc(ctx, loc) + "unsupported relocations combination " +
Twine(type));
return std::make_pair(type & 0xff, val);
}
@@ -559,7 +559,7 @@ static uint64_t fixupCrossModeJump(uint8_t *loc, RelType type, uint64_t val) {
llvm_unreachable("unexpected jump/branch relocation");
}
- error(getErrorLocation(loc) +
+ error(getErrorLoc(ctx, loc) +
"unsupported jump/branch instruction between ISA modes referenced by " +
toString(type) + " relocation");
return val;
diff --git a/lld/ELF/Arch/PPC.cpp b/lld/ELF/Arch/PPC.cpp
index 323b81dc721e44..ff9970ba494c1c 100644
--- a/lld/ELF/Arch/PPC.cpp
+++ b/lld/ELF/Arch/PPC.cpp
@@ -265,7 +265,7 @@ RelExpr PPC::getRelExpr(RelType type, const Symbol &s,
case R_PPC_TPREL16_HI:
return R_TPREL;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -292,7 +292,7 @@ int64_t PPC::getImplicitAddend(const uint8_t *buf, RelType type) const {
case R_PPC_TPREL32:
return SignExtend64<32>(read32(buf));
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index 63f3a32c128c37..361e30b0843b9a 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -1097,7 +1097,7 @@ RelExpr PPC64::getRelExpr(RelType type, const Symbol &s,
case R_PPC64_TLS:
return R_TLSIE_HINT;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -1126,7 +1126,7 @@ int64_t PPC64::getImplicitAddend(const uint8_t *buf, RelType type) const {
case R_PPC64_TPREL64:
return read64(buf);
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
@@ -1332,9 +1332,8 @@ void PPC64::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const {
if (ctx.arg.tocOptimize && shouldTocOptimize && ha(val) == 0) {
uint32_t insn = readFromHalf16(ctx, loc);
if (isInstructionUpdateForm(insn))
- error(getErrorLocation(loc) +
- "can't toc-optimize an update instruction: 0x" +
- utohexstr(insn));
+ error(getErrorLoc(ctx, loc) +
+ "can't toc-optimize an update instruction: 0x" + utohexstr(insn));
writeFromHalf16(ctx, loc, (insn & 0xffe00000) | 0x00020000 | lo(val));
} else {
write16(loc, lo(val));
@@ -1352,7 +1351,7 @@ void PPC64::relocate(uint8_t *loc, const Relocation &rel, uint64_t val) const {
// changed into a nop. The lo part then needs to be updated to use the toc
// pointer register r2, as the base register.
if (isInstructionUpdateForm(insn))
- error(getErrorLocation(loc) +
+ error(getErrorLoc(ctx, loc) +
"Can't toc-optimize an update instruction: 0x" +
Twine::utohexstr(insn));
insn &= 0xffe00000 | mask;
@@ -1612,7 +1611,7 @@ void PPC64::relocateAlloc(InputSectionBase &sec, uint8_t *buf) const {
read32(loc + 4) != 0x60000000) &&
rel.sym->file != sec.file) {
// Use substr(6) to remove the "__plt_" prefix.
- errorOrWarn(getErrorLocation(loc) + "call to " +
+ errorOrWarn(getErrorLoc(ctx, loc) + "call to " +
lld::toString(*rel.sym).substr(6) +
" lacks nop, can't restore toc");
break;
@@ -1725,7 +1724,7 @@ bool PPC64::adjustPrologueForCrossSplitStack(uint8_t *loc, uint8_t *end,
// Check that the adjusted size doesn't overflow what we can represent with 2
// instructions.
if (stackFrameSize < ctx.arg.splitStackAdjustSize + INT32_MIN) {
- error(getErrorLocation(loc) + "split-stack prologue adjustment overflows");
+ error(getErrorLoc(ctx, loc) + "split-stack prologue adjustment overflows");
return false;
}
diff --git a/lld/ELF/Arch/RISCV.cpp b/lld/ELF/Arch/RISCV.cpp
index 130952b74c43dc..6970eccf51bdea 100644
--- a/lld/ELF/Arch/RISCV.cpp
+++ b/lld/ELF/Arch/RISCV.cpp
@@ -172,7 +172,7 @@ uint32_t RISCV::calcEFlags() const {
int64_t RISCV::getImplicitAddend(const uint8_t *buf, RelType type) const {
switch (type) {
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
case R_RISCV_32:
@@ -325,7 +325,7 @@ RelExpr RISCV::getRelExpr(const RelType type, const Symbol &s,
case R_RISCV_SUB_ULEB128:
return R_RISCV_LEB128;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -831,10 +831,12 @@ static bool relax(Ctx &ctx, InputSection &sec) {
remove = nextLoc - ((loc + align - 1) & -align);
// If we can't satisfy this alignment, we've found a bad input.
if (LLVM_UNLIKELY(static_cast<int32_t>(remove) < 0)) {
- errorOrWarn(getErrorLocation((const uint8_t*)loc) +
+ errorOrWarn(getErrorLoc(ctx, (const uint8_t *)loc) +
"insufficient padding bytes for " + lld::toString(r.type) +
- ": " + Twine(r.addend) + " bytes available "
- "for requested alignment of " + Twine(align) + " bytes");
+ ": " + Twine(r.addend) +
+ " bytes available "
+ "for requested alignment of " +
+ Twine(align) + " bytes");
remove = 0;
}
break;
diff --git a/lld/ELF/Arch/SPARCV9.cpp b/lld/ELF/Arch/SPARCV9.cpp
index 15c7c9c28b2ed8..6d72fcbd1dde3a 100644
--- a/lld/ELF/Arch/SPARCV9.cpp
+++ b/lld/ELF/Arch/SPARCV9.cpp
@@ -78,7 +78,7 @@ RelExpr SPARCV9::getRelExpr(RelType type, const Symbol &s,
case R_SPARC_TLS_LE_LOX10:
return R_TPREL;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
diff --git a/lld/ELF/Arch/SystemZ.cpp b/lld/ELF/Arch/SystemZ.cpp
index 3757babb720517..e1f76e482823a2 100644
--- a/lld/ELF/Arch/SystemZ.cpp
+++ b/lld/ELF/Arch/SystemZ.cpp
@@ -170,7 +170,7 @@ RelExpr SystemZ::getRelExpr(RelType type, const Symbol &s,
return R_GOT_PC;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -261,7 +261,7 @@ int64_t SystemZ::getImplicitAddend(const uint8_t *buf, RelType type) const {
// These relocations are defined as not having an implicit addend.
return 0;
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
diff --git a/lld/ELF/Arch/X86.cpp b/lld/ELF/Arch/X86.cpp
index f0b8a5a71db2b4..795c783951da5a 100644
--- a/lld/ELF/Arch/X86.cpp
+++ b/lld/ELF/Arch/X86.cpp
@@ -145,7 +145,7 @@ RelExpr X86::getRelExpr(RelType type, const Symbol &s,
case R_386_NONE:
return R_NONE;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -274,7 +274,7 @@ int64_t X86::getImplicitAddend(const uint8_t *buf, RelType type) const {
// These relocations are defined as not having an implicit addend.
return 0;
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
@@ -365,7 +365,7 @@ static void relaxTlsGdToLe(uint8_t *loc, const Relocation &rel, uint64_t val) {
//
// Note: call *x at tlsdesc(%eax) may not immediately follow this instruction.
if (memcmp(loc - 2, "\x8d\x83", 2)) {
- error(getErrorLocation(loc - 2) +
+ error(getErrorLoc(ctx, loc - 2) +
"R_386_TLS_GOTDESC must be used in leal x at tlsdesc(%ebx), %eax");
return;
}
@@ -397,7 +397,7 @@ static void relaxTlsGdToIe(uint8_t *loc, const Relocation &rel, uint64_t val) {
} else if (rel.type == R_386_TLS_GOTDESC) {
// Convert leal x at tlsdesc(%ebx), %eax to movl x at gotntpoff(%ebx), %eax.
if (memcmp(loc - 2, "\x8d\x83", 2)) {
- error(getErrorLocation(loc - 2) +
+ error(getErrorLoc(ctx, loc - 2) +
"R_386_TLS_GOTDESC must be used in leal x at tlsdesc(%ebx), %eax");
return;
}
diff --git a/lld/ELF/Arch/X86_64.cpp b/lld/ELF/Arch/X86_64.cpp
index b31bc14b888200..5cf5ea366aa7f7 100644
--- a/lld/ELF/Arch/X86_64.cpp
+++ b/lld/ELF/Arch/X86_64.cpp
@@ -401,7 +401,7 @@ RelExpr X86_64::getRelExpr(RelType type, const Symbol &s,
case R_X86_64_NONE:
return R_NONE;
default:
- error(getErrorLocation(loc) + "unknown relocation (" + Twine(type) +
+ error(getErrorLoc(ctx, loc) + "unknown relocation (" + Twine(type) +
") against symbol " + toString(s));
return R_NONE;
}
@@ -483,7 +483,7 @@ static void relaxTlsGdToLe(uint8_t *loc, const Relocation &rel, uint64_t val) {
// Convert leaq x at tlsdesc(%rip), %REG to movq $x at tpoff, %REG.
if ((loc[-3] & 0xfb) != 0x48 || loc[-2] != 0x8d ||
(loc[-1] & 0xc7) != 0x05) {
- errorOrWarn(getErrorLocation(loc - 3) +
+ errorOrWarn(getErrorLoc(ctx, loc - 3) +
"R_X86_64_GOTPC32_TLSDESC must be used "
"in leaq x at tlsdesc(%rip), %REG");
return;
@@ -524,7 +524,7 @@ static void relaxTlsGdToIe(uint8_t *loc, const Relocation &rel, uint64_t val) {
assert(rel.type == R_X86_64_GOTPC32_TLSDESC);
if ((loc[-3] & 0xfb) != 0x48 || loc[-2] != 0x8d ||
(loc[-1] & 0xc7) != 0x05) {
- errorOrWarn(getErrorLocation(loc - 3) +
+ errorOrWarn(getErrorLoc(ctx, loc - 3) +
"R_X86_64_GOTPC32_TLSDESC must be used "
"in leaq x at tlsdesc(%rip), %REG");
return;
@@ -573,7 +573,7 @@ static void relaxTlsIeToLe(uint8_t *loc, const Relocation &, uint64_t val) {
memcpy(inst, "\x48\xc7", 2);
*regSlot = 0xc0 | reg;
} else {
- error(getErrorLocation(loc - 3) +
+ error(getErrorLoc(ctx, loc - 3) +
"R_X86_64_GOTTPOFF must be used in MOVQ or ADDQ instructions only");
}
@@ -617,7 +617,7 @@ static void relaxTlsLdToLe(uint8_t *loc, const Relocation &rel, uint64_t val) {
return;
}
- error(getErrorLocation(loc - 3) +
+ error(getErrorLoc(ctx, loc - 3) +
"expected R_X86_64_PLT32 or R_X86_64_GOTPCRELX after R_X86_64_TLSLD");
}
@@ -756,7 +756,7 @@ int64_t X86_64::getImplicitAddend(const uint8_t *buf, RelType type) const {
// These relocations are defined as not having an implicit addend.
return 0;
default:
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h
index f4a295a1371e07..12a6513fae91dc 100644
--- a/lld/ELF/Config.h
+++ b/lld/ELF/Config.h
@@ -668,7 +668,7 @@ LLVM_LIBRARY_VISIBILITY extern Ctx ctx;
// The first two elements of versionDefinitions represent VER_NDX_LOCAL and
// VER_NDX_GLOBAL. This helper returns other elements.
-static inline ArrayRef<VersionDefinition> namedVersionDefs() {
+static inline ArrayRef<VersionDefinition> namedVersionDefs(Ctx &ctx) {
return llvm::ArrayRef(ctx.arg.versionDefinitions).slice(2);
}
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index bdbcdffaf7ce64..68cce62188b0fe 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -663,7 +663,7 @@ static Relocation *getRISCVPCRelHi20(const Symbol *sym, uint64_t addend) {
// A TLS symbol's virtual address is relative to the TLS segment. Add a
// target-specific adjustment to produce a thread-pointer-relative offset.
-static int64_t getTlsTpOffset(const Symbol &s) {
+static int64_t getTlsTpOffset(Ctx &ctx, const Symbol &s) {
// On targets that support TLSDESC, _TLS_MODULE_BASE_ at tpoff = 0.
if (&s == ctx.sym.tlsModuleBase)
return 0;
@@ -906,12 +906,12 @@ uint64_t InputSectionBase::getRelocTargetVA(Ctx &ctx, const Relocation &r,
// loaders.
if (r.sym->isUndefined())
return a;
- return getTlsTpOffset(*r.sym) + a;
+ return getTlsTpOffset(ctx, *r.sym) + a;
case R_RELAX_TLS_GD_TO_LE_NEG:
case R_TPREL_NEG:
if (r.sym->isUndefined())
return a;
- return -getTlsTpOffset(*r.sym) + a;
+ return -getTlsTpOffset(ctx, *r.sym) + a;
case R_SIZE:
return r.sym->getSize() + a;
case R_TLSDESC:
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index a8b24256fe0c43..f3f95ec589bd82 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -239,7 +239,7 @@ void LinkerScript::addSymbol(SymbolAssignment *cmd) {
// This function is called from LinkerScript::declareSymbols.
// It creates a placeholder symbol if needed.
-static void declareSymbol(SymbolAssignment *cmd) {
+void LinkerScript::declareSymbol(SymbolAssignment *cmd) {
if (!shouldDefineSym(cmd))
return;
diff --git a/lld/ELF/LinkerScript.h b/lld/ELF/LinkerScript.h
index db6a8c8e147ac6..4aa030a37fc0f4 100644
--- a/lld/ELF/LinkerScript.h
+++ b/lld/ELF/LinkerScript.h
@@ -303,6 +303,7 @@ class LinkerScript final {
StringRef getOutputSectionName(const InputSectionBase *s) const;
void addSymbol(SymbolAssignment *cmd);
+ void declareSymbol(SymbolAssignment *cmd);
void assignSymbol(SymbolAssignment *cmd, bool inSec);
void setDot(Expr e, const Twine &loc, bool inSec);
void expandOutputSection(uint64_t size);
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index 3468420b3bb0bb..408dbdc43d5481 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -896,7 +896,7 @@ void OutputSection::checkDynRelAddends(Ctx &ctx) {
: ctx.target->getImplicitAddend(relocTarget, rel.type);
if (addend != writtenAddend)
internalLinkerError(
- getErrorLocation(relocTarget),
+ getErrorLoc(ctx, relocTarget),
"wrote incorrect addend value 0x" + utohexstr(writtenAddend) +
" instead of 0x" + utohexstr(addend) +
" for dynamic relocation " + toString(rel.type) +
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index be04f9776bcd60..0842c15974d130 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -225,7 +225,7 @@ void Symbol::parseSymbolVersion() {
if (isDefault)
verstr = verstr.substr(1);
- for (const VersionDefinition &ver : namedVersionDefs()) {
+ for (const VersionDefinition &ver : namedVersionDefs(ctx)) {
if (ver.name != verstr)
continue;
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 587c7333869b1c..88f0ccf1c4b730 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -1280,9 +1280,7 @@ void StringTableSection::writeTo(Ctx &ctx, uint8_t *buf) {
// Returns the number of entries in .gnu.version_d: the number of
// non-VER_NDX_LOCAL-non-VER_NDX_GLOBAL definitions, plus 1.
// Note that we don't support vd_cnt > 1 yet.
-static unsigned getVerDefNum() {
- return namedVersionDefs().size() + 1;
-}
+static unsigned getVerDefNum() { return namedVersionDefs(ctx).size() + 1; }
template <class ELFT>
DynamicSection<ELFT>::DynamicSection()
@@ -3691,7 +3689,7 @@ StringRef VersionDefinitionSection::getFileDefName() {
void VersionDefinitionSection::finalizeContents(Ctx &) {
fileDefNameOff = getPartition().dynStrTab->addString(getFileDefName());
- for (const VersionDefinition &v : namedVersionDefs())
+ for (const VersionDefinition &v : namedVersionDefs(ctx))
verDefNameOffs.push_back(getPartition().dynStrTab->addString(v.name));
if (OutputSection *sec = getPartition().dynStrTab->getParent())
@@ -3725,7 +3723,7 @@ void VersionDefinitionSection::writeTo(Ctx &ctx, uint8_t *buf) {
writeOne(buf, 1, getFileDefName(), fileDefNameOff);
auto nameOffIt = verDefNameOffs.begin();
- for (const VersionDefinition &v : namedVersionDefs()) {
+ for (const VersionDefinition &v : namedVersionDefs(ctx)) {
buf += EntrySize;
writeOne(buf, v.id, v.name, *nameOffIt++);
}
@@ -4586,13 +4584,14 @@ static size_t computeOrWriteULEB128(uint64_t v, uint8_t *buf, size_t offset) {
constexpr uint64_t kMemtagStepSizeBits = 3;
constexpr uint64_t kMemtagGranuleSize = 16;
static size_t
-createMemtagGlobalDescriptors(const SmallVector<const Symbol *, 0> &symbols,
+createMemtagGlobalDescriptors(Ctx &ctx,
+ const SmallVector<const Symbol *, 0> &symbols,
uint8_t *buf = nullptr) {
size_t sectionSize = 0;
uint64_t lastGlobalEnd = 0;
for (const Symbol *sym : symbols) {
- if (!includeInSymtab(*sym))
+ if (!includeInSymtab(ctx, *sym))
continue;
const uint64_t addr = sym->getVA();
const uint64_t size = sym->getSize();
@@ -4638,11 +4637,11 @@ bool MemtagGlobalDescriptors::updateAllocSize(Ctx &ctx) {
}
void MemtagGlobalDescriptors::writeTo(Ctx &ctx, uint8_t *buf) {
- createMemtagGlobalDescriptors(symbols, buf);
+ createMemtagGlobalDescriptors(ctx, symbols, buf);
}
size_t MemtagGlobalDescriptors::getSize(Ctx &ctx) const {
- return createMemtagGlobalDescriptors(symbols);
+ return createMemtagGlobalDescriptors(ctx, symbols);
}
static OutputSection *findSection(StringRef name) {
@@ -4775,7 +4774,7 @@ template <class ELFT> void elf::createSyntheticSections(Ctx &ctx) {
part.verSym = std::make_unique<VersionTableSection>();
add(*part.verSym);
- if (!namedVersionDefs().empty()) {
+ if (!namedVersionDefs(ctx).empty()) {
part.verDef = std::make_unique<VersionDefinitionSection>();
add(*part.verDef);
}
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp
index d1706fb1f2bbd7..08f12b08bf80b6 100644
--- a/lld/ELF/Target.cpp
+++ b/lld/ELF/Target.cpp
@@ -113,7 +113,7 @@ ErrorPlace elf::getErrorPlace(Ctx &ctx, const uint8_t *loc) {
TargetInfo::~TargetInfo() {}
int64_t TargetInfo::getImplicitAddend(const uint8_t *buf, RelType type) const {
- internalLinkerError(getErrorLocation(buf),
+ internalLinkerError(getErrorLoc(ctx, buf),
"cannot read addend for relocation " + toString(type));
return 0;
}
diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h
index f15b624f505c47..0bc5e3881190e5 100644
--- a/lld/ELF/Target.h
+++ b/lld/ELF/Target.h
@@ -204,7 +204,7 @@ struct ErrorPlace {
// Returns input section and corresponding source string for the given location.
ErrorPlace getErrorPlace(Ctx &ctx, const uint8_t *loc);
-static inline std::string getErrorLocation(const uint8_t *loc) {
+static inline std::string getErrorLoc(Ctx &ctx, const uint8_t *loc) {
return getErrorPlace(ctx, loc).loc;
}
@@ -286,7 +286,7 @@ inline void checkIntUInt(uint8_t *loc, uint64_t v, int n,
inline void checkAlignment(uint8_t *loc, uint64_t v, int n,
const Relocation &rel) {
if ((v & (n - 1)) != 0)
- error(getErrorLocation(loc) + "improper alignment for relocation " +
+ error(getErrorLoc(ctx, loc) + "improper alignment for relocation " +
lld::toString(rel.type) + ": 0x" + llvm::utohexstr(v) +
" is not aligned to " + Twine(n) + " bytes");
}
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 72b6276913e6d6..f4a22ea953ec49 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -456,7 +456,7 @@ static bool shouldKeepInSymtab(Ctx &ctx, const Defined &sym) {
return true;
}
-bool lld::elf::includeInSymtab(const Symbol &b) {
+bool elf::includeInSymtab(Ctx &ctx, const Symbol &b) {
if (auto *d = dyn_cast<Defined>(&b)) {
// Always include absolute symbols.
SectionBase *sec = d->section;
@@ -488,7 +488,7 @@ static void demoteAndCopyLocalSymbols(Ctx &ctx) {
if (dr->section && !dr->section->isLive())
demoteDefined(*dr, sectionIndexMap);
- else if (ctx.in.symTab && includeInSymtab(*b) &&
+ else if (ctx.in.symTab && includeInSymtab(ctx, *b) &&
shouldKeepInSymtab(ctx, *dr))
ctx.in.symTab->addSymbol(b);
}
@@ -1862,7 +1862,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
// Now that we have defined all possible global symbols including linker-
// synthesized ones. Visit all symbols to give the finishing touches.
for (Symbol *sym : ctx.symtab->getSymbols()) {
- if (!sym->isUsedInRegularObj || !includeInSymtab(*sym))
+ if (!sym->isUsedInRegularObj || !includeInSymtab(ctx, *sym))
continue;
if (!ctx.arg.relocatable)
sym->binding = sym->computeBinding();
diff --git a/lld/ELF/Writer.h b/lld/ELF/Writer.h
index b7063f62606ba1..bd6efe9cde4a5c 100644
--- a/lld/ELF/Writer.h
+++ b/lld/ELF/Writer.h
@@ -45,7 +45,7 @@ struct PhdrEntry {
};
void addReservedSymbols(Ctx &ctx);
-bool includeInSymtab(const Symbol &b);
+bool includeInSymtab(Ctx &, const Symbol &);
unsigned getSectionRank(Ctx &, OutputSection &osec);
} // namespace lld::elf
More information about the llvm-commits
mailing list