[llvm] r278065 - [RuntimeDyld][Orc][MCJIT] Add partial weak-symbol support to RuntimeDyld.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 8 15:53:37 PDT 2016


Author: lhames
Date: Mon Aug  8 17:53:37 2016
New Revision: 278065

URL: http://llvm.org/viewvc/llvm-project?rev=278065&view=rev
Log:
[RuntimeDyld][Orc][MCJIT] Add partial weak-symbol support to RuntimeDyld.

This patch causes RuntimeDyld to check for existing definitions when it
encounters weak symbols. If a definition already exists then the new weak
definition is discarded. All symbol lookups within a "logical dylib" should now
agree on the address of any given weak symbol. This allows the JIT to better
match the behavior of the static linker for C++ code.

This support is only partial, as it does not allow strong definitions that
occur after the first weak definition (in JIT symbol lookup order) to override
the previous weak definitions. Support for this will be added in a future
patch.


Added:
    llvm/trunk/test/ExecutionEngine/MCJIT/Inputs/weak-function-2.ll
    llvm/trunk/test/ExecutionEngine/MCJIT/weak-function.ll
    llvm/trunk/test/ExecutionEngine/OrcMCJIT/Inputs/weak-function-2.ll
    llvm/trunk/test/ExecutionEngine/OrcMCJIT/weak-function.ll
Modified:
    llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp

Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h?rev=278065&r1=278064&r2=278065&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h Mon Aug  8 17:53:37 2016
@@ -116,11 +116,13 @@ class OrcMCJITReplacement : public Execu
     LinkingResolver(OrcMCJITReplacement &M) : M(M) {}
 
     JITSymbol findSymbol(const std::string &Name) override {
-      return M.findMangledSymbol(Name);
+      return M.ClientResolver->findSymbol(Name);
     }
 
     JITSymbol findSymbolInLogicalDylib(const std::string &Name) override {
-      return M.ClientResolver->findSymbol(Name);
+      if (auto Sym = M.findMangledSymbol(Name))
+        return Sym;
+      return M.ClientResolver->findSymbolInLogicalDylib(Name);
     }
 
   private:

Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=278065&r1=278064&r2=278065&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Mon Aug  8 17:53:37 2016
@@ -226,6 +226,24 @@ RuntimeDyldImpl::loadObjectImpl(const ob
       // Compute JIT symbol flags.
       JITSymbolFlags JITSymFlags = JITSymbolFlags::fromObjectSymbol(*I);
 
+      // If this is a weak definition, check to see if there's a strong one.
+      // If there is, skip this symbol (we won't be providing it: the strong
+      // definition will). If there's no strong definition, make this definition
+      // strong.
+      if (JITSymFlags.isWeak()) {
+        // First check whether there's already a definition in this instance.
+        // FIXME: Override existing weak definitions with strong ones.
+        if (GlobalSymbolTable.count(Name))
+          continue;
+        // Then check the symbol resolver to see if there's a definition
+        // elsewhere in this logical dylib.
+        if (auto Sym = Resolver.findSymbolInLogicalDylib(Name))
+          if (Sym.getFlags().isStrongDefinition())
+            continue;
+        // else
+        JITSymFlags &= ~JITSymbolFlags::Weak;
+      }
+
       if (Flags & SymbolRef::SF_Absolute &&
           SymType != object::SymbolRef::ST_File) {
         uint64_t Addr = 0;

Added: llvm/trunk/test/ExecutionEngine/MCJIT/Inputs/weak-function-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/MCJIT/Inputs/weak-function-2.ll?rev=278065&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/MCJIT/Inputs/weak-function-2.ll (added)
+++ llvm/trunk/test/ExecutionEngine/MCJIT/Inputs/weak-function-2.ll Mon Aug  8 17:53:37 2016
@@ -0,0 +1,9 @@
+define linkonce_odr i32 @baz() #0 {
+entry:
+  ret i32 0
+}
+
+define i8* @bar() {
+entry:
+  ret i8* bitcast (i32 ()* @baz to i8*)
+}

Added: llvm/trunk/test/ExecutionEngine/MCJIT/weak-function.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/MCJIT/weak-function.ll?rev=278065&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/MCJIT/weak-function.ll (added)
+++ llvm/trunk/test/ExecutionEngine/MCJIT/weak-function.ll Mon Aug  8 17:53:37 2016
@@ -0,0 +1,26 @@
+; RUN: lli -jit-kind=mcjit -extra-module %p/Inputs/weak-function-2.ll %s
+;
+; Check that functions in two different modules agree on the address of weak
+; function 'baz'
+
+define linkonce_odr i32 @baz() {
+entry:
+  ret i32 0
+}
+
+define i8* @foo() {
+entry:
+  ret i8* bitcast (i32 ()* @baz to i8*)
+}
+
+declare i8* @bar()
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %call = tail call i8* @foo()
+  %call1 = tail call i8* @bar()
+  %cmp = icmp ne i8* %call, %call1
+  %conv = zext i1 %cmp to i32
+  ret i32 %conv
+}
+

Added: llvm/trunk/test/ExecutionEngine/OrcMCJIT/Inputs/weak-function-2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcMCJIT/Inputs/weak-function-2.ll?rev=278065&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/OrcMCJIT/Inputs/weak-function-2.ll (added)
+++ llvm/trunk/test/ExecutionEngine/OrcMCJIT/Inputs/weak-function-2.ll Mon Aug  8 17:53:37 2016
@@ -0,0 +1,9 @@
+define linkonce_odr i32 @baz() #0 {
+entry:
+  ret i32 0
+}
+
+define i8* @bar() {
+entry:
+  ret i8* bitcast (i32 ()* @baz to i8*)
+}

Added: llvm/trunk/test/ExecutionEngine/OrcMCJIT/weak-function.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcMCJIT/weak-function.ll?rev=278065&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/OrcMCJIT/weak-function.ll (added)
+++ llvm/trunk/test/ExecutionEngine/OrcMCJIT/weak-function.ll Mon Aug  8 17:53:37 2016
@@ -0,0 +1,26 @@
+; RUN: lli -jit-kind=orc-mcjit -extra-module %p/Inputs/weak-function-2.ll %s
+;
+; Check that functions in two different modules agree on the address of weak
+; function 'baz'
+
+define linkonce_odr i32 @baz() {
+entry:
+  ret i32 0
+}
+
+define i8* @foo() {
+entry:
+  ret i8* bitcast (i32 ()* @baz to i8*)
+}
+
+declare i8* @bar()
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %call = tail call i8* @foo()
+  %call1 = tail call i8* @bar()
+  %cmp = icmp ne i8* %call, %call1
+  %conv = zext i1 %cmp to i32
+  ret i32 %conv
+}
+




More information about the llvm-commits mailing list