forked from OSchip/llvm-project
[CGBuilder] Remove CreateBitCast() method
Use CreateElementBitCast() instead, or don't work on Address where not necessary.
This commit is contained in:
parent
76032b0e3f
commit
f208644ed3
|
@ -1265,8 +1265,7 @@ Address CodeGenFunction::GetAddrOfBlockDecl(const VarDecl *variable) {
|
||||||
auto &byrefInfo = getBlockByrefInfo(variable);
|
auto &byrefInfo = getBlockByrefInfo(variable);
|
||||||
addr = Address(Builder.CreateLoad(addr), byrefInfo.ByrefAlignment);
|
addr = Address(Builder.CreateLoad(addr), byrefInfo.ByrefAlignment);
|
||||||
|
|
||||||
auto byrefPointerType = llvm::PointerType::get(byrefInfo.Type, 0);
|
addr = Builder.CreateElementBitCast(addr, byrefInfo.Type, "byref.addr");
|
||||||
addr = Builder.CreateBitCast(addr, byrefPointerType, "byref.addr");
|
|
||||||
|
|
||||||
addr = emitBlockByrefAddress(addr, byrefInfo, /*follow*/ true,
|
addr = emitBlockByrefAddress(addr, byrefInfo, /*follow*/ true,
|
||||||
variable->getName());
|
variable->getName());
|
||||||
|
@ -1940,15 +1939,15 @@ CodeGenFunction::GenerateCopyHelperFunction(const CGBlockInfo &blockInfo) {
|
||||||
StartFunction(GlobalDecl(), ReturnTy, Fn, FI, args);
|
StartFunction(GlobalDecl(), ReturnTy, Fn, FI, args);
|
||||||
auto AL = ApplyDebugLocation::CreateArtificial(*this);
|
auto AL = ApplyDebugLocation::CreateArtificial(*this);
|
||||||
|
|
||||||
llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo();
|
|
||||||
|
|
||||||
Address src = GetAddrOfLocalVar(&SrcDecl);
|
Address src = GetAddrOfLocalVar(&SrcDecl);
|
||||||
src = Address(Builder.CreateLoad(src), blockInfo.BlockAlign);
|
src = Address(Builder.CreateLoad(src), blockInfo.BlockAlign);
|
||||||
src = Builder.CreateBitCast(src, structPtrTy, "block.source");
|
src = Builder.CreateElementBitCast(src, blockInfo.StructureType,
|
||||||
|
"block.source");
|
||||||
|
|
||||||
Address dst = GetAddrOfLocalVar(&DstDecl);
|
Address dst = GetAddrOfLocalVar(&DstDecl);
|
||||||
dst = Address(Builder.CreateLoad(dst), blockInfo.BlockAlign);
|
dst = Address(Builder.CreateLoad(dst), blockInfo.BlockAlign);
|
||||||
dst = Builder.CreateBitCast(dst, structPtrTy, "block.dest");
|
dst =
|
||||||
|
Builder.CreateElementBitCast(dst, blockInfo.StructureType, "block.dest");
|
||||||
|
|
||||||
for (auto &capture : blockInfo.SortedCaptures) {
|
for (auto &capture : blockInfo.SortedCaptures) {
|
||||||
if (capture.isConstantOrTrivial())
|
if (capture.isConstantOrTrivial())
|
||||||
|
@ -2130,11 +2129,9 @@ CodeGenFunction::GenerateDestroyHelperFunction(const CGBlockInfo &blockInfo) {
|
||||||
|
|
||||||
auto AL = ApplyDebugLocation::CreateArtificial(*this);
|
auto AL = ApplyDebugLocation::CreateArtificial(*this);
|
||||||
|
|
||||||
llvm::Type *structPtrTy = blockInfo.StructureType->getPointerTo();
|
|
||||||
|
|
||||||
Address src = GetAddrOfLocalVar(&SrcDecl);
|
Address src = GetAddrOfLocalVar(&SrcDecl);
|
||||||
src = Address(Builder.CreateLoad(src), blockInfo.BlockAlign);
|
src = Address(Builder.CreateLoad(src), blockInfo.BlockAlign);
|
||||||
src = Builder.CreateBitCast(src, structPtrTy, "block");
|
src = Builder.CreateElementBitCast(src, blockInfo.StructureType, "block");
|
||||||
|
|
||||||
CodeGenFunction::RunCleanupsScope cleanups(*this);
|
CodeGenFunction::RunCleanupsScope cleanups(*this);
|
||||||
|
|
||||||
|
@ -2171,9 +2168,9 @@ public:
|
||||||
|
|
||||||
void emitCopy(CodeGenFunction &CGF, Address destField,
|
void emitCopy(CodeGenFunction &CGF, Address destField,
|
||||||
Address srcField) override {
|
Address srcField) override {
|
||||||
destField = CGF.Builder.CreateBitCast(destField, CGF.VoidPtrTy);
|
destField = CGF.Builder.CreateElementBitCast(destField, CGF.Int8Ty);
|
||||||
|
|
||||||
srcField = CGF.Builder.CreateBitCast(srcField, CGF.VoidPtrPtrTy);
|
srcField = CGF.Builder.CreateElementBitCast(srcField, CGF.Int8PtrTy);
|
||||||
llvm::Value *srcValue = CGF.Builder.CreateLoad(srcField);
|
llvm::Value *srcValue = CGF.Builder.CreateLoad(srcField);
|
||||||
|
|
||||||
unsigned flags = (Flags | BLOCK_BYREF_CALLER).getBitMask();
|
unsigned flags = (Flags | BLOCK_BYREF_CALLER).getBitMask();
|
||||||
|
@ -2186,7 +2183,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void emitDispose(CodeGenFunction &CGF, Address field) override {
|
void emitDispose(CodeGenFunction &CGF, Address field) override {
|
||||||
field = CGF.Builder.CreateBitCast(field, CGF.Int8PtrTy->getPointerTo(0));
|
field = CGF.Builder.CreateElementBitCast(field, CGF.Int8PtrTy);
|
||||||
llvm::Value *value = CGF.Builder.CreateLoad(field);
|
llvm::Value *value = CGF.Builder.CreateLoad(field);
|
||||||
|
|
||||||
CGF.BuildBlockRelease(value, Flags | BLOCK_BYREF_CALLER, false);
|
CGF.BuildBlockRelease(value, Flags | BLOCK_BYREF_CALLER, false);
|
||||||
|
@ -2376,13 +2373,11 @@ generateByrefCopyHelper(CodeGenFunction &CGF, const BlockByrefInfo &byrefInfo,
|
||||||
auto AL = ApplyDebugLocation::CreateArtificial(CGF);
|
auto AL = ApplyDebugLocation::CreateArtificial(CGF);
|
||||||
|
|
||||||
if (generator.needsCopy()) {
|
if (generator.needsCopy()) {
|
||||||
llvm::Type *byrefPtrType = byrefInfo.Type->getPointerTo(0);
|
|
||||||
|
|
||||||
// dst->x
|
// dst->x
|
||||||
Address destField = CGF.GetAddrOfLocalVar(&Dst);
|
Address destField = CGF.GetAddrOfLocalVar(&Dst);
|
||||||
destField = Address(CGF.Builder.CreateLoad(destField),
|
destField = Address(CGF.Builder.CreateLoad(destField),
|
||||||
byrefInfo.ByrefAlignment);
|
byrefInfo.ByrefAlignment);
|
||||||
destField = CGF.Builder.CreateBitCast(destField, byrefPtrType);
|
destField = CGF.Builder.CreateElementBitCast(destField, byrefInfo.Type);
|
||||||
destField = CGF.emitBlockByrefAddress(destField, byrefInfo, false,
|
destField = CGF.emitBlockByrefAddress(destField, byrefInfo, false,
|
||||||
"dest-object");
|
"dest-object");
|
||||||
|
|
||||||
|
@ -2390,7 +2385,7 @@ generateByrefCopyHelper(CodeGenFunction &CGF, const BlockByrefInfo &byrefInfo,
|
||||||
Address srcField = CGF.GetAddrOfLocalVar(&Src);
|
Address srcField = CGF.GetAddrOfLocalVar(&Src);
|
||||||
srcField = Address(CGF.Builder.CreateLoad(srcField),
|
srcField = Address(CGF.Builder.CreateLoad(srcField),
|
||||||
byrefInfo.ByrefAlignment);
|
byrefInfo.ByrefAlignment);
|
||||||
srcField = CGF.Builder.CreateBitCast(srcField, byrefPtrType);
|
srcField = CGF.Builder.CreateElementBitCast(srcField, byrefInfo.Type);
|
||||||
srcField = CGF.emitBlockByrefAddress(srcField, byrefInfo, false,
|
srcField = CGF.emitBlockByrefAddress(srcField, byrefInfo, false,
|
||||||
"src-object");
|
"src-object");
|
||||||
|
|
||||||
|
@ -2447,8 +2442,7 @@ generateByrefDisposeHelper(CodeGenFunction &CGF,
|
||||||
if (generator.needsDispose()) {
|
if (generator.needsDispose()) {
|
||||||
Address addr = CGF.GetAddrOfLocalVar(&Src);
|
Address addr = CGF.GetAddrOfLocalVar(&Src);
|
||||||
addr = Address(CGF.Builder.CreateLoad(addr), byrefInfo.ByrefAlignment);
|
addr = Address(CGF.Builder.CreateLoad(addr), byrefInfo.ByrefAlignment);
|
||||||
auto byrefPtrType = byrefInfo.Type->getPointerTo(0);
|
addr = CGF.Builder.CreateElementBitCast(addr, byrefInfo.Type);
|
||||||
addr = CGF.Builder.CreateBitCast(addr, byrefPtrType);
|
|
||||||
addr = CGF.emitBlockByrefAddress(addr, byrefInfo, false, "object");
|
addr = CGF.emitBlockByrefAddress(addr, byrefInfo, false, "object");
|
||||||
|
|
||||||
generator.emitDispose(CGF, addr);
|
generator.emitDispose(CGF, addr);
|
||||||
|
|
|
@ -151,13 +151,6 @@ public:
|
||||||
Ordering, SSID);
|
Ordering, SSID);
|
||||||
}
|
}
|
||||||
|
|
||||||
using CGBuilderBaseTy::CreateBitCast;
|
|
||||||
Address CreateBitCast(Address Addr, llvm::Type *Ty,
|
|
||||||
const llvm::Twine &Name = "") {
|
|
||||||
return Address(CreateBitCast(Addr.getPointer(), Ty, Name),
|
|
||||||
Addr.getAlignment());
|
|
||||||
}
|
|
||||||
|
|
||||||
using CGBuilderBaseTy::CreateAddrSpaceCast;
|
using CGBuilderBaseTy::CreateAddrSpaceCast;
|
||||||
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty,
|
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty,
|
||||||
const llvm::Twine &Name = "") {
|
const llvm::Twine &Name = "") {
|
||||||
|
|
|
@ -1800,8 +1800,8 @@ llvm::Function *CodeGenFunction::generateBuiltinOSLogHelperFunction(
|
||||||
|
|
||||||
Address Arg = GetAddrOfLocalVar(Args[I]);
|
Address Arg = GetAddrOfLocalVar(Args[I]);
|
||||||
Address Addr = Builder.CreateConstByteGEP(BufAddr, Offset, "argData");
|
Address Addr = Builder.CreateConstByteGEP(BufAddr, Offset, "argData");
|
||||||
Addr = Builder.CreateBitCast(Addr, Arg.getPointer()->getType(),
|
Addr =
|
||||||
"argDataCast");
|
Builder.CreateElementBitCast(Addr, Arg.getElementType(), "argDataCast");
|
||||||
Builder.CreateStore(Builder.CreateLoad(Arg), Addr);
|
Builder.CreateStore(Builder.CreateLoad(Arg), Addr);
|
||||||
Offset += Size;
|
Offset += Size;
|
||||||
++I;
|
++I;
|
||||||
|
@ -3838,7 +3838,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
|
||||||
|
|
||||||
// Call LLVM's EH setjmp, which is lightweight.
|
// Call LLVM's EH setjmp, which is lightweight.
|
||||||
Function *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
|
Function *F = CGM.getIntrinsic(Intrinsic::eh_sjlj_setjmp);
|
||||||
Buf = Builder.CreateBitCast(Buf, Int8PtrTy);
|
Buf = Builder.CreateElementBitCast(Buf, Int8Ty);
|
||||||
return RValue::get(Builder.CreateCall(F, Buf.getPointer()));
|
return RValue::get(Builder.CreateCall(F, Buf.getPointer()));
|
||||||
}
|
}
|
||||||
case Builtin::BI__builtin_longjmp: {
|
case Builtin::BI__builtin_longjmp: {
|
||||||
|
@ -4149,8 +4149,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
|
||||||
PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified();
|
PtrTy->castAs<PointerType>()->getPointeeType().isVolatileQualified();
|
||||||
|
|
||||||
Address Ptr = EmitPointerWithAlignment(E->getArg(0));
|
Address Ptr = EmitPointerWithAlignment(E->getArg(0));
|
||||||
unsigned AddrSpace = Ptr.getPointer()->getType()->getPointerAddressSpace();
|
Ptr = Builder.CreateElementBitCast(Ptr, Int8Ty);
|
||||||
Ptr = Builder.CreateBitCast(Ptr, Int8Ty->getPointerTo(AddrSpace));
|
|
||||||
Value *NewVal = Builder.getInt8(0);
|
Value *NewVal = Builder.getInt8(0);
|
||||||
Value *Order = EmitScalarExpr(E->getArg(1));
|
Value *Order = EmitScalarExpr(E->getArg(1));
|
||||||
if (isa<llvm::ConstantInt>(Order)) {
|
if (isa<llvm::ConstantInt>(Order)) {
|
||||||
|
@ -6919,8 +6918,7 @@ Value *CodeGenFunction::EmitCommonNeonBuiltinExpr(
|
||||||
case NEON::BI__builtin_neon_vld1_dup_v:
|
case NEON::BI__builtin_neon_vld1_dup_v:
|
||||||
case NEON::BI__builtin_neon_vld1q_dup_v: {
|
case NEON::BI__builtin_neon_vld1q_dup_v: {
|
||||||
Value *V = UndefValue::get(Ty);
|
Value *V = UndefValue::get(Ty);
|
||||||
Ty = llvm::PointerType::getUnqual(VTy->getElementType());
|
PtrOp0 = Builder.CreateElementBitCast(PtrOp0, VTy->getElementType());
|
||||||
PtrOp0 = Builder.CreateBitCast(PtrOp0, Ty);
|
|
||||||
LoadInst *Ld = Builder.CreateLoad(PtrOp0);
|
LoadInst *Ld = Builder.CreateLoad(PtrOp0);
|
||||||
llvm::Constant *CI = ConstantInt::get(SizeTy, 0);
|
llvm::Constant *CI = ConstantInt::get(SizeTy, 0);
|
||||||
Ops[0] = Builder.CreateInsertElement(V, Ld, CI);
|
Ops[0] = Builder.CreateInsertElement(V, Ld, CI);
|
||||||
|
@ -7728,7 +7726,7 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
||||||
Value *Val = EmitScalarExpr(E->getArg(0));
|
Value *Val = EmitScalarExpr(E->getArg(0));
|
||||||
Builder.CreateStore(Val, Tmp);
|
Builder.CreateStore(Val, Tmp);
|
||||||
|
|
||||||
Address LdPtr = Builder.CreateBitCast(Tmp,llvm::PointerType::getUnqual(STy));
|
Address LdPtr = Builder.CreateElementBitCast(Tmp, STy);
|
||||||
Val = Builder.CreateLoad(LdPtr);
|
Val = Builder.CreateLoad(LdPtr);
|
||||||
|
|
||||||
Value *Arg0 = Builder.CreateExtractValue(Val, 0);
|
Value *Arg0 = Builder.CreateExtractValue(Val, 0);
|
||||||
|
@ -8149,8 +8147,8 @@ Value *CodeGenFunction::EmitARMBuiltinExpr(unsigned BuiltinID,
|
||||||
case NEON::BI__builtin_neon_vst1_lane_v: {
|
case NEON::BI__builtin_neon_vst1_lane_v: {
|
||||||
Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
|
Ops[1] = Builder.CreateBitCast(Ops[1], Ty);
|
||||||
Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]);
|
Ops[1] = Builder.CreateExtractElement(Ops[1], Ops[2]);
|
||||||
Ty = llvm::PointerType::getUnqual(Ops[1]->getType());
|
auto St = Builder.CreateStore(
|
||||||
auto St = Builder.CreateStore(Ops[1], Builder.CreateBitCast(PtrOp0, Ty));
|
Ops[1], Builder.CreateElementBitCast(PtrOp0, Ops[1]->getType()));
|
||||||
return St;
|
return St;
|
||||||
}
|
}
|
||||||
case NEON::BI__builtin_neon_vtbl1_v:
|
case NEON::BI__builtin_neon_vtbl1_v:
|
||||||
|
@ -9711,7 +9709,7 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
|
||||||
Address Tmp = CreateMemTemp(E->getArg(0)->getType());
|
Address Tmp = CreateMemTemp(E->getArg(0)->getType());
|
||||||
EmitAnyExprToMem(E->getArg(0), Tmp, Qualifiers(), /*init*/ true);
|
EmitAnyExprToMem(E->getArg(0), Tmp, Qualifiers(), /*init*/ true);
|
||||||
|
|
||||||
Tmp = Builder.CreateBitCast(Tmp, llvm::PointerType::getUnqual(STy));
|
Tmp = Builder.CreateElementBitCast(Tmp, STy);
|
||||||
llvm::Value *Val = Builder.CreateLoad(Tmp);
|
llvm::Value *Val = Builder.CreateLoad(Tmp);
|
||||||
|
|
||||||
Value *Arg0 = Builder.CreateExtractValue(Val, 0);
|
Value *Arg0 = Builder.CreateExtractValue(Val, 0);
|
||||||
|
|
|
@ -4839,13 +4839,10 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
|
||||||
// Store the RValue into the argument struct.
|
// Store the RValue into the argument struct.
|
||||||
Address Addr =
|
Address Addr =
|
||||||
Builder.CreateStructGEP(ArgMemory, ArgInfo.getInAllocaFieldIndex());
|
Builder.CreateStructGEP(ArgMemory, ArgInfo.getInAllocaFieldIndex());
|
||||||
unsigned AS = Addr.getType()->getPointerAddressSpace();
|
|
||||||
llvm::Type *MemType = ConvertTypeForMem(I->Ty)->getPointerTo(AS);
|
|
||||||
// There are some cases where a trivial bitcast is not avoidable. The
|
// There are some cases where a trivial bitcast is not avoidable. The
|
||||||
// definition of a type later in a translation unit may change it's type
|
// definition of a type later in a translation unit may change it's type
|
||||||
// from {}* to (%struct.foo*)*.
|
// from {}* to (%struct.foo*)*.
|
||||||
if (Addr.getType() != MemType)
|
Addr = Builder.CreateElementBitCast(Addr, ConvertTypeForMem(I->Ty));
|
||||||
Addr = Builder.CreateBitCast(Addr, MemType);
|
|
||||||
I->copyInto(*this, Addr);
|
I->copyInto(*this, Addr);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -2332,8 +2332,8 @@ CodeGenFunction::EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D,
|
||||||
// Push the src ptr.
|
// Push the src ptr.
|
||||||
QualType QT = *(FPT->param_type_begin());
|
QualType QT = *(FPT->param_type_begin());
|
||||||
llvm::Type *t = CGM.getTypes().ConvertType(QT);
|
llvm::Type *t = CGM.getTypes().ConvertType(QT);
|
||||||
Src = Builder.CreateBitCast(Src, t);
|
llvm::Value *SrcVal = Builder.CreateBitCast(Src.getPointer(), t);
|
||||||
Args.add(RValue::get(Src.getPointer()), QT);
|
Args.add(RValue::get(SrcVal), QT);
|
||||||
|
|
||||||
// Skip over first argument (Src).
|
// Skip over first argument (Src).
|
||||||
EmitCallArgs(Args, FPT, drop_begin(E->arguments(), 1), E->getConstructor(),
|
EmitCallArgs(Args, FPT, drop_begin(E->arguments(), 1), E->getConstructor(),
|
||||||
|
|
|
@ -1155,11 +1155,7 @@ static Address createUnnamedGlobalForMemcpyFrom(CodeGenModule &CGM,
|
||||||
llvm::Constant *Constant,
|
llvm::Constant *Constant,
|
||||||
CharUnits Align) {
|
CharUnits Align) {
|
||||||
Address SrcPtr = CGM.createUnnamedGlobalFrom(D, Constant, Align);
|
Address SrcPtr = CGM.createUnnamedGlobalFrom(D, Constant, Align);
|
||||||
llvm::Type *BP = llvm::PointerType::getInt8PtrTy(CGM.getLLVMContext(),
|
return Builder.CreateElementBitCast(SrcPtr, CGM.Int8Ty);
|
||||||
SrcPtr.getAddressSpace());
|
|
||||||
if (SrcPtr.getType() != BP)
|
|
||||||
SrcPtr = Builder.CreateBitCast(SrcPtr, BP);
|
|
||||||
return SrcPtr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void emitStoresForConstant(CodeGenModule &CGM, const VarDecl &D,
|
static void emitStoresForConstant(CodeGenModule &CGM, const VarDecl &D,
|
||||||
|
@ -1908,10 +1904,9 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) {
|
||||||
return EmitStoreThroughLValue(RValue::get(constant), lv, true);
|
return EmitStoreThroughLValue(RValue::get(constant), lv, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Type *BP = CGM.Int8Ty->getPointerTo(Loc.getAddressSpace());
|
emitStoresForConstant(CGM, D, Builder.CreateElementBitCast(Loc, CGM.Int8Ty),
|
||||||
emitStoresForConstant(
|
type.isVolatileQualified(), Builder, constant,
|
||||||
CGM, D, (Loc.getType() == BP) ? Loc : Builder.CreateBitCast(Loc, BP),
|
/*IsAutoInit=*/false);
|
||||||
type.isVolatileQualified(), Builder, constant, /*IsAutoInit=*/false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Emit an expression as an initializer for an object (variable, field, etc.)
|
/// Emit an expression as an initializer for an object (variable, field, etc.)
|
||||||
|
@ -2462,12 +2457,10 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, ParamValue Arg,
|
||||||
bool IsScalar = hasScalarEvaluationKind(Ty);
|
bool IsScalar = hasScalarEvaluationKind(Ty);
|
||||||
// If we already have a pointer to the argument, reuse the input pointer.
|
// If we already have a pointer to the argument, reuse the input pointer.
|
||||||
if (Arg.isIndirect()) {
|
if (Arg.isIndirect()) {
|
||||||
DeclPtr = Arg.getIndirectAddress();
|
|
||||||
// If we have a prettier pointer type at this point, bitcast to that.
|
// If we have a prettier pointer type at this point, bitcast to that.
|
||||||
unsigned AS = DeclPtr.getType()->getAddressSpace();
|
DeclPtr = Arg.getIndirectAddress();
|
||||||
llvm::Type *IRTy = ConvertTypeForMem(Ty)->getPointerTo(AS);
|
DeclPtr = Builder.CreateElementBitCast(DeclPtr, ConvertTypeForMem(Ty),
|
||||||
if (DeclPtr.getType() != IRTy)
|
D.getName());
|
||||||
DeclPtr = Builder.CreateBitCast(DeclPtr, IRTy, D.getName());
|
|
||||||
// Indirect argument is in alloca address space, which may be different
|
// Indirect argument is in alloca address space, which may be different
|
||||||
// from the default address space.
|
// from the default address space.
|
||||||
auto AllocaAS = CGM.getASTAllocaAddressSpace();
|
auto AllocaAS = CGM.getASTAllocaAddressSpace();
|
||||||
|
|
|
@ -3814,7 +3814,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
|
||||||
// interfaces, so we can't rely on GEP to do this scaling
|
// interfaces, so we can't rely on GEP to do this scaling
|
||||||
// correctly, so we need to cast to i8*. FIXME: is this actually
|
// correctly, so we need to cast to i8*. FIXME: is this actually
|
||||||
// true? A lot of other things in the fragile ABI would break...
|
// true? A lot of other things in the fragile ABI would break...
|
||||||
llvm::Type *OrigBaseTy = Addr.getType();
|
llvm::Type *OrigBaseElemTy = Addr.getElementType();
|
||||||
Addr = Builder.CreateElementBitCast(Addr, Int8Ty);
|
Addr = Builder.CreateElementBitCast(Addr, Int8Ty);
|
||||||
|
|
||||||
// Do the GEP.
|
// Do the GEP.
|
||||||
|
@ -3826,7 +3826,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
|
||||||
Addr = Address(EltPtr, Addr.getElementType(), EltAlign);
|
Addr = Address(EltPtr, Addr.getElementType(), EltAlign);
|
||||||
|
|
||||||
// Cast back.
|
// Cast back.
|
||||||
Addr = Builder.CreateBitCast(Addr, OrigBaseTy);
|
Addr = Builder.CreateElementBitCast(Addr, OrigBaseElemTy);
|
||||||
} else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) {
|
} else if (const Expr *Array = isSimpleArrayDecayOperand(E->getBase())) {
|
||||||
// If this is A[i] where A is an array, the frontend will have decayed the
|
// If this is A[i] where A is an array, the frontend will have decayed the
|
||||||
// base to be a ArrayToPointerDecay implicit cast. While correct, it is
|
// base to be a ArrayToPointerDecay implicit cast. While correct, it is
|
||||||
|
|
|
@ -1736,13 +1736,14 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
|
||||||
|
|
||||||
EmitNewInitializer(*this, E, allocType, elementTy, result, numElements,
|
EmitNewInitializer(*this, E, allocType, elementTy, result, numElements,
|
||||||
allocSizeWithoutCookie);
|
allocSizeWithoutCookie);
|
||||||
|
llvm::Value *resultPtr = result.getPointer();
|
||||||
if (E->isArray()) {
|
if (E->isArray()) {
|
||||||
// NewPtr is a pointer to the base element type. If we're
|
// NewPtr is a pointer to the base element type. If we're
|
||||||
// allocating an array of arrays, we'll need to cast back to the
|
// allocating an array of arrays, we'll need to cast back to the
|
||||||
// array pointer type.
|
// array pointer type.
|
||||||
llvm::Type *resultType = ConvertTypeForMem(E->getType());
|
llvm::Type *resultType = ConvertTypeForMem(E->getType());
|
||||||
if (result.getType() != resultType)
|
if (resultPtr->getType() != resultType)
|
||||||
result = Builder.CreateBitCast(result, resultType);
|
resultPtr = Builder.CreateBitCast(resultPtr, resultType);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deactivate the 'operator delete' cleanup if we finished
|
// Deactivate the 'operator delete' cleanup if we finished
|
||||||
|
@ -1752,7 +1753,6 @@ llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
|
||||||
cleanupDominator->eraseFromParent();
|
cleanupDominator->eraseFromParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
llvm::Value *resultPtr = result.getPointer();
|
|
||||||
if (nullCheck) {
|
if (nullCheck) {
|
||||||
conditional.end(*this);
|
conditional.end(*this);
|
||||||
|
|
||||||
|
|
|
@ -92,8 +92,9 @@ CodeGenFunction::EmitObjCBoxedExpr(const ObjCBoxedExpr *E) {
|
||||||
// and cast value to correct type
|
// and cast value to correct type
|
||||||
Address Temporary = CreateMemTemp(SubExpr->getType());
|
Address Temporary = CreateMemTemp(SubExpr->getType());
|
||||||
EmitAnyExprToMem(SubExpr, Temporary, Qualifiers(), /*isInit*/ true);
|
EmitAnyExprToMem(SubExpr, Temporary, Qualifiers(), /*isInit*/ true);
|
||||||
Address BitCast = Builder.CreateBitCast(Temporary, ConvertType(ArgQT));
|
llvm::Value *BitCast =
|
||||||
Args.add(RValue::get(BitCast.getPointer()), ArgQT);
|
Builder.CreateBitCast(Temporary.getPointer(), ConvertType(ArgQT));
|
||||||
|
Args.add(RValue::get(BitCast), ArgQT);
|
||||||
|
|
||||||
// Create char array to store type encoding
|
// Create char array to store type encoding
|
||||||
std::string Str;
|
std::string Str;
|
||||||
|
@ -816,19 +817,20 @@ static void emitStructGetterCall(CodeGenFunction &CGF, ObjCIvarDecl *ivar,
|
||||||
bool isAtomic, bool hasStrong) {
|
bool isAtomic, bool hasStrong) {
|
||||||
ASTContext &Context = CGF.getContext();
|
ASTContext &Context = CGF.getContext();
|
||||||
|
|
||||||
Address src =
|
llvm::Value *src =
|
||||||
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)
|
CGF.EmitLValueForIvar(CGF.TypeOfSelfObject(), CGF.LoadObjCSelf(), ivar, 0)
|
||||||
.getAddress(CGF);
|
.getPointer(CGF);
|
||||||
|
|
||||||
// objc_copyStruct (ReturnValue, &structIvar,
|
// objc_copyStruct (ReturnValue, &structIvar,
|
||||||
// sizeof (Type of Ivar), isAtomic, false);
|
// sizeof (Type of Ivar), isAtomic, false);
|
||||||
CallArgList args;
|
CallArgList args;
|
||||||
|
|
||||||
Address dest = CGF.Builder.CreateBitCast(CGF.ReturnValue, CGF.VoidPtrTy);
|
llvm::Value *dest =
|
||||||
args.add(RValue::get(dest.getPointer()), Context.VoidPtrTy);
|
CGF.Builder.CreateBitCast(CGF.ReturnValue.getPointer(), CGF.VoidPtrTy);
|
||||||
|
args.add(RValue::get(dest), Context.VoidPtrTy);
|
||||||
|
|
||||||
src = CGF.Builder.CreateBitCast(src, CGF.VoidPtrTy);
|
src = CGF.Builder.CreateBitCast(src, CGF.VoidPtrTy);
|
||||||
args.add(RValue::get(src.getPointer()), Context.VoidPtrTy);
|
args.add(RValue::get(src), Context.VoidPtrTy);
|
||||||
|
|
||||||
CharUnits size = CGF.getContext().getTypeSizeInChars(ivar->getType());
|
CharUnits size = CGF.getContext().getTypeSizeInChars(ivar->getType());
|
||||||
args.add(RValue::get(CGF.CGM.getSize(size)), Context.getSizeType());
|
args.add(RValue::get(CGF.CGM.getSize(size)), Context.getSizeType());
|
||||||
|
@ -1149,11 +1151,10 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
||||||
// types, so there's no point in trying to pick a prettier type.
|
// types, so there's no point in trying to pick a prettier type.
|
||||||
uint64_t ivarSize = getContext().toBits(strategy.getIvarSize());
|
uint64_t ivarSize = getContext().toBits(strategy.getIvarSize());
|
||||||
llvm::Type *bitcastType = llvm::Type::getIntNTy(getLLVMContext(), ivarSize);
|
llvm::Type *bitcastType = llvm::Type::getIntNTy(getLLVMContext(), ivarSize);
|
||||||
bitcastType = bitcastType->getPointerTo(); // addrspace 0 okay
|
|
||||||
|
|
||||||
// Perform an atomic load. This does not impose ordering constraints.
|
// Perform an atomic load. This does not impose ordering constraints.
|
||||||
Address ivarAddr = LV.getAddress(*this);
|
Address ivarAddr = LV.getAddress(*this);
|
||||||
ivarAddr = Builder.CreateBitCast(ivarAddr, bitcastType);
|
ivarAddr = Builder.CreateElementBitCast(ivarAddr, bitcastType);
|
||||||
llvm::LoadInst *load = Builder.CreateLoad(ivarAddr, "load");
|
llvm::LoadInst *load = Builder.CreateLoad(ivarAddr, "load");
|
||||||
load->setAtomic(llvm::AtomicOrdering::Unordered);
|
load->setAtomic(llvm::AtomicOrdering::Unordered);
|
||||||
|
|
||||||
|
@ -1164,12 +1165,11 @@ CodeGenFunction::generateObjCGetterBody(const ObjCImplementationDecl *classImpl,
|
||||||
uint64_t retTySize = CGM.getDataLayout().getTypeSizeInBits(retTy);
|
uint64_t retTySize = CGM.getDataLayout().getTypeSizeInBits(retTy);
|
||||||
llvm::Value *ivarVal = load;
|
llvm::Value *ivarVal = load;
|
||||||
if (ivarSize > retTySize) {
|
if (ivarSize > retTySize) {
|
||||||
llvm::Type *newTy = llvm::Type::getIntNTy(getLLVMContext(), retTySize);
|
bitcastType = llvm::Type::getIntNTy(getLLVMContext(), retTySize);
|
||||||
ivarVal = Builder.CreateTrunc(load, newTy);
|
ivarVal = Builder.CreateTrunc(load, bitcastType);
|
||||||
bitcastType = newTy->getPointerTo();
|
|
||||||
}
|
}
|
||||||
Builder.CreateStore(ivarVal,
|
Builder.CreateStore(ivarVal,
|
||||||
Builder.CreateBitCast(ReturnValue, bitcastType));
|
Builder.CreateElementBitCast(ReturnValue, bitcastType));
|
||||||
|
|
||||||
// Make sure we don't do an autorelease.
|
// Make sure we don't do an autorelease.
|
||||||
AutoreleaseResult = false;
|
AutoreleaseResult = false;
|
||||||
|
@ -2156,7 +2156,7 @@ static llvm::Value *emitARCLoadOperation(CodeGenFunction &CGF, Address addr,
|
||||||
|
|
||||||
// Cast the argument to 'id*'.
|
// Cast the argument to 'id*'.
|
||||||
llvm::Type *origType = addr.getElementType();
|
llvm::Type *origType = addr.getElementType();
|
||||||
addr = CGF.Builder.CreateBitCast(addr, CGF.Int8PtrPtrTy);
|
addr = CGF.Builder.CreateElementBitCast(addr, CGF.Int8PtrTy);
|
||||||
|
|
||||||
// Call the function.
|
// Call the function.
|
||||||
llvm::Value *result = CGF.EmitNounwindRuntimeCall(fn, addr.getPointer());
|
llvm::Value *result = CGF.EmitNounwindRuntimeCall(fn, addr.getPointer());
|
||||||
|
@ -2610,7 +2610,7 @@ void CodeGenFunction::EmitARCDestroyWeak(Address addr) {
|
||||||
fn = getARCIntrinsic(llvm::Intrinsic::objc_destroyWeak, CGM);
|
fn = getARCIntrinsic(llvm::Intrinsic::objc_destroyWeak, CGM);
|
||||||
|
|
||||||
// Cast the argument to 'id*'.
|
// Cast the argument to 'id*'.
|
||||||
addr = Builder.CreateBitCast(addr, Int8PtrPtrTy);
|
addr = Builder.CreateElementBitCast(addr, Int8PtrTy);
|
||||||
|
|
||||||
EmitNounwindRuntimeCall(fn, addr.getPointer());
|
EmitNounwindRuntimeCall(fn, addr.getPointer());
|
||||||
}
|
}
|
||||||
|
|
|
@ -318,8 +318,9 @@ protected:
|
||||||
return B.CreateBitCast(V, Ty);
|
return B.CreateBitCast(V, Ty);
|
||||||
}
|
}
|
||||||
Address EnforceType(CGBuilderTy &B, Address V, llvm::Type *Ty) {
|
Address EnforceType(CGBuilderTy &B, Address V, llvm::Type *Ty) {
|
||||||
if (V.getType() == Ty) return V;
|
if (V.getType() == Ty)
|
||||||
return B.CreateBitCast(V, Ty);
|
return V;
|
||||||
|
return B.CreateElementBitCast(V, Ty->getPointerElementType());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Some zeros used for GEPs in lots of places.
|
// Some zeros used for GEPs in lots of places.
|
||||||
|
|
|
@ -4915,11 +4915,11 @@ void CGObjCMac::EmitThrowStmt(CodeGen::CodeGenFunction &CGF,
|
||||||
llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
|
llvm::Value * CGObjCMac::EmitObjCWeakRead(CodeGen::CodeGenFunction &CGF,
|
||||||
Address AddrWeakObj) {
|
Address AddrWeakObj) {
|
||||||
llvm::Type* DestTy = AddrWeakObj.getElementType();
|
llvm::Type* DestTy = AddrWeakObj.getElementType();
|
||||||
AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj,
|
llvm::Value *AddrWeakObjVal = CGF.Builder.CreateBitCast(
|
||||||
ObjCTypes.PtrObjectPtrTy);
|
AddrWeakObj.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
llvm::Value *read_weak =
|
llvm::Value *read_weak =
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
|
||||||
AddrWeakObj.getPointer(), "weakread");
|
AddrWeakObjVal, "weakread");
|
||||||
read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
|
read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
|
||||||
return read_weak;
|
return read_weak;
|
||||||
}
|
}
|
||||||
|
@ -4938,8 +4938,9 @@ void CGObjCMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
|
||||||
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
||||||
dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *dstVal =
|
||||||
llvm::Value *args[] = { src, dst.getPointer() };
|
CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
|
llvm::Value *args[] = { src, dstVal };
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
|
||||||
args, "weakassign");
|
args, "weakassign");
|
||||||
}
|
}
|
||||||
|
@ -4959,8 +4960,9 @@ void CGObjCMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
|
||||||
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
||||||
dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *dstVal =
|
||||||
llvm::Value *args[] = { src, dst.getPointer() };
|
CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
|
llvm::Value *args[] = {src, dstVal};
|
||||||
if (!threadlocal)
|
if (!threadlocal)
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
|
||||||
args, "globalassign");
|
args, "globalassign");
|
||||||
|
@ -4985,8 +4987,9 @@ void CGObjCMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
|
||||||
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
||||||
dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *dstVal =
|
||||||
llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
|
CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
|
llvm::Value *args[] = {src, dstVal, ivarOffset};
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5004,8 +5007,9 @@ void CGObjCMac::EmitObjCStrongCastAssign(CodeGen::CodeGenFunction &CGF,
|
||||||
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
||||||
dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *dstVal =
|
||||||
llvm::Value *args[] = { src, dst.getPointer() };
|
CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
|
llvm::Value *args[] = {src, dstVal};
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
|
||||||
args, "strongassign");
|
args, "strongassign");
|
||||||
}
|
}
|
||||||
|
@ -5014,8 +5018,8 @@ void CGObjCMac::EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF,
|
||||||
Address DestPtr,
|
Address DestPtr,
|
||||||
Address SrcPtr,
|
Address SrcPtr,
|
||||||
llvm::Value *size) {
|
llvm::Value *size) {
|
||||||
SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
|
SrcPtr = CGF.Builder.CreateElementBitCast(SrcPtr, CGF.Int8Ty);
|
||||||
DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
|
DestPtr = CGF.Builder.CreateElementBitCast(DestPtr, CGF.Int8Ty);
|
||||||
llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), size };
|
llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), size };
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
|
||||||
}
|
}
|
||||||
|
@ -7658,8 +7662,9 @@ void CGObjCNonFragileABIMac::EmitObjCIvarAssign(CodeGen::CodeGenFunction &CGF,
|
||||||
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
||||||
dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *dstVal =
|
||||||
llvm::Value *args[] = { src, dst.getPointer(), ivarOffset };
|
CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
|
llvm::Value *args[] = {src, dstVal, ivarOffset};
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignIvarFn(), args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7678,8 +7683,9 @@ void CGObjCNonFragileABIMac::EmitObjCStrongCastAssign(
|
||||||
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
||||||
dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *dstVal =
|
||||||
llvm::Value *args[] = { src, dst.getPointer() };
|
CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
|
llvm::Value *args[] = {src, dstVal};
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignStrongCastFn(),
|
||||||
args, "weakassign");
|
args, "weakassign");
|
||||||
}
|
}
|
||||||
|
@ -7689,8 +7695,8 @@ void CGObjCNonFragileABIMac::EmitGCMemmoveCollectable(
|
||||||
Address DestPtr,
|
Address DestPtr,
|
||||||
Address SrcPtr,
|
Address SrcPtr,
|
||||||
llvm::Value *Size) {
|
llvm::Value *Size) {
|
||||||
SrcPtr = CGF.Builder.CreateBitCast(SrcPtr, ObjCTypes.Int8PtrTy);
|
SrcPtr = CGF.Builder.CreateElementBitCast(SrcPtr, CGF.Int8Ty);
|
||||||
DestPtr = CGF.Builder.CreateBitCast(DestPtr, ObjCTypes.Int8PtrTy);
|
DestPtr = CGF.Builder.CreateElementBitCast(DestPtr, CGF.Int8Ty);
|
||||||
llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), Size };
|
llvm::Value *args[] = { DestPtr.getPointer(), SrcPtr.getPointer(), Size };
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.GcMemmoveCollectableFn(), args);
|
||||||
}
|
}
|
||||||
|
@ -7702,10 +7708,11 @@ llvm::Value * CGObjCNonFragileABIMac::EmitObjCWeakRead(
|
||||||
CodeGen::CodeGenFunction &CGF,
|
CodeGen::CodeGenFunction &CGF,
|
||||||
Address AddrWeakObj) {
|
Address AddrWeakObj) {
|
||||||
llvm::Type *DestTy = AddrWeakObj.getElementType();
|
llvm::Type *DestTy = AddrWeakObj.getElementType();
|
||||||
AddrWeakObj = CGF.Builder.CreateBitCast(AddrWeakObj, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *AddrWeakObjVal = CGF.Builder.CreateBitCast(
|
||||||
|
AddrWeakObj.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
llvm::Value *read_weak =
|
llvm::Value *read_weak =
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcReadWeakFn(),
|
||||||
AddrWeakObj.getPointer(), "weakread");
|
AddrWeakObjVal, "weakread");
|
||||||
read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
|
read_weak = CGF.Builder.CreateBitCast(read_weak, DestTy);
|
||||||
return read_weak;
|
return read_weak;
|
||||||
}
|
}
|
||||||
|
@ -7724,8 +7731,9 @@ void CGObjCNonFragileABIMac::EmitObjCWeakAssign(CodeGen::CodeGenFunction &CGF,
|
||||||
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
||||||
dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *dstVal =
|
||||||
llvm::Value *args[] = { src, dst.getPointer() };
|
CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
|
llvm::Value *args[] = {src, dstVal};
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignWeakFn(),
|
||||||
args, "weakassign");
|
args, "weakassign");
|
||||||
}
|
}
|
||||||
|
@ -7745,8 +7753,9 @@ void CGObjCNonFragileABIMac::EmitObjCGlobalAssign(CodeGen::CodeGenFunction &CGF,
|
||||||
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
src = CGF.Builder.CreateIntToPtr(src, ObjCTypes.Int8PtrTy);
|
||||||
}
|
}
|
||||||
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
src = CGF.Builder.CreateBitCast(src, ObjCTypes.ObjectPtrTy);
|
||||||
dst = CGF.Builder.CreateBitCast(dst, ObjCTypes.PtrObjectPtrTy);
|
llvm::Value *dstVal =
|
||||||
llvm::Value *args[] = { src, dst.getPointer() };
|
CGF.Builder.CreateBitCast(dst.getPointer(), ObjCTypes.PtrObjectPtrTy);
|
||||||
|
llvm::Value *args[] = {src, dstVal};
|
||||||
if (!threadlocal)
|
if (!threadlocal)
|
||||||
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
|
CGF.EmitNounwindRuntimeCall(ObjCTypes.getGcAssignGlobalFn(),
|
||||||
args, "globalassign");
|
args, "globalassign");
|
||||||
|
|
|
@ -2121,10 +2121,9 @@ std::pair<llvm::Value*, llvm::Type *> CodeGenFunction::EmitAsmInputLValue(
|
||||||
if ((Size <= 64 && llvm::isPowerOf2_64(Size)) ||
|
if ((Size <= 64 && llvm::isPowerOf2_64(Size)) ||
|
||||||
getTargetHooks().isScalarizableAsmOperand(*this, Ty)) {
|
getTargetHooks().isScalarizableAsmOperand(*this, Ty)) {
|
||||||
Ty = llvm::IntegerType::get(getLLVMContext(), Size);
|
Ty = llvm::IntegerType::get(getLLVMContext(), Size);
|
||||||
Ty = llvm::PointerType::getUnqual(Ty);
|
|
||||||
|
|
||||||
return {Builder.CreateLoad(
|
return {Builder.CreateLoad(Builder.CreateElementBitCast(
|
||||||
Builder.CreateBitCast(InputValue.getAddress(*this), Ty)),
|
InputValue.getAddress(*this), Ty)),
|
||||||
nullptr};
|
nullptr};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2713,8 +2712,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
||||||
// ResultTypeRequiresCast.size() elements of RegResults.
|
// ResultTypeRequiresCast.size() elements of RegResults.
|
||||||
if ((i < ResultTypeRequiresCast.size()) && ResultTypeRequiresCast[i]) {
|
if ((i < ResultTypeRequiresCast.size()) && ResultTypeRequiresCast[i]) {
|
||||||
unsigned Size = getContext().getTypeSize(ResultRegQualTys[i]);
|
unsigned Size = getContext().getTypeSize(ResultRegQualTys[i]);
|
||||||
Address A = Builder.CreateBitCast(Dest.getAddress(*this),
|
Address A = Builder.CreateElementBitCast(Dest.getAddress(*this),
|
||||||
ResultRegTypes[i]->getPointerTo());
|
ResultRegTypes[i]);
|
||||||
if (getTargetHooks().isScalarizableAsmOperand(*this, TruncTy)) {
|
if (getTargetHooks().isScalarizableAsmOperand(*this, TruncTy)) {
|
||||||
Builder.CreateStore(Tmp, A);
|
Builder.CreateStore(Tmp, A);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -6817,10 +6817,10 @@ void CodeGenFunction::EmitOMPUseDevicePtrClause(
|
||||||
// because it is always a void *. References are materialized in the
|
// because it is always a void *. References are materialized in the
|
||||||
// privatization scope, so the initialization here disregards the fact
|
// privatization scope, so the initialization here disregards the fact
|
||||||
// the original variable is a reference.
|
// the original variable is a reference.
|
||||||
QualType AddrQTy = getContext().getPointerType(
|
llvm::Type *Ty =
|
||||||
OrigVD->getType().getNonReferenceType());
|
ConvertTypeForMem(OrigVD->getType().getNonReferenceType());
|
||||||
llvm::Type *AddrTy = ConvertTypeForMem(AddrQTy);
|
Address InitAddr =
|
||||||
Address InitAddr = Builder.CreateBitCast(InitAddrIt->second, AddrTy);
|
Builder.CreateElementBitCast(InitAddrIt->second, Ty);
|
||||||
setAddrOfLocalVar(InitVD, InitAddr);
|
setAddrOfLocalVar(InitVD, InitAddr);
|
||||||
|
|
||||||
// Emit private declaration, it will be initialized by the value we
|
// Emit private declaration, it will be initialized by the value we
|
||||||
|
|
|
@ -1352,8 +1352,8 @@ void X86_32TargetCodeGenInfo::addReturnRegisterOutputs(
|
||||||
ResultTruncRegTypes.push_back(CoerceTy);
|
ResultTruncRegTypes.push_back(CoerceTy);
|
||||||
|
|
||||||
// Coerce the integer by bitcasting the return slot pointer.
|
// Coerce the integer by bitcasting the return slot pointer.
|
||||||
ReturnSlot.setAddress(CGF.Builder.CreateBitCast(ReturnSlot.getAddress(CGF),
|
ReturnSlot.setAddress(
|
||||||
CoerceTy->getPointerTo()));
|
CGF.Builder.CreateElementBitCast(ReturnSlot.getAddress(CGF), CoerceTy));
|
||||||
ResultRegDests.push_back(ReturnSlot);
|
ResultRegDests.push_back(ReturnSlot);
|
||||||
|
|
||||||
rewriteInputConstraintReferences(NumOutputs, 1, AsmString);
|
rewriteInputConstraintReferences(NumOutputs, 1, AsmString);
|
||||||
|
@ -8600,9 +8600,8 @@ Address HexagonABIInfo::EmitVAArgFromMemory(CodeGenFunction &CGF,
|
||||||
// Get the type of the argument from memory and bitcast
|
// Get the type of the argument from memory and bitcast
|
||||||
// overflow area pointer to the argument type.
|
// overflow area pointer to the argument type.
|
||||||
llvm::Type *PTy = CGF.ConvertTypeForMem(Ty);
|
llvm::Type *PTy = CGF.ConvertTypeForMem(Ty);
|
||||||
Address AddrTyped = CGF.Builder.CreateBitCast(
|
Address AddrTyped = CGF.Builder.CreateElementBitCast(
|
||||||
Address(__overflow_area_pointer, CharUnits::fromQuantity(Align)),
|
Address(__overflow_area_pointer, CharUnits::fromQuantity(Align)), PTy);
|
||||||
llvm::PointerType::getUnqual(PTy));
|
|
||||||
|
|
||||||
// Round up to the minimum stack alignment for varargs which is 4 bytes.
|
// Round up to the minimum stack alignment for varargs which is 4 bytes.
|
||||||
uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
|
uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
|
||||||
|
@ -8621,9 +8620,8 @@ Address HexagonABIInfo::EmitVAArgForHexagon(CodeGenFunction &CGF,
|
||||||
QualType Ty) const {
|
QualType Ty) const {
|
||||||
// FIXME: Need to handle alignment
|
// FIXME: Need to handle alignment
|
||||||
llvm::Type *BP = CGF.Int8PtrTy;
|
llvm::Type *BP = CGF.Int8PtrTy;
|
||||||
llvm::Type *BPP = CGF.Int8PtrPtrTy;
|
|
||||||
CGBuilderTy &Builder = CGF.Builder;
|
CGBuilderTy &Builder = CGF.Builder;
|
||||||
Address VAListAddrAsBPP = Builder.CreateBitCast(VAListAddr, BPP, "ap");
|
Address VAListAddrAsBPP = Builder.CreateElementBitCast(VAListAddr, BP, "ap");
|
||||||
llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
|
llvm::Value *Addr = Builder.CreateLoad(VAListAddrAsBPP, "ap.cur");
|
||||||
// Handle address alignment for type alignment > 32 bits
|
// Handle address alignment for type alignment > 32 bits
|
||||||
uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8;
|
uint64_t TyAlign = CGF.getContext().getTypeAlign(Ty) / 8;
|
||||||
|
@ -8634,9 +8632,8 @@ Address HexagonABIInfo::EmitVAArgForHexagon(CodeGenFunction &CGF,
|
||||||
AddrAsInt = Builder.CreateAnd(AddrAsInt, Builder.getInt32(~(TyAlign - 1)));
|
AddrAsInt = Builder.CreateAnd(AddrAsInt, Builder.getInt32(~(TyAlign - 1)));
|
||||||
Addr = Builder.CreateIntToPtr(AddrAsInt, BP);
|
Addr = Builder.CreateIntToPtr(AddrAsInt, BP);
|
||||||
}
|
}
|
||||||
llvm::Type *PTy = llvm::PointerType::getUnqual(CGF.ConvertType(Ty));
|
Address AddrTyped = Builder.CreateElementBitCast(
|
||||||
Address AddrTyped = Builder.CreateBitCast(
|
Address(Addr, CharUnits::fromQuantity(TyAlign)), CGF.ConvertType(Ty));
|
||||||
Address(Addr, CharUnits::fromQuantity(TyAlign)), PTy);
|
|
||||||
|
|
||||||
uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
|
uint64_t Offset = llvm::alignTo(CGF.getContext().getTypeSize(Ty) / 8, 4);
|
||||||
llvm::Value *NextAddr = Builder.CreateGEP(
|
llvm::Value *NextAddr = Builder.CreateGEP(
|
||||||
|
@ -9750,7 +9747,7 @@ Address SparcV9ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
|
||||||
Address NextPtr = Builder.CreateConstInBoundsByteGEP(Addr, Stride, "ap.next");
|
Address NextPtr = Builder.CreateConstInBoundsByteGEP(Addr, Stride, "ap.next");
|
||||||
Builder.CreateStore(NextPtr.getPointer(), VAListAddr);
|
Builder.CreateStore(NextPtr.getPointer(), VAListAddr);
|
||||||
|
|
||||||
return Builder.CreateBitCast(ArgAddr, ArgPtrTy, "arg.addr");
|
return Builder.CreateElementBitCast(ArgAddr, ArgTy, "arg.addr");
|
||||||
}
|
}
|
||||||
|
|
||||||
void SparcV9ABIInfo::computeInfo(CGFunctionInfo &FI) const {
|
void SparcV9ABIInfo::computeInfo(CGFunctionInfo &FI) const {
|
||||||
|
@ -10107,9 +10104,9 @@ Address XCoreABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr,
|
||||||
break;
|
break;
|
||||||
case ABIArgInfo::Extend:
|
case ABIArgInfo::Extend:
|
||||||
case ABIArgInfo::Direct:
|
case ABIArgInfo::Direct:
|
||||||
Val = Builder.CreateBitCast(AP, ArgPtrTy);
|
Val = Builder.CreateElementBitCast(AP, ArgTy);
|
||||||
ArgSize = CharUnits::fromQuantity(
|
ArgSize = CharUnits::fromQuantity(
|
||||||
getDataLayout().getTypeAllocSize(AI.getCoerceToType()));
|
getDataLayout().getTypeAllocSize(AI.getCoerceToType()));
|
||||||
ArgSize = ArgSize.alignTo(SlotSize);
|
ArgSize = ArgSize.alignTo(SlotSize);
|
||||||
break;
|
break;
|
||||||
case ABIArgInfo::Indirect:
|
case ABIArgInfo::Indirect:
|
||||||
|
|
Loading…
Reference in New Issue