summaryrefslogtreecommitdiffstats
path: root/lld/ELF/ScriptParser.cpp
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2018-02-01 23:46:17 +0000
committerRui Ueyama <ruiu@google.com>2018-02-01 23:46:17 +0000
commit17324d8b340dd9a3e22a94191b15ebf07a41fcc9 (patch)
tree9967fda80e930b8a01adcb16cc02761d610ea86f /lld/ELF/ScriptParser.cpp
parentb2c3ea760320443f9d4360cbd7fcec1a8b3cc28e (diff)
downloadbcm5719-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.cpp5
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(";");
}
OpenPOWER on IntegriCloud