[lld] r250711 - [ELF2] - Linker script EXTERN command implemented.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 19 10:35:12 PDT 2015


Author: grimar
Date: Mon Oct 19 12:35:12 2015
New Revision: 250711

URL: http://llvm.org/viewvc/llvm-project?rev=250711&view=rev
Log:
[ELF2] - Linker script EXTERN command implemented.

The reason of collecting all undefines in vector is that during reading files we already need to have Symtab created. Or like was done in that patch - to put undefines from scripts somewhere to delay Symtab.addUndefinedOpt() call.

Differential Revision: http://reviews.llvm.org/D13870

Modified:
    lld/trunk/ELF/Config.h
    lld/trunk/ELF/Driver.cpp
    lld/trunk/ELF/LinkerScript.cpp
    lld/trunk/test/elf2/linkerscript.s
    lld/trunk/test/elf2/undefined-opt.s

Modified: lld/trunk/ELF/Config.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Config.h?rev=250711&r1=250710&r2=250711&view=diff
==============================================================================
--- lld/trunk/ELF/Config.h (original)
+++ lld/trunk/ELF/Config.h Mon Oct 19 12:35:12 2015
@@ -42,6 +42,7 @@ struct Configuration {
   llvm::StringRef Sysroot;
   std::string RPath;
   std::vector<llvm::StringRef> SearchPaths;
+  std::vector<llvm::StringRef> Undefined;
   bool AllowMultipleDefinition;
   bool AsNeeded = false;
   bool Bsymbolic;

Modified: lld/trunk/ELF/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=250711&r1=250710&r2=250711&view=diff
==============================================================================
--- lld/trunk/ELF/Driver.cpp (original)
+++ lld/trunk/ELF/Driver.cpp Mon Oct 19 12:35:12 2015
@@ -155,6 +155,9 @@ void LinkerDriver::createFiles(opt::Inpu
   Config->SoName = getString(Args, OPT_soname);
   Config->Sysroot = getString(Args, OPT_sysroot);
 
+  for (auto *Arg : Args.filtered(OPT_undefined))
+    Config->Undefined.push_back(Arg->getValue());
+
   for (auto *Arg : Args.filtered(OPT_z))
     if (Arg->getValue() == StringRef("now"))
       Config->ZNow = true;
@@ -225,8 +228,8 @@ template <class ELFT> void LinkerDriver:
   for (std::unique_ptr<InputFile> &F : Files)
     Symtab.addFile(std::move(F));
 
-  for (auto *Arg : Args.filtered(OPT_undefined))
-    Symtab.addUndefinedOpt(Arg->getValue());
+  for (auto &U : Config->Undefined)
+    Symtab.addUndefinedOpt(U);
 
   if (Config->OutputFile.empty())
     Config->OutputFile = "a.out";

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=250711&r1=250710&r2=250711&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Mon Oct 19 12:35:12 2015
@@ -43,6 +43,7 @@ private:
 
   void readAsNeeded();
   void readEntry();
+  void readExtern();
   void readGroup();
   void readInclude();
   void readOutput();
@@ -63,6 +64,8 @@ void LinkerScript::run() {
       continue;
     if (Tok == "ENTRY") {
       readEntry();
+    } else if (Tok == "EXTERN") {
+      readExtern();
     } else if (Tok == "GROUP" || Tok == "INPUT") {
       readGroup();
     } else if (Tok == "INCLUDE") {
@@ -181,6 +184,16 @@ void LinkerScript::readEntry() {
   expect(")");
 }
 
+void LinkerScript::readExtern() {
+  expect("(");
+  for (;;) {
+    StringRef Tok = next();
+    if (Tok == ")")
+      return;
+    Config->Undefined.push_back(Tok);
+  }
+}
+
 void LinkerScript::readGroup() {
   expect("(");
   for (;;) {

Modified: lld/trunk/test/elf2/linkerscript.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/linkerscript.s?rev=250711&r1=250710&r2=250711&view=diff
==============================================================================
--- lld/trunk/test/elf2/linkerscript.s (original)
+++ lld/trunk/test/elf2/linkerscript.s Mon Oct 19 12:35:12 2015
@@ -6,6 +6,10 @@
 # RUN: rm -f %t.dir/libxyz.a
 # RUN: llvm-ar rcs %t.dir/libxyz.a %t2.o
 
+# RUN: echo "EXTERN( undef undef2 )" > %t.script
+# RUN: ld.lld2 %t -o %t2 %t.script
+# RUN: llvm-readobj %t2 > /dev/null
+
 # RUN: echo "GROUP(" %t ")" > %t.script
 # RUN: ld.lld2 -o %t2 %t.script
 # RUN: llvm-readobj %t2 > /dev/null

Modified: lld/trunk/test/elf2/undefined-opt.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/undefined-opt.s?rev=250711&r1=250710&r2=250711&view=diff
==============================================================================
--- lld/trunk/test/elf2/undefined-opt.s (original)
+++ lld/trunk/test/elf2/undefined-opt.s Mon Oct 19 12:35:12 2015
@@ -37,6 +37,10 @@
 # TWO-UNDEFINED: Name: bar
 # TWO-UNDEFINED: Name: zed
 # TWO-UNDEFINED: ]
+# Now the same logic but linker script is used to set undefines
+# RUN: echo "EXTERN( bar abs )" > %t.script
+# RUN: ld.lld2 -o %t3 %t.o %tar.a %t.script
+# RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=TWO-UNDEFINED %s
 
 # Added undefined symbol may be left undefined without error, but
 # shouldn't show up in the dynamic table.




More information about the llvm-commits mailing list