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
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())
ValueMaterializer *Materializer = nullptr,
GlobalVariable *NewGV = nullptr);
+GlobalAlias* cloneGlobalAlias(Module &Dst, const GlobalAlias &OrigA,
+ ValueToValueMapTy &VMap,
+ ValueMaterializer *Materializer = nullptr);
+
} // End namespace orc.
} // End namespace llvm.
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.
--- /dev/null
+; 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
+}