diff options
author | Rui Ueyama <ruiu@google.com> | 2018-02-01 23:46:17 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2018-02-01 23:46:17 +0000 |
commit | 17324d8b340dd9a3e22a94191b15ebf07a41fcc9 (patch) | |
tree | 9967fda80e930b8a01adcb16cc02761d610ea86f /lld/ELF/ScriptParser.cpp | |
parent | b2c3ea760320443f9d4360cbd7fcec1a8b3cc28e (diff) | |
download | bcm5719-llvm-17324d8b340dd9a3e22a94191b15ebf07a41fcc9.tar.gz bcm5719-llvm-17324d8b340dd9a3e22a94191b15ebf07a41fcc9.zip |
Relax the grammar of the version script.
In GNU linkers, the last semicolon is optional. We can't link libstdc++
with lld because of that difference.
Differential Revision: https://reviews.llvm.org/D42820
llvm-svn: 324036
Diffstat (limited to 'lld/ELF/ScriptParser.cpp')
-rw-r--r-- | lld/ELF/ScriptParser.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 3e5975f3038..9f3eeda8b58 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -1233,6 +1233,9 @@ ScriptParser::readSymbols() { // Reads an "extern C++" directive, e.g., // "extern "C++" { ns::*; "f(int, double)"; };" +// +// The last semicolon is optional. E.g. this is OK: +// "extern "C++" { ns::*; "f(int, double)" };" std::vector<SymbolVersion> ScriptParser::readVersionExtern() { StringRef Tok = next(); bool IsCXX = Tok == "\"C++\""; @@ -1245,6 +1248,8 @@ std::vector<SymbolVersion> ScriptParser::readVersionExtern() { StringRef Tok = next(); bool HasWildcard = !Tok.startswith("\"") && hasWildcard(Tok); Ret.push_back({unquote(Tok), IsCXX, HasWildcard}); + if (consume("}")) + return Ret; expect(";"); } |