[lld] r195307 - [LinkingContext] Limit shared library undefined atoms to be added.

Shankar Easwaran shankare at codeaurora.org
Wed Nov 20 19:50:59 PST 2013


Author: shankare
Date: Wed Nov 20 21:50:59 2013
New Revision: 195307

URL: http://llvm.org/viewvc/llvm-project?rev=195307&view=rev
Log:
[LinkingContext] Limit shared library undefined atoms to be added.

This adds functionality to limit shared library undefined atoms to be added
only once by the Resolver.

Dynamic libraries may be processed more than once if they exist within a
Group.

Also adds a test to verify the change.

Added:
    lld/trunk/test/elf/X86_64/Inputs/group/libfn.so   (with props)
    lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test
Modified:
    lld/trunk/include/lld/Core/LinkingContext.h
    lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
    lld/trunk/lib/Core/Resolver.cpp

Modified: lld/trunk/include/lld/Core/LinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/Core/LinkingContext.h?rev=195307&r1=195306&r2=195307&view=diff
==============================================================================
--- lld/trunk/include/lld/Core/LinkingContext.h (original)
+++ lld/trunk/include/lld/Core/LinkingContext.h Wed Nov 20 21:50:59 2013
@@ -34,6 +34,7 @@ class File;
 class Writer;
 class InputGraph;
 class InputElement;
+class SharedLibraryFile;
 
 /// \brief The LinkingContext class encapsulates "what and how" to link.
 ///
@@ -163,6 +164,11 @@ public:
   /// to be an error.
   bool allowShlibUndefines() const { return _allowShlibUndefines; }
 
+  /// Add undefined symbols from shared libraries ?
+  virtual bool addUndefinedAtomsFromSharedLibrary(const SharedLibraryFile *) {
+    return true;
+  }
+
   /// If true, core linking will write the path to each input file to stdout
   /// (i.e. llvm::outs()) as it is used.  This is used to implement the -t
   /// linker option.

Modified: lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h?rev=195307&r1=195306&r2=195307&view=diff
==============================================================================
--- lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h (original)
+++ lld/trunk/include/lld/ReaderWriter/ELFLinkingContext.h Wed Nov 20 21:50:59 2013
@@ -22,6 +22,7 @@
 #include "llvm/Object/ELF.h"
 #include "llvm/Support/ELF.h"
 
+#include <map>
 #include <memory>
 
 namespace lld {
@@ -206,6 +207,13 @@ public:
     return _rpathLinkList;
   }
 
+  virtual bool addUndefinedAtomsFromSharedLibrary(const SharedLibraryFile *s) {
+    if (_undefinedAtomsFromFile.find(s) != _undefinedAtomsFromFile.end())
+      return false;
+    _undefinedAtomsFromFile[s] = true;
+    return true;
+  }
+
 private:
   ELFLinkingContext() LLVM_DELETED_FUNCTION;
 
@@ -240,6 +248,7 @@ protected:
   StringRef _soname;
   StringRefVector _rpathList;
   StringRefVector _rpathLinkList;
+  std::map<const SharedLibraryFile *, bool> _undefinedAtomsFromFile;
 };
 } // end namespace lld
 

Modified: lld/trunk/lib/Core/Resolver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=195307&r1=195306&r2=195307&view=diff
==============================================================================
--- lld/trunk/lib/Core/Resolver.cpp (original)
+++ lld/trunk/lib/Core/Resolver.cpp Wed Nov 20 21:50:59 2013
@@ -75,22 +75,27 @@ void Resolver::doFile(const File &file)
 
 void Resolver::handleFile(const File &file) {
   uint32_t resolverState = Resolver::StateNoChange;
+  const SharedLibraryFile *sharedLibraryFile =
+      llvm::dyn_cast<SharedLibraryFile>(&file);
+
   doFile(file);
   for (const DefinedAtom *atom : file.defined()) {
     doDefinedAtom(*atom);
     resolverState |= StateNewDefinedAtoms;
   }
-  for (const UndefinedAtom *undefAtom : file.undefined()) {
-    doUndefinedAtom(*undefAtom);
-    resolverState |= StateNewUndefinedAtoms;
-
-    // If the undefined symbol has an alternative name, try to resolve the
-    // symbol with the name to give it a second chance. This feature is used for
-    // COFF "weak external" symbol.
-    if (!_symbolTable.isDefined(undefAtom->name())) {
-      if (const UndefinedAtom *fallbackAtom = undefAtom->fallback()) {
-        doUndefinedAtom(*fallbackAtom);
-        _symbolTable.addReplacement(undefAtom, fallbackAtom);
+  if (!sharedLibraryFile ||
+      _context.addUndefinedAtomsFromSharedLibrary(sharedLibraryFile)) {
+    for (const UndefinedAtom *undefAtom : file.undefined()) {
+      doUndefinedAtom(*undefAtom);
+      resolverState |= StateNewUndefinedAtoms;
+      // If the undefined symbol has an alternative name, try to resolve the
+      // symbol with the name to give it a second chance. This feature is used
+      // for COFF "weak external" symbol.
+      if (!_symbolTable.isDefined(undefAtom->name())) {
+        if (const UndefinedAtom *fallbackAtom = undefAtom->fallback()) {
+          doUndefinedAtom(*fallbackAtom);
+          _symbolTable.addReplacement(undefAtom, fallbackAtom);
+        }
       }
     }
   }

Added: lld/trunk/test/elf/X86_64/Inputs/group/libfn.so
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/Inputs/group/libfn.so?rev=195307&view=auto
==============================================================================
Binary files lld/trunk/test/elf/X86_64/Inputs/group/libfn.so (added) and lld/trunk/test/elf/X86_64/Inputs/group/libfn.so Wed Nov 20 21:50:59 2013 differ

Propchange: lld/trunk/test/elf/X86_64/Inputs/group/libfn.so
------------------------------------------------------------------------------
    svn:executable = *

Added: lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test?rev=195307&view=auto
==============================================================================
--- lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test (added)
+++ lld/trunk/test/elf/X86_64/startGroupEndGroupWithDynlib.test Wed Nov 20 21:50:59 2013
@@ -0,0 +1,10 @@
+# This tests functionality of --start-group, --end-group with a dynamic library 
+
+# Mix dynamic libraries/object files in group
+RUN: lld -flavor gnu -target x86_64 %p/Inputs/group/1.o --start-group \
+RUN: %p/Inputs/group/libfn.so %p/Inputs/group/fn2.o \
+RUN: %p/Inputs/group/fn1.o --end-group -o %t1
+
+RUN: llvm-nm %t1 | FileCheck -check-prefix=RESOLVEDEXTERNAL %s
+
+RESOLVEDEXTERNAL: {{[0-9a-z]+}} T fn2





More information about the llvm-commits mailing list