[llvm] r277397 - [Orc] Fix common symbol support in ORC.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 1 15:23:24 PDT 2016


Author: lhames
Date: Mon Aug  1 17:23:24 2016
New Revision: 277397

URL: http://llvm.org/viewvc/llvm-project?rev=277397&view=rev
Log:
[Orc] Fix common symbol support in ORC.

Common symbol support in ORC was broken in r270716 when the symbol resolution
rules in RuntimeDyld were changed. With the switch to lazily materialized
symbols in r277386, common symbols can be supported by having
RuntimeDyld::emitCommonSymbols search for (but not materialize!) definitions
elsewhere in the logical dylib.

This patch adds the 'Common' flag to JITSymbolFlags, and the necessary check
to RuntimeDyld::emitCommonSymbols.


Added:
    llvm/trunk/test/ExecutionEngine/OrcLazy/common-symbols.ll
Modified:
    llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h
    llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h
    llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp

Modified: llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h?rev=277397&r1=277396&r2=277397&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/JITSymbolFlags.h Mon Aug  1 17:23:24 2016
@@ -23,7 +23,8 @@ namespace llvm {
 enum class JITSymbolFlags : char {
   None = 0,
   Weak = 1U << 0,
-  Exported = 1U << 1
+  Common = 1U << 1,
+  Exported = 1U << 2
 };
 
 inline JITSymbolFlags operator|(JITSymbolFlags LHS, JITSymbolFlags RHS) {
@@ -59,6 +60,10 @@ public:
     return (Flags & JITSymbolFlags::Weak) == JITSymbolFlags::Weak;
   }
 
+  bool isCommon() const {
+    return (Flags & JITSymbolFlags::Common) == JITSymbolFlags::Common;
+  }
+
   bool isExported() const {
     return (Flags & JITSymbolFlags::Exported) == JITSymbolFlags::Exported;
   }
@@ -67,6 +72,8 @@ public:
     JITSymbolFlags Flags = JITSymbolFlags::None;
     if (GV.hasWeakLinkage())
       Flags |= JITSymbolFlags::Weak;
+    if (GV.hasCommonLinkage())
+      Flags |= JITSymbolFlags::Common;
     if (!GV.hasLocalLinkage() && !GV.hasHiddenVisibility())
       Flags |= JITSymbolFlags::Exported;
     return Flags;
@@ -77,6 +84,8 @@ public:
     JITSymbolFlags Flags = JITSymbolFlags::None;
     if (Symbol.getFlags() & object::BasicSymbolRef::SF_Weak)
       Flags |= JITSymbolFlags::Weak;
+    if (Symbol.getFlags() & object::BasicSymbolRef::SF_Common)
+      Flags |= JITSymbolFlags::Common;
     if (Symbol.getFlags() & object::BasicSymbolRef::SF_Exported)
       Flags |= JITSymbolFlags::Exported;
     return Flags;

Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h?rev=277397&r1=277396&r2=277397&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h Mon Aug  1 17:23:24 2016
@@ -122,10 +122,10 @@ private:
       RTDyld.setProcessAllSections(PFC->ProcessAllSections);
       PFC->RTDyld = &RTDyld;
 
+      this->Finalized = true;
       PFC->Finalizer(PFC->Handle, RTDyld, std::move(PFC->Objects),
                      [&]() {
                        this->updateSymbolTable(RTDyld);
-                       this->Finalized = true;
                      });
 
       // Release resources.

Modified: llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp?rev=277397&r1=277396&r2=277397&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp Mon Aug  1 17:23:24 2016
@@ -584,13 +584,19 @@ Error RuntimeDyldImpl::emitCommonSymbols
       return NameOrErr.takeError();
 
     // Skip common symbols already elsewhere.
-    if (GlobalSymbolTable.count(Name) ||
-        Resolver.findSymbolInLogicalDylib(Name)) {
+    if (GlobalSymbolTable.count(Name)) {
       DEBUG(dbgs() << "\tSkipping already emitted common symbol '" << Name
                    << "'\n");
       continue;
     }
 
+    if (auto Sym = Resolver.findSymbolInLogicalDylib(Name)) {
+      if (!Sym.isCommon()) {
+        DEBUG(dbgs() << "\tSkipping common symbol '" << Name
+                     << "' in favor of stronger definition.\n");
+        continue;
+      }
+    }
     uint32_t Align = Sym.getAlignment();
     uint64_t Size = Sym.getCommonSize();
 

Added: llvm/trunk/test/ExecutionEngine/OrcLazy/common-symbols.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcLazy/common-symbols.ll?rev=277397&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/OrcLazy/common-symbols.ll (added)
+++ llvm/trunk/test/ExecutionEngine/OrcLazy/common-symbols.ll Mon Aug  1 17:23:24 2016
@@ -0,0 +1,18 @@
+; RUN: lli -jit-kind=orc-lazy %s | FileCheck %s
+;
+; CHECK: 7
+
+ at x = common global i32 0, align 4
+ at .str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
+
+define i32 @main() {
+entry:
+  %retval = alloca i32, align 4
+  store i32 0, i32* %retval, align 4
+  store i32 7, i32* @x, align 4
+  %0 = load i32, i32* @x, align 4
+  %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %0)
+  ret i32 0
+}
+
+declare i32 @printf(i8*, ...)




More information about the llvm-commits mailing list