[lld] r280067 - [ELF] - Versionscript: support wildcards for extern "c++" tag.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 30 02:35:04 PDT 2016
Author: grimar
Date: Tue Aug 30 04:35:03 2016
New Revision: 280067
URL: http://llvm.org/viewvc/llvm-project?rev=280067&view=rev
Log:
[ELF] - Versionscript: support wildcards for extern "c++" tag.
Previously for extern keyword only names in quotes (exact match) was supported.
Patch adds support for wildcards, so next scripts can be handled properly:
LIBSAMPLE_1.0 {
global:
extern "C++" {
foo*;
};
};
Differential revision: https://reviews.llvm.org/D23794
Added:
lld/trunk/test/ELF/version-script-extern-wildcards.s
Modified:
lld/trunk/ELF/SymbolTable.cpp
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=280067&r1=280066&r2=280067&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Tue Aug 30 04:35:03 2016
@@ -621,6 +621,18 @@ static SymbolBody *findDemangled(const s
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 @@ template <class ELFT> void SymbolTable<E
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;
+ }
}
}
Added: lld/trunk/test/ELF/version-script-extern-wildcards.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/version-script-extern-wildcards.s?rev=280067&view=auto
==============================================================================
--- lld/trunk/test/ELF/version-script-extern-wildcards.s (added)
+++ lld/trunk/test/ELF/version-script-extern-wildcards.s Tue Aug 30 04:35:03 2016
@@ -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
More information about the llvm-commits
mailing list