[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
This commit is contained in:
Lang Hames 2015-10-06 22:55:05 +00:00
parent 0ea7b26ee3
commit 3ce6a23469
4 changed files with 43 additions and 0 deletions

View File

@ -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())

View File

@ -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.

View File

@ -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.

View File

@ -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
}