[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