diff options
Diffstat (limited to 'lld/ELF/SymbolListFile.cpp')
-rw-r--r-- | lld/ELF/SymbolListFile.cpp | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/lld/ELF/SymbolListFile.cpp b/lld/ELF/SymbolListFile.cpp index b8cfdc88f33..3d1377be438 100644 --- a/lld/ELF/SymbolListFile.cpp +++ b/lld/ELF/SymbolListFile.cpp @@ -78,24 +78,41 @@ public: private: void parseVersion(); + void parseLocal(); + void parseVersionSymbols(); }; void VersionScriptParser::parseVersion() { expect("{"); if (peek() == "global:") { next(); - while (!Error) { - Config->VersionScriptGlobals.push_back(next()); - expect(";"); - if (peek() == "local:") - break; - } + parseVersionSymbols(); } + if (peek() == "local:") + parseLocal(); + else + parseVersionSymbols(); + + expect("}"); + expect(";"); +} + +void VersionScriptParser::parseLocal() { expect("local:"); expect("*"); expect(";"); - expect("}"); - expect(";"); + Config->VersionScriptGlobalByDefault = false; +} + +void VersionScriptParser::parseVersionSymbols() { + for (;;) { + StringRef Cur = peek(); + if (Cur == "}" || Cur == "local:") + return; + next(); + Config->VersionScriptGlobals.push_back(Cur); + expect(";"); + } } void VersionScriptParser::run() { |