[lld] fe8af49 - [ELF] Pass Ctx & to Defined & CommonSymbol
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 19 18:38:22 PDT 2024
Author: Fangrui Song
Date: 2024-10-20T01:38:16Z
New Revision: fe8af49a1bf73055941d7aba5d1d2f8e894e8022
URL: https://github.com/llvm/llvm-project/commit/fe8af49a1bf73055941d7aba5d1d2f8e894e8022
DIFF: https://github.com/llvm/llvm-project/commit/fe8af49a1bf73055941d7aba5d1d2f8e894e8022.diff
LOG: [ELF] Pass Ctx & to Defined & CommonSymbol
Added:
Modified:
lld/ELF/Arch/ARM.cpp
lld/ELF/Arch/PPC64.cpp
lld/ELF/Driver.cpp
lld/ELF/InputFiles.cpp
lld/ELF/LinkerScript.cpp
lld/ELF/Relocations.cpp
lld/ELF/Symbols.h
lld/ELF/SyntheticSections.cpp
lld/ELF/Writer.cpp
Removed:
################################################################################
diff --git a/lld/ELF/Arch/ARM.cpp b/lld/ELF/Arch/ARM.cpp
index 9bb3604ce61cc5..1cc396aa395d3b 100644
--- a/lld/ELF/Arch/ARM.cpp
+++ b/lld/ELF/Arch/ARM.cpp
@@ -1439,8 +1439,8 @@ void ArmCmseSGSection::finalizeContents() {
for (size_t i = 0; i < sgVeneers.size(); ++i) {
ArmCmseSGVeneer *s = sgVeneers[i];
s->offset = i * s->size;
- Defined(file, StringRef(), s->sym->binding, s->sym->stOther, s->sym->type,
- s->offset | 1, s->size, this)
+ Defined(ctx, file, StringRef(), s->sym->binding, s->sym->stOther,
+ s->sym->type, s->offset | 1, s->size, this)
.overwrite(*s->sym);
}
}
@@ -1474,7 +1474,7 @@ template <typename ELFT> void elf::writeARMCmseImportLib(Ctx &ctx) {
for (auto &p : ctx.symtab->cmseSymMap) {
Defined *d = cast<Defined>(p.second.sym);
impSymTab->addSymbol(makeDefined(
- ctx.internalFile, d->getName(), d->computeBinding(ctx),
+ ctx, ctx.internalFile, d->getName(), d->computeBinding(ctx),
/*stOther=*/0, STT_FUNC, d->getVA(), d->getSize(), nullptr));
}
diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index d937492fe440d7..9f550745f93b2a 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -254,7 +254,7 @@ static bool addOptional(Ctx &ctx, StringRef name, uint64_t value,
Symbol *sym = ctx.symtab->find(name);
if (!sym || sym->isDefined())
return false;
- sym->resolve(ctx, Defined{ctx.internalFile, StringRef(), STB_GLOBAL,
+ sym->resolve(ctx, Defined{ctx, ctx.internalFile, StringRef(), STB_GLOBAL,
STV_HIDDEN, STT_FUNC, value,
/*size=*/0, /*section=*/nullptr});
defined.push_back(cast<Defined>(sym));
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index fb77e67e9fc5ca..0d7712f904dab8 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -2375,7 +2375,7 @@ static void replaceCommonSymbols(Ctx &ctx) {
auto *bss = make<BssSection>(ctx, "COMMON", s->size, s->alignment);
bss->file = s->file;
ctx.inputSections.push_back(bss);
- Defined(s->file, StringRef(), s->binding, s->stOther, s->type,
+ Defined(ctx, s->file, StringRef(), s->binding, s->stOther, s->type,
/*value=*/0, s->size, bss)
.overwrite(*s);
}
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 3d02ef8b77abaa..0d3db373138874 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -1156,14 +1156,14 @@ void ObjFile<ELFT>::initializeSymbols(const object::ELFFile<ELFT> &obj) {
fatal(toString(this) + ": common symbol '" + sym->getName() +
"' has invalid alignment: " + Twine(value));
hasCommonSyms = true;
- sym->resolve(ctx, CommonSymbol{this, StringRef(), binding, stOther, type,
- value, size});
+ sym->resolve(ctx, CommonSymbol{ctx, this, StringRef(), binding, stOther,
+ type, value, size});
continue;
}
// Handle global defined symbols. Defined::section will be set in postParse.
- sym->resolve(ctx, Defined{this, StringRef(), binding, stOther, type, value,
- size, nullptr});
+ sym->resolve(ctx, Defined{ctx, this, StringRef(), binding, stOther, type,
+ value, size, nullptr});
}
// Undefined symbols (excluding those defined relative to non-prevailing
@@ -1219,7 +1219,7 @@ void ObjFile<ELFT>::initSectionsAndLocalSyms(bool ignoreComdats) {
new (symbols[i]) Undefined(this, name, STB_LOCAL, eSym.st_other, type,
/*discardedSecIdx=*/secIdx);
else
- new (symbols[i]) Defined(this, name, STB_LOCAL, eSym.st_other, type,
+ new (symbols[i]) Defined(ctx, this, name, STB_LOCAL, eSym.st_other, type,
eSym.st_value, eSym.st_size, sec);
symbols[i]->partition = 1;
symbols[i]->isUsedInRegularObj = true;
@@ -1765,11 +1765,12 @@ static void createBitcodeSymbol(Ctx &ctx, Symbol *&sym,
}
if (objSym.isCommon()) {
- sym->resolve(ctx, CommonSymbol{&f, StringRef(), binding, visibility,
+ sym->resolve(ctx, CommonSymbol{ctx, &f, StringRef(), binding, visibility,
STT_OBJECT, objSym.getCommonAlignment(),
objSym.getCommonSize()});
} else {
- Defined newSym(&f, StringRef(), binding, visibility, type, 0, 0, nullptr);
+ Defined newSym(ctx, &f, StringRef(), binding, visibility, type, 0, 0,
+ nullptr);
if (objSym.canBeOmittedFromSymbolTable())
newSym.exportDynamic = false;
sym->resolve(ctx, newSym);
@@ -1849,14 +1850,14 @@ void BinaryFile::parse() {
llvm::StringSaver &saver = lld::saver();
- ctx.symtab->addAndCheckDuplicate(ctx, Defined{this, saver.save(s + "_start"),
- STB_GLOBAL, STV_DEFAULT,
- STT_OBJECT, 0, 0, section});
ctx.symtab->addAndCheckDuplicate(
- ctx, Defined{this, saver.save(s + "_end"), STB_GLOBAL, STV_DEFAULT,
+ ctx, Defined{ctx, this, saver.save(s + "_start"), STB_GLOBAL, STV_DEFAULT,
+ STT_OBJECT, 0, 0, section});
+ ctx.symtab->addAndCheckDuplicate(
+ ctx, Defined{ctx, this, saver.save(s + "_end"), STB_GLOBAL, STV_DEFAULT,
STT_OBJECT, data.size(), 0, section});
ctx.symtab->addAndCheckDuplicate(
- ctx, Defined{this, saver.save(s + "_size"), STB_GLOBAL, STV_DEFAULT,
+ ctx, Defined{ctx, this, saver.save(s + "_size"), STB_GLOBAL, STV_DEFAULT,
STT_OBJECT, data.size(), 0, nullptr});
}
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 0560065ffa4780..d2088b4c648180 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -227,8 +227,8 @@ void LinkerScript::addSymbol(SymbolAssignment *cmd) {
// write expressions like this: `alignment = 16; . = ALIGN(., alignment)`.
uint64_t symValue = value.sec ? 0 : value.getValue();
- Defined newSym(createInternalFile(ctx, cmd->location), cmd->name, STB_GLOBAL,
- visibility, value.type, symValue, 0, sec);
+ Defined newSym(ctx, createInternalFile(ctx, cmd->location), cmd->name,
+ STB_GLOBAL, visibility, value.type, symValue, 0, sec);
Symbol *sym = ctx.symtab->insert(cmd->name);
sym->mergeProperties(newSym);
@@ -244,7 +244,7 @@ void LinkerScript::declareSymbol(SymbolAssignment *cmd) {
return;
uint8_t visibility = cmd->hidden ? STV_HIDDEN : STV_DEFAULT;
- Defined newSym(ctx.internalFile, cmd->name, STB_GLOBAL, visibility,
+ Defined newSym(ctx, ctx.internalFile, cmd->name, STB_GLOBAL, visibility,
STT_NOTYPE, 0, 0, nullptr);
// If the symbol is already defined, its order is 0 (with absence indicating
diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index 0188d658f9210e..c8dcc276c30a66 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -315,10 +315,10 @@ static SmallSet<SharedSymbol *, 4> getSymbolsAt(Ctx &ctx, SharedSymbol &ss) {
// in .bss and in the case of a canonical plt entry it is in .plt. This function
// replaces the existing symbol with a Defined pointing to the appropriate
// location.
-static void replaceWithDefined(Symbol &sym, SectionBase &sec, uint64_t value,
- uint64_t size) {
+static void replaceWithDefined(Ctx &ctx, Symbol &sym, SectionBase &sec,
+ uint64_t value, uint64_t size) {
Symbol old = sym;
- Defined(sym.file, StringRef(), sym.binding, sym.stOther, sym.type, value,
+ Defined(ctx, sym.file, StringRef(), sym.binding, sym.stOther, sym.type, value,
size, &sec)
.overwrite(sym);
@@ -398,7 +398,7 @@ template <class ELFT> static void addCopyRelSymbol(Ctx &ctx, SharedSymbol &ss) {
// dynamic symbol for each one. This causes the copy relocation to correctly
// interpose any aliases.
for (SharedSymbol *sym : getSymbolsAt<ELFT>(ctx, ss))
- replaceWithDefined(*sym, *sec, 0, sym->size);
+ replaceWithDefined(ctx, *sym, *sec, 0, sym->size);
ctx.mainPart->relaDyn->addSymbolReloc(ctx.target->copyRel, *sec, 0, ss);
}
@@ -1807,7 +1807,7 @@ void elf::postScanRelocations(Ctx &ctx) {
} else {
assert(sym.isFunc() && sym.hasFlag(NEEDS_PLT));
if (!sym.isDefined()) {
- replaceWithDefined(sym, *ctx.in.plt,
+ replaceWithDefined(ctx, sym, *ctx.in.plt,
ctx.target->pltHeaderSize +
ctx.target->pltEntrySize * sym.getPltIdx(ctx),
0);
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index 010ae9742378b9..86abebe79f8db6 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -363,8 +363,9 @@ class Symbol {
// Represents a symbol that is defined in the current output file.
class Defined : public Symbol {
public:
- Defined(InputFile *file, StringRef name, uint8_t binding, uint8_t stOther,
- uint8_t type, uint64_t value, uint64_t size, SectionBase *section)
+ Defined(Ctx &ctx, InputFile *file, StringRef name, uint8_t binding,
+ uint8_t stOther, uint8_t type, uint64_t value, uint64_t size,
+ SectionBase *section)
: Symbol(DefinedKind, file, name, binding, stOther, type), value(value),
size(size), section(section) {
exportDynamic = ctx.arg.exportDynamic;
@@ -401,7 +402,7 @@ class Defined : public Symbol {
// section. (Therefore, the later passes don't see any CommonSymbols.)
class CommonSymbol : public Symbol {
public:
- CommonSymbol(InputFile *file, StringRef name, uint8_t binding,
+ CommonSymbol(Ctx &ctx, InputFile *file, StringRef name, uint8_t binding,
uint8_t stOther, uint8_t type, uint64_t alignment, uint64_t size)
: Symbol(CommonKind, file, name, binding, stOther, type),
alignment(alignment), size(size) {
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index e18e7a32df86c7..f50404ed3016f4 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -276,8 +276,8 @@ InputSection *elf::createInterpSection(Ctx &ctx) {
Defined *elf::addSyntheticLocal(Ctx &ctx, StringRef name, uint8_t type,
uint64_t value, uint64_t size,
InputSectionBase §ion) {
- Defined *s = makeDefined(section.file, name, STB_LOCAL, STV_DEFAULT, type,
- value, size, §ion);
+ Defined *s = makeDefined(ctx, section.file, name, STB_LOCAL, STV_DEFAULT,
+ type, value, size, §ion);
if (ctx.in.symTab)
ctx.in.symTab->addSymbol(s);
@@ -4681,8 +4681,8 @@ static Defined *addOptionalRegular(Ctx &ctx, StringRef name, SectionBase *sec,
if (!s || s->isDefined() || s->isCommon())
return nullptr;
- s->resolve(ctx, Defined{ctx.internalFile, StringRef(), STB_GLOBAL, stOther,
- STT_NOTYPE, val,
+ s->resolve(ctx, Defined{ctx, ctx.internalFile, StringRef(), STB_GLOBAL,
+ stOther, STT_NOTYPE, val,
/*size=*/0, sec});
s->isUsedInRegularObj = true;
return cast<Defined>(s);
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 2cd4478d00cf5d..c237a5f3793a12 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -145,8 +145,8 @@ static Defined *addOptionalRegular(Ctx &ctx, StringRef name, SectionBase *sec,
if (!s || s->isDefined() || s->isCommon())
return nullptr;
- s->resolve(ctx, Defined{ctx.internalFile, StringRef(), STB_GLOBAL, stOther,
- STT_NOTYPE, val,
+ s->resolve(ctx, Defined{ctx, ctx.internalFile, StringRef(), STB_GLOBAL,
+ stOther, STT_NOTYPE, val,
/*size=*/0, sec});
s->isUsedInRegularObj = true;
return cast<Defined>(s);
@@ -158,7 +158,7 @@ void elf::addReservedSymbols(Ctx &ctx) {
if (ctx.arg.emachine == EM_MIPS) {
auto addAbsolute = [&](StringRef name) {
Symbol *sym =
- ctx.symtab->addSymbol(Defined{ctx.internalFile, name, STB_GLOBAL,
+ ctx.symtab->addSymbol(Defined{ctx, ctx.internalFile, name, STB_GLOBAL,
STV_HIDDEN, STT_NOTYPE, 0, 0, nullptr});
sym->isUsedInRegularObj = true;
return cast<Defined>(sym);
@@ -211,9 +211,9 @@ void elf::addReservedSymbols(Ctx &ctx) {
if (ctx.arg.emachine == EM_PPC64)
gotOff = 0x8000;
- s->resolve(ctx,
- Defined{ctx.internalFile, StringRef(), STB_GLOBAL, STV_HIDDEN,
- STT_NOTYPE, gotOff, /*size=*/0, ctx.out.elfHeader});
+ s->resolve(ctx, Defined{ctx, ctx.internalFile, StringRef(), STB_GLOBAL,
+ STV_HIDDEN, STT_NOTYPE, gotOff, /*size=*/0,
+ ctx.out.elfHeader});
ctx.sym.globalOffsetTable = cast<Defined>(s);
}
@@ -534,7 +534,7 @@ template <class ELFT> void Writer<ELFT>::addSectionSymbols() {
// Set the symbol to be relative to the output section so that its st_value
// equals the output section address. Note, there may be a gap between the
// start of the output section and isec.
- ctx.in.symTab->addSymbol(makeDefined(isec->file, "", STB_LOCAL,
+ ctx.in.symTab->addSymbol(makeDefined(ctx, isec->file, "", STB_LOCAL,
/*stOther=*/0, STT_SECTION,
/*value=*/0, /*size=*/0, &osec));
}
@@ -1734,7 +1734,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
// https://sourceware.org/ml/binutils/2002-03/msg00360.html
if (ctx.mainPart->dynamic->parent) {
Symbol *s = ctx.symtab->addSymbol(Defined{
- ctx.internalFile, "_DYNAMIC", STB_WEAK, STV_HIDDEN, STT_NOTYPE,
+ ctx, ctx.internalFile, "_DYNAMIC", STB_WEAK, STV_HIDDEN, STT_NOTYPE,
/*value=*/0, /*size=*/0, ctx.mainPart->dynamic.get()});
s->isUsedInRegularObj = true;
}
@@ -1775,7 +1775,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
// define _TLS_MODULE_BASE_ relative to the first TLS section.
Symbol *s = ctx.symtab->find("_TLS_MODULE_BASE_");
if (s && s->isUndefined()) {
- s->resolve(ctx, Defined{ctx.internalFile, StringRef(), STB_GLOBAL,
+ s->resolve(ctx, Defined{ctx, ctx.internalFile, StringRef(), STB_GLOBAL,
STV_HIDDEN, STT_TLS, /*value=*/0, 0,
/*section=*/nullptr});
ctx.sym.tlsModuleBase = cast<Defined>(s);
More information about the llvm-commits
mailing list