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); }