diff options
Diffstat (limited to 'lld/ELF/ScriptParser.cpp')
| -rw-r--r-- | lld/ELF/ScriptParser.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 3bb1de99480f..f90ce6fa7407 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -36,6 +36,7 @@ #include "llvm/Support/TimeProfiler.h" #include <cassert> #include <limits> +#include <optional> #include <vector> using namespace llvm; @@ -138,6 +139,10 @@ private: // A set to detect an INCLUDE() cycle. StringSet<> seen; + + // If we are currently parsing a PROVIDE|PROVIDE_HIDDEN command, + // then this member is set to the PROVIDE symbol name. + std::optional<llvm::StringRef> activeProvideSym; }; } // namespace @@ -1055,6 +1060,9 @@ SymbolAssignment *ScriptParser::readProvideHidden(bool provide, bool hidden) { ; return nullptr; } + llvm::SaveAndRestore saveActiveProvideSym(activeProvideSym); + if (provide) + activeProvideSym = name; SymbolAssignment *cmd = readSymbolAssignment(name); cmd->provide = provide; cmd->hidden = hidden; @@ -1570,7 +1578,10 @@ Expr ScriptParser::readPrimary() { tok = unquote(tok); else if (!isValidSymbolName(tok)) setError("malformed number: " + tok); - script->referencedSymbols.push_back(tok); + if (activeProvideSym) + script->provideMap[*activeProvideSym].push_back(tok); + else + script->referencedSymbols.push_back(tok); return [=] { return script->getSymbolValue(tok, location); }; } |
