Recommit [ELF] - Versionscript: do not treat non-wildcarded names as wildcards.

Fixed code that was not checked by testcases that are disabled on windows.

Inital commit message:
"[ELF] - Versionscript: do not treat non-wildcarded names as wildcards."
Previously we incorrectly handled cases when symbol name in extern c++ tag
was enclosed in quotes. Next case was treated as wildcard:

GLIBCXX_3.4 {                                                                   
    extern "C++" {  
    "aaa*"
   }
But it should have not. Quotes around aaa here means that we should have do exact
name matching.
That is PR30268 which has name with pointer is interpreted as wildcard by lld:

extern "C++" {                                                              
    "operator delete[](void*)";

Patch fixes the issue.

Differential revision: https://reviews.llvm.org/D24229

llvm-svn: 281045
This commit is contained in:
George Rimar
2016-09-09 13:58:07 +00:00
parent 57d9dfa9ac
commit b5e77c47fb
5 changed files with 45 additions and 13 deletions

View File

@@ -780,12 +780,18 @@ void ScriptParser::addFile(StringRef S) {
}
}
static StringRef unquote(StringRef S) {
if (!S.startswith("\""))
return S;
return S.substr(1, S.size() - 2);
}
void ScriptParser::readAsNeeded() {
expect("(");
bool Orig = Config->AsNeeded;
Config->AsNeeded = true;
while (!Error && !skip(")"))
addFile(next());
addFile(unquote(next()));
Config->AsNeeded = Orig;
}
@@ -811,13 +817,13 @@ void ScriptParser::readGroup() {
if (Tok == "AS_NEEDED")
readAsNeeded();
else
addFile(Tok);
addFile(unquote(Tok));
}
}
void ScriptParser::readInclude() {
StringRef Tok = next();
auto MBOrErr = MemoryBuffer::getFile(Tok);
auto MBOrErr = MemoryBuffer::getFile(unquote(Tok));
if (!MBOrErr) {
setError("cannot open " + Tok);
return;
@@ -833,7 +839,7 @@ void ScriptParser::readOutput() {
expect("(");
StringRef Tok = next();
if (Config->OutputFile.empty())
Config->OutputFile = Tok;
Config->OutputFile = unquote(Tok);
expect(")");
}
@@ -1004,7 +1010,7 @@ Expr ScriptParser::readAssert() {
expect("(");
Expr E = readExpr();
expect(",");
StringRef Msg = next();
StringRef Msg = unquote(next());
expect(")");
return [=](uint64_t Dot) {
uint64_t V = E(Dot);
@@ -1421,13 +1427,14 @@ void ScriptParser::readLocal() {
}
void ScriptParser::readExtern(std::vector<SymbolVersion> *Globals) {
expect("C++");
expect("\"C++\"");
expect("{");
for (;;) {
if (peek() == "}" || Error)
break;
Globals->push_back({next(), true});
bool HasWildcard = !peek().startswith("\"") && hasWildcard(peek());
Globals->push_back({unquote(next()), true, HasWildcard});
expect(";");
}
@@ -1450,7 +1457,7 @@ void ScriptParser::readGlobal(StringRef VerStr) {
if (Cur == "}" || Cur == "local:" || Error)
return;
next();
Globals->push_back({Cur, false});
Globals->push_back({unquote(Cur), false, hasWildcard(Cur)});
expect(";");
}
}