[lld] ac2911e - [ELF] Refactor how exportDynamic is set. NFC
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sat Feb 5 10:25:30 PST 2022
Author: Fangrui Song
Date: 2022-02-05T10:25:25-08:00
New Revision: ac2911e738bb478507b31d7814fc1da1f60ef9ed
URL: https://github.com/llvm/llvm-project/commit/ac2911e738bb478507b31d7814fc1da1f60ef9ed
DIFF: https://github.com/llvm/llvm-project/commit/ac2911e738bb478507b31d7814fc1da1f60ef9ed.diff
LOG: [ELF] Refactor how exportDynamic is set. NFC
Added:
Modified:
lld/ELF/InputFiles.cpp
lld/ELF/LTO.cpp
lld/ELF/Symbols.h
Removed:
################################################################################
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index b5510b3b2736..dcdd80d6a4ea 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -1669,7 +1669,6 @@ createBitcodeSymbol(Symbol *&sym, const std::vector<bool> &keptComdats,
uint8_t binding = objSym.isWeak() ? STB_WEAK : STB_GLOBAL;
uint8_t type = objSym.isTLS() ? STT_TLS : STT_NOTYPE;
uint8_t visibility = mapVisibility(objSym.getVisibility());
- bool canOmitFromDynSym = objSym.canBeOmittedFromSymbolTable();
StringRef name;
if (sym) {
@@ -1682,8 +1681,6 @@ createBitcodeSymbol(Symbol *&sym, const std::vector<bool> &keptComdats,
int c = objSym.getComdatIndex();
if (objSym.isUndefined() || (c != -1 && !keptComdats[c])) {
Undefined newSym(&f, name, binding, visibility, type);
- if (canOmitFromDynSym)
- newSym.exportDynamic = false;
sym->resolve(newSym);
sym->referenced = true;
return;
@@ -1695,7 +1692,7 @@ createBitcodeSymbol(Symbol *&sym, const std::vector<bool> &keptComdats,
objSym.getCommonSize()});
} else {
Defined newSym(&f, name, binding, visibility, type, 0, 0, nullptr);
- if (canOmitFromDynSym)
+ if (objSym.canBeOmittedFromSymbolTable())
newSym.exportDynamic = false;
sym->resolve(newSym);
}
diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp
index 5c10df489d91..e409e86f9c34 100644
--- a/lld/ELF/LTO.cpp
+++ b/lld/ELF/LTO.cpp
@@ -254,7 +254,7 @@ void BitcodeCompiler::add(BitcodeFile &f) {
// Identify symbols exported dynamically, and that therefore could be
// referenced by a shared library not visible to the linker.
r.ExportDynamic = sym->computeBinding() != STB_LOCAL &&
- (sym->isExportDynamic(sym->kind()) ||
+ (config->shared || config->exportDynamic ||
sym->exportDynamic || sym->inDynamicList);
const auto *dr = dyn_cast<Defined>(sym);
r.FinalDefinitionInLinkageUnit =
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index 22d57e54d2f0..a306cdd3a01f 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -228,10 +228,6 @@ class Symbol {
// non-lazy object causes a runtime error.
void extract() const;
- static bool isExportDynamic(Kind k) {
- return k == SharedKind || config->shared || config->exportDynamic;
- }
-
private:
void resolveUndefined(const Undefined &other);
void resolveCommon(const CommonSymbol &other);
@@ -250,14 +246,14 @@ class Symbol {
binding(binding), type(type), stOther(stOther), symbolKind(k),
visibility(stOther & 3),
isUsedInRegularObj(!file || file->kind() == InputFile::ObjKind),
- exportDynamic(isExportDynamic(k)), inDynamicList(false),
- canInline(false), referenced(false), traced(false),
- hasVersionSuffix(false), isInIplt(false), gotInIgot(false),
- isPreemptible(false), used(!config->gcSections), folded(false),
- needsTocRestore(false), scriptDefined(false), needsCopy(false),
- needsGot(false), needsPlt(false), needsTlsDesc(false),
- needsTlsGd(false), needsTlsGdToIe(false), needsTlsLd(false),
- needsGotDtprel(false), needsTlsIe(false), hasDirectReloc(false) {}
+ exportDynamic(false), inDynamicList(false), canInline(false),
+ referenced(false), traced(false), hasVersionSuffix(false),
+ isInIplt(false), gotInIgot(false), isPreemptible(false),
+ used(!config->gcSections), folded(false), needsTocRestore(false),
+ scriptDefined(false), needsCopy(false), needsGot(false),
+ needsPlt(false), needsTlsDesc(false), needsTlsGd(false),
+ needsTlsGdToIe(false), needsTlsLd(false), needsGotDtprel(false),
+ needsTlsIe(false), hasDirectReloc(false) {}
public:
// True if this symbol is in the Iplt sub-section of the Plt and the Igot
@@ -330,7 +326,9 @@ class Defined : public Symbol {
Defined(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) {}
+ size(size), section(section) {
+ exportDynamic = config->shared || config->exportDynamic;
+ }
static bool classof(const Symbol *s) { return s->isDefined(); }
@@ -365,7 +363,9 @@ class CommonSymbol : public Symbol {
CommonSymbol(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) {}
+ alignment(alignment), size(size) {
+ exportDynamic = config->shared || config->exportDynamic;
+ }
static bool classof(const Symbol *s) { return s->isCommon(); }
@@ -396,6 +396,7 @@ class SharedSymbol : public Symbol {
: Symbol(SharedKind, &file, name, binding, stOther, type), value(value),
size(size), alignment(alignment) {
this->verdefIndex = verdefIndex;
+ exportDynamic = true;
// GNU ifunc is a mechanism to allow user-supplied functions to
// resolve PLT slot values at load-time. This is contrary to the
// regular symbol resolution scheme in which symbols are resolved just
More information about the llvm-commits
mailing list