Lines Matching refs:CGF
123 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
131 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
136 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
151 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
156 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
160 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
164 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
165 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
167 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
170 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
182 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
183 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
229 llvm::Value *emitDynamicCastCall(CodeGenFunction &CGF, Address Value,
234 llvm::Value *emitExactDynamicCast(CodeGenFunction &CGF, Address ThisAddr,
240 llvm::Value *emitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
243 bool EmitBadCastCall(CodeGenFunction &CGF) override;
246 GetVirtualBaseClassOffset(CodeGenFunction &CGF, Address This,
266 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
269 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
271 AddedStructorArgs getImplicitConstructorArgs(CodeGenFunction &CGF,
277 llvm::Value *getCXXDestructorImplicitParam(CodeGenFunction &CGF,
283 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
291 bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
303 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
307 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
317 CGCallee getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
321 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
342 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
345 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
359 Address InitializeArrayCookie(CodeGenFunction &CGF,
364 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
368 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
371 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
387 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
426 LoadVTablePtr(CodeGenFunction &CGF, Address This,
484 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
488 Address InitializeArrayCookie(CodeGenFunction &CGF,
493 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, Address allocPtr,
521 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
523 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
536 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
623 CodeGenFunction &CGF, const Expr *E, Address ThisAddr, in EmitLoadOfMemberFunctionPointer() argument
626 CGBuilderTy &Builder = CGF.Builder; in EmitLoadOfMemberFunctionPointer()
635 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual"); in EmitLoadOfMemberFunctionPointer()
636 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual"); in EmitLoadOfMemberFunctionPointer()
637 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end"); in EmitLoadOfMemberFunctionPointer()
669 CGF.EmitBlock(FnVirtual); in EmitLoadOfMemberFunctionPointer()
672 llvm::Type *VTableTy = CGF.CGM.GlobalsInt8PtrTy; in EmitLoadOfMemberFunctionPointer()
674 CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD, in EmitLoadOfMemberFunctionPointer()
675 CGF.getPointerAlign()); in EmitLoadOfMemberFunctionPointer()
676 llvm::Value *VTable = CGF.GetVTablePtr( in EmitLoadOfMemberFunctionPointer()
686 VTableOffset = Builder.CreateTrunc(VTableOffset, CGF.Int32Ty); in EmitLoadOfMemberFunctionPointer()
694 bool ShouldEmitCFICheck = CGF.SanOpts.has(SanitizerKind::CFIMFCall) && in EmitLoadOfMemberFunctionPointer()
705 CodeGenFunction::SanitizerScope SanScope(&CGF); in EmitLoadOfMemberFunctionPointer()
714 TypeId = llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD); in EmitLoadOfMemberFunctionPointer()
719 Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset); in EmitLoadOfMemberFunctionPointer()
736 Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset); in EmitLoadOfMemberFunctionPointer()
746 VirtualFn = CGF.Builder.CreateCall( in EmitLoadOfMemberFunctionPointer()
752 CGF.Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset); in EmitLoadOfMemberFunctionPointer()
753 VirtualFn = CGF.Builder.CreateAlignedLoad(CGF.UnqualPtrTy, VFPAddr, in EmitLoadOfMemberFunctionPointer()
754 CGF.getPointerAlign(), in EmitLoadOfMemberFunctionPointer()
765 CheckSourceLocation = CGF.EmitCheckSourceLocation(E->getBeginLoc()); in EmitLoadOfMemberFunctionPointer()
766 CheckTypeDesc = CGF.EmitCheckTypeDescriptor(QualType(MPT, 0)); in EmitLoadOfMemberFunctionPointer()
768 llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_VMFCall), in EmitLoadOfMemberFunctionPointer()
774 CGF.EmitTrapCheck(CheckResult, SanitizerHandler::CFICheckFail); in EmitLoadOfMemberFunctionPointer()
781 CGF.EmitCheck(std::make_pair(CheckResult, SanitizerKind::CFIMFCall), in EmitLoadOfMemberFunctionPointer()
790 CGF.EmitBranch(FnEnd); in EmitLoadOfMemberFunctionPointer()
794 CGF.EmitBlock(FnNonVirtual); in EmitLoadOfMemberFunctionPointer()
796 Builder.CreateIntToPtr(FnAsInt, CGF.UnqualPtrTy, "memptr.nonvirtualfn"); in EmitLoadOfMemberFunctionPointer()
802 CodeGenFunction::SanitizerScope SanScope(&CGF); in EmitLoadOfMemberFunctionPointer()
805 llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_NVMFCall), in EmitLoadOfMemberFunctionPointer()
817 llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD); in EmitLoadOfMemberFunctionPointer()
825 CGF.EmitCheck(std::make_pair(Bit, SanitizerKind::CFIMFCall), in EmitLoadOfMemberFunctionPointer()
827 {NonVirtualFn, llvm::UndefValue::get(CGF.IntPtrTy)}); in EmitLoadOfMemberFunctionPointer()
834 CGF.EmitBlock(FnEnd); in EmitLoadOfMemberFunctionPointer()
835 llvm::PHINode *CalleePtr = Builder.CreatePHI(CGF.UnqualPtrTy, 2); in EmitLoadOfMemberFunctionPointer()
846 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr, in EmitMemberDataPointerAddress() argument
850 CGBuilderTy &Builder = CGF.Builder; in EmitMemberDataPointerAddress()
853 return Builder.CreateInBoundsGEP(CGF.Int8Ty, Base.getPointer(), MemPtr, in EmitMemberDataPointerAddress()
881 ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF, in EmitMemberPointerConversion() argument
898 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerConversion()
1097 ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF, in EmitMemberPointerComparison() argument
1102 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerComparison()
1171 ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF, in EmitMemberPointerIsNotNull() argument
1174 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerIsNotNull()
1226 void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF, in emitVirtualObjectDelete() argument
1239 llvm::Value *VTable = CGF.GetVTablePtr(Ptr, CGF.UnqualPtrTy, ClassDecl); in emitVirtualObjectDelete()
1242 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64( in emitVirtualObjectDelete()
1243 CGF.IntPtrTy, VTable, -2, "complete-offset.ptr"); in emitVirtualObjectDelete()
1244 llvm::Value *Offset = CGF.Builder.CreateAlignedLoad(CGF.IntPtrTy, OffsetPtr, in emitVirtualObjectDelete()
1245 CGF.getPointerAlign()); in emitVirtualObjectDelete()
1250 CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, CompletePtr, Offset); in emitVirtualObjectDelete()
1254 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr, in emitVirtualObjectDelete()
1261 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE); in emitVirtualObjectDelete()
1264 CGF.PopCleanupBlock(); in emitVirtualObjectDelete()
1267 void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) { in emitRethrow() argument
1276 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, std::nullopt); in emitRethrow()
1278 CGF.EmitRuntimeCallOrInvoke(Fn); in emitRethrow()
1301 void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) { in emitThrow() argument
1304 llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType()); in emitThrow()
1308 llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall( in emitThrow()
1311 CharUnits ExnAlign = CGF.getContext().getExnObjectAlignment(); in emitThrow()
1312 CGF.EmitAnyExprToExn( in emitThrow()
1332 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args); in emitThrow()
1335 static llvm::FunctionCallee getItaniumDynamicCastFn(CodeGenFunction &CGF) { in getItaniumDynamicCastFn() argument
1341 llvm::Type *Int8PtrTy = CGF.Int8PtrTy; in getItaniumDynamicCastFn()
1342 llvm::Type *GlobInt8PtrTy = CGF.GlobalsInt8PtrTy; in getItaniumDynamicCastFn()
1344 CGF.ConvertType(CGF.getContext().getPointerDiffType()); in getItaniumDynamicCastFn()
1351 llvm::AttrBuilder FuncAttrs(CGF.getLLVMContext()); in getItaniumDynamicCastFn()
1355 CGF.getLLVMContext(), llvm::AttributeList::FunctionIndex, FuncAttrs); in getItaniumDynamicCastFn()
1357 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs); in getItaniumDynamicCastFn()
1360 static llvm::FunctionCallee getBadCastFn(CodeGenFunction &CGF) { in getBadCastFn() argument
1362 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false); in getBadCastFn()
1363 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast"); in getBadCastFn()
1418 static llvm::FunctionCallee getBadTypeidFn(CodeGenFunction &CGF) { in getBadTypeidFn() argument
1420 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false); in getBadTypeidFn()
1422 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid"); in getBadTypeidFn()
1430 void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) { in EmitBadTypeidCall() argument
1431 llvm::FunctionCallee Fn = getBadTypeidFn(CGF); in EmitBadTypeidCall()
1432 llvm::CallBase *Call = CGF.EmitRuntimeCallOrInvoke(Fn); in EmitBadTypeidCall()
1434 CGF.Builder.CreateUnreachable(); in EmitBadTypeidCall()
1437 llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF, in EmitTypeid() argument
1443 llvm::Value *Value = CGF.GetVTablePtr(ThisPtr, CGM.GlobalsInt8PtrTy, in EmitTypeid()
1448 Value = CGF.Builder.CreateCall( in EmitTypeid()
1454 CGF.Builder.CreateConstInBoundsGEP1_64(StdTypeInfoPtrTy, Value, -1ULL); in EmitTypeid()
1456 return CGF.Builder.CreateAlignedLoad(StdTypeInfoPtrTy, Value, in EmitTypeid()
1457 CGF.getPointerAlign()); in EmitTypeid()
1466 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy, in emitDynamicCastCall() argument
1469 CGF.ConvertType(CGF.getContext().getPointerDiffType()); in emitDynamicCastCall()
1472 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType()); in emitDynamicCastCall()
1474 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType()); in emitDynamicCastCall()
1481 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity()); in emitDynamicCastCall()
1486 CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), Args); in emitDynamicCastCall()
1492 CGF.createBasicBlock("dynamic_cast.bad_cast"); in emitDynamicCastCall()
1494 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value); in emitDynamicCastCall()
1495 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd); in emitDynamicCastCall()
1497 CGF.EmitBlock(BadCastBlock); in emitDynamicCastCall()
1498 EmitBadCastCall(CGF); in emitDynamicCastCall()
1505 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy, in emitExactDynamicCast() argument
1549 ThisAddr = Address(emitDynamicCastToVoid(CGF, ThisAddr, SrcRecordTy), in emitExactDynamicCast()
1550 CGF.VoidPtrTy, ThisAddr.getAlignment()); in emitExactDynamicCast()
1559 CGF.EmitBranch(CastFail); in emitExactDynamicCast()
1560 return llvm::PoisonValue::get(CGF.VoidPtrTy); in emitExactDynamicCast()
1567 llvm::Instruction *VPtr = CGF.Builder.CreateLoad( in emitExactDynamicCast()
1568 ThisAddr.withElementType(CGF.VoidPtrPtrTy), "vtable"); in emitExactDynamicCast()
1570 VPtr, CGM.getTBAAVTablePtrAccessInfo(CGF.VoidPtrPtrTy)); in emitExactDynamicCast()
1571 llvm::Value *Success = CGF.Builder.CreateICmpEQ( in emitExactDynamicCast()
1575 Result = CGF.Builder.CreateInBoundsGEP( in emitExactDynamicCast()
1576 CGF.CharTy, Result, in emitExactDynamicCast()
1577 {llvm::ConstantInt::get(CGF.PtrDiffTy, -Offset->getQuantity())}); in emitExactDynamicCast()
1578 CGF.Builder.CreateCondBr(Success, CastSuccess, CastFail); in emitExactDynamicCast()
1582 llvm::Value *ItaniumCXXABI::emitDynamicCastToVoid(CodeGenFunction &CGF, in emitDynamicCastToVoid() argument
1591 CGF.GetVTablePtr(ThisAddr, CGF.UnqualPtrTy, ClassDecl); in emitDynamicCastToVoid()
1595 CGF.Builder.CreateConstInBoundsGEP1_32(CGM.Int32Ty, VTable, -2U); in emitDynamicCastToVoid()
1596 OffsetToTop = CGF.Builder.CreateAlignedLoad( in emitDynamicCastToVoid()
1600 CGF.ConvertType(CGF.getContext().getPointerDiffType()); in emitDynamicCastToVoid()
1604 CGF.GetVTablePtr(ThisAddr, CGF.UnqualPtrTy, ClassDecl); in emitDynamicCastToVoid()
1608 CGF.Builder.CreateConstInBoundsGEP1_64(PtrDiffLTy, VTable, -2ULL); in emitDynamicCastToVoid()
1609 OffsetToTop = CGF.Builder.CreateAlignedLoad( in emitDynamicCastToVoid()
1610 PtrDiffLTy, OffsetToTop, CGF.getPointerAlign(), "offset.to.top"); in emitDynamicCastToVoid()
1613 return CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, ThisAddr.getPointer(), in emitDynamicCastToVoid()
1617 bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) { in EmitBadCastCall() argument
1618 llvm::FunctionCallee Fn = getBadCastFn(CGF); in EmitBadCastCall()
1619 llvm::CallBase *Call = CGF.EmitRuntimeCallOrInvoke(Fn); in EmitBadCastCall()
1621 CGF.Builder.CreateUnreachable(); in EmitBadCastCall()
1626 ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF, in GetVirtualBaseClassOffset() argument
1630 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl); in GetVirtualBaseClassOffset()
1635 CGF.Builder.CreateConstGEP1_64( in GetVirtualBaseClassOffset()
1636 CGF.Int8Ty, VTablePtr, VBaseOffsetOffset.getQuantity(), in GetVirtualBaseClassOffset()
1641 VBaseOffset = CGF.Builder.CreateAlignedLoad( in GetVirtualBaseClassOffset()
1642 CGF.Int32Ty, VBaseOffsetPtr, CharUnits::fromQuantity(4), in GetVirtualBaseClassOffset()
1645 VBaseOffset = CGF.Builder.CreateAlignedLoad( in GetVirtualBaseClassOffset()
1646 CGM.PtrDiffTy, VBaseOffsetPtr, CGF.getPointerAlign(), "vbase.offset"); in GetVirtualBaseClassOffset()
1704 void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF, in addImplicitStructorParams() argument
1707 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); in addImplicitStructorParams()
1711 if (NeedsVTTParameter(CGF.CurGD)) { in addImplicitStructorParams()
1722 getStructorImplicitParamDecl(CGF) = VTTDecl; in addImplicitStructorParams()
1726 void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) { in EmitInstanceFunctionProlog() argument
1728 if (CGF.CurFuncDecl && CGF.CurFuncDecl->hasAttr<NakedAttr>()) in EmitInstanceFunctionProlog()
1733 setCXXABIThisValue(CGF, loadIncomingCXXThis(CGF)); in EmitInstanceFunctionProlog()
1736 if (getStructorImplicitParamDecl(CGF)) { in EmitInstanceFunctionProlog()
1737 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad( in EmitInstanceFunctionProlog()
1738 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt"); in EmitInstanceFunctionProlog()
1749 if (HasThisReturn(CGF.CurGD)) in EmitInstanceFunctionProlog()
1750 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue); in EmitInstanceFunctionProlog()
1754 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type, in getImplicitConstructorArgs() argument
1763 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating); in getImplicitConstructorArgs()
1771 CodeGenFunction &CGF, const CXXDestructorDecl *DD, CXXDtorType Type, in getCXXDestructorImplicitParam() argument
1774 return CGF.GetVTTParameter(GD, ForVirtualBase, Delegating); in getCXXDestructorImplicitParam()
1777 void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF, in EmitDestructorCall() argument
1784 getCXXDestructorImplicitParam(CGF, DD, Type, ForVirtualBase, Delegating); in EmitDestructorCall()
1790 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent()); in EmitDestructorCall()
1794 CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, VTT, VTTTy, in EmitDestructorCall()
1862 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) { in isVirtualOffsetNeededForVTableField() argument
1865 return NeedsVTTParameter(CGF.CurGD); in isVirtualOffsetNeededForVTableField()
1869 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base, in getVTableAddressPointInStructor() argument
1873 NeedsVTTParameter(CGF.CurGD)) { in getVTableAddressPointInStructor()
1874 return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base, in getVTableAddressPointInStructor()
1926 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base, in getVTableAddressPointInStructorWithVTT() argument
1929 NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT"); in getVTableAddressPointInStructorWithVTT()
1936 llvm::Value *VTT = CGF.LoadCXXVTT(); in getVTableAddressPointInStructorWithVTT()
1938 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(CGF.GlobalsVoidPtrTy, VTT, in getVTableAddressPointInStructorWithVTT()
1942 return CGF.Builder.CreateAlignedLoad(CGF.GlobalsVoidPtrTy, VTT, in getVTableAddressPointInStructorWithVTT()
1943 CGF.getPointerAlign()); in getVTableAddressPointInStructorWithVTT()
2006 CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, in getVirtualFunctionPointer() argument
2013 llvm::Value *VTable = CGF.GetVTablePtr(This, PtrTy, MethodDecl->getParent()); in getVirtualFunctionPointer()
2017 if (CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) { in getVirtualFunctionPointer()
2018 VFunc = CGF.EmitVTableTypeCheckedLoad( in getVirtualFunctionPointer()
2024 CGF.EmitTypeMetadataCodeForVCall(MethodDecl->getParent(), VTable, Loc); in getVirtualFunctionPointer()
2028 VFuncLoad = CGF.Builder.CreateCall( in getVirtualFunctionPointer()
2032 llvm::Value *VTableSlotPtr = CGF.Builder.CreateConstInBoundsGEP1_64( in getVirtualFunctionPointer()
2034 VFuncLoad = CGF.Builder.CreateAlignedLoad(PtrTy, VTableSlotPtr, in getVirtualFunctionPointer()
2035 CGF.getPointerAlign()); in getVirtualFunctionPointer()
2061 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType, in EmitVirtualDestructorCall() argument
2072 llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo); in EmitVirtualDestructorCall()
2082 CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, nullptr, in EmitVirtualDestructorCall()
2150 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF, in performTypeAdjustment() argument
2158 Address V = InitialPtr.withElementType(CGF.Int8Ty); in performTypeAdjustment()
2162 V = CGF.Builder.CreateConstInBoundsByteGEP(V, in performTypeAdjustment()
2169 Address VTablePtrPtr = V.withElementType(CGF.Int8PtrTy); in performTypeAdjustment()
2170 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr); in performTypeAdjustment()
2173 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64( in performTypeAdjustment()
2174 CGF.Int8Ty, VTablePtr, VirtualAdjustment); in performTypeAdjustment()
2175 if (CGF.CGM.getItaniumVTableContext().isRelativeLayout()) { in performTypeAdjustment()
2178 CGF.Builder.CreateAlignedLoad(CGF.Int32Ty, OffsetPtr, in performTypeAdjustment()
2182 CGF.ConvertType(CGF.getContext().getPointerDiffType()); in performTypeAdjustment()
2185 Offset = CGF.Builder.CreateAlignedLoad(PtrDiffTy, OffsetPtr, in performTypeAdjustment()
2186 CGF.getPointerAlign()); in performTypeAdjustment()
2189 ResultPtr = CGF.Builder.CreateInBoundsGEP( in performTypeAdjustment()
2198 ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(CGF.Int8Ty, ResultPtr, in performTypeAdjustment()
2205 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF, in performThisAdjustment() argument
2208 return performTypeAdjustment(CGF, This, TA.NonVirtual, in performThisAdjustment()
2214 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret, in performReturnAdjustment() argument
2216 return performTypeAdjustment(CGF, Ret, RA.NonVirtual, in performReturnAdjustment()
2221 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF, in EmitReturnFromThunk() argument
2223 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl())) in EmitReturnFromThunk()
2224 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType); in EmitReturnFromThunk()
2227 llvm::Type *T = CGF.ReturnValue.getElementType(); in EmitReturnFromThunk()
2229 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType); in EmitReturnFromThunk()
2241 Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, in InitializeArrayCookie() argument
2251 CharUnits SizeSize = CGF.getSizeSize(); in InitializeArrayCookie()
2262 CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset); in InitializeArrayCookie()
2265 Address NumElementsPtr = CookiePtr.withElementType(CGF.SizeTy); in InitializeArrayCookie()
2266 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr); in InitializeArrayCookie()
2278 CGF.Builder.CreateCall(F, NumElementsPtr.getPointer()); in InitializeArrayCookie()
2283 return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize); in InitializeArrayCookie()
2286 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, in readArrayCookieImpl() argument
2291 CharUnits numElementsOffset = cookieSize - CGF.getSizeSize(); in readArrayCookieImpl()
2294 CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset); in readArrayCookieImpl()
2297 numElementsPtr = numElementsPtr.withElementType(CGF.SizeTy); in readArrayCookieImpl()
2299 return CGF.Builder.CreateLoad(numElementsPtr); in readArrayCookieImpl()
2306 llvm::FunctionType::get(CGF.SizeTy, CGF.UnqualPtrTy, false); in readArrayCookieImpl()
2309 return CGF.Builder.CreateCall(F, numElementsPtr.getPointer()); in readArrayCookieImpl()
2325 Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, in InitializeArrayCookie() argument
2336 cookie = cookie.withElementType(CGF.SizeTy); in InitializeArrayCookie()
2337 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy, in InitializeArrayCookie()
2339 CGF.Builder.CreateStore(elementSize, cookie); in InitializeArrayCookie()
2342 cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1); in InitializeArrayCookie()
2343 CGF.Builder.CreateStore(numElements, cookie); in InitializeArrayCookie()
2348 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize); in InitializeArrayCookie()
2351 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, in readArrayCookieImpl() argument
2357 = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize()); in readArrayCookieImpl()
2359 numElementsPtr = numElementsPtr.withElementType(CGF.SizeTy); in readArrayCookieImpl()
2360 return CGF.Builder.CreateLoad(numElementsPtr); in readArrayCookieImpl()
2407 void Emit(CodeGenFunction &CGF, Flags flags) override { in Emit()
2408 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()), in Emit()
2416 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF, in EmitGuardedInit() argument
2420 CGBuilderTy &Builder = CGF.Builder; in EmitGuardedInit()
2442 guardTy = CGF.Int8Ty; in EmitGuardedInit()
2448 guardTy = CGF.SizeTy; in EmitGuardedInit()
2449 guardAlignment = CGF.getSizeAlign(); in EmitGuardedInit()
2451 guardTy = CGF.Int64Ty; in EmitGuardedInit()
2457 CGF.CGM.getLLVMContext(), in EmitGuardedInit()
2458 CGF.CGM.getDataLayout().getDefaultGlobalsAddressSpace()); in EmitGuardedInit()
2523 unsigned MaxInlineWidthInBits = CGF.getTarget().getMaxAtomicInlineWidth(); in EmitGuardedInit()
2524 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end"); in EmitGuardedInit()
2565 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check"); in EmitGuardedInit()
2568 CGF.EmitCXXGuardedInitBranch(NeedsInit, InitCheckBlock, EndBlock, in EmitGuardedInit()
2571 CGF.EmitBlock(InitCheckBlock); in EmitGuardedInit()
2593 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard); in EmitGuardedInit()
2595 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init"); in EmitGuardedInit()
2601 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard); in EmitGuardedInit()
2603 CGF.EmitBlock(InitBlock); in EmitGuardedInit()
2613 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit); in EmitGuardedInit()
2617 CGF.PopCleanupBlock(); in EmitGuardedInit()
2620 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy), in EmitGuardedInit()
2630 CGF.EmitBlock(EndBlock); in EmitGuardedInit()
2634 static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF, in emitGlobalDtorWithCXAAtExit() argument
2637 assert(!CGF.getTarget().getTriple().isOSAIX() && in emitGlobalDtorWithCXAAtExit()
2639 assert((TLS || CGF.getTypes().getCodeGenOpts().CXAAtExit) && in emitGlobalDtorWithCXAAtExit()
2643 const llvm::Triple &T = CGF.getTarget().getTriple(); in emitGlobalDtorWithCXAAtExit()
2649 llvm::Type *dtorTy = CGF.UnqualPtrTy; in emitGlobalDtorWithCXAAtExit()
2653 auto AddrPtrTy = AddrAS ? llvm::PointerType::get(CGF.getLLVMContext(), AddrAS) in emitGlobalDtorWithCXAAtExit()
2654 : CGF.Int8PtrTy; in emitGlobalDtorWithCXAAtExit()
2658 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle"); in emitGlobalDtorWithCXAAtExit()
2665 llvm::FunctionType::get(CGF.IntTy, paramTys, false); in emitGlobalDtorWithCXAAtExit()
2668 llvm::FunctionCallee atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name); in emitGlobalDtorWithCXAAtExit()
2677 addr = llvm::Constant::getNullValue(CGF.Int8PtrTy); in emitGlobalDtorWithCXAAtExit()
2680 CGF.EmitNounwindRuntimeCall(atexit, args); in emitGlobalDtorWithCXAAtExit()
2703 CodeGenFunction CGF(*this); in unregisterGlobalDtorsWithUnAtExit() local
2704 CGF.StartFunction(GlobalDecl(), getContext().VoidTy, GlobalCleanupFn, in unregisterGlobalDtorsWithUnAtExit()
2707 auto AL = ApplyDebugLocation::CreateArtificial(CGF); in unregisterGlobalDtorsWithUnAtExit()
2710 llvm::FunctionType *dtorFuncTy = llvm::FunctionType::get(CGF.VoidTy, false); in unregisterGlobalDtorsWithUnAtExit()
2721 llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(Dtor); in unregisterGlobalDtorsWithUnAtExit()
2723 CGF.Builder.CreateIsNull(V, "needs_destruct"); in unregisterGlobalDtorsWithUnAtExit()
2726 CGF.createBasicBlock("destruct.call"); in unregisterGlobalDtorsWithUnAtExit()
2727 llvm::BasicBlock *EndBlock = CGF.createBasicBlock( in unregisterGlobalDtorsWithUnAtExit()
2731 CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock); in unregisterGlobalDtorsWithUnAtExit()
2733 CGF.EmitBlock(DestructCallBlock); in unregisterGlobalDtorsWithUnAtExit()
2736 llvm::CallInst *CI = CGF.Builder.CreateCall(dtorFuncTy, Dtor); in unregisterGlobalDtorsWithUnAtExit()
2740 CGF.EmitBlock(EndBlock); in unregisterGlobalDtorsWithUnAtExit()
2745 CGF.FinishFunction(); in unregisterGlobalDtorsWithUnAtExit()
2758 CodeGenFunction CGF(*this); in registerGlobalDtorsWithAtExit() local
2759 CGF.StartFunction(GlobalDecl(), getContext().VoidTy, GlobalInitFn, in registerGlobalDtorsWithAtExit()
2762 auto AL = ApplyDebugLocation::CreateArtificial(CGF); in registerGlobalDtorsWithAtExit()
2774 emitGlobalDtorWithCXAAtExit(CGF, Dtor, nullptr, false); in registerGlobalDtorsWithAtExit()
2778 CGF.registerGlobalDtorWithAtExit(Dtor); in registerGlobalDtorsWithAtExit()
2782 CGF.FinishFunction(); in registerGlobalDtorsWithAtExit()
2791 void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, in registerGlobalDtor() argument
2803 return CGF.registerGlobalDtorWithLLVM(D, dtor, addr); in registerGlobalDtor()
2810 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind()); in registerGlobalDtor()
2819 CGF.registerGlobalDtorWithAtExit(D, dtor, addr); in registerGlobalDtor()
3103 LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, in EmitThreadLocalVarDeclLValue() argument
3106 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD); in EmitThreadLocalVarDeclLValue()
3109 llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper); in EmitThreadLocalVarDeclLValue()
3114 LV = CGF.MakeNaturalAlignAddrLValue(CallVal, LValType); in EmitThreadLocalVarDeclLValue()
3116 LV = CGF.MakeAddrLValue(CallVal, LValType, in EmitThreadLocalVarDeclLValue()
3117 CGF.getContext().getDeclAlign(VD)); in EmitThreadLocalVarDeclLValue()
4504 void Emit(CodeGenFunction &CGF, Flags flags) override { in Emit()
4506 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM)); in Emit()
4510 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM)); in Emit()
4521 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF, in CallBeginCatch() argument
4525 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn); in CallBeginCatch()
4527 CGF.EHStack.pushCleanup<CallEndCatch>( in CallBeginCatch()
4529 EndMightThrow && !CGF.CGM.getLangOpts().AssumeNothrowExceptionDtor); in CallBeginCatch()
4536 static void InitCatchParam(CodeGenFunction &CGF, in InitCatchParam() argument
4541 llvm::Value *Exn = CGF.getExceptionFromSlot(); in InitCatchParam()
4544 CGF.CGM.getContext().getCanonicalType(CatchParam.getType()); in InitCatchParam()
4545 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType); in InitCatchParam()
4554 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow); in InitCatchParam()
4569 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException(); in InitCatchParam()
4571 CGF.Builder.CreateConstGEP1_32(CGF.Int8Ty, Exn, HeaderSize); in InitCatchParam()
4589 llvm::Type *PtrTy = CGF.ConvertTypeForMem(CaughtType); in InitCatchParam()
4593 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp"); in InitCatchParam()
4594 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy); in InitCatchParam()
4595 CGF.Builder.CreateStore(Casted, ExnPtrTmp); in InitCatchParam()
4603 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref"); in InitCatchParam()
4604 CGF.Builder.CreateStore(ExnCast, ParamAddr); in InitCatchParam()
4609 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType); in InitCatchParam()
4611 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false); in InitCatchParam()
4617 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted"); in InitCatchParam()
4621 CastExn = CGF.EmitARCRetainNonBlock(CastExn); in InitCatchParam()
4627 CGF.Builder.CreateStore(CastExn, ParamAddr); in InitCatchParam()
4631 CGF.EmitARCInitWeak(ParamAddr, CastExn); in InitCatchParam()
4639 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(AdjustedExn, CatchType); in InitCatchParam()
4640 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType); in InitCatchParam()
4643 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV, in InitCatchParam()
4647 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc); in InitCatchParam()
4648 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true); in InitCatchParam()
4659 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD); in InitCatchParam()
4661 llvm::Type *PtrTy = CGF.UnqualPtrTy; // addrspace 0 ok in InitCatchParam()
4667 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true); in InitCatchParam()
4668 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy), in InitCatchParam()
4670 LValue Dest = CGF.MakeAddrLValue(ParamAddr, CatchType); in InitCatchParam()
4671 LValue Src = CGF.MakeAddrLValue(adjustedExn, CatchType); in InitCatchParam()
4672 CGF.EmitAggregateCopy(Dest, Src, CatchType, AggValueSlot::DoesNotOverlap); in InitCatchParam()
4679 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn); in InitCatchParam()
4682 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy), in InitCatchParam()
4688 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr), in InitCatchParam()
4689 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType())); in InitCatchParam()
4692 CGF.EHStack.pushTerminate(); in InitCatchParam()
4695 CGF.EmitAggExpr(copyExpr, in InitCatchParam()
4703 CGF.EHStack.popTerminate(); in InitCatchParam()
4709 CallBeginCatch(CGF, Exn, true); in InitCatchParam()
4714 void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF, in emitBeginCatch() argument
4741 llvm::Value *Exn = CGF.getExceptionFromSlot(); in emitBeginCatch()
4742 CallBeginCatch(CGF, Exn, true); in emitBeginCatch()
4747 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam); in emitBeginCatch()
4748 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getBeginLoc()); in emitBeginCatch()
4749 CGF.EmitAutoVarCleanups(var); in emitBeginCatch()
4808 ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF, in emitTerminateForUnexpectedException() argument
4812 assert(CGF.CGM.getLangOpts().CPlusPlus); in emitTerminateForUnexpectedException()
4813 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn); in emitTerminateForUnexpectedException()
4815 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn()); in emitTerminateForUnexpectedException()
4819 ItaniumCXXABI::LoadVTablePtr(CodeGenFunction &CGF, Address This, in LoadVTablePtr() argument
4821 return {CGF.GetVTablePtr(This, CGM.Int8PtrTy, RD), RD}; in LoadVTablePtr()
4824 void WebAssemblyCXXABI::emitBeginCatch(CodeGenFunction &CGF, in emitBeginCatch() argument
4826 if (CGF.getTarget().hasFeature("exception-handling")) in emitBeginCatch()
4827 CGF.EHStack.pushCleanup<CatchRetScope>( in emitBeginCatch()
4828 NormalCleanup, cast<llvm::CatchPadInst>(CGF.CurrentFuncletPad)); in emitBeginCatch()
4829 ItaniumCXXABI::emitBeginCatch(CGF, C); in emitBeginCatch()
4833 WebAssemblyCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF, in emitTerminateForUnexpectedException() argument
4841 return CGCXXABI::emitTerminateForUnexpectedException(CGF, Exn); in emitTerminateForUnexpectedException()
4845 void XLCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, in registerGlobalDtor() argument
4849 llvm::PointerType *PtrTy = CGF.UnqualPtrTy; in registerGlobalDtor()
4860 llvm::Function *DtorStub = CGF.createTLSAtExitStub(D, Dtor, Addr, AtExit); in registerGlobalDtor()
4865 CGF.EmitNounwindRuntimeCall(AtExit, {NV, DtorStub}); in registerGlobalDtor()
4872 llvm::Function *DtorStub = CGF.createAtExitStub(D, Dtor, Addr); in registerGlobalDtor()
4875 CGF.registerGlobalDtorWithAtExit(DtorStub); in registerGlobalDtor()
4896 CodeGenFunction CGF(CGM); in emitCXXStermFinalizer() local
4898 CGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, StermFinalizer, FI, in emitCXXStermFinalizer()
4906 llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(dtorStub); in emitCXXStermFinalizer()
4908 llvm::Value *NeedsDestruct = CGF.Builder.CreateIsNull(V, "needs_destruct"); in emitCXXStermFinalizer()
4910 llvm::BasicBlock *DestructCallBlock = CGF.createBasicBlock("destruct.call"); in emitCXXStermFinalizer()
4911 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("destruct.end"); in emitCXXStermFinalizer()
4915 CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock); in emitCXXStermFinalizer()
4917 CGF.EmitBlock(DestructCallBlock); in emitCXXStermFinalizer()
4920 llvm::CallInst *CI = CGF.Builder.CreateCall(dtorStub); in emitCXXStermFinalizer()
4925 CGF.EmitBlock(EndBlock); in emitCXXStermFinalizer()
4927 CGF.FinishFunction(); in emitCXXStermFinalizer()