Index: lld/trunk/ELF/SymbolListFile.cpp =================================================================== --- lld/trunk/ELF/SymbolListFile.cpp +++ lld/trunk/ELF/SymbolListFile.cpp @@ -75,9 +75,12 @@ 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 @@ 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) { Index: lld/trunk/test/ELF/version-script.s =================================================================== --- lld/trunk/test/ELF/version-script.s +++ lld/trunk/test/ELF/version-script.s @@ -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)