bridge: fix circular pointer handling in non-integral pointer mode
In non-integral pointer mode, the pointer can be in either
address space. Handle this.
Change-Id: I15f185236cb8410409fe280077c5807b489d50c8
Reviewed-on: https://go-review.googlesource.com/c/157239
Reviewed-by: Than McIntosh <thanm@google.com>
diff --git a/bridge/go-llvm.cpp b/bridge/go-llvm.cpp
index 0d605cb..a371811 100644
--- a/bridge/go-llvm.cpp
+++ b/bridge/go-llvm.cpp
@@ -542,19 +542,20 @@
Location loc)
{
llvm::Value *val = expr->value();
+ llvm::Type *vt = val->getType();
+ assert(vt->isPointerTy());
llvm::Type *llToType = toType->type();
if (expr->varExprPending()) {
- llvm::Type *pet = llvm::PointerType::get(expr->btype()->type(),
- addressSpace_);
- if (val->getType() == pet)
- llToType = llvm::PointerType::get(llToType, addressSpace_);
+ llvm::Type *et = expr->btype()->type();
+ if (vt->getPointerElementType() == et)
+ llToType = llvm::PointerType::get(llToType, vt->getPointerAddressSpace());
}
- if (val->getType() == llToType)
+ if (vt == llToType)
return expr;
std::string tag(namegen("cast"));
LIRBuilder builder(context_, llvm::ConstantFolder());
- llvm::Value *bitcast = builder.CreateBitCast(val, llToType, tag);
+ llvm::Value *bitcast = builder.CreatePointerBitCastOrAddrSpaceCast(val, llToType, tag);
return nbuilder_.mkConversion(toType, bitcast, expr, loc);
}