[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:
George Rimar 2016-08-30 09:35:03 +00:00
parent c3ec9d0cbf
commit 397cd87a69
2 changed files with 59 additions and 2 deletions

View File

@ -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;
}
}
}

View 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