summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h4
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h4
-rw-r--r--llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp14
-rw-r--r--llvm/test/ExecutionEngine/OrcLazy/global_aliases.ll21
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
+}
OpenPOWER on IntegriCloud