[PATCH] D21607: [ELF] - Proccess 'extern' keyword in version scripts.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 22 06:27:38 PDT 2016
grimar created this revision.
grimar added reviewers: rafael, ruiu.
grimar added subscribers: llvm-commits, grimar.
Herald added a subscriber: emaste.
During investigation about FreeBsd scripts I found that few of them uses
'extern' keyword. This patch just reads all globals inside as regular ones.
Note: I downloaded FreeBsd sources and tried to link with every *.map file in batch mode,
some of them are not script files, so I had to skip them manually.
Seems that this one in combination with D21556 allows to parse all available
FreeBsd version scripts.
http://reviews.llvm.org/D21607
Files:
ELF/SymbolListFile.cpp
test/ELF/version-script-err.s
test/ELF/version-script-extern.s
Index: test/ELF/version-script-extern.s
===================================================================
--- test/ELF/version-script-extern.s
+++ test/ELF/version-script-extern.s
@@ -0,0 +1,34 @@
+# REQUIRES: x86
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+
+# RUN: echo "VERSION_1.0{ \
+# RUN: extern "C++" { \
+# RUN: foo; \
+# RUN: "bar"; \
+# RUN: }; \
+# RUN: }; " > %t1.script
+# RUN: ld.lld --version-script %t1.script -shared %t.o -o %t.so
+# RUN: llvm-readobj -dyn-symbols %t.so | FileCheck %s
+
+# CHECK: DynamicSymbols [
+# CHECK: Symbol {
+# CHECK: Name: bar@@VERSION_1.0
+# CHECK: }
+# CHECK: Symbol {
+# CHECK: Name: foo@@VERSION_1.0
+# CHECK: }
+# CHECK: Symbol {
+# CHECK: Name: zed@
+
+.global foo
+.type foo, @function
+foo:
+
+.global bar
+.type bar, @function
+bar:
+
+.global zed
+.type zed, @function
+zed:
Index: test/ELF/version-script-err.s
===================================================================
--- test/ELF/version-script-err.s
+++ test/ELF/version-script-err.s
@@ -8,3 +8,8 @@
// RUN: not ld.lld --version-script %terr1.script -shared %t.o -o %t.so 2>&1 | \
// RUN: FileCheck -check-prefix=ERR1 %s
// ERR1: unclosed quote
+
+// RUN: echo "VERSION { extern "C--" {}; }; " > %terr2.script
+// RUN: not ld.lld --version-script %terr2.script -shared %t.o -o %t.so 2>&1 | \
+// RUN: FileCheck -check-prefix=ERR2 %s
+// ERR2: unsupported language C-- in extern scope
Index: ELF/SymbolListFile.cpp
===================================================================
--- ELF/SymbolListFile.cpp
+++ ELF/SymbolListFile.cpp
@@ -80,6 +80,7 @@
void parseVersion(StringRef Version);
void parseLocal();
void parseVersionSymbols(StringRef Version);
+ void parseExtern(StringRef Version);
};
void VersionScriptParser::parseVersion(StringRef Version) {
@@ -104,6 +105,19 @@
Config->VersionScriptGlobalByDefault = false;
}
+void VersionScriptParser::parseExtern(StringRef Version) {
+ expect("extern");
+ StringRef Lang = next();
+ if (Lang != "C" && Lang != "C++") {
+ setError("unsupported language " + Lang + " in extern scope");
+ return;
+ }
+ expect("{");
+ parseVersionSymbols(Version);
+ expect("}");
+ expect(";");
+}
+
void VersionScriptParser::parseVersionSymbols(StringRef Version) {
std::vector<StringRef> *Globals;
if (Version.empty()) {
@@ -117,6 +131,10 @@
StringRef Cur = peek();
if (Cur == "}" || Cur == "local:" || Error)
return;
+ if (Cur == "extern") {
+ parseExtern(Version);
+ continue;
+ }
next();
Globals->push_back(Cur);
expect(";");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21607.61539.patch
Type: text/x-patch
Size: 2703 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160622/ce59bf23/attachment.bin>
More information about the llvm-commits
mailing list