diff options
4 files changed, 43 insertions, 0 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h b/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h index 9694b80d192..714ca2374dc 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h +++ b/llvm/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/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h index 4b7fc5e84b9..e5cd0d2559c 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h +++ b/llvm/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/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp index b439810ed33..ddd1921657b 100644 --- a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/llvm/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<Constant>(MapValue(OrigA.getAliasee(), VMap, RF_None, + nullptr, Materializer))); + return NewA; +} + } // End namespace orc. } // End namespace llvm. diff --git a/llvm/test/ExecutionEngine/OrcLazy/global_aliases.ll b/llvm/test/ExecutionEngine/OrcLazy/global_aliases.ll new file mode 100644 index 00000000000..61fde4bebf8 --- /dev/null +++ b/llvm/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 +} |