From 3ce6a234699f2cb088b9d666c6e5021af7e85d54 Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Tue, 6 Oct 2015 22:55:05 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249481 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Orc/CompileOnDemandLayer.h | 4 ++++ .../ExecutionEngine/Orc/IndirectionUtils.h | 4 ++++ lib/ExecutionEngine/Orc/IndirectionUtils.cpp | 14 +++++++++++++ .../ExecutionEngine/OrcLazy/global_aliases.ll | 21 +++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 test/ExecutionEngine/OrcLazy/global_aliases.ll diff --git a/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h b/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h index 9694b80d192..714ca2374dc 100644 --- a/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h +++ b/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h @@ -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()) diff --git a/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h b/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h index 4b7fc5e84b9..e5cd0d2559c 100644 --- a/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h +++ b/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h @@ -289,6 +289,10 @@ void moveGlobalVariableInitializer(GlobalVariable &OrigGV, ValueMaterializer *Materializer = nullptr, GlobalVariable *NewGV = nullptr); +GlobalAlias* cloneGlobalAlias(Module &Dst, const GlobalAlias &OrigA, + ValueToValueMapTy &VMap, + ValueMaterializer *Materializer = nullptr); + } // End namespace orc. } // End namespace llvm. diff --git a/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index b439810ed33..ddd1921657b 100644 --- a/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/lib/ExecutionEngine/Orc/IndirectionUtils.cpp @@ -177,5 +177,19 @@ void moveGlobalVariableInitializer(GlobalVariable &OrigGV, 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(MapValue(OrigA.getAliasee(), VMap, RF_None, + nullptr, Materializer))); + return NewA; +} + } // End namespace orc. } // End namespace llvm. diff --git a/test/ExecutionEngine/OrcLazy/global_aliases.ll b/test/ExecutionEngine/OrcLazy/global_aliases.ll new file mode 100644 index 00000000000..61fde4bebf8 --- /dev/null +++ b/test/ExecutionEngine/OrcLazy/global_aliases.ll @@ -0,0 +1,21 @@ +; RUN: lli -jit-kind=orc-lazy %s +; +; Test handling of global aliases for function and variables. + +@x = global i32 42, align 4 +@y = alias i32, i32* @x + +define i32 @foo() { +entry: + %0 = load i32, i32* @y, align 4 + ret i32 %0 +} + +@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 +}