Fix asserts when linking wrong address space declarations
llvm-svn: 342858
This commit is contained in:
parent
ce5f203415
commit
9a71e80645
|
@ -978,11 +978,14 @@ Expected<Constant *> IRLinker::linkGlobalValueProto(GlobalValue *SGV,
|
||||||
// containing a GV from the source module, in which case SGV will be
|
// containing a GV from the source module, in which case SGV will be
|
||||||
// the same as DGV and NewGV, and TypeMap.get() will assert since it
|
// the same as DGV and NewGV, and TypeMap.get() will assert since it
|
||||||
// assumes it is being invoked on a type in the source module.
|
// assumes it is being invoked on a type in the source module.
|
||||||
if (DGV && NewGV != SGV)
|
if (DGV && NewGV != SGV) {
|
||||||
C = ConstantExpr::getBitCast(NewGV, TypeMap.get(SGV->getType()));
|
C = ConstantExpr::getPointerBitCastOrAddrSpaceCast(
|
||||||
|
NewGV, TypeMap.get(SGV->getType()));
|
||||||
|
}
|
||||||
|
|
||||||
if (DGV && NewGV != DGV) {
|
if (DGV && NewGV != DGV) {
|
||||||
DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewGV, DGV->getType()));
|
DGV->replaceAllUsesWith(
|
||||||
|
ConstantExpr::getPointerBitCastOrAddrSpaceCast(NewGV, DGV->getType()));
|
||||||
DGV->eraseFromParent();
|
DGV->eraseFromParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
@is_really_as1_gv = addrspace(1) global i32 0, align 4
|
||||||
|
@is_really_as1_gv_other_type = addrspace(1) global float 4.0, align 4
|
|
@ -0,0 +1,17 @@
|
||||||
|
; RUN: llvm-link %s %p/Inputs/wrong-addrspace-gv-declaration.ll -S | FileCheck %s
|
||||||
|
; RUN: llvm-link %p/Inputs/wrong-addrspace-gv-declaration.ll %s -S | FileCheck %s
|
||||||
|
|
||||||
|
; The address space is declared incorrectly here, so an addrspacecast
|
||||||
|
; is needed to link.
|
||||||
|
|
||||||
|
@is_really_as1_gv = external global i32
|
||||||
|
@is_really_as1_gv_other_type = external global i32
|
||||||
|
|
||||||
|
; CHECK-LABEL: @foo(
|
||||||
|
; CHECK: %load0 = load volatile i32, i32* addrspacecast (i32 addrspace(1)* @is_really_as1_gv to i32*), align 4
|
||||||
|
; CHECK: %load1 = load volatile i32, i32* addrspacecast (i32 addrspace(1)* bitcast (float addrspace(1)* @is_really_as1_gv_other_type to i32 addrspace(1)*) to i32*), align 4
|
||||||
|
define void @foo() {
|
||||||
|
%load0 = load volatile i32, i32* @is_really_as1_gv, align 4
|
||||||
|
%load1 = load volatile i32, i32* @is_really_as1_gv_other_type, align 4
|
||||||
|
ret void
|
||||||
|
}
|
Loading…
Reference in New Issue