Lines Matching refs:CGF

121     EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
129 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
134 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
149 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
154 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
158 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
162 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
163 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
165 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
168 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
180 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
181 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
188 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, Address Value,
193 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
197 bool EmitBadCastCall(CodeGenFunction &CGF) override;
200 GetVirtualBaseClassOffset(CodeGenFunction &CGF, Address This,
220 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
223 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
225 AddedStructorArgs getImplicitConstructorArgs(CodeGenFunction &CGF,
231 llvm::Value *getCXXDestructorImplicitParam(CodeGenFunction &CGF,
237 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
245 bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
257 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
261 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
271 CGCallee getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
275 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
296 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
299 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
313 Address InitializeArrayCookie(CodeGenFunction &CGF,
318 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
322 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
325 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
341 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
380 LoadVTablePtr(CodeGenFunction &CGF, Address This,
438 void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV,
442 Address InitializeArrayCookie(CodeGenFunction &CGF,
447 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF, Address allocPtr,
475 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
477 emitTerminateForUnexpectedException(CodeGenFunction &CGF,
490 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
577 CodeGenFunction &CGF, const Expr *E, Address ThisAddr, in EmitLoadOfMemberFunctionPointer() argument
580 CGBuilderTy &Builder = CGF.Builder; in EmitLoadOfMemberFunctionPointer()
592 llvm::BasicBlock *FnVirtual = CGF.createBasicBlock("memptr.virtual"); in EmitLoadOfMemberFunctionPointer()
593 llvm::BasicBlock *FnNonVirtual = CGF.createBasicBlock("memptr.nonvirtual"); in EmitLoadOfMemberFunctionPointer()
594 llvm::BasicBlock *FnEnd = CGF.createBasicBlock("memptr.end"); in EmitLoadOfMemberFunctionPointer()
628 CGF.EmitBlock(FnVirtual); in EmitLoadOfMemberFunctionPointer()
633 CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD, in EmitLoadOfMemberFunctionPointer()
634 CGF.getPointerAlign()); in EmitLoadOfMemberFunctionPointer()
635 llvm::Value *VTable = CGF.GetVTablePtr( in EmitLoadOfMemberFunctionPointer()
645 VTableOffset = Builder.CreateTrunc(VTableOffset, CGF.Int32Ty); in EmitLoadOfMemberFunctionPointer()
653 bool ShouldEmitCFICheck = CGF.SanOpts.has(SanitizerKind::CFIMFCall) && in EmitLoadOfMemberFunctionPointer()
664 CodeGenFunction::SanitizerScope SanScope(&CGF); in EmitLoadOfMemberFunctionPointer()
673 TypeId = llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD); in EmitLoadOfMemberFunctionPointer()
678 Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset); in EmitLoadOfMemberFunctionPointer()
697 Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset); in EmitLoadOfMemberFunctionPointer()
704 {Builder.CreateBitCast(VFPAddr, CGF.Int8PtrTy), TypeId}); in EmitLoadOfMemberFunctionPointer()
708 VirtualFn = CGF.Builder.CreateCall( in EmitLoadOfMemberFunctionPointer()
712 VirtualFn = CGF.Builder.CreateBitCast(VirtualFn, FTy->getPointerTo()); in EmitLoadOfMemberFunctionPointer()
715 CGF.Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset); in EmitLoadOfMemberFunctionPointer()
716 VFPAddr = CGF.Builder.CreateBitCast( in EmitLoadOfMemberFunctionPointer()
718 VirtualFn = CGF.Builder.CreateAlignedLoad( in EmitLoadOfMemberFunctionPointer()
719 FTy->getPointerTo(), VFPAddr, CGF.getPointerAlign(), in EmitLoadOfMemberFunctionPointer()
730 CheckSourceLocation = CGF.EmitCheckSourceLocation(E->getBeginLoc()); in EmitLoadOfMemberFunctionPointer()
731 CheckTypeDesc = CGF.EmitCheckTypeDescriptor(QualType(MPT, 0)); in EmitLoadOfMemberFunctionPointer()
733 llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_VMFCall), in EmitLoadOfMemberFunctionPointer()
739 CGF.EmitTrapCheck(CheckResult, SanitizerHandler::CFICheckFail); in EmitLoadOfMemberFunctionPointer()
746 CGF.EmitCheck(std::make_pair(CheckResult, SanitizerKind::CFIMFCall), in EmitLoadOfMemberFunctionPointer()
755 CGF.EmitBranch(FnEnd); in EmitLoadOfMemberFunctionPointer()
759 CGF.EmitBlock(FnNonVirtual); in EmitLoadOfMemberFunctionPointer()
767 CodeGenFunction::SanitizerScope SanScope(&CGF); in EmitLoadOfMemberFunctionPointer()
770 llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_NVMFCall), in EmitLoadOfMemberFunctionPointer()
777 Builder.CreateBitCast(NonVirtualFn, CGF.Int8PtrTy); in EmitLoadOfMemberFunctionPointer()
784 llvm::MetadataAsValue::get(CGF.getLLVMContext(), MD); in EmitLoadOfMemberFunctionPointer()
792 CGF.EmitCheck(std::make_pair(Bit, SanitizerKind::CFIMFCall), in EmitLoadOfMemberFunctionPointer()
794 {CastedNonVirtualFn, llvm::UndefValue::get(CGF.IntPtrTy)}); in EmitLoadOfMemberFunctionPointer()
801 CGF.EmitBlock(FnEnd); in EmitLoadOfMemberFunctionPointer()
813 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr, in EmitMemberDataPointerAddress() argument
817 CGBuilderTy &Builder = CGF.Builder; in EmitMemberDataPointerAddress()
820 Base = Builder.CreateElementBitCast(Base, CGF.Int8Ty); in EmitMemberDataPointerAddress()
828 llvm::Type *PType = CGF.ConvertTypeForMem(MPT->getPointeeType()) in EmitMemberDataPointerAddress()
857 ItaniumCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF, in EmitMemberPointerConversion() argument
874 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerConversion()
1073 ItaniumCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF, in EmitMemberPointerComparison() argument
1078 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerComparison()
1147 ItaniumCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF, in EmitMemberPointerIsNotNull() argument
1150 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerIsNotNull()
1202 void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF, in emitVirtualObjectDelete() argument
1216 CGF.GetVTablePtr(Ptr, CGF.IntPtrTy->getPointerTo(), ClassDecl); in emitVirtualObjectDelete()
1219 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64( in emitVirtualObjectDelete()
1220 CGF.IntPtrTy, VTable, -2, "complete-offset.ptr"); in emitVirtualObjectDelete()
1221 …vm::Value *Offset = CGF.Builder.CreateAlignedLoad(CGF.IntPtrTy, OffsetPtr, … in emitVirtualObjectDelete()
1225 CGF.Builder.CreateBitCast(Ptr.getPointer(), CGF.Int8PtrTy); in emitVirtualObjectDelete()
1227 CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, CompletePtr, Offset); in emitVirtualObjectDelete()
1231 CGF.pushCallObjectDeleteCleanup(DE->getOperatorDelete(), CompletePtr, in emitVirtualObjectDelete()
1238 EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE); in emitVirtualObjectDelete()
1241 CGF.PopCleanupBlock(); in emitVirtualObjectDelete()
1244 void ItaniumCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) { in emitRethrow() argument
1253 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, std::nullopt); in emitRethrow()
1255 CGF.EmitRuntimeCallOrInvoke(Fn); in emitRethrow()
1278 void ItaniumCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) { in emitThrow() argument
1281 llvm::Type *SizeTy = CGF.ConvertType(getContext().getSizeType()); in emitThrow()
1285 llvm::CallInst *ExceptionPtr = CGF.EmitNounwindRuntimeCall( in emitThrow()
1288 CharUnits ExnAlign = CGF.getContext().getExnObjectAlignment(); in emitThrow()
1289 CGF.EmitAnyExprToExn( in emitThrow()
1310 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args); in emitThrow()
1313 static llvm::FunctionCallee getItaniumDynamicCastFn(CodeGenFunction &CGF) { in getItaniumDynamicCastFn() argument
1319 llvm::Type *Int8PtrTy = CGF.Int8PtrTy; in getItaniumDynamicCastFn()
1321 CGF.ConvertType(CGF.getContext().getPointerDiffType()); in getItaniumDynamicCastFn()
1328 llvm::AttrBuilder FuncAttrs(CGF.getLLVMContext()); in getItaniumDynamicCastFn()
1332 CGF.getLLVMContext(), llvm::AttributeList::FunctionIndex, FuncAttrs); in getItaniumDynamicCastFn()
1334 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs); in getItaniumDynamicCastFn()
1337 static llvm::FunctionCallee getBadCastFn(CodeGenFunction &CGF) { in getBadCastFn() argument
1339 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false); in getBadCastFn()
1340 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast"); in getBadCastFn()
1395 static llvm::FunctionCallee getBadTypeidFn(CodeGenFunction &CGF) { in getBadTypeidFn() argument
1397 llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false); in getBadTypeidFn()
1399 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid"); in getBadTypeidFn()
1407 void ItaniumCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) { in EmitBadTypeidCall() argument
1408 llvm::FunctionCallee Fn = getBadTypeidFn(CGF); in EmitBadTypeidCall()
1409 llvm::CallBase *Call = CGF.EmitRuntimeCallOrInvoke(Fn); in EmitBadTypeidCall()
1411 CGF.Builder.CreateUnreachable(); in EmitBadTypeidCall()
1414 llvm::Value *ItaniumCXXABI::EmitTypeid(CodeGenFunction &CGF, in EmitTypeid() argument
1421 CGF.GetVTablePtr(ThisPtr, StdTypeInfoPtrTy->getPointerTo(), ClassDecl); in EmitTypeid()
1425 Value = CGF.Builder.CreateBitCast(Value, CGM.Int8PtrTy); in EmitTypeid()
1426 Value = CGF.Builder.CreateCall( in EmitTypeid()
1431 Value = CGF.Builder.CreateBitCast(Value, StdTypeInfoPtrTy->getPointerTo()); in EmitTypeid()
1435 CGF.Builder.CreateConstInBoundsGEP1_64(StdTypeInfoPtrTy, Value, -1ULL); in EmitTypeid()
1437 return CGF.Builder.CreateAlignedLoad(StdTypeInfoPtrTy, Value, in EmitTypeid()
1438 CGF.getPointerAlign()); in EmitTypeid()
1447 CodeGenFunction &CGF, Address ThisAddr, QualType SrcRecordTy, in EmitDynamicCastCall() argument
1450 CGF.ConvertType(CGF.getContext().getPointerDiffType()); in EmitDynamicCastCall()
1451 llvm::Type *DestLTy = CGF.ConvertType(DestTy); in EmitDynamicCastCall()
1454 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType()); in EmitDynamicCastCall()
1456 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType()); in EmitDynamicCastCall()
1463 computeOffsetHint(CGF.getContext(), SrcDecl, DestDecl).getQuantity()); in EmitDynamicCastCall()
1467 Value = CGF.EmitCastToVoidPtr(Value); in EmitDynamicCastCall()
1470 Value = CGF.EmitNounwindRuntimeCall(getItaniumDynamicCastFn(CGF), args); in EmitDynamicCastCall()
1471 Value = CGF.Builder.CreateBitCast(Value, DestLTy); in EmitDynamicCastCall()
1477 CGF.createBasicBlock("dynamic_cast.bad_cast"); in EmitDynamicCastCall()
1479 llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value); in EmitDynamicCastCall()
1480 CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd); in EmitDynamicCastCall()
1482 CGF.EmitBlock(BadCastBlock); in EmitDynamicCastCall()
1483 EmitBadCastCall(CGF); in EmitDynamicCastCall()
1489 llvm::Value *ItaniumCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF, in EmitDynamicCastToVoid() argument
1493 llvm::Type *DestLTy = CGF.ConvertType(DestTy); in EmitDynamicCastToVoid()
1500 CGF.GetVTablePtr(ThisAddr, CGM.Int32Ty->getPointerTo(), ClassDecl); in EmitDynamicCastToVoid()
1504 CGF.Builder.CreateConstInBoundsGEP1_32(CGM.Int32Ty, VTable, -2U); in EmitDynamicCastToVoid()
1505 OffsetToTop = CGF.Builder.CreateAlignedLoad( in EmitDynamicCastToVoid()
1509 CGF.ConvertType(CGF.getContext().getPointerDiffType()); in EmitDynamicCastToVoid()
1513 CGF.GetVTablePtr(ThisAddr, PtrDiffLTy->getPointerTo(), ClassDecl); in EmitDynamicCastToVoid()
1517 CGF.Builder.CreateConstInBoundsGEP1_64(PtrDiffLTy, VTable, -2ULL); in EmitDynamicCastToVoid()
1518 OffsetToTop = CGF.Builder.CreateAlignedLoad( in EmitDynamicCastToVoid()
1519 PtrDiffLTy, OffsetToTop, CGF.getPointerAlign(), "offset.to.top"); in EmitDynamicCastToVoid()
1523 Value = CGF.EmitCastToVoidPtr(Value); in EmitDynamicCastToVoid()
1524 Value = CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, Value, OffsetToTop); in EmitDynamicCastToVoid()
1525 return CGF.Builder.CreateBitCast(Value, DestLTy); in EmitDynamicCastToVoid()
1528 bool ItaniumCXXABI::EmitBadCastCall(CodeGenFunction &CGF) { in EmitBadCastCall() argument
1529 llvm::FunctionCallee Fn = getBadCastFn(CGF); in EmitBadCastCall()
1530 llvm::CallBase *Call = CGF.EmitRuntimeCallOrInvoke(Fn); in EmitBadCastCall()
1532 CGF.Builder.CreateUnreachable(); in EmitBadCastCall()
1537 ItaniumCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF, in GetVirtualBaseClassOffset() argument
1541 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl); in GetVirtualBaseClassOffset()
1546 CGF.Builder.CreateConstGEP1_64( in GetVirtualBaseClassOffset()
1547 CGF.Int8Ty, VTablePtr, VBaseOffsetOffset.getQuantity(), in GetVirtualBaseClassOffset()
1553 CGF.Builder.CreateBitCast(VBaseOffsetPtr, CGF.Int32Ty->getPointerTo()); in GetVirtualBaseClassOffset()
1554 VBaseOffset = CGF.Builder.CreateAlignedLoad( in GetVirtualBaseClassOffset()
1555 CGF.Int32Ty, VBaseOffsetPtr, CharUnits::fromQuantity(4), in GetVirtualBaseClassOffset()
1558 VBaseOffsetPtr = CGF.Builder.CreateBitCast(VBaseOffsetPtr, in GetVirtualBaseClassOffset()
1560 VBaseOffset = CGF.Builder.CreateAlignedLoad( in GetVirtualBaseClassOffset()
1561 CGM.PtrDiffTy, VBaseOffsetPtr, CGF.getPointerAlign(), "vbase.offset"); in GetVirtualBaseClassOffset()
1617 void ItaniumCXXABI::addImplicitStructorParams(CodeGenFunction &CGF, in addImplicitStructorParams() argument
1620 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); in addImplicitStructorParams()
1624 if (NeedsVTTParameter(CGF.CurGD)) { in addImplicitStructorParams()
1633 getStructorImplicitParamDecl(CGF) = VTTDecl; in addImplicitStructorParams()
1637 void ItaniumCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) { in EmitInstanceFunctionProlog() argument
1639 if (CGF.CurFuncDecl && CGF.CurFuncDecl->hasAttr<NakedAttr>()) in EmitInstanceFunctionProlog()
1644 setCXXABIThisValue(CGF, loadIncomingCXXThis(CGF)); in EmitInstanceFunctionProlog()
1647 if (getStructorImplicitParamDecl(CGF)) { in EmitInstanceFunctionProlog()
1648 getStructorImplicitParamValue(CGF) = CGF.Builder.CreateLoad( in EmitInstanceFunctionProlog()
1649 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), "vtt"); in EmitInstanceFunctionProlog()
1660 if (HasThisReturn(CGF.CurGD)) in EmitInstanceFunctionProlog()
1661 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue); in EmitInstanceFunctionProlog()
1665 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type, in getImplicitConstructorArgs() argument
1672 CGF.GetVTTParameter(GlobalDecl(D, Type), ForVirtualBase, Delegating); in getImplicitConstructorArgs()
1678 CodeGenFunction &CGF, const CXXDestructorDecl *DD, CXXDtorType Type, in getCXXDestructorImplicitParam() argument
1681 return CGF.GetVTTParameter(GD, ForVirtualBase, Delegating); in getCXXDestructorImplicitParam()
1684 void ItaniumCXXABI::EmitDestructorCall(CodeGenFunction &CGF, in EmitDestructorCall() argument
1691 getCXXDestructorImplicitParam(CGF, DD, Type, ForVirtualBase, Delegating); in EmitDestructorCall()
1697 Callee = CGF.BuildAppleKextVirtualDestructorCall(DD, Type, DD->getParent()); in EmitDestructorCall()
1701 CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, VTT, VTTTy, in EmitDestructorCall()
1769 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) { in isVirtualOffsetNeededForVTableField() argument
1772 return NeedsVTTParameter(CGF.CurGD); in isVirtualOffsetNeededForVTableField()
1776 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base, in getVTableAddressPointInStructor() argument
1780 NeedsVTTParameter(CGF.CurGD)) { in getVTableAddressPointInStructor()
1781 return getVTableAddressPointInStructorWithVTT(CGF, VTableClass, Base, in getVTableAddressPointInStructor()
1833 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base, in getVTableAddressPointInStructorWithVTT() argument
1836 NeedsVTTParameter(CGF.CurGD) && "This class doesn't have VTT"); in getVTableAddressPointInStructorWithVTT()
1843 llvm::Value *VTT = CGF.LoadCXXVTT(); in getVTableAddressPointInStructorWithVTT()
1845 VTT = CGF.Builder.CreateConstInBoundsGEP1_64( in getVTableAddressPointInStructorWithVTT()
1846 CGF.VoidPtrTy, VTT, VirtualPointerIndex); in getVTableAddressPointInStructorWithVTT()
1849 return CGF.Builder.CreateAlignedLoad(CGF.VoidPtrTy, VTT, in getVTableAddressPointInStructorWithVTT()
1850 CGF.getPointerAlign()); in getVTableAddressPointInStructorWithVTT()
1912 CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, in getVirtualFunctionPointer() argument
1919 llvm::Value *VTable = CGF.GetVTablePtr( in getVirtualFunctionPointer()
1924 if (CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) { in getVirtualFunctionPointer()
1925 VFunc = CGF.EmitVTableTypeCheckedLoad( in getVirtualFunctionPointer()
1931 CGF.EmitTypeMetadataCodeForVCall(MethodDecl->getParent(), VTable, Loc); in getVirtualFunctionPointer()
1935 VTable = CGF.Builder.CreateBitCast(VTable, CGM.Int8PtrTy); in getVirtualFunctionPointer()
1936 llvm::Value *Load = CGF.Builder.CreateCall( in getVirtualFunctionPointer()
1939 VFuncLoad = CGF.Builder.CreateBitCast(Load, TyPtr); in getVirtualFunctionPointer()
1942 CGF.Builder.CreateBitCast(VTable, TyPtr->getPointerTo()); in getVirtualFunctionPointer()
1943 llvm::Value *VTableSlotPtr = CGF.Builder.CreateConstInBoundsGEP1_64( in getVirtualFunctionPointer()
1946 CGF.Builder.CreateAlignedLoad(TyPtr, VTableSlotPtr, in getVirtualFunctionPointer()
1947 CGF.getPointerAlign()); in getVirtualFunctionPointer()
1973 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType, in EmitVirtualDestructorCall() argument
1984 llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo); in EmitVirtualDestructorCall()
1994 CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, nullptr, in EmitVirtualDestructorCall()
2062 static llvm::Value *performTypeAdjustment(CodeGenFunction &CGF, in performTypeAdjustment() argument
2070 Address V = CGF.Builder.CreateElementBitCast(InitialPtr, CGF.Int8Ty); in performTypeAdjustment()
2074 V = CGF.Builder.CreateConstInBoundsByteGEP(V, in performTypeAdjustment()
2081 Address VTablePtrPtr = CGF.Builder.CreateElementBitCast(V, CGF.Int8PtrTy); in performTypeAdjustment()
2082 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr); in performTypeAdjustment()
2085 llvm::Value *OffsetPtr = CGF.Builder.CreateConstInBoundsGEP1_64( in performTypeAdjustment()
2086 CGF.Int8Ty, VTablePtr, VirtualAdjustment); in performTypeAdjustment()
2087 if (CGF.CGM.getItaniumVTableContext().isRelativeLayout()) { in performTypeAdjustment()
2090 CGF.Builder.CreateBitCast(OffsetPtr, CGF.Int32Ty->getPointerTo()); in performTypeAdjustment()
2092 CGF.Builder.CreateAlignedLoad(CGF.Int32Ty, OffsetPtr, in performTypeAdjustment()
2096 CGF.ConvertType(CGF.getContext().getPointerDiffType()); in performTypeAdjustment()
2099 CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo()); in performTypeAdjustment()
2102 Offset = CGF.Builder.CreateAlignedLoad(PtrDiffTy, OffsetPtr, in performTypeAdjustment()
2103 CGF.getPointerAlign()); in performTypeAdjustment()
2106 ResultPtr = CGF.Builder.CreateInBoundsGEP( in performTypeAdjustment()
2115 ResultPtr = CGF.Builder.CreateConstInBoundsGEP1_64(CGF.Int8Ty, ResultPtr, in performTypeAdjustment()
2120 return CGF.Builder.CreateBitCast(ResultPtr, InitialPtr.getType()); in performTypeAdjustment()
2123 llvm::Value *ItaniumCXXABI::performThisAdjustment(CodeGenFunction &CGF, in performThisAdjustment() argument
2126 return performTypeAdjustment(CGF, This, TA.NonVirtual, in performThisAdjustment()
2132 ItaniumCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret, in performReturnAdjustment() argument
2134 return performTypeAdjustment(CGF, Ret, RA.NonVirtual, in performReturnAdjustment()
2139 void ARMCXXABI::EmitReturnFromThunk(CodeGenFunction &CGF, in EmitReturnFromThunk() argument
2141 if (!isa<CXXDestructorDecl>(CGF.CurGD.getDecl())) in EmitReturnFromThunk()
2142 return ItaniumCXXABI::EmitReturnFromThunk(CGF, RV, ResultType); in EmitReturnFromThunk()
2145 llvm::Type *T = CGF.ReturnValue.getElementType(); in EmitReturnFromThunk()
2147 return ItaniumCXXABI::EmitReturnFromThunk(CGF, Undef, ResultType); in EmitReturnFromThunk()
2159 Address ItaniumCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, in InitializeArrayCookie() argument
2169 CharUnits SizeSize = CGF.getSizeSize(); in InitializeArrayCookie()
2180 CookiePtr = CGF.Builder.CreateConstInBoundsByteGEP(CookiePtr, CookieOffset); in InitializeArrayCookie()
2184 CGF.Builder.CreateElementBitCast(CookiePtr, CGF.SizeTy); in InitializeArrayCookie()
2185 llvm::Instruction *SI = CGF.Builder.CreateStore(NumElements, NumElementsPtr); in InitializeArrayCookie()
2197 CGF.Builder.CreateCall(F, NumElementsPtr.getPointer()); in InitializeArrayCookie()
2202 return CGF.Builder.CreateConstInBoundsByteGEP(NewPtr, CookieSize); in InitializeArrayCookie()
2205 llvm::Value *ItaniumCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, in readArrayCookieImpl() argument
2210 CharUnits numElementsOffset = cookieSize - CGF.getSizeSize(); in readArrayCookieImpl()
2213 CGF.Builder.CreateConstInBoundsByteGEP(numElementsPtr, numElementsOffset); in readArrayCookieImpl()
2216 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy); in readArrayCookieImpl()
2218 return CGF.Builder.CreateLoad(numElementsPtr); in readArrayCookieImpl()
2225 llvm::FunctionType::get(CGF.SizeTy, CGF.SizeTy->getPointerTo(0), false); in readArrayCookieImpl()
2228 return CGF.Builder.CreateCall(F, numElementsPtr.getPointer()); in readArrayCookieImpl()
2244 Address ARMCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, in InitializeArrayCookie() argument
2255 cookie = CGF.Builder.CreateElementBitCast(cookie, CGF.SizeTy); in InitializeArrayCookie()
2256 llvm::Value *elementSize = llvm::ConstantInt::get(CGF.SizeTy, in InitializeArrayCookie()
2258 CGF.Builder.CreateStore(elementSize, cookie); in InitializeArrayCookie()
2261 cookie = CGF.Builder.CreateConstInBoundsGEP(cookie, 1); in InitializeArrayCookie()
2262 CGF.Builder.CreateStore(numElements, cookie); in InitializeArrayCookie()
2267 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize); in InitializeArrayCookie()
2270 llvm::Value *ARMCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, in readArrayCookieImpl() argument
2276 = CGF.Builder.CreateConstInBoundsByteGEP(allocPtr, CGF.getSizeSize()); in readArrayCookieImpl()
2278 numElementsPtr = CGF.Builder.CreateElementBitCast(numElementsPtr, CGF.SizeTy); in readArrayCookieImpl()
2279 return CGF.Builder.CreateLoad(numElementsPtr); in readArrayCookieImpl()
2326 void Emit(CodeGenFunction &CGF, Flags flags) override { in Emit()
2327 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()), in Emit()
2335 void ItaniumCXXABI::EmitGuardedInit(CodeGenFunction &CGF, in EmitGuardedInit() argument
2339 CGBuilderTy &Builder = CGF.Builder; in EmitGuardedInit()
2361 guardTy = CGF.Int8Ty; in EmitGuardedInit()
2367 guardTy = CGF.SizeTy; in EmitGuardedInit()
2368 guardAlignment = CGF.getSizeAlign(); in EmitGuardedInit()
2370 guardTy = CGF.Int64Ty; in EmitGuardedInit()
2376 CGF.CGM.getDataLayout().getDefaultGlobalsAddressSpace()); in EmitGuardedInit()
2441 unsigned MaxInlineWidthInBits = CGF.getTarget().getMaxAtomicInlineWidth(); in EmitGuardedInit()
2442 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end"); in EmitGuardedInit()
2483 llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check"); in EmitGuardedInit()
2486 CGF.EmitCXXGuardedInitBranch(NeedsInit, InitCheckBlock, EndBlock, in EmitGuardedInit()
2489 CGF.EmitBlock(InitCheckBlock); in EmitGuardedInit()
2511 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard); in EmitGuardedInit()
2513 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init"); in EmitGuardedInit()
2519 CGF.EHStack.pushCleanup<CallGuardAbort>(EHCleanup, guard); in EmitGuardedInit()
2521 CGF.EmitBlock(InitBlock); in EmitGuardedInit()
2531 CGF.EmitCXXGlobalVarDeclInit(D, var, shouldPerformInit); in EmitGuardedInit()
2535 CGF.PopCleanupBlock(); in EmitGuardedInit()
2538 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy), in EmitGuardedInit()
2548 CGF.EmitBlock(EndBlock); in EmitGuardedInit()
2552 static void emitGlobalDtorWithCXAAtExit(CodeGenFunction &CGF, in emitGlobalDtorWithCXAAtExit() argument
2555 assert(!CGF.getTarget().getTriple().isOSAIX() && in emitGlobalDtorWithCXAAtExit()
2557 assert((TLS || CGF.getTypes().getCodeGenOpts().CXAAtExit) && in emitGlobalDtorWithCXAAtExit()
2561 const llvm::Triple &T = CGF.getTarget().getTriple(); in emitGlobalDtorWithCXAAtExit()
2569 llvm::FunctionType::get(CGF.VoidTy, CGF.Int8PtrTy, false)->getPointerTo(); in emitGlobalDtorWithCXAAtExit()
2574 AddrAS ? CGF.Int8Ty->getPointerTo(AddrAS) : CGF.Int8PtrTy; in emitGlobalDtorWithCXAAtExit()
2578 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle"); in emitGlobalDtorWithCXAAtExit()
2585 llvm::FunctionType::get(CGF.IntTy, paramTys, false); in emitGlobalDtorWithCXAAtExit()
2588 llvm::FunctionCallee atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name); in emitGlobalDtorWithCXAAtExit()
2597 addr = llvm::Constant::getNullValue(CGF.Int8PtrTy); in emitGlobalDtorWithCXAAtExit()
2603 CGF.EmitNounwindRuntimeCall(atexit, args); in emitGlobalDtorWithCXAAtExit()
2626 CodeGenFunction CGF(*this); in unregisterGlobalDtorsWithUnAtExit() local
2627 CGF.StartFunction(GlobalDecl(), getContext().VoidTy, GlobalCleanupFn, in unregisterGlobalDtorsWithUnAtExit()
2630 auto AL = ApplyDebugLocation::CreateArtificial(CGF); in unregisterGlobalDtorsWithUnAtExit()
2633 llvm::FunctionType *dtorFuncTy = llvm::FunctionType::get(CGF.VoidTy, false); in unregisterGlobalDtorsWithUnAtExit()
2647 llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(dtor); in unregisterGlobalDtorsWithUnAtExit()
2649 CGF.Builder.CreateIsNull(V, "needs_destruct"); in unregisterGlobalDtorsWithUnAtExit()
2652 CGF.createBasicBlock("destruct.call"); in unregisterGlobalDtorsWithUnAtExit()
2653 llvm::BasicBlock *EndBlock = CGF.createBasicBlock( in unregisterGlobalDtorsWithUnAtExit()
2657 CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock); in unregisterGlobalDtorsWithUnAtExit()
2659 CGF.EmitBlock(DestructCallBlock); in unregisterGlobalDtorsWithUnAtExit()
2662 llvm::CallInst *CI = CGF.Builder.CreateCall(dtorFuncTy, dtor); in unregisterGlobalDtorsWithUnAtExit()
2666 CGF.EmitBlock(EndBlock); in unregisterGlobalDtorsWithUnAtExit()
2671 CGF.FinishFunction(); in unregisterGlobalDtorsWithUnAtExit()
2684 CodeGenFunction CGF(*this); in registerGlobalDtorsWithAtExit() local
2685 CGF.StartFunction(GlobalDecl(), getContext().VoidTy, GlobalInitFn, in registerGlobalDtorsWithAtExit()
2688 auto AL = ApplyDebugLocation::CreateArtificial(CGF); in registerGlobalDtorsWithAtExit()
2700 emitGlobalDtorWithCXAAtExit(CGF, Dtor, nullptr, false); in registerGlobalDtorsWithAtExit()
2704 llvm::FunctionType::get(CGF.VoidTy, false)->getPointerTo(); in registerGlobalDtorsWithAtExit()
2709 CGF.registerGlobalDtorWithAtExit( in registerGlobalDtorsWithAtExit()
2714 CGF.FinishFunction(); in registerGlobalDtorsWithAtExit()
2723 void ItaniumCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, in registerGlobalDtor() argument
2734 return emitGlobalDtorWithCXAAtExit(CGF, dtor, addr, D.getTLSKind()); in registerGlobalDtor()
2743 CGF.registerGlobalDtorWithAtExit(D, dtor, addr); in registerGlobalDtor()
3030 LValue ItaniumCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, in EmitThreadLocalVarDeclLValue() argument
3033 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD); in EmitThreadLocalVarDeclLValue()
3036 llvm::CallInst *CallVal = CGF.Builder.CreateCall(Wrapper); in EmitThreadLocalVarDeclLValue()
3041 LV = CGF.MakeNaturalAlignAddrLValue(CallVal, LValType); in EmitThreadLocalVarDeclLValue()
3043 LV = CGF.MakeAddrLValue(CallVal, LValType, in EmitThreadLocalVarDeclLValue()
3044 CGF.getContext().getDeclAlign(VD)); in EmitThreadLocalVarDeclLValue()
4430 void Emit(CodeGenFunction &CGF, Flags flags) override { in Emit()
4432 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM)); in Emit()
4436 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM)); in Emit()
4445 static llvm::Value *CallBeginCatch(CodeGenFunction &CGF, in CallBeginCatch() argument
4449 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn); in CallBeginCatch()
4451 CGF.EHStack.pushCleanup<CallEndCatch>(NormalAndEHCleanup, EndMightThrow); in CallBeginCatch()
4458 static void InitCatchParam(CodeGenFunction &CGF, in InitCatchParam() argument
4463 llvm::Value *Exn = CGF.getExceptionFromSlot(); in InitCatchParam()
4466 CGF.CGM.getContext().getCanonicalType(CatchParam.getType()); in InitCatchParam()
4467 llvm::Type *LLVMCatchTy = CGF.ConvertTypeForMem(CatchType); in InitCatchParam()
4476 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, EndCatchMightThrow); in InitCatchParam()
4491 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException(); in InitCatchParam()
4493 CGF.Builder.CreateConstGEP1_32(CGF.Int8Ty, Exn, HeaderSize); in InitCatchParam()
4511 llvm::Type *PtrTy = CGF.ConvertTypeForMem(CaughtType); in InitCatchParam()
4515 CGF.CreateTempAlloca(PtrTy, CGF.getPointerAlign(), "exn.byref.tmp"); in InitCatchParam()
4516 llvm::Value *Casted = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy); in InitCatchParam()
4517 CGF.Builder.CreateStore(Casted, ExnPtrTmp); in InitCatchParam()
4525 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.byref"); in InitCatchParam()
4526 CGF.Builder.CreateStore(ExnCast, ParamAddr); in InitCatchParam()
4531 TypeEvaluationKind TEK = CGF.getEvaluationKind(CatchType); in InitCatchParam()
4533 llvm::Value *AdjustedExn = CallBeginCatch(CGF, Exn, false); in InitCatchParam()
4539 CGF.Builder.CreateBitCast(AdjustedExn, LLVMCatchTy, "exn.casted"); in InitCatchParam()
4543 CastExn = CGF.EmitARCRetainNonBlock(CastExn); in InitCatchParam()
4549 CGF.Builder.CreateStore(CastExn, ParamAddr); in InitCatchParam()
4553 CGF.EmitARCInitWeak(ParamAddr, CastExn); in InitCatchParam()
4562 llvm::Value *Cast = CGF.Builder.CreateBitCast(AdjustedExn, PtrTy); in InitCatchParam()
4564 LValue srcLV = CGF.MakeNaturalAlignAddrLValue(Cast, CatchType); in InitCatchParam()
4565 LValue destLV = CGF.MakeAddrLValue(ParamAddr, CatchType); in InitCatchParam()
4568 CGF.EmitStoreOfComplex(CGF.EmitLoadOfComplex(srcLV, Loc), destLV, in InitCatchParam()
4572 llvm::Value *ExnLoad = CGF.EmitLoadOfScalar(srcLV, Loc); in InitCatchParam()
4573 CGF.EmitStoreOfScalar(ExnLoad, destLV, /*init*/ true); in InitCatchParam()
4584 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD); in InitCatchParam()
4592 llvm::Value *rawAdjustedExn = CallBeginCatch(CGF, Exn, true); in InitCatchParam()
4593 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy), in InitCatchParam()
4595 LValue Dest = CGF.MakeAddrLValue(ParamAddr, CatchType); in InitCatchParam()
4596 LValue Src = CGF.MakeAddrLValue(adjustedExn, CatchType); in InitCatchParam()
4597 CGF.EmitAggregateCopy(Dest, Src, CatchType, AggValueSlot::DoesNotOverlap); in InitCatchParam()
4604 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn); in InitCatchParam()
4607 Address adjustedExn(CGF.Builder.CreateBitCast(rawAdjustedExn, PtrTy), in InitCatchParam()
4613 opaque(CGF, OpaqueValueExpr::findInCopyConstruct(copyExpr), in InitCatchParam()
4614 CGF.MakeAddrLValue(adjustedExn, CatchParam.getType())); in InitCatchParam()
4617 CGF.EHStack.pushTerminate(); in InitCatchParam()
4620 CGF.EmitAggExpr(copyExpr, in InitCatchParam()
4628 CGF.EHStack.popTerminate(); in InitCatchParam()
4634 CallBeginCatch(CGF, Exn, true); in InitCatchParam()
4639 void ItaniumCXXABI::emitBeginCatch(CodeGenFunction &CGF, in emitBeginCatch() argument
4666 llvm::Value *Exn = CGF.getExceptionFromSlot(); in emitBeginCatch()
4667 CallBeginCatch(CGF, Exn, true); in emitBeginCatch()
4672 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam); in emitBeginCatch()
4673 InitCatchParam(CGF, *CatchParam, var.getObjectAddress(CGF), S->getBeginLoc()); in emitBeginCatch()
4674 CGF.EmitAutoVarCleanups(var); in emitBeginCatch()
4732 ItaniumCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF, in emitTerminateForUnexpectedException() argument
4736 assert(CGF.CGM.getLangOpts().CPlusPlus); in emitTerminateForUnexpectedException()
4737 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn); in emitTerminateForUnexpectedException()
4739 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn()); in emitTerminateForUnexpectedException()
4743 ItaniumCXXABI::LoadVTablePtr(CodeGenFunction &CGF, Address This, in LoadVTablePtr() argument
4745 return {CGF.GetVTablePtr(This, CGM.Int8PtrTy, RD), RD}; in LoadVTablePtr()
4748 void WebAssemblyCXXABI::emitBeginCatch(CodeGenFunction &CGF, in emitBeginCatch() argument
4750 if (CGF.getTarget().hasFeature("exception-handling")) in emitBeginCatch()
4751 CGF.EHStack.pushCleanup<CatchRetScope>( in emitBeginCatch()
4752 NormalCleanup, cast<llvm::CatchPadInst>(CGF.CurrentFuncletPad)); in emitBeginCatch()
4753 ItaniumCXXABI::emitBeginCatch(CGF, C); in emitBeginCatch()
4757 WebAssemblyCXXABI::emitTerminateForUnexpectedException(CodeGenFunction &CGF, in emitTerminateForUnexpectedException() argument
4765 return CGCXXABI::emitTerminateForUnexpectedException(CGF, Exn); in emitTerminateForUnexpectedException()
4769 void XLCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, in registerGlobalDtor() argument
4787 llvm::Function *DtorStub = CGF.createTLSAtExitStub(D, Dtor, Addr, AtExit); in registerGlobalDtor()
4792 CGF.EmitNounwindRuntimeCall(AtExit, {NV, DtorStub}); in registerGlobalDtor()
4799 llvm::Function *DtorStub = CGF.createAtExitStub(D, Dtor, Addr); in registerGlobalDtor()
4802 CGF.registerGlobalDtorWithAtExit(DtorStub); in registerGlobalDtor()
4823 CodeGenFunction CGF(CGM); in emitCXXStermFinalizer() local
4825 CGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, StermFinalizer, FI, in emitCXXStermFinalizer()
4833 llvm::Value *V = CGF.unregisterGlobalDtorWithUnAtExit(dtorStub); in emitCXXStermFinalizer()
4835 llvm::Value *NeedsDestruct = CGF.Builder.CreateIsNull(V, "needs_destruct"); in emitCXXStermFinalizer()
4837 llvm::BasicBlock *DestructCallBlock = CGF.createBasicBlock("destruct.call"); in emitCXXStermFinalizer()
4838 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("destruct.end"); in emitCXXStermFinalizer()
4842 CGF.Builder.CreateCondBr(NeedsDestruct, DestructCallBlock, EndBlock); in emitCXXStermFinalizer()
4844 CGF.EmitBlock(DestructCallBlock); in emitCXXStermFinalizer()
4847 llvm::CallInst *CI = CGF.Builder.CreateCall(dtorStub); in emitCXXStermFinalizer()
4852 CGF.EmitBlock(EndBlock); in emitCXXStermFinalizer()
4854 CGF.FinishFunction(); in emitCXXStermFinalizer()