[lld] 2a26292 - [ELF] Make isExported accurate early
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 26 20:32:48 PST 2025
Author: Fangrui Song
Date: 2025-01-26T20:32:43-08:00
New Revision: 2a26292388fcab0c857c91b2d08074c33abd37e8
URL: https://github.com/llvm/llvm-project/commit/2a26292388fcab0c857c91b2d08074c33abd37e8
DIFF: https://github.com/llvm/llvm-project/commit/2a26292388fcab0c857c91b2d08074c33abd37e8.diff
LOG: [ELF] Make isExported accurate early
LTO compilation might define symbols not in the symbol table (e.g.
__emutls_v.x in test/ELF/lto/wrap-unreferenced-before-codegen.test).
These symbols have a false `isExported` until
`demoteSymbolsAndComputeIsPreemptible`. This is usually benign as we do
not reference `isExported` that early.
Ensure that `isExported` is correct early. This helps remove a redundant
`isExported` computation in `demoteSymbolsAndComputeIsPreemptible`.
Added:
Modified:
lld/ELF/Driver.cpp
Removed:
################################################################################
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 7e0d3fca31353c..06c93710497ed8 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -2157,9 +2157,12 @@ static void excludeLibs(Ctx &ctx, opt::InputArgList &args) {
ArrayRef<Symbol *> symbols = file->getSymbols();
if (isa<ELFFileBase>(file))
symbols = cast<ELFFileBase>(file)->getGlobalSymbols();
- for (Symbol *sym : symbols)
- if (!sym->isUndefined() && sym->file == file)
+ for (Symbol *sym : symbols) {
+ if (!sym->isUndefined() && sym->file == file) {
sym->versionId = VER_NDX_LOCAL;
+ sym->isExported = false;
+ }
+ }
};
for (ELFFileBase *file : ctx.objectFiles)
@@ -2545,11 +2548,17 @@ void LinkerDriver::compileBitcodeFiles(bool skipLinkedOutput) {
auto *obj = cast<ObjFile<ELFT>>(file.get());
obj->parse(/*ignoreComdats=*/true);
- // Parse '@' in symbol names for non-relocatable output.
+ // For defined symbols in non-relocatable output,
+ // compute isExported and parse '@'.
if (!ctx.arg.relocatable)
- for (Symbol *sym : obj->getGlobalSymbols())
+ for (Symbol *sym : obj->getGlobalSymbols()) {
+ if (!sym->isDefined())
+ continue;
+ if (sym->includeInDynsym(ctx))
+ sym->isExported = true;
if (sym->hasVersionSuffix)
sym->parseSymbolVersion(ctx);
+ }
ctx.objectFiles.push_back(obj);
}
}
@@ -3061,7 +3070,7 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
// Handle --exclude-libs again because lto.tmp may reference additional
// libcalls symbols defined in an excluded archive. This may override
- // versionId set by scanVersionScript().
+ // versionId set by scanVersionScript() and isExported.
if (args.hasArg(OPT_exclude_libs))
excludeLibs(ctx, args);
More information about the llvm-commits
mailing list