summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Mikulin <dmitry.mikulin@sony.com>2017-02-07 19:50:47 +0000
committerDmitry Mikulin <dmitry.mikulin@sony.com>2017-02-07 19:50:47 +0000
commitf3965c02462e2f6f8e07823e219cc923e76e5708 (patch)
tree042bf63c02744c1043fad66c8094fbd28b2aa207
parent3877f397cd1d52b5ac6fd5e7d1e208f2d2caa09e (diff)
downloadbcm5719-llvm-f3965c02462e2f6f8e07823e219cc923e76e5708.tar.gz
bcm5719-llvm-f3965c02462e2f6f8e07823e219cc923e76e5708.zip
Handle the case where 'local' is the name of a global in a version script:
{ global : local; local: *; }; llvm-svn: 294343
-rw-r--r--lld/ELF/LinkerScript.cpp2
-rw-r--r--lld/ELF/ScriptParser.cpp13
-rw-r--r--lld/ELF/ScriptParser.h2
-rw-r--r--lld/test/ELF/version-script-glob.s27
4 files changed, 37 insertions, 7 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 26e814b1b06..fe0a3cfaa0f 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -1995,7 +1995,7 @@ std::vector<SymbolVersion> ScriptParser::readSymbols() {
continue;
}
- if (peek() == "}" || peek() == "local" || Error)
+ if (peek() == "}" || (peek() == "local" && peek(1) == ":") || Error)
break;
StringRef Tok = next();
Ret.push_back({unquote(Tok), false, hasWildcard(Tok)});
diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp
index 79f3cd38646..474895fe133 100644
--- a/lld/ELF/ScriptParser.cpp
+++ b/lld/ELF/ScriptParser.cpp
@@ -156,11 +156,14 @@ StringRef ScriptParserBase::next() {
return Tokens[Pos++];
}
-StringRef ScriptParserBase::peek() {
- StringRef Tok = next();
- if (Error)
- return "";
- --Pos;
+StringRef ScriptParserBase::peek(unsigned N) {
+ StringRef Tok;
+ for (unsigned I = 0; I <= N; ++I) {
+ Tok = next();
+ if (Error)
+ return "";
+ }
+ Pos = Pos - N - 1;
return Tok;
}
diff --git a/lld/ELF/ScriptParser.h b/lld/ELF/ScriptParser.h
index 264c4979233..42ae2676a43 100644
--- a/lld/ELF/ScriptParser.h
+++ b/lld/ELF/ScriptParser.h
@@ -28,7 +28,7 @@ public:
static StringRef skipSpace(StringRef S);
bool atEOF();
StringRef next();
- StringRef peek();
+ StringRef peek(unsigned N = 0);
void skip();
bool consume(StringRef Tok);
void expect(StringRef Expect);
diff --git a/lld/test/ELF/version-script-glob.s b/lld/test/ELF/version-script-glob.s
index 330c068ba91..8149ead8292 100644
--- a/lld/test/ELF/version-script-glob.s
+++ b/lld/test/ELF/version-script-glob.s
@@ -14,6 +14,9 @@ bar1:
.globl zed1
zed1:
+ .globl local
+local:
+
# CHECK: DynamicSymbols [
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Name:
@@ -43,3 +46,27 @@ zed1:
# CHECK-NEXT: Section: .text
# CHECK-NEXT: }
# CHECK-NEXT: ]
+
+# RUN: echo "{ global : local; local: *; };" > %t1.script
+# RUN: ld.lld -shared --version-script %t1.script %t.o -o %t1.so
+
+# LOCAL: DynamicSymbols [
+# LOCAL-NEXT: Symbol {
+# LOCAL-NEXT: Name:
+# LOCAL-NEXT: Value: 0x0
+# LOCAL-NEXT: Size: 0
+# LOCAL-NEXT: Binding: Local
+# LOCAL-NEXT: Type: None
+# LOCAL-NEXT: Other: 0
+# LOCAL-NEXT: Section: Undefined
+# LOCAL-NEXT: }
+# LOCAL-NEXT: Symbol {
+# LOCAL-NEXT: Name: local
+# LOCAL-NEXT: Value: 0x1000
+# LOCAL-NEXT: Size: 0
+# LOCAL-NEXT: Binding: Global
+# LOCAL-NEXT: Type: None
+# LOCAL-NEXT: Other: 0
+# LOCAL-NEXT: Section: .text
+# LOCAL-NEXT: }
+# LOCAL-NEXT: ]
OpenPOWER on IntegriCloud