From 1ef90d2f25ca2dc6c538949d4f5d4e6f7de18986 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 9 Dec 2016 16:44:05 +0000 Subject: [PATCH] Fix parsing when one extern follows another. llvm-svn: 289224 --- lld/ELF/LinkerScript.cpp | 4 +++- lld/test/ELF/dynamic-list-extern.s | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 lld/test/ELF/dynamic-list-extern.s diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index d5e9487..bf19914 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -1915,9 +1915,11 @@ void ScriptParser::readVersionDeclaration(StringRef VerStr) { std::vector ScriptParser::readSymbols() { std::vector Ret; for (;;) { - if (consume("extern")) + if (consume("extern")) { for (SymbolVersion V : readVersionExtern()) Ret.push_back(V); + continue; + } if (peek() == "}" || peek() == "local:" || Error) break; diff --git a/lld/test/ELF/dynamic-list-extern.s b/lld/test/ELF/dynamic-list-extern.s new file mode 100644 index 0000000..dfeb31d --- /dev/null +++ b/lld/test/ELF/dynamic-list-extern.s @@ -0,0 +1,15 @@ +# REQUIRES: x86 + +# Test that we can parse multiple externs. + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o + +# RUN: echo '{ \ +# RUN: extern "C" { \ +# RUN: foo; \ +# RUN: }; \ +# RUN: extern "C++" { \ +# RUN: bar; \ +# RUN: }; \ +# RUN: };' > %t.list +# RUN: ld.lld --dynamic-list %t.list %t.o -shared -o %t.so -- 2.7.4