[PATCH] D23794: [ELF] - Versionscript: support wildcards for extern "c++" tag.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 30 02:43:21 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL280067: [ELF] - Versionscript: support wildcards for extern "c++" tag. (authored by grimar).
Changed prior to commit:
https://reviews.llvm.org/D23794?vs=69218&id=69656#toc
Repository:
rL LLVM
https://reviews.llvm.org/D23794
Files:
lld/trunk/ELF/SymbolTable.cpp
lld/trunk/test/ELF/version-script-extern-wildcards.s
Index: lld/trunk/test/ELF/version-script-extern-wildcards.s
===================================================================
--- lld/trunk/test/ELF/version-script-extern-wildcards.s
+++ lld/trunk/test/ELF/version-script-extern-wildcards.s
@@ -0,0 +1,40 @@
+# REQUIRES: shell
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: echo "LIBSAMPLE_1.0 { \
+# RUN: global: \
+# RUN: extern "C++" { \
+# RUN: foo*; \
+# RUN: }; \
+# RUN: }; \
+# RUN: LIBSAMPLE_2.0 { \
+# RUN: global: \
+# RUN: extern "C++" { \
+# RUN: zed*; \
+# RUN: bar; \
+# RUN: }; \
+# RUN: }; " > %t.script
+# RUN: ld.lld --version-script %t.script -shared %t.o -o %t.so
+# RUN: llvm-readobj -V -dyn-symbols %t.so | FileCheck %s
+
+# CHECK: Version symbols {
+# CHECK: Symbols [
+# CHECK: Name: _Z3bari@
+# CHECK: Name: _Z3fooi@@LIBSAMPLE_1.0
+# CHECK: Name: _Z3zedi@@LIBSAMPLE_2.0
+
+.text
+.globl _Z3fooi
+.type _Z3fooi, at function
+_Z3fooi:
+retq
+
+.globl _Z3bari
+.type _Z3bari, at function
+_Z3bari:
+retq
+
+.globl _Z3zedi
+.type _Z3zedi, at function
+_Z3zedi:
+retq
Index: lld/trunk/ELF/SymbolTable.cpp
===================================================================
--- lld/trunk/ELF/SymbolTable.cpp
+++ lld/trunk/ELF/SymbolTable.cpp
@@ -621,6 +621,18 @@
return nullptr;
}
+static std::vector<SymbolBody *>
+findAllDemangled(const std::map<std::string, SymbolBody *> &D,
+ StringRef Pattern) {
+ std::vector<SymbolBody *> Res;
+ for (auto &P : D) {
+ SymbolBody *Body = P.second;
+ if (!Body->isUndefined() && globMatch(Pattern, P.first))
+ Res.push_back(Body);
+ }
+ return Res;
+}
+
// This function processes the --version-script option by marking all global
// symbols with the VersionScriptGlobal flag, which acts as a filter on the
// dynamic symbol table.
@@ -665,10 +677,15 @@
for (size_t I = Config->VersionDefinitions.size() - 1; I != (size_t)-1; --I) {
VersionDefinition &V = Config->VersionDefinitions[I];
for (SymbolVersion &Sym : V.Globals)
- if (hasWildcard(Sym.Name))
- for (SymbolBody *B : findAll(Sym.Name))
+ if (hasWildcard(Sym.Name)) {
+ std::vector<SymbolBody *> All =
+ Sym.IsExternCpp ? findAllDemangled(Demangled, Sym.Name)
+ : findAll(Sym.Name);
+
+ for (SymbolBody *B : All)
if (B->symbol()->VersionId == Config->DefaultSymbolVersion)
B->symbol()->VersionId = V.Id;
+ }
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D23794.69656.patch
Type: text/x-patch
Size: 2622 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160830/e4d1c942/attachment.bin>
More information about the llvm-commits
mailing list