[llvm] r249481 - [Orc] Teach the CompileOnDemand layer to clone aliases.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 6 15:55:06 PDT 2015


Author: lhames
Date: Tue Oct  6 17:55:05 2015
New Revision: 249481

URL: http://llvm.org/viewvc/llvm-project?rev=249481&view=rev
Log:
[Orc] Teach the CompileOnDemand layer to clone aliases.

This allows modules containing aliases to be lazily jit'd. Previously these
failed with missing symbol errors because the aliases weren't cloned from the
original module.


Added:
    llvm/trunk/test/ExecutionEngine/OrcLazy/global_aliases.ll
Modified:
    llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h
    llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h
    llvm/trunk/lib/ExecutionEngine/Orc/IndirectionUtils.cpp

Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h?rev=249481&r1=249480&r2=249481&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h Tue Oct  6 17:55:05 2015
@@ -217,6 +217,10 @@ private:
       if (!GV.isDeclaration())
         cloneGlobalVariableDecl(*GVsAndStubsM, GV, &VMap);
 
+    // And the aliases.
+    for (auto &Alias : SrcM->aliases())
+      cloneGlobalAlias(*GVsAndStubsM, Alias, VMap, &GDMat);
+
     // Then clone the initializers.
     for (auto &GV : SrcM->globals())
       if (!GV.isDeclaration())

Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h?rev=249481&r1=249480&r2=249481&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h (original)
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h Tue Oct  6 17:55:05 2015
@@ -289,6 +289,10 @@ void moveGlobalVariableInitializer(Globa
                                    ValueMaterializer *Materializer = nullptr,
                                    GlobalVariable *NewGV = nullptr);
 
+GlobalAlias* cloneGlobalAlias(Module &Dst, const GlobalAlias &OrigA,
+                              ValueToValueMapTy &VMap,
+                              ValueMaterializer *Materializer = nullptr);
+
 } // End namespace orc.
 } // End namespace llvm.
 

Modified: llvm/trunk/lib/ExecutionEngine/Orc/IndirectionUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/IndirectionUtils.cpp?rev=249481&r1=249480&r2=249481&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/IndirectionUtils.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/IndirectionUtils.cpp Tue Oct  6 17:55:05 2015
@@ -177,5 +177,19 @@ void moveGlobalVariableInitializer(Globa
                                  nullptr, Materializer));
 }
 
+GlobalAlias* cloneGlobalAlias(Module &Dst, const GlobalAlias &OrigA,
+                              ValueToValueMapTy &VMap,
+                              ValueMaterializer *Materializer) {
+  assert(OrigA.getAliasee() && "Original alias doesn't have an aliasee?");
+  auto *NewA = GlobalAlias::create(OrigA.getValueType(),
+                                   OrigA.getType()->getPointerAddressSpace(),
+                                   OrigA.getLinkage(), OrigA.getName(), &Dst);
+  NewA->copyAttributesFrom(&OrigA);
+  VMap[&OrigA] = NewA;
+  NewA->setAliasee(cast<Constant>(MapValue(OrigA.getAliasee(), VMap, RF_None,
+                                           nullptr, Materializer)));
+  return NewA;
+}
+
 } // End namespace orc.
 } // End namespace llvm.

Added: llvm/trunk/test/ExecutionEngine/OrcLazy/global_aliases.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/ExecutionEngine/OrcLazy/global_aliases.ll?rev=249481&view=auto
==============================================================================
--- llvm/trunk/test/ExecutionEngine/OrcLazy/global_aliases.ll (added)
+++ llvm/trunk/test/ExecutionEngine/OrcLazy/global_aliases.ll Tue Oct  6 17:55:05 2015
@@ -0,0 +1,21 @@
+; RUN: lli -jit-kind=orc-lazy %s
+;
+; Test handling of global aliases for function and variables.
+
+ at x = global i32 42, align 4
+ at y = alias i32, i32* @x
+
+define i32 @foo() {
+entry:
+  %0 = load i32, i32* @y, align 4
+  ret i32 %0
+}
+
+ at bar = alias i32(), i32()* @foo
+
+define i32 @main(i32 %argc, i8** %argv) {
+entry:
+  %0 = call i32() @bar()
+  %1 = sub i32 %0, 42
+  ret i32 %1
+}




More information about the llvm-commits mailing list