Home | History | Annotate | Download | only in CodeGen

Lines Matching refs:CGF

406 static void EmitNullBaseClassInitialization(CodeGenFunction &CGF,
412 DestPtr = CGF.EmitCastToVoidPtr(DestPtr);
414 const ASTRecordLayout &Layout = CGF.getContext().getASTRecordLayout(Base);
418 llvm::Value *SizeVal = CGF.CGM.getSize(Size);
426 if (!CGF.CGM.getTypes().isZeroInitializable(Base)) {
427 llvm::Constant *NullConstant = CGF.CGM.EmitNullConstantForBase(Base);
430 new llvm::GlobalVariable(CGF.CGM.getModule(), NullConstant->getType(),
435 llvm::Value *SrcPtr = CGF.EmitCastToVoidPtr(NullVariable);
438 CGF.Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal, Align.getQuantity());
445 CGF.Builder.CreateMemSet(DestPtr, CGF.Builder.getInt8(0), SizeVal,
547 static CharUnits CalculateCookiePadding(CodeGenFunction &CGF,
557 return CGF.CGM.getCXXABI().GetArrayCookieSize(E);
560 static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF,
568 CharUnits typeSize = CGF.getContext().getTypeSizeInChars(type);
570 = llvm::ConstantInt::get(CGF.SizeTy, typeSize.getQuantity());
575 unsigned sizeWidth = CGF.SizeTy->getBitWidth();
579 CalculateCookiePadding(CGF, e).getQuantity());
584 numElements = CGF.EmitScalarExpr(e->getArraySize());
602 = CGF.getContext().getAsConstantArrayType(type)) {
607 CharUnits typeSize = CGF.getContext().getTypeSizeInChars(type);
644 numElements = llvm::ConstantInt::get(CGF.SizeTy,
657 sizeWithoutCookie = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
665 size = llvm::Constant::getAllOnesValue(CGF.SizeTy);
667 size = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
697 hasOverflow = CGF.Builder.CreateICmpUGE(numElements, thresholdV);
698 numElements = CGF.Builder.CreateTrunc(numElements, CGF.SizeTy);
703 numElements = CGF.Builder.CreateSExt(numElements, CGF.SizeTy);
711 hasOverflow = CGF.Builder.CreateICmpSLT(numElements,
712 llvm::ConstantInt::get(CGF.SizeTy, minElements));
716 numElements = CGF.Builder.CreateZExt(numElements, CGF.SizeTy);
719 assert(numElements->getType() == CGF.SizeTy);
724 hasOverflow = CGF.Builder.CreateICmpULT(numElements,
725 llvm::ConstantInt::get(CGF.SizeTy, minElements));
730 hasOverflow = CGF.Builder.CreateOr(hasOverflow,
731 CGF.Builder.CreateICmpULT(numElements,
732 llvm::ConstantInt::get(CGF.SizeTy, minElements)));
747 = CGF.CGM.getIntrinsic(llvm::Intrinsic::umul_with_overflow, CGF.SizeTy);
750 llvm::ConstantInt::get(CGF.SizeTy, typeSizeMultiplier);
752 CGF.Builder.CreateCall2(umul_with_overflow, size, tsmV);
754 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
756 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
760 size = CGF.Builder.CreateExtractValue(result, 0);
773 llvm::ConstantInt::get(CGF.SizeTy, arraySizeMultiplier);
774 numElements = CGF.Builder.CreateMul(numElements, asmV);
787 = CGF.CGM.getIntrinsic(llvm::Intrinsic::uadd_with_overflow, CGF.SizeTy);
789 llvm::Value *cookieSizeV = llvm::ConstantInt::get(CGF.SizeTy, cookieSize);
791 CGF.Builder.CreateCall2(uadd_with_overflow, size, cookieSizeV);
793 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
795 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
799 size = CGF.Builder.CreateExtractValue(result, 0);
806 size = CGF.Builder.CreateSelect(hasOverflow,
807 llvm::Constant::getAllOnesValue(CGF.SizeTy),
819 static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const Expr *Init,
822 CharUnits Alignment = CGF.getContext().getTypeAlignInChars(AllocType);
823 switch (CGF.getEvaluationKind(AllocType)) {
825 CGF.EmitScalarInit(Init, 0, CGF.MakeAddrLValue(NewPtr, AllocType,
830 CGF.EmitComplexExprIntoLValue(Init, CGF.MakeAddrLValue(NewPtr, AllocType,
840 CGF.EmitAggExpr(Init, Slot);
842 CGF.MaybeEmitStdInitializerListCleanup(NewPtr, Init);
963 static void EmitZeroMemSet(CodeGenFunction &CGF, QualType T,
965 CGF.EmitCastToVoidPtr(NewPtr);
966 CharUnits Alignment = CGF.getContext().getTypeAlignInChars(T);
967 CGF.Builder.CreateMemSet(NewPtr, CGF.Builder.getInt8(0), Size,
971 static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E,
986 if (CGF.CGM.getTypes().isZeroInitializable(ElementType)) {
989 EmitZeroMemSet(CGF, ElementType, NewPtr, AllocSizeWithoutCookie);
994 CGF.EmitCXXAggrConstructorCall(Ctor, NumElements, NewPtr,
999 CGF.CGM.getTypes().isZeroInitializable(ElementType)) {
1002 EmitZeroMemSet(CGF, ElementType, NewPtr, AllocSizeWithoutCookie);
1005 CGF.EmitNewArrayInitializer(E, ElementType, NewPtr, NumElements);
1012 StoreAnyExprIntoOneUnit(CGF, Init, E->getAllocatedType(), NewPtr);
1043 void Emit(CodeGenFunction &CGF, Flags flags) {
1064 CGF.EmitCall(CGF.CGM.getTypes().arrangeFreeFunctionCall(DeleteArgs, FPT),
1065 CGF.CGM.GetAddrOfFunction(OperatorDelete),
1100 void Emit(CodeGenFunction &CGF, Flags flags) {
1110 DeleteArgs.add(Ptr.restore(CGF), *AI++);
1114 RValue RV = AllocSize.restore(CGF);
1120 RValue RV = getPlacementArgs()[I].restore(CGF);
1125 CGF.EmitCall(CGF.CGM.getTypes().arrangeFreeFunctionCall(DeleteArgs, FPT),
1126 CGF.CGM.GetAddrOfFunction(OperatorDelete),
1134 static void EnterNewDeleteCleanup(CodeGenFunction &CGF,
1141 if (!CGF.isInConditionalBranch()) {
1142 CallDeleteDuringNew *Cleanup = CGF.EHStack
1155 DominatingValue<RValue>::save(CGF, RValue::get(NewPtr));
1157 DominatingValue<RValue>::save(CGF, RValue::get(AllocSize));
1159 CallDeleteDuringConditionalNew *Cleanup = CGF.EHStack
1167 DominatingValue<RValue>::save(CGF, NewArgs[I+1].RV));
1169 CGF.initFullExprCleanup();
1380 void Emit(CodeGenFunction &CGF, Flags flags) {
1381 CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType);
1387 static void EmitObjectDelete(CodeGenFunction &CGF,
1408 CGF.CGM.getCXXABI().adjustToCompleteObject(CGF, Ptr, ElementType);
1410 CGF.EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup,
1417 CGF.CGM.getCXXABI().EmitVirtualDestructorCall(CGF, Dtor, DtorType,
1422 CGF.PopCleanupBlock();
1433 CGF.EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup,
1437 CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete,
1441 else if (CGF.getLangOpts().ObjCAutoRefCount &&
1451 llvm::Value *PtrValue = CGF.Builder.CreateLoad(Ptr,
1454 CGF.EmitARCRelease(PtrValue, ARCPreciseLifetime);
1459 CGF.EmitARCDestroyWeak(Ptr);
1464 CGF.PopCleanupBlock();
1484 void Emit(CodeGenFunction &CGF, Flags flags) {
1494 = CGF.Builder.CreateBitCast(Ptr, CGF.ConvertType(VoidPtrTy));
1501 = cast<llvm::IntegerType>(CGF.ConvertType(size_t));
1504 CGF.CGM.getContext().getTypeSizeInChars(ElementType);
1509 Size = CGF.Builder.CreateMul(Size, NumElements);
1515 Size = CGF.Builder.CreateAdd(Size, CookieSizeV);
1522 CGF.EmitCall(CGF.getTypes().arrangeFreeFunctionCall(Args, DeleteFTy),
1523 CGF.CGM.GetAddrOfFunction(OperatorDelete),
1530 static void EmitArrayDelete(CodeGenFunction &CGF,
1537 CGF.CGM.getCXXABI().ReadArrayCookie(CGF, deletedPtr, E, elementType,
1544 CGF.EHStack.pushCleanup<CallArrayDelete>(NormalAndEHCleanup,
1554 CGF.Builder.CreateInBoundsGEP(deletedPtr, numElements, "delete.end");
1559 CGF.emitArrayDestroy(deletedPtr, arrayEnd, elementType,
1560 CGF.getDestroyer(dtorKind),
1562 CGF.needsEHCleanup(dtorKind));
1566 CGF.PopCleanupBlock();
1618 static llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
1620 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1622 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1625 static void EmitBadTypeidCall(CodeGenFunction &CGF) {
1626 llvm::Value *Fn = getBadTypeidFn(CGF);
1627 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1628 CGF.Builder.CreateUnreachable();
1631 static llvm::Value *EmitTypeidFromVTable(CodeGenFunction &CGF,
1635 llvm::Value *ThisPtr = CGF.EmitLValue(E).getAddress();
1644 CGF.createBasicBlock("typeid.bad_typeid");
1646 CGF.createBasicBlock("typeid.end");
1648 llvm::Value *IsNull = CGF.Builder.CreateIsNull(ThisPtr);
1649 CGF.Builder.CreateCondBr(IsNull, BadTypeidBlock, EndBlock);
1651 CGF.EmitBlock(BadTypeidBlock);
1652 EmitBadTypeidCall(CGF);
1653 CGF.EmitBlock(EndBlock);
1657 llvm::Value *Value = CGF.GetVTablePtr(ThisPtr,
1661 Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
1662 return CGF.Builder.CreateLoad(Value);
1689 static llvm::Constant *getDynamicCastFn(CodeGenFunction &CGF) {
1695 llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
1697 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1707 CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
1709 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1712 static llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
1714 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1715 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1718 static void EmitBadCastCall(CodeGenFunction &CGF) {
1719 llvm::Value *Fn = getBadCastFn(CGF);
1720 CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
1721 CGF.Builder.CreateUnreachable();
1777 EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
1781 CGF.ConvertType(CGF.getContext().getPointerDiffType());
1782 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1791 llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1795 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1796 OffsetToTop = CGF.Builder.CreateLoad(OffsetToTop, "offset.to.top");
1799 Value = CGF.EmitCastToVoidPtr(Value);
1800 Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1802 return CGF.Builder.CreateBitCast(Value, DestLTy);
1821 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1823 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1830 computeOffsetHint(CGF.getContext(), SrcDecl,
1834 Value = CGF.EmitCastToVoidPtr(Value);
1837 Value = CGF.EmitNounwindRuntimeCall(getDynamicCastFn(CGF), args);
1838 Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1844 CGF.createBasicBlock("dynamic_cast.bad_cast");
1846 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1847 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1849 CGF.EmitBlock(BadCastBlock);
1850 EmitBadCastCall(CGF);
1856 static llvm::Value *EmitDynamicCastToNull(CodeGenFunction &CGF,
1858 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1864 EmitBadCastCall(CGF);
1866 CGF.EmitBlock(CGF.createBasicBlock("dynamic_cast.end"));