Handle numbers followed by ":" in linker scripts.
This is a fix for Bugzilla 31813.
The problem is that the tokenizer does not create a separate token for
":" unless there's white space before it. Changed it to always create
a token for ":" and reworked some logic that relied on ":" being
attached to some tokens like "global:" and "local:".
llvm-svn: 294006
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 292547d..34d6be2 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -1938,17 +1938,20 @@
void ScriptParser::readAnonymousDeclaration() {
// Read global symbols first. "global:" is default, so if there's
// no label, we assume global symbols.
- if (consume("global:") || peek() != "local:")
+ if (peek() != "local") {
+ if (consume("global"))
+ expect(":");
Config->VersionScriptGlobals = readSymbols();
-
+ }
readLocals();
expect("}");
expect(";");
}
void ScriptParser::readLocals() {
- if (!consume("local:"))
+ if (!consume("local"))
return;
+ expect(":");
std::vector<SymbolVersion> Locals = readSymbols();
for (SymbolVersion V : Locals) {
if (V.Name == "*") {
@@ -1967,9 +1970,11 @@
Config->VersionDefinitions.push_back({VerStr, VersionId});
// Read global symbols.
- if (consume("global:") || peek() != "local:")
+ if (peek() != "local") {
+ if (consume("global"))
+ expect(":");
Config->VersionDefinitions.back().Globals = readSymbols();
-
+ }
readLocals();
expect("}");
@@ -1993,7 +1998,7 @@
continue;
}
- if (peek() == "}" || peek() == "local:" || Error)
+ if (peek() == "}" || peek() == "local" || Error)
break;
StringRef Tok = next();
Ret.push_back({unquote(Tok), false, hasWildcard(Tok)});