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
This commit is contained in:
Rui Ueyama 2018-02-01 23:46:17 +00:00
parent b2c3ea7603
commit 17324d8b34
2 changed files with 9 additions and 8 deletions

View File

@ -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(";");
}

View File

@ -4,12 +4,8 @@
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
# RUN: echo '{ \
# RUN: extern "C" { \
# RUN: foo; \
# RUN: }; \
# RUN: extern "C++" { \
# RUN: bar; \
# RUN: }; \
# RUN: };' > %t.list
# RUN: echo '{ extern "C" { foo; }; extern "C++" { bar; }; };' > %t.list
# RUN: ld.lld --dynamic-list %t.list %t.o -shared -o %t.so
# RUN: echo '{ extern "C" { foo }; extern "C++" { bar }; };' > %t.list
# RUN: ld.lld --dynamic-list %t.list %t.o -shared -o %t.so