Home | History | Annotate | Download | only in CodeGen

Lines Matching refs:CGF

356 static void EmitNullBaseClassInitialization(CodeGenFunction &CGF,
362 DestPtr = CGF.EmitCastToVoidPtr(DestPtr);
364 const ASTRecordLayout &Layout = CGF.getContext().getASTRecordLayout(Base);
368 llvm::Value *SizeVal = CGF.CGM.getSize(Size);
376 if (!CGF.CGM.getTypes().isZeroInitializable(Base)) {
377 llvm::Constant *NullConstant = CGF.CGM.EmitNullConstantForBase(Base);
380 new llvm::GlobalVariable(CGF.CGM.getModule(), NullConstant->getType(),
385 llvm::Value *SrcPtr = CGF.EmitCastToVoidPtr(NullVariable);
388 CGF.Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal, Align.getQuantity());
395 CGF.Builder.CreateMemSet(DestPtr, CGF.Builder.getInt8(0), SizeVal,
496 static CharUnits CalculateCookiePadding(CodeGenFunction &CGF,
506 return CGF.CGM.getCXXABI().GetArrayCookieSize(E);
509 static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF,
517 CharUnits typeSize = CGF.getContext().getTypeSizeInChars(type);
519 = llvm::ConstantInt::get(CGF.SizeTy, typeSize.getQuantity());
524 unsigned sizeWidth = CGF.SizeTy->getBitWidth();
528 CalculateCookiePadding(CGF, e).getQuantity());
533 numElements = CGF.EmitScalarExpr(e->getArraySize());
551 = CGF.getContext().getAsConstantArrayType(type)) {
556 CharUnits typeSize = CGF.getContext().getTypeSizeInChars(type);
593 numElements = llvm::ConstantInt::get(CGF.SizeTy,
606 sizeWithoutCookie = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
614 size = llvm::Constant::getAllOnesValue(CGF.SizeTy);
616 size = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
646 hasOverflow = CGF.Builder.CreateICmpUGE(numElements, thresholdV);
647 numElements = CGF.Builder.CreateTrunc(numElements, CGF.SizeTy);
652 numElements = CGF.Builder.CreateSExt(numElements, CGF.SizeTy);
660 hasOverflow = CGF.Builder.CreateICmpSLT(numElements,
661 llvm::ConstantInt::get(CGF.SizeTy, minElements));
665 numElements = CGF.Builder.CreateZExt(numElements, CGF.SizeTy);
668 assert(numElements->getType() == CGF.SizeTy);
673 hasOverflow = CGF.Builder.CreateICmpULT(numElements,
674 llvm::ConstantInt::get(CGF.SizeTy, minElements));
679 hasOverflow = CGF.Builder.CreateOr(hasOverflow,
680 CGF.Builder.CreateICmpULT(numElements,
681 llvm::ConstantInt::get(CGF.SizeTy, minElements)));
696 = CGF.CGM.getIntrinsic(llvm::Intrinsic::umul_with_overflow, CGF.SizeTy);
699 llvm::ConstantInt::get(CGF.SizeTy, typeSizeMultiplier);
701 CGF.Builder.CreateCall2(umul_with_overflow, size, tsmV);
703 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
705 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
709 size = CGF.Builder.CreateExtractValue(result, 0);
722 llvm::ConstantInt::get(CGF.SizeTy, arraySizeMultiplier);
723 numElements = CGF.Builder.CreateMul(numElements, asmV);
736 = CGF.CGM.getIntrinsic(llvm::Intrinsic::uadd_with_overflow, CGF.SizeTy);
738 llvm::Value *cookieSizeV = llvm::ConstantInt::get(CGF.SizeTy, cookieSize);
740 CGF.Builder.CreateCall2(uadd_with_overflow, size, cookieSizeV);
742 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
744 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
748 size = CGF.Builder.CreateExtractValue(result, 0);
755 size = CGF.Builder.CreateSelect(hasOverflow,
756 llvm::Constant::getAllOnesValue(CGF.SizeTy),
768 static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const Expr *Init,
771 CharUnits Alignment = CGF.getContext().getTypeAlignInChars(AllocType);
772 if (!CGF.hasAggregateLLVMType(AllocType))
773 CGF.EmitScalarInit(Init, 0, CGF.MakeAddrLValue(NewPtr, AllocType,
777 CGF.EmitComplexExprIntoAddr(Init, NewPtr,
785 CGF.EmitAggExpr(Init, Slot);
787 CGF.MaybeEmitStdInitializerListCleanup(NewPtr, Init);
905 static void EmitZeroMemSet(CodeGenFunction &CGF, QualType T,
907 CGF.EmitCastToVoidPtr(NewPtr);
908 CharUnits Alignment = CGF.getContext().getTypeAlignInChars(T);
909 CGF.Builder.CreateMemSet(NewPtr, CGF.Builder.getInt8(0), Size,
913 static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E,
929 if (CGF.CGM.getTypes().isZeroInitializable(ElementType)) {
932 EmitZeroMemSet(CGF, ElementType, NewPtr, AllocSizeWithoutCookie);
939 CGF.EmitCXXAggrConstructorCall(Ctor, NumElements, NewPtr,
944 CGF.CGM.getTypes().isZeroInitializable(ElementType)) {
947 EmitZeroMemSet(CGF, ElementType, NewPtr, AllocSizeWithoutCookie);
950 CGF.EmitNewArrayInitializer(E, ElementType, NewPtr, NumElements);
957 StoreAnyExprIntoOneUnit(CGF, Init, E->getAllocatedType(), NewPtr);
988 void Emit(CodeGenFunction &CGF, Flags flags) {
1009 CGF.EmitCall(CGF.CGM.getTypes().arrangeFunctionCall(DeleteArgs, FPT),
1010 CGF.CGM.GetAddrOfFunction(OperatorDelete),
1045 void Emit(CodeGenFunction &CGF, Flags flags) {
1055 DeleteArgs.add(Ptr.restore(CGF), *AI++);
1059 RValue RV = AllocSize.restore(CGF);
1065 RValue RV = getPlacementArgs()[I].restore(CGF);
1070 CGF.EmitCall(CGF.CGM.getTypes().arrangeFunctionCall(DeleteArgs, FPT),
1071 CGF.CGM.GetAddrOfFunction(OperatorDelete),
1079 static void EnterNewDeleteCleanup(CodeGenFunction &CGF,
1086 if (!CGF.isInConditionalBranch()) {
1087 CallDeleteDuringNew *Cleanup = CGF.EHStack
1100 DominatingValue<RValue>::save(CGF, RValue::get(NewPtr));
1102 DominatingValue<RValue>::save(CGF, RValue::get(AllocSize));
1104 CallDeleteDuringConditionalNew *Cleanup = CGF.EHStack
1112 DominatingValue<RValue>::save(CGF, NewArgs[I+1].RV));
1114 CGF.initFullExprCleanup();
1326 void Emit(CodeGenFunction &CGF, Flags flags) {
1327 CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType);
1333 static void EmitObjectDelete(CodeGenFunction &CGF,
1350 CGF.EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup,
1356 CGF.getTypes().GetFunctionType(
1357 CGF.getTypes().arrangeCXXDestructor(Dtor, Dtor_Complete));
1360 = CGF.BuildVirtualCall(Dtor,
1363 CGF.EmitCXXMemberCall(Dtor, Callee, ReturnValueSlot(), Ptr, /*VTT=*/0,
1367 CGF.PopCleanupBlock();
1378 CGF.EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup,
1382 CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete,
1384 else if (CGF.getLangOpts().ObjCAutoRefCount &&
1394 llvm::Value *PtrValue = CGF.Builder.CreateLoad(Ptr,
1397 CGF.EmitARCRelease(PtrValue, /*precise*/ true);
1402 CGF.EmitARCDestroyWeak(Ptr);
1407 CGF.PopCleanupBlock();
1427 void Emit(CodeGenFunction &CGF, Flags flags) {
1437 = CGF.Builder.CreateBitCast(Ptr, CGF.ConvertType(VoidPtrTy));
1444 = cast<llvm::IntegerType>(CGF.ConvertType(size_t));
1447 CGF.CGM.getContext().getTypeSizeInChars(ElementType);
1452 Size = CGF.Builder.CreateMul(Size, NumElements);
1458 Size = CGF.Builder.CreateAdd(Size, CookieSizeV);
1465 CGF.EmitCall(CGF.getTypes().arrangeFunctionCall(Args, DeleteFTy),
1466 CGF.CGM.GetAddrOfFunction(OperatorDelete),
1473 static void EmitArrayDelete(CodeGenFunction &CGF,
1480 CGF.CGM.getCXXABI().ReadArrayCookie(CGF, deletedPtr, E, elementType,
1487 CGF.EHStack.pushCleanup<CallArrayDelete>(NormalAndEHCleanup,
1497 CGF.Builder.CreateInBoundsGEP(deletedPtr, numElements, "delete.end");
1502 CGF.emitArrayDestroy(deletedPtr, arrayEnd, elementType,
1503 CGF.getDestroyer(dtorKind),
1505 CGF.needsEHCleanup(dtorKind));
1509 CGF.PopCleanupBlock();
1572 static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
1574 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1576 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1579 static void EmitBadTypeidCall(CodeGenFunction &CGF) {
1580 llvm::Value *Fn = getBadTypeidFn(CGF);
1581 CGF.EmitCallOrInvoke(Fn).setDoesNotReturn();
1582 CGF.Builder.CreateUnreachable();
1585 static llvm::Value *EmitTypeidFromVTable(CodeGenFunction &CGF,
1589 llvm::Value *ThisPtr = CGF.EmitLValue(E).getAddress();
1598 CGF.createBasicBlock("typeid.bad_typeid");
1600 CGF.createBasicBlock("typeid.end");
1602 llvm::Value *IsNull = CGF.Builder.CreateIsNull(ThisPtr);
1603 CGF.Builder.CreateCondBr(IsNull, BadTypeidBlock, EndBlock);
1605 CGF.EmitBlock(BadTypeidBlock);
1606 EmitBadTypeidCall(CGF);
1607 CGF.EmitBlock(EndBlock);
1611 llvm::Value *Value = CGF.GetVTablePtr(ThisPtr,
1615 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
1616 return CGF.Builder.CreateLoad(Value);
1649 static llvm::Constant *getDynamicCastFn(CodeGenFunction &CGF) {
1655 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1657 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1664 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast");
1667 static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
1669 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1670 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1673 static void EmitBadCastCall(CodeGenFunction &CGF) {
1674 llvm::Value *Fn = getBadCastFn(CGF);
1675 CGF.EmitCallOrInvoke(Fn).setDoesNotReturn();
1676 CGF.Builder.CreateUnreachable();
1680 EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
1684 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1685 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1694 llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1698 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1699 OffsetToTop = CGF.Builder.CreateLoad(OffsetToTop, "offset.to.top");
1702 Value = CGF.EmitCastToVoidPtr(Value);
1703 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1705 return CGF.Builder.CreateBitCast(Value, DestLTy);
1724 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1726 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1732 Value = CGF.EmitCastToVoidPtr(Value);
1733 Value = CGF.Builder.CreateCall4(getDynamicCastFn(CGF), Value,
1735 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1741 CGF.createBasicBlock("dynamic_cast.bad_cast");
1743 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1744 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1746 CGF.EmitBlock(BadCastBlock);
1747 EmitBadCastCall(CGF);
1753 static llvm::Value *EmitDynamicCastToNull(CodeGenFunction &CGF,
1755 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1761 EmitBadCastCall(CGF);
1763 CGF.EmitBlock(CGF.createBasicBlock("dynamic_cast.end"));