[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