mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-14 15:39:06 +00:00
[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:
parent
0ea7b26ee3
commit
3ce6a23469
@ -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())
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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.
|
||||
|
21
test/ExecutionEngine/OrcLazy/global_aliases.ll
Normal file
21
test/ExecutionEngine/OrcLazy/global_aliases.ll
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user