[ELF] - Handle every global as unversioned export in versioned script.

Patch updates the version script parser to parse versioned files.
In a simple way, just adding them to VersionScriptGlobals list.

Differential revision: http://reviews.llvm.org/D21439

llvm-svn: 272934
This commit is contained in:
George Rimar 2016-06-16 18:47:04 +00:00
parent dbd68dd09d
commit 95eeb7730d
2 changed files with 54 additions and 3 deletions

View File

@ -75,9 +75,12 @@ public:
VersionScriptParser(StringRef S) : ScriptParserBase(S) {}
void run();
private:
void parseVersion();
};
void VersionScriptParser::run() {
void VersionScriptParser::parseVersion() {
expect("{");
if (peek() == "global:") {
next();
@ -93,8 +96,25 @@ void VersionScriptParser::run() {
expect(";");
expect("}");
expect(";");
if (!atEOF())
setError("expected EOF");
}
void VersionScriptParser::run() {
StringRef Msg = "anonymous version definition is used in "
"combination with other version definitions";
if (peek() == "{") {
parseVersion();
if (!atEOF())
setError(Msg);
return;
}
while (!atEOF() && !Error) {
if (next() == "{") {
setError(Msg);
return;
}
parseVersion();
}
}
void elf::parseVersionScript(MemoryBufferRef MB) {

View File

@ -19,6 +19,37 @@
# RUN: ld.lld --version-script %t.script --dynamic-list %t.list %t.o %t2.so -o %t
# RUN: llvm-readobj -dyn-symbols %t | FileCheck --check-prefix=EXE %s
# RUN: echo "VERSION_1.0{ \
# RUN: global: foo1; \
# RUN: local: *; }; \
# RUN: VERSION_2.0{ \
# RUN: global: foo3; \
# RUN: local: *; }; " > %t4.script
# RUN: ld.lld --version-script %t4.script -shared %t.o %t2.so -o %t4.so
# RUN: llvm-readobj -dyn-symbols %t4.so | FileCheck --check-prefix=DSO %s
# RUN: echo "VERSION_1.0{ \
# RUN: global: foo1; \
# RUN: local: *; }; \
# RUN: { \
# RUN: global: foo3; \
# RUN: local: *; }; " > %t5.script
# RUN: not ld.lld --version-script %t5.script -shared %t.o %t2.so -o %t5.so 2>&1 | \
# RUN: FileCheck -check-prefix=ERR %s
# ERR: anonymous version definition is used in combination with other version definitions
# RUN: echo "{ \
# RUN: global: foo1; \
# RUN: local: *; }; \
# RUN: VERSION_2.0 { \
# RUN: global: foo3; \
# RUN: local: *; }; " > %t5.script
# RUN: not ld.lld --version-script %t5.script -shared %t.o %t2.so -o %t5.so 2>&1 | \
# RUN: FileCheck -check-prefix=ERR %s
# RUN: ld.lld --version-script %t.script --dynamic-list %t.list %t.o %t2.so -o %t2
# RUN: llvm-readobj %t2 > /dev/null
# DSO: DynamicSymbols [
# DSO-NEXT: Symbol {
# DSO-NEXT: Name: @ (0)