[ELF] Pass Ctx & to SyntheticSections
diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h
index 543ff4d..bf2cf09 100644
--- a/lld/ELF/InputSection.h
+++ b/lld/ELF/InputSection.h
@@ -472,10 +472,12 @@
class SyntheticSection : public InputSection {
public:
+ Ctx &ctx;
SyntheticSection(Ctx &ctx, uint64_t flags, uint32_t type, uint32_t addralign,
StringRef name)
: InputSection(ctx.internalFile, flags, type, addralign, {}, name,
- InputSectionBase::Synthetic) {}
+ InputSectionBase::Synthetic),
+ ctx(ctx) {}
virtual ~SyntheticSection() = default;
virtual size_t getSize(Ctx &) const = 0;
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index a65c137..5d62f08 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -59,7 +59,7 @@
constexpr size_t MergeNoTailSection::numShards;
-static uint64_t readUint(uint8_t *buf) {
+static uint64_t readUint(Ctx &ctx, uint8_t *buf) {
return ctx.arg.is64 ? read64(buf) : read32(buf);
}
@@ -267,7 +267,7 @@
return std::make_unique<MipsReginfoSection<ELFT>>(ctx, reginfo);
}
-InputSection *elf::createInterpSection() {
+InputSection *elf::createInterpSection(Ctx &) {
// StringSaver guarantees that the returned string ends with '\0'.
StringRef s = saver().save(ctx.arg.dynamicLinker);
ArrayRef<uint8_t> contents = {(const uint8_t *)s.data(), s.size() + 1};
@@ -609,7 +609,7 @@
case DW_EH_PE_sdata8:
return read64(buf);
case DW_EH_PE_absptr:
- return readUint(buf);
+ return readUint(ctx, buf);
}
fatal("unknown FDE size encoding");
}
@@ -1452,7 +1452,8 @@
addInSec(DT_PLTGOT, *ctx.in.plt);
break;
case EM_AARCH64:
- if (llvm::find_if(ctx.in.relaPlt->relocs, [](const DynamicReloc &r) {
+ if (llvm::find_if(ctx.in.relaPlt->relocs, [&ctx = ctx](
+ const DynamicReloc &r) {
return r.type == ctx.target->pltRel &&
r.sym->stOther & STO_AARCH64_VARIANT_PCS;
}) != ctx.in.relaPlt->relocs.end())
@@ -1460,7 +1461,8 @@
addInSec(DT_PLTGOT, *ctx.in.gotPlt);
break;
case EM_RISCV:
- if (llvm::any_of(ctx.in.relaPlt->relocs, [](const DynamicReloc &r) {
+ if (llvm::any_of(ctx.in.relaPlt->relocs, [&ctx = ctx](
+ const DynamicReloc &r) {
return r.type == ctx.target->pltRel &&
(r.sym->stOther & STO_RISCV_VARIANT_CC);
}))
@@ -2441,7 +2443,7 @@
// When C = 64, we choose a word with bits [6:...] and set 1 to two bits in
// the word using bits [0:5] and [26:31].
size_t i = (sym.hash / c) & (maskWords - 1);
- uint64_t val = readUint(buf + i * ctx.arg.wordsize);
+ uint64_t val = readUint(ctx, buf + i * ctx.arg.wordsize);
val |= uint64_t(1) << (sym.hash % c);
val |= uint64_t(1) << ((sym.hash >> Shift2) % c);
writeUint(buf + i * ctx.arg.wordsize, val);
@@ -3513,7 +3515,7 @@
// Returns a newly-created .gdb_index section.
template <class ELFT>
-std::unique_ptr<GdbIndexSection> GdbIndexSection::create(Ctx &) {
+std::unique_ptr<GdbIndexSection> GdbIndexSection::create(Ctx &ctx) {
llvm::TimeTraceScope timeScope("Create gdb index");
// Collect InputFiles with .debug_info. See the comment in
@@ -4684,7 +4686,7 @@
// SyntheticSections coming last.
if (needsInterpSection(ctx)) {
for (size_t i = 1; i <= ctx.partitions.size(); ++i) {
- InputSection *sec = createInterpSection();
+ InputSection *sec = createInterpSection(ctx);
sec->partition = i;
ctx.inputSections.push_back(sec);
}
diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h
index b89860d..283b295 100644
--- a/lld/ELF/SyntheticSections.h
+++ b/lld/ELF/SyntheticSections.h
@@ -554,7 +554,7 @@
(d->type == llvm::ELF::SHT_RELA || d->type == llvm::ELF::SHT_REL ||
d->type == llvm::ELF::SHT_RELR ||
(d->type == llvm::ELF::SHT_AARCH64_AUTH_RELR &&
- ctx.arg.emachine == llvm::ELF::EM_AARCH64));
+ elf::ctx.arg.emachine == llvm::ELF::EM_AARCH64));
}
int32_t dynamicTag, sizeDynamicTag;
SmallVector<DynamicReloc, 0> relocs;
@@ -1433,7 +1433,7 @@
};
template <class ELFT> void createSyntheticSections(Ctx &);
-InputSection *createInterpSection();
+InputSection *createInterpSection(Ctx &);
MergeInputSection *createCommentSection();
template <class ELFT> void splitSections(Ctx &);
void combineEhSections(Ctx &);