mirror of
https://github.com/intel/llvm.git
synced 2026-01-19 09:31:59 +08:00
[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
llvm-svn: 280067
This commit is contained in:
@@ -621,6 +621,18 @@ static SymbolBody *findDemangled(const std::map<std::string, SymbolBody *> &D,
|
||||
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<ELFT>::scanVersionScript() {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
40
lld/test/ELF/version-script-extern-wildcards.s
Normal file
40
lld/test/ELF/version-script-extern-wildcards.s
Normal file
@@ -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,@function
|
||||
_Z3fooi:
|
||||
retq
|
||||
|
||||
.globl _Z3bari
|
||||
.type _Z3bari,@function
|
||||
_Z3bari:
|
||||
retq
|
||||
|
||||
.globl _Z3zedi
|
||||
.type _Z3zedi,@function
|
||||
_Z3zedi:
|
||||
retq
|
||||
Reference in New Issue
Block a user