Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2022-10-02 00:46:49 +0300
committerFangrui Song <i@maskray.me>2022-10-02 00:46:49 +0300
commit9c626d4a0d4d75c976c9a7c9093ea885fcbd98d5 (patch)
treefde44c74afae10959f7e905d3faa352bdca80469 /lld
parent424c69190c756dac14c70011806c1dd524d5d58f (diff)
[ELF] Remove symtab indirection. NFC
Add LLVM_LIBRARY_VISIBILITY to remove unneeded GOT and unique_ptr indirection.
Diffstat (limited to 'lld')
-rw-r--r--lld/ELF/Arch/PPC64.cpp2
-rw-r--r--lld/ELF/Driver.cpp34
-rw-r--r--lld/ELF/ICF.cpp4
-rw-r--r--lld/ELF/InputFiles.cpp34
-rw-r--r--lld/ELF/InputSection.cpp2
-rw-r--r--lld/ELF/LTO.cpp2
-rw-r--r--lld/ELF/LinkerScript.cpp8
-rw-r--r--lld/ELF/MarkLive.cpp18
-rw-r--r--lld/ELF/Relocations.cpp14
-rw-r--r--lld/ELF/ScriptParser.cpp2
-rw-r--r--lld/ELF/SymbolTable.cpp2
-rw-r--r--lld/ELF/SymbolTable.h3
-rw-r--r--lld/ELF/SyntheticSections.cpp4
-rw-r--r--lld/ELF/Writer.cpp30
14 files changed, 77 insertions, 82 deletions
diff --git a/lld/ELF/Arch/PPC64.cpp b/lld/ELF/Arch/PPC64.cpp
index febcbe6bb245..f2ad3942d43d 100644
--- a/lld/ELF/Arch/PPC64.cpp
+++ b/lld/ELF/Arch/PPC64.cpp
@@ -194,7 +194,7 @@ void elf::writePrefixedInstruction(uint8_t *loc, uint64_t insn) {
static bool addOptional(StringRef name, uint64_t value,
std::vector<Defined *> &defined) {
- Symbol *sym = symtab->find(name);
+ Symbol *sym = symtab.find(name);
if (!sym || sym->isDefined())
return false;
sym->resolve(Defined{/*file=*/nullptr, StringRef(), STB_GLOBAL, STV_HIDDEN,
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 904c0004d066..f452052ee875 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -111,6 +111,7 @@ bool elf::link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS,
ctx->e.initialize(stdoutOS, stderrOS, exitEarly, disableOutput);
ctx->e.cleanupCallback = []() {
elf::ctx.reset();
+ symtab = SymbolTable();
inputSections.clear();
ehInputSections.clear();
@@ -132,7 +133,6 @@ bool elf::link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS,
config = ConfigWrapper();
driver = std::make_unique<LinkerDriver>();
script = std::make_unique<LinkerScript>();
- symtab = std::make_unique<SymbolTable>();
symAux.emplace_back();
@@ -1837,7 +1837,7 @@ static void handleUndefinedGlob(StringRef arg) {
// Calling sym->extract() in the loop is not safe because it may add new
// symbols to the symbol table, invalidating the current iterator.
SmallVector<Symbol *, 0> syms;
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
if (!sym->isPlaceholder() && pat->match(sym->getName()))
syms.push_back(sym);
@@ -1846,7 +1846,7 @@ static void handleUndefinedGlob(StringRef arg) {
}
static void handleLibcall(StringRef name) {
- Symbol *sym = symtab->find(name);
+ Symbol *sym = symtab.find(name);
if (!sym || !sym->isLazy())
return;
@@ -2024,7 +2024,7 @@ static void replaceCommonSymbols() {
// --no-allow-shlib-undefined diagnostics. Similarly, demote lazy symbols.
static void demoteSharedAndLazySymbols() {
llvm::TimeTraceScope timeScope("Demote shared and lazy symbols");
- for (Symbol *sym : symtab->getSymbols()) {
+ for (Symbol *sym : symtab.getSymbols()) {
auto *s = dyn_cast<SharedSymbol>(sym);
if (!(s && !cast<SharedFile>(s->file)->isNeeded) && !sym->isLazy())
continue;
@@ -2054,7 +2054,7 @@ template <class ELFT>
static void findKeepUniqueSections(opt::InputArgList &args) {
for (auto *arg : args.filtered(OPT_keep_unique)) {
StringRef name = arg->getValue();
- auto *d = dyn_cast_or_null<Defined>(symtab->find(name));
+ auto *d = dyn_cast_or_null<Defined>(symtab.find(name));
if (!d || !d->section) {
warn("could not find symbol " + name + " to keep unique");
continue;
@@ -2069,7 +2069,7 @@ static void findKeepUniqueSections(opt::InputArgList &args) {
// Symbols in the dynsym could be address-significant in other executables
// or DSOs, so we conservatively mark them as address-significant.
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
if (sym->includeInDynsym())
markAddrsig(sym);
@@ -2152,7 +2152,7 @@ static void readSymbolPartitionSection(InputSectionBase *s) {
static Symbol *addUnusedUndefined(StringRef name,
uint8_t binding = STB_GLOBAL) {
- return symtab->addSymbol(Undefined{nullptr, name, binding, STV_DEFAULT, 0});
+ return symtab.addSymbol(Undefined{nullptr, name, binding, STV_DEFAULT, 0});
}
static void markBuffersAsDontNeed(bool skipLinkedOutput) {
@@ -2236,7 +2236,7 @@ static std::vector<WrappedSymbol> addWrappedSymbols(opt::InputArgList &args) {
if (!seen.insert(name).second)
continue;
- Symbol *sym = symtab->find(name);
+ Symbol *sym = symtab.find(name);
if (!sym)
continue;
@@ -2277,7 +2277,7 @@ static void combineVersionedSymbol(Symbol &sym,
//
// * There is a definition of foo@v1 and foo@@v1.
// * There is a definition of foo@v1 and foo.
- Defined *sym2 = dyn_cast_or_null<Defined>(symtab->find(sym.getName()));
+ Defined *sym2 = dyn_cast_or_null<Defined>(symtab.find(sym.getName()));
if (!sym2)
return;
const char *suffix2 = sym2->getVersionSuffix();
@@ -2332,7 +2332,7 @@ static void redirectSymbols(ArrayRef<WrappedSymbol> wrapped) {
// symbols with a non-default version (foo@v1) and check whether it should be
// combined with foo or foo@@v1.
if (config->versionDefinitions.size() > 2)
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
if (sym->hasVersionSuffix)
combineVersionedSymbol(*sym, map);
@@ -2348,7 +2348,7 @@ static void redirectSymbols(ArrayRef<WrappedSymbol> wrapped) {
// Update pointers in the symbol table.
for (const WrappedSymbol &w : wrapped)
- symtab->wrap(w.sym, w.real, w.wrap);
+ symtab.wrap(w.sym, w.real, w.wrap);
}
static void checkAndReportMissingFeature(StringRef config, uint32_t features,
@@ -2502,7 +2502,7 @@ void LinkerDriver::link(opt::InputArgList &args) {
// Handle --trace-symbol.
for (auto *arg : args.filtered(OPT_trace_symbol))
- symtab->insert(arg->getValue())->traced = true;
+ symtab.insert(arg->getValue())->traced = true;
// Handle -u/--undefined before input files. If both a.a and b.so define foo,
// -u foo a.a b.so will extract a.a.
@@ -2540,11 +2540,11 @@ void LinkerDriver::link(opt::InputArgList &args) {
// Prevent LTO from removing any definition referenced by -u.
for (StringRef name : config->undefined)
- if (Defined *sym = dyn_cast_or_null<Defined>(symtab->find(name)))
+ if (Defined *sym = dyn_cast_or_null<Defined>(symtab.find(name)))
sym->isUsedInRegularObj = true;
// If an entry symbol is in a static archive, pull out that file now.
- if (Symbol *sym = symtab->find(config->entry))
+ if (Symbol *sym = symtab.find(config->entry))
handleUndefined(sym, "--entry");
// Handle the `--undefined-glob <pattern>` options.
@@ -2552,9 +2552,9 @@ void LinkerDriver::link(opt::InputArgList &args) {
handleUndefinedGlob(pat);
// Mark -init and -fini symbols so that the LTO doesn't eliminate them.
- if (Symbol *sym = dyn_cast_or_null<Defined>(symtab->find(config->init)))
+ if (Symbol *sym = dyn_cast_or_null<Defined>(symtab.find(config->init)))
sym->isUsedInRegularObj = true;
- if (Symbol *sym = dyn_cast_or_null<Defined>(symtab->find(config->fini)))
+ if (Symbol *sym = dyn_cast_or_null<Defined>(symtab.find(config->fini)))
sym->isUsedInRegularObj = true;
// If any of our inputs are bitcode files, the LTO code generator may create
@@ -2633,7 +2633,7 @@ void LinkerDriver::link(opt::InputArgList &args) {
// name "foo@ver1") rather do harm, so we don't call this if -r is given.
if (!config->relocatable) {
llvm::TimeTraceScope timeScope("Process symbol versions");
- symtab->scanVersionScript();
+ symtab.scanVersionScript();
}
// Skip the normal linked output if some LTO options are specified.
diff --git a/lld/ELF/ICF.cpp b/lld/ELF/ICF.cpp
index 84c890f21b3e..3e76a9baba9b 100644
--- a/lld/ELF/ICF.cpp
+++ b/lld/ELF/ICF.cpp
@@ -460,7 +460,7 @@ template <class ELFT> void ICF<ELFT>::run() {
// cannot be merged with the later computeIsPreemptible() pass which is used
// by scanRelocations().
if (config->hasDynSymTab)
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
sym->isPreemptible = computeIsPreemptible(*sym);
// Two text sections may have identical content and relocations but different
@@ -558,7 +558,7 @@ template <class ELFT> void ICF<ELFT>::run() {
d->folded = true;
}
};
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
fold(sym);
parallelForEach(ctx.objectFiles, [&](ELFFileBase *file) {
for (Symbol *sym : file->getLocalSymbols())
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 1c9003d51283..dd581cf777b3 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -616,7 +616,7 @@ template <class ELFT> void ObjFile<ELFT>::parse(bool ignoreComdats) {
bool keepGroup =
(flag & GRP_COMDAT) == 0 || ignoreComdats ||
- symtab->comdatGroups.try_emplace(CachedHashStringRef(signature), this)
+ symtab.comdatGroups.try_emplace(CachedHashStringRef(signature), this)
.second;
if (keepGroup) {
if (config->relocatable)
@@ -754,7 +754,7 @@ void ObjFile<ELFT>::initializeSections(bool ignoreComdats,
ArrayRef<Elf_Word> entries =
cantFail(obj.template getSectionContentsAsArray<Elf_Word>(sec));
if ((entries[0] & GRP_COMDAT) == 0 || ignoreComdats ||
- symtab->comdatGroups.find(CachedHashStringRef(signature))->second ==
+ symtab.comdatGroups.find(CachedHashStringRef(signature))->second ==
this)
selectedGroups.push_back(entries);
break;
@@ -1031,8 +1031,6 @@ InputSectionBase *ObjFile<ELFT>::createInputSection(uint32_t idx,
// its corresponding ELF symbol table.
template <class ELFT>
void ObjFile<ELFT>::initializeSymbols(const object::ELFFile<ELFT> &obj) {
- SymbolTable &symtab = *elf::symtab;
-
ArrayRef<Elf_Sym> eSyms = this->getELFSyms<ELFT>();
symbols.resize(eSyms.size());
@@ -1412,7 +1410,7 @@ template <class ELFT> void SharedFile::parse() {
DenseMap<CachedHashStringRef, SharedFile *>::iterator it;
bool wasInserted;
std::tie(it, wasInserted) =
- symtab->soNames.try_emplace(CachedHashStringRef(soName), this);
+ symtab.soNames.try_emplace(CachedHashStringRef(soName), this);
// If a DSO appears more than once on the command line with and without
// --as-needed, --no-as-needed takes precedence over --as-needed because a
@@ -1447,7 +1445,6 @@ template <class ELFT> void SharedFile::parse() {
SmallString<0> versionedNameBuffer;
// Add symbols to the symbol table.
- SymbolTable &symtab = *elf::symtab;
ArrayRef<Elf_Sym> syms = this->getGlobalELFSyms<ELFT>();
for (size_t i = 0, e = syms.size(); i != e; ++i) {
const Elf_Sym &sym = syms[i];
@@ -1639,7 +1636,7 @@ createBitcodeSymbol(Symbol *&sym, const std::vector<bool> &keptComdats,
uint8_t visibility = mapVisibility(objSym.getVisibility());
if (!sym)
- sym = symtab->insert(saver().save(objSym.getName()));
+ sym = symtab.insert(saver().save(objSym.getName()));
int c = objSym.getComdatIndex();
if (objSym.isUndefined() || (c != -1 && !keptComdats[c])) {
@@ -1665,7 +1662,7 @@ void BitcodeFile::parse() {
for (std::pair<StringRef, Comdat::SelectionKind> s : obj->getComdatTable()) {
keptComdats.push_back(
s.second == Comdat::NoDeduplicate ||
- symtab->comdatGroups.try_emplace(CachedHashStringRef(s.first), this)
+ symtab.comdatGroups.try_emplace(CachedHashStringRef(s.first), this)
.second);
}
@@ -1684,7 +1681,6 @@ void BitcodeFile::parse() {
}
void BitcodeFile::parseLazy() {
- SymbolTable &symtab = *elf::symtab;
symbols.resize(obj->symbols().size());
for (auto [i, irSym] : llvm::enumerate(obj->symbols()))
if (!irSym.isUndefined()) {
@@ -1724,15 +1720,15 @@ void BinaryFile::parse() {
llvm::StringSaver &saver = lld::saver();
- symtab->addAndCheckDuplicate(Defined{nullptr, saver.save(s + "_start"),
- STB_GLOBAL, STV_DEFAULT, STT_OBJECT, 0,
- 0, section});
- symtab->addAndCheckDuplicate(Defined{nullptr, saver.save(s + "_end"),
- STB_GLOBAL, STV_DEFAULT, STT_OBJECT,
- data.size(), 0, section});
- symtab->addAndCheckDuplicate(Defined{nullptr, saver.save(s + "_size"),
- STB_GLOBAL, STV_DEFAULT, STT_OBJECT,
- data.size(), 0, nullptr});
+ symtab.addAndCheckDuplicate(Defined{nullptr, saver.save(s + "_start"),
+ STB_GLOBAL, STV_DEFAULT, STT_OBJECT, 0, 0,
+ section});
+ symtab.addAndCheckDuplicate(Defined{nullptr, saver.save(s + "_end"),
+ STB_GLOBAL, STV_DEFAULT, STT_OBJECT,
+ data.size(), 0, section});
+ symtab.addAndCheckDuplicate(Defined{nullptr, saver.save(s + "_size"),
+ STB_GLOBAL, STV_DEFAULT, STT_OBJECT,
+ data.size(), 0, nullptr});
}
ELFFileBase *elf::createObjFile(MemoryBufferRef mb, StringRef archiveName,
@@ -1760,8 +1756,6 @@ ELFFileBase *elf::createObjFile(MemoryBufferRef mb, StringRef archiveName,
template <class ELFT> void ObjFile<ELFT>::parseLazy() {
const ArrayRef<typename ELFT::Sym> eSyms = this->getELFSyms<ELFT>();
- SymbolTable &symtab = *elf::symtab;
-
symbols.resize(eSyms.size());
for (size_t i = firstGlobal, end = eSyms.size(); i != end; ++i)
if (eSyms[i].st_shndx != SHN_UNDEF)
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index 75563f8cf3d8..a599786e13fb 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -1119,7 +1119,7 @@ static void switchMorestackCallsToMorestackNonSplit(
// If the target adjusted a function's prologue, all calls to
// __morestack inside that function should be switched to
// __morestack_non_split.
- Symbol *moreStackNonSplit = symtab->find("__morestack_non_split");
+ Symbol *moreStackNonSplit = symtab.find("__morestack_non_split");
if (!moreStackNonSplit) {
error("mixing split-stack objects requires a definition of "
"__morestack_non_split");
diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp
index 1e18b4320110..de0f8316a299 100644
--- a/lld/ELF/LTO.cpp
+++ b/lld/ELF/LTO.cpp
@@ -213,7 +213,7 @@ BitcodeCompiler::BitcodeCompiler() {
// Initialize usedStartStop.
if (ctx.bitcodeFiles.empty())
return;
- for (Symbol *sym : symtab->getSymbols()) {
+ for (Symbol *sym : symtab.getSymbols()) {
if (sym->isPlaceholder())
continue;
StringRef s = sym->getName();
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index d59c2c08539b..c9ead13eba90 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -203,7 +203,7 @@ static bool shouldDefineSym(SymbolAssignment *cmd) {
// If a symbol was in PROVIDE(), we need to define it only
// when it is a referenced undefined symbol.
- Symbol *b = symtab->find(cmd->name);
+ Symbol *b = symtab.find(cmd->name);
if (b && !b->isDefined() && !b->isCommon())
return true;
return false;
@@ -236,7 +236,7 @@ void LinkerScript::addSymbol(SymbolAssignment *cmd) {
Defined newSym(nullptr, cmd->name, STB_GLOBAL, visibility, value.type,
symValue, 0, sec);
- Symbol *sym = symtab->insert(cmd->name);
+ Symbol *sym = symtab.insert(cmd->name);
sym->mergeProperties(newSym);
newSym.overwrite(*sym);
sym->isUsedInRegularObj = true;
@@ -254,7 +254,7 @@ static void declareSymbol(SymbolAssignment *cmd) {
nullptr);
// We can't calculate final value right now.
- Symbol *sym = symtab->insert(cmd->name);
+ Symbol *sym = symtab.insert(cmd->name);
sym->mergeProperties(newSym);
newSym.overwrite(*sym);
@@ -1386,7 +1386,7 @@ ExprValue LinkerScript::getSymbolValue(StringRef name, const Twine &loc) {
return 0;
}
- if (Symbol *sym = symtab->find(name)) {
+ if (Symbol *sym = symtab.find(name)) {
if (auto *ds = dyn_cast<Defined>(sym)) {
ExprValue v{ds->section, false, ds->value, loc};
// Retain the original st_type, so that the alias will get the same
diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp
index 80f0473d1f0f..265424800f68 100644
--- a/lld/ELF/MarkLive.cpp
+++ b/lld/ELF/MarkLive.cpp
@@ -213,7 +213,7 @@ template <class ELFT> void MarkLive<ELFT>::run() {
// Preserve externally-visible symbols if the symbols defined by this
// file can interrupt other ELF file's symbols at runtime.
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
if (sym->includeInDynsym() && sym->partition == partition)
markSymbol(sym);
@@ -223,13 +223,13 @@ template <class ELFT> void MarkLive<ELFT>::run() {
return;
}
- markSymbol(symtab->find(config->entry));
- markSymbol(symtab->find(config->init));
- markSymbol(symtab->find(config->fini));
+ markSymbol(symtab.find(config->entry));
+ markSymbol(symtab.find(config->init));
+ markSymbol(symtab.find(config->fini));
for (StringRef s : config->undefined)
- markSymbol(symtab->find(s));
+ markSymbol(symtab.find(s));
for (StringRef s : script->referencedSymbols)
- markSymbol(symtab->find(s));
+ markSymbol(symtab.find(s));
// Mark .eh_frame sections as live because there are usually no relocations
// that point to .eh_frames. Otherwise, the garbage collector would drop
@@ -338,8 +338,8 @@ template <class ELFT> void MarkLive<ELFT>::moveToMain() {
for (InputSectionBase *sec : inputSections) {
if (!sec->isLive() || !isValidCIdentifier(sec->name))
continue;
- if (symtab->find(("__start_" + sec->name).str()) ||
- symtab->find(("__stop_" + sec->name).str()))
+ if (symtab.find(("__start_" + sec->name).str()) ||
+ symtab.find(("__stop_" + sec->name).str()))
enqueue(sec, 0);
}
@@ -354,7 +354,7 @@ template <class ELFT> void elf::markLive() {
// If --gc-sections is not given, retain all input sections.
if (!config->gcSections) {
// If a DSO defines a symbol referenced in a regular object, it is needed.
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
if (auto *s = dyn_cast<SharedSymbol>(sym))
if (s->isUsedInRegularObj && !s->isWeak())
cast<SharedFile>(s->file)->isNeeded = true;
diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp
index 7bd0c1759969..7e03fc5ffb13 100644
--- a/lld/ELF/Relocations.cpp
+++ b/lld/ELF/Relocations.cpp
@@ -275,7 +275,7 @@ static SmallSet<SharedSymbol *, 4> getSymbolsAt(SharedSymbol &ss) {
s.getType() == STT_TLS || s.st_value != ss.value)
continue;
StringRef name = check(s.getName(file.getStringTable()));
- Symbol *sym = symtab->find(name);
+ Symbol *sym = symtab.find(name);
if (auto *alias = dyn_cast_or_null<SharedSymbol>(sym))
ret.insert(alias);
}
@@ -550,7 +550,7 @@ static std::string maybeReportDiscarded(Undefined &sym) {
// If the discarded section is a COMDAT.
StringRef signature = file->getShtGroupSignature(objSections, elfSec);
if (const InputFile *prevailing =
- symtab->comdatGroups.lookup(CachedHashStringRef(signature))) {
+ symtab.comdatGroups.lookup(CachedHashStringRef(signature))) {
msg += "\n>>> section group signature: " + signature.str() +
"\n>>> prevailing definition is in " + toString(prevailing);
if (sym.nonPrevailing) {
@@ -623,7 +623,7 @@ static const Symbol *getAlternativeSpelling(const Undefined &sym,
return s;
// If in the symbol table and not undefined.
- if (const Symbol *s = symtab->find(newName))
+ if (const Symbol *s = symtab.find(newName))
if (!s->isUndefined())
return s;
@@ -672,7 +672,7 @@ static const Symbol *getAlternativeSpelling(const Undefined &sym,
for (auto &it : map)
if (name.equals_insensitive(it.first))
return it.second;
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
if (!sym->isUndefined() && name.equals_insensitive(sym->getName()))
return sym;
@@ -698,7 +698,7 @@ static const Symbol *getAlternativeSpelling(const Undefined &sym,
break;
}
if (!s)
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
if (canSuggestExternCForCXX(name, sym->getName())) {
s = sym;
break;
@@ -1748,7 +1748,7 @@ void elf::postScanRelocations() {
}
assert(symAux.size() == 1);
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
fn(*sym);
// Local symbols may need the aforementioned non-preemptible ifunc and GOT
@@ -2263,7 +2263,7 @@ bool elf::hexagonNeedsTLSSymbol(ArrayRef<OutputSection *> outputSections) {
}
void elf::hexagonTLSSymbolUpdate(ArrayRef<OutputSection *> outputSections) {
- Symbol *sym = symtab->find("__tls_get_addr");
+ Symbol *sym = symtab.find("__tls_get_addr");
if (!sym)
return;
bool needEntry = true;
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index 7fc50b293b15..111f168efdfe 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -1449,7 +1449,7 @@ Expr ScriptParser::readPrimary() {
if (tok == "DEFINED") {
StringRef name = unquote(readParenLiteral());
return [=] {
- Symbol *b = symtab->find(name);
+ Symbol *b = symtab.find(name);
return (b && b->isDefined()) ? 1 : 0;
};
}
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 7852127c895d..8ee3365c32c6 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -28,7 +28,7 @@ using namespace llvm::ELF;
using namespace lld;
using namespace lld::elf;
-std::unique_ptr<SymbolTable> elf::symtab;
+SymbolTable elf::symtab;
void SymbolTable::wrap(Symbol *sym, Symbol *real, Symbol *wrap) {
// Redirect __real_foo to the original foo and foo to the original __wrap_foo.
diff --git a/lld/ELF/SymbolTable.h b/lld/ELF/SymbolTable.h
index 7d6ab93585e6..51a34c797497 100644
--- a/lld/ELF/SymbolTable.h
+++ b/lld/ELF/SymbolTable.h
@@ -12,6 +12,7 @@
#include "Symbols.h"
#include "llvm/ADT/CachedHashString.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/Support/Compiler.h"
namespace lld::elf {
@@ -87,7 +88,7 @@ private:
llvm::Optional<llvm::StringMap<SmallVector<Symbol *, 0>>> demangledSyms;
};
-extern std::unique_ptr<SymbolTable> symtab;
+LLVM_LIBRARY_VISIBILITY extern SymbolTable symtab;
} // namespace lld::elf
diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp
index 38cd166f2264..52f8948e8b18 100644
--- a/lld/ELF/SyntheticSections.cpp
+++ b/lld/ELF/SyntheticSections.cpp
@@ -1458,10 +1458,10 @@ DynamicSection<ELFT>::computeContents() {
addInt(DT_FINI_ARRAYSZ, Out::finiArray->size);
}
- if (Symbol *b = symtab->find(config->init))
+ if (Symbol *b = symtab.find(config->init))
if (b->isDefined())
addInt(DT_INIT, b->getVA());
- if (Symbol *b = symtab->find(config->fini))
+ if (Symbol *b = symtab.find(config->fini))
if (b->isDefined())
addInt(DT_FINI, b->getVA());
}
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 8428691ecebc..26c6239563dc 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -144,7 +144,7 @@ void elf::copySectionsIntoPartitions() {
static Defined *addOptionalRegular(StringRef name, SectionBase *sec,
uint64_t val, uint8_t stOther = STV_HIDDEN) {
- Symbol *s = symtab->find(name);
+ Symbol *s = symtab.find(name);
if (!s || s->isDefined() || s->isCommon())
return nullptr;
@@ -155,8 +155,8 @@ static Defined *addOptionalRegular(StringRef name, SectionBase *sec,
}
static Defined *addAbsolute(StringRef name) {
- Symbol *sym = symtab->addSymbol(Defined{nullptr, name, STB_GLOBAL, STV_HIDDEN,
- STT_NOTYPE, 0, 0, nullptr});
+ Symbol *sym = symtab.addSymbol(Defined{nullptr, name, STB_GLOBAL, STV_HIDDEN,
+ STT_NOTYPE, 0, 0, nullptr});
sym->isUsedInRegularObj = true;
return cast<Defined>(sym);
}
@@ -174,14 +174,14 @@ void elf::addReservedSymbols() {
// On MIPS O32 ABI, _gp_disp is a magic symbol designates offset between
// start of function and 'gp' pointer into GOT.
- if (symtab->find("_gp_disp"))
+ if (symtab.find("_gp_disp"))
ElfSym::mipsGpDisp = addAbsolute("_gp_disp");
// The __gnu_local_gp is a magic symbol equal to the current value of 'gp'
// pointer. This symbol is used in the code generated by .cpload pseudo-op
// in case of using -mno-shared option.
// https://sourceware.org/ml/binutils/2004-12/msg00094.html
- if (symtab->find("__gnu_local_gp"))
+ if (symtab.find("__gnu_local_gp"))
ElfSym::mipsLocalGp = addAbsolute("__gnu_local_gp");
} else if (config->emachine == EM_PPC) {
// glibc *crt1.o has a undefined reference to _SDA_BASE_. Since we don't
@@ -202,7 +202,7 @@ void elf::addReservedSymbols() {
StringRef gotSymName =
(config->emachine == EM_PPC64) ? ".TOC." : "_GLOBAL_OFFSET_TABLE_";
- if (Symbol *s = symtab->find(gotSymName)) {
+ if (Symbol *s = symtab.find(gotSymName)) {
if (s->isDefined()) {
error(toString(s->file) + " cannot redefine linker defined symbol '" +
gotSymName + "'");
@@ -1278,7 +1278,7 @@ static DenseMap<const InputSectionBase *, int> buildSectionOrder() {
// We want both global and local symbols. We get the global ones from the
// symbol table and iterate the object files for the local ones.
- for (Symbol *sym : symtab->getSymbols())
+ for (Symbol *sym : symtab.getSymbols())
addSym(*sym);
for (ELFFileBase *file : ctx.objectFiles)
@@ -1846,8 +1846,8 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
// Even the author of gold doesn't remember why gold behaves that way.
// https://sourceware.org/ml/binutils/2002-03/msg00360.html
if (mainPart->dynamic->parent)
- symtab->addSymbol(Defined{/*file=*/nullptr, "_DYNAMIC", STB_WEAK, STV_HIDDEN, STT_NOTYPE,
- /*value=*/0, /*size=*/0, mainPart->dynamic.get()})->isUsedInRegularObj = true;
+ symtab.addSymbol(Defined{/*file=*/nullptr, "_DYNAMIC", STB_WEAK, STV_HIDDEN,
+ STT_NOTYPE, /*value=*/0, /*size=*/0, mainPart->dynamic.get()})->isUsedInRegularObj = true;
// Define __rel[a]_iplt_{start,end} symbols if needed.
addRelIpltSymbols();
@@ -1875,7 +1875,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
// 2) is special cased in @tpoff computation. To satisfy 1), we define it as
// an absolute symbol of zero. This is different from GNU linkers which
// define _TLS_MODULE_BASE_ relative to the first TLS section.
- Symbol *s = symtab->find("_TLS_MODULE_BASE_");
+ Symbol *s = symtab.find("_TLS_MODULE_BASE_");
if (s && s->isUndefined()) {
s->resolve(Defined{/*file=*/nullptr, StringRef(), STB_GLOBAL, STV_HIDDEN,
STT_TLS, /*value=*/0, 0,
@@ -1894,7 +1894,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
}
if (config->hasDynSymTab) {
- parallelForEach(symtab->getSymbols(), [](Symbol *sym) {
+ parallelForEach(symtab.getSymbols(), [](Symbol *sym) {
sym->isPreemptible = computeIsPreemptible(*sym);
});
}
@@ -1937,7 +1937,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
for (SharedFile *file : ctx.sharedFiles) {
bool allNeededIsKnown =
llvm::all_of(file->dtNeeded, [&](StringRef needed) {
- return symtab->soNames.count(CachedHashStringRef(needed));
+ return symtab.soNames.count(CachedHashStringRef(needed));
});
if (!allNeededIsKnown)
continue;
@@ -1952,7 +1952,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
llvm::TimeTraceScope timeScope("Add symbols to symtabs");
// Now that we have defined all possible global symbols including linker-
// synthesized ones. Visit all symbols to give the finishing touches.
- for (Symbol *sym : symtab->getSymbols()) {
+ for (Symbol *sym : symtab.getSymbols()) {
if (!sym->isUsedInRegularObj || !includeInSymtab(*sym))
continue;
if (!config->relocatable)
@@ -2009,7 +2009,7 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
// With the outputSections available check for GDPLT relocations
// and add __tls_get_addr symbol if needed.
if (config->emachine == EM_HEXAGON && hexagonNeedsTLSSymbol(outputSections)) {
- Symbol *sym = symtab->addSymbol(Undefined{
+ Symbol *sym = symtab.addSymbol(Undefined{
nullptr, "__tls_get_addr", STB_GLOBAL, STV_DEFAULT, STT_NOTYPE});
sym->isPreemptible = true;
partitions[0].dynSymTab->addSymbol(sym);
@@ -2739,7 +2739,7 @@ template <class ELFT> void Writer<ELFT>::checkSections() {
// 5. the address 0.
static uint64_t getEntryAddr() {
// Case 1, 2 or 3
- if (Symbol *b = symtab->find(config->entry))
+ if (Symbol *b = symtab.find(config->entry))
return b->getVA();
// Case 4