[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