[lld] r273000 - Make local: optional.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 17 06:38:09 PDT 2016


Author: rafael
Date: Fri Jun 17 08:38:09 2016
New Revision: 273000

URL: http://llvm.org/viewvc/llvm-project?rev=273000&view=rev
Log:
Make local: optional.

Doing that in an anonymous version is a bit silly, but this opens the
way for supporting it in general.

Since we don't support actual versions, for now we just disable the
version script if we detect that it is missing a local.

Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/SymbolListFile.cpp
    lld/trunk/ELF/SymbolTable.cpp
    lld/trunk/test/ELF/version-script.s

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=273000&r1=272999&r2=273000&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Fri Jun 17 08:38:09 2016
@@ -88,7 +88,7 @@ struct Configuration {
   bool Threads;
   bool Trace;
   bool Verbose;
-  bool VersionScript = false;
+  bool VersionScriptGlobalByDefault = true;
   bool WarnCommon;
   bool ZCombreloc;
   bool ZDefs;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=273000&r1=272999&r2=273000&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Fri Jun 17 08:38:09 2016
@@ -414,7 +414,6 @@ void LinkerDriver::readConfigs(opt::Inpu
     Config->DynamicList.push_back(Arg->getValue());
 
   if (auto *Arg = Args.getLastArg(OPT_version_script)) {
-    Config->VersionScript = true;
     if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue()))
       parseVersionScript(*Buffer);
   }

Modified: lld/trunk/ELF/SymbolListFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolListFile.cpp?rev=273000&r1=272999&r2=273000&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolListFile.cpp (original)
+++ lld/trunk/ELF/SymbolListFile.cpp Fri Jun 17 08:38:09 2016
@@ -78,24 +78,41 @@ public:
 
 private:
   void parseVersion();
+  void parseLocal();
+  void parseVersionSymbols();
 };
 
 void VersionScriptParser::parseVersion() {
   expect("{");
   if (peek() == "global:") {
     next();
-    while (!Error) {
-      Config->VersionScriptGlobals.push_back(next());
-      expect(";");
-      if (peek() == "local:")
-        break;
-    }
+    parseVersionSymbols();
   }
+  if (peek() == "local:")
+    parseLocal();
+  else
+    parseVersionSymbols();
+
+  expect("}");
+  expect(";");
+}
+
+void VersionScriptParser::parseLocal() {
   expect("local:");
   expect("*");
   expect(";");
-  expect("}");
-  expect(";");
+  Config->VersionScriptGlobalByDefault = false;
+}
+
+void VersionScriptParser::parseVersionSymbols() {
+  for (;;) {
+    StringRef Cur = peek();
+    if (Cur == "}" || Cur == "local:")
+      return;
+    next();
+    Config->VersionScriptGlobals.push_back(Cur);
+    expect(";");
+  }
 }
 
 void VersionScriptParser::run() {

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=273000&r1=272999&r2=273000&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Fri Jun 17 08:38:09 2016
@@ -175,7 +175,7 @@ std::pair<Symbol *, bool> SymbolTable<EL
     Sym->Visibility = STV_DEFAULT;
     Sym->IsUsedInRegularObj = false;
     Sym->ExportDynamic = false;
-    Sym->VersionScriptGlobal = !Config->VersionScript;
+    Sym->VersionScriptGlobal = Config->VersionScriptGlobalByDefault;
     SymVector.push_back(Sym);
   } else {
     Sym = SymVector[P.first->second];

Modified: lld/trunk/test/ELF/version-script.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/version-script.s?rev=273000&r1=272999&r2=273000&view=diff
==============================================================================
--- lld/trunk/test/ELF/version-script.s (original)
+++ lld/trunk/test/ELF/version-script.s Fri Jun 17 08:38:09 2016
@@ -140,6 +140,73 @@
 # EXE-NEXT:   }
 # EXE-NEXT: ]
 
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: ld.lld -shared %t.o %t2.so -o %t.so
+# RUN: llvm-readobj -dyn-symbols %t.so | FileCheck --check-prefix=ALL %s
+
+# RUN: echo "{ global: foo1; foo3; };" > %t2.script
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
+# RUN: ld.lld --version-script %t2.script -shared %t.o %t2.so -o %t.so
+# RUN: llvm-readobj -dyn-symbols %t.so | FileCheck --check-prefix=ALL %s
+
+# ALL:      DynamicSymbols [
+# ALL-NEXT:   Symbol {
+# ALL-NEXT:     Name: @
+# ALL-NEXT:     Value: 0x0
+# ALL-NEXT:     Size: 0
+# ALL-NEXT:     Binding: Local
+# ALL-NEXT:     Type: None
+# ALL-NEXT:     Other: 0
+# ALL-NEXT:     Section: Undefined
+# ALL-NEXT:   }
+# ALL-NEXT:  Symbol {
+# ALL-NEXT:    Name: _start@
+# ALL-NEXT:    Value:
+# ALL-NEXT:    Size: 0
+# ALL-NEXT:    Binding: Global
+# ALL-NEXT:    Type: None
+# ALL-NEXT:    Other: 0
+# ALL-NEXT:    Section: .text
+# ALL-NEXT:  }
+# ALL-NEXT:  Symbol {
+# ALL-NEXT:    Name: bar@
+# ALL-NEXT:    Value:
+# ALL-NEXT:    Size: 0
+# ALL-NEXT:    Binding: Global
+# ALL-NEXT:    Type: Function
+# ALL-NEXT:    Other: 0
+# ALL-NEXT:    Section: Undefined
+# ALL-NEXT:  }
+# ALL-NEXT:  Symbol {
+# ALL-NEXT:    Name: foo1@
+# ALL-NEXT:    Value:
+# ALL-NEXT:    Size: 0
+# ALL-NEXT:    Binding: Global
+# ALL-NEXT:    Type: None
+# ALL-NEXT:    Other: 0
+# ALL-NEXT:    Section: .text
+# ALL-NEXT:  }
+# ALL-NEXT:  Symbol {
+# ALL-NEXT:    Name: foo2@
+# ALL-NEXT:    Value:
+# ALL-NEXT:    Size: 0
+# ALL-NEXT:    Binding: Global
+# ALL-NEXT:    Type: None
+# ALL-NEXT:    Other: 0
+# ALL-NEXT:    Section: .text
+# ALL-NEXT:  }
+# ALL-NEXT:  Symbol {
+# ALL-NEXT:    Name: foo3@
+# ALL-NEXT:    Value:
+# ALL-NEXT:    Size: 0
+# ALL-NEXT:    Binding: Global
+# ALL-NEXT:    Type: None
+# ALL-NEXT:    Other: 0
+# ALL-NEXT:    Section: .text
+# ALL-NEXT:  }
+# ALL-NEXT: ]
+
 .globl foo1
 foo1:
   call bar at PLT




More information about the llvm-commits mailing list