Lines Matching refs:CGF
120 void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
124 void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
125 void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
127 void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C) override;
147 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
148 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
155 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, Address Value,
160 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, Address Value,
164 bool EmitBadCastCall(CodeGenFunction &CGF) override;
170 GetVirtualBaseClassOffset(CodeGenFunction &CGF, Address This,
175 EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
179 EmitDtorCompleteObjectHandler(CodeGenFunction &CGF);
181 void initializeHiddenVirtualInheritanceMembers(CodeGenFunction &CGF,
256 adjustThisArgumentForVirtualFunctionCall(CodeGenFunction &CGF, GlobalDecl GD,
260 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
263 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
265 AddedStructorArgs getImplicitConstructorArgs(CodeGenFunction &CGF,
271 llvm::Value *getCXXDestructorImplicitParam(CodeGenFunction &CGF,
277 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
288 bool isVirtualOffsetNeededForVTableField(CodeGenFunction &CGF,
302 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
312 CGCallee getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
316 llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
321 void adjustCallArgsForDestructorThunk(CodeGenFunction &CGF, GlobalDecl GD, in adjustCallArgsForDestructorThunk() argument
325 CallArgs.add(RValue::get(getStructorImplicitParamValue(CGF)), in adjustCallArgsForDestructorThunk()
396 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, Address This,
399 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, Address Ret,
412 LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD,
415 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
418 void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D,
449 Address InitializeArrayCookie(CodeGenFunction &CGF,
454 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
593 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
599 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF, in GetVBaseOffsetFromVBPtr() argument
607 return GetVBaseOffsetFromVBPtr(CGF, Base, VBPOffset, VBTOffset, VBPtr); in GetVBaseOffsetFromVBPtr()
611 performBaseAdjustment(CodeGenFunction &CGF, Address Value,
616 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const Expr *E,
633 void EmitVBPtrStores(CodeGenFunction &CGF, const CXXRecordDecl *RD);
662 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
668 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
673 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
683 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
696 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, const Expr *E,
782 LoadVTablePtr(CodeGenFunction &CGF, Address This,
872 void MicrosoftCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF, in emitVirtualObjectDelete() argument
881 llvm::Value *MDThis = EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE); in emitVirtualObjectDelete()
883 CGF.EmitDeleteCall(DE->getOperatorDelete(), MDThis, ElementType); in emitVirtualObjectDelete()
886 void MicrosoftCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) { in emitRethrow() argument
892 CGF.EmitNoreturnRuntimeCallOrInvoke(Fn, Args); in emitRethrow()
894 CGF.EmitRuntimeCallOrInvoke(Fn, Args); in emitRethrow()
897 void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF, in emitBeginCatch() argument
902 llvm::BasicBlock *CatchPadBB = CGF.Builder.GetInsertBlock(); in emitBeginCatch()
905 CGF.CurrentFuncletPad = CPI; in emitBeginCatch()
910 CGF.EHStack.pushCleanup<CatchRetScope>(NormalCleanup, CPI); in emitBeginCatch()
914 CodeGenFunction::AutoVarEmission var = CGF.EmitAutoVarAlloca(*CatchParam); in emitBeginCatch()
915 CPI->setArgOperand(2, var.getObjectAddress(CGF).getPointer()); in emitBeginCatch()
916 CGF.EHStack.pushCleanup<CatchRetScope>(NormalCleanup, CPI); in emitBeginCatch()
917 CGF.EmitAutoVarCleanups(var); in emitBeginCatch()
924 MicrosoftCXXABI::performBaseAdjustment(CodeGenFunction &CGF, Address Value, in performBaseAdjustment() argument
926 Value = CGF.Builder.CreateElementBitCast(Value, CGF.Int8Ty); in performBaseAdjustment()
934 return std::make_tuple(Value, llvm::ConstantInt::get(CGF.Int32Ty, 0), in performBaseAdjustment()
950 GetVirtualBaseClassOffset(CGF, Value, SrcDecl, PolymorphicBase); in performBaseAdjustment()
951 llvm::Value *Ptr = CGF.Builder.CreateInBoundsGEP( in performBaseAdjustment()
954 CGF.CGM.getVBaseAlignment(Value.getAlignment(), SrcDecl, PolymorphicBase); in performBaseAdjustment()
955 return std::make_tuple(Address(Ptr, CGF.Int8Ty, VBaseAlign), Offset, in performBaseAdjustment()
966 static llvm::CallBase *emitRTtypeidCall(CodeGenFunction &CGF, in emitRTtypeidCall() argument
968 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy}; in emitRTtypeidCall()
970 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false); in emitRTtypeidCall()
972 llvm::FunctionCallee Fn = CGF.CGM.CreateRuntimeFunction(FTy, "__RTtypeid"); in emitRTtypeidCall()
973 return CGF.EmitRuntimeCallOrInvoke(Fn, Args); in emitRTtypeidCall()
976 void MicrosoftCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) { in EmitBadTypeidCall() argument
978 emitRTtypeidCall(CGF, llvm::Constant::getNullValue(CGM.VoidPtrTy)); in EmitBadTypeidCall()
980 CGF.Builder.CreateUnreachable(); in EmitBadTypeidCall()
983 llvm::Value *MicrosoftCXXABI::EmitTypeid(CodeGenFunction &CGF, in EmitTypeid() argument
988 performBaseAdjustment(CGF, ThisPtr, SrcRecordTy); in EmitTypeid()
989 llvm::CallBase *Typeid = emitRTtypeidCall(CGF, ThisPtr.getPointer()); in EmitTypeid()
990 return CGF.Builder.CreateBitCast(Typeid, StdTypeInfoPtrTy); in EmitTypeid()
1001 CodeGenFunction &CGF, Address This, QualType SrcRecordTy, in EmitDynamicCastCall() argument
1003 llvm::Type *DestLTy = CGF.ConvertType(DestTy); in EmitDynamicCastCall()
1006 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType()); in EmitDynamicCastCall()
1008 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType()); in EmitDynamicCastCall()
1012 performBaseAdjustment(CGF, This, SrcRecordTy); in EmitDynamicCastCall()
1014 Offset = CGF.Builder.CreateTrunc(Offset, CGF.Int32Ty); in EmitDynamicCastCall()
1022 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy, CGF.Int32Ty, CGF.Int8PtrTy, in EmitDynamicCastCall()
1023 CGF.Int8PtrTy, CGF.Int32Ty}; in EmitDynamicCastCall()
1024 llvm::FunctionCallee Function = CGF.CGM.CreateRuntimeFunction( in EmitDynamicCastCall()
1025 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false), in EmitDynamicCastCall()
1029 llvm::ConstantInt::get(CGF.Int32Ty, DestTy->isReferenceType())}; in EmitDynamicCastCall()
1030 ThisPtr = CGF.EmitRuntimeCallOrInvoke(Function, Args); in EmitDynamicCastCall()
1031 return CGF.Builder.CreateBitCast(ThisPtr, DestLTy); in EmitDynamicCastCall()
1035 MicrosoftCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF, Address Value, in EmitDynamicCastToVoid() argument
1039 performBaseAdjustment(CGF, Value, SrcRecordTy); in EmitDynamicCastToVoid()
1043 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy}; in EmitDynamicCastToVoid()
1044 llvm::FunctionCallee Function = CGF.CGM.CreateRuntimeFunction( in EmitDynamicCastToVoid()
1045 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false), in EmitDynamicCastToVoid()
1048 return CGF.EmitRuntimeCall(Function, Args); in EmitDynamicCastToVoid()
1051 bool MicrosoftCXXABI::EmitBadCastCall(CodeGenFunction &CGF) { in EmitBadCastCall() argument
1056 CodeGenFunction &CGF, Address This, const CXXRecordDecl *ClassDecl, in GetVirtualBaseClassOffset() argument
1070 GetVBaseOffsetFromVBPtr(CGF, This, VBPtrOffset, VBTableOffset); in GetVirtualBaseClassOffset()
1072 CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy); in GetVirtualBaseClassOffset()
1073 return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase); in GetVirtualBaseClassOffset()
1150 MicrosoftCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF, in EmitCtorCompleteObjectHandler() argument
1152 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF); in EmitCtorCompleteObjectHandler()
1156 CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object"); in EmitCtorCompleteObjectHandler()
1158 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases"); in EmitCtorCompleteObjectHandler()
1159 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases"); in EmitCtorCompleteObjectHandler()
1160 CGF.Builder.CreateCondBr(IsCompleteObject, in EmitCtorCompleteObjectHandler()
1163 CGF.EmitBlock(CallVbaseCtorsBB); in EmitCtorCompleteObjectHandler()
1166 EmitVBPtrStores(CGF, RD); in EmitCtorCompleteObjectHandler()
1174 MicrosoftCXXABI::EmitDtorCompleteObjectHandler(CodeGenFunction &CGF) { in EmitDtorCompleteObjectHandler() argument
1175 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF); in EmitDtorCompleteObjectHandler()
1179 CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object"); in EmitDtorCompleteObjectHandler()
1181 llvm::BasicBlock *CallVbaseDtorsBB = CGF.createBasicBlock("Dtor.dtor_vbases"); in EmitDtorCompleteObjectHandler()
1182 llvm::BasicBlock *SkipVbaseDtorsBB = CGF.createBasicBlock("Dtor.skip_vbases"); in EmitDtorCompleteObjectHandler()
1183 CGF.Builder.CreateCondBr(IsCompleteObject, in EmitDtorCompleteObjectHandler()
1186 CGF.EmitBlock(CallVbaseDtorsBB); in EmitDtorCompleteObjectHandler()
1193 CodeGenFunction &CGF, const CXXRecordDecl *RD) { in initializeHiddenVirtualInheritanceMembers() argument
1210 CGBuilderTy &Builder = CGF.Builder; in initializeHiddenVirtualInheritanceMembers()
1212 unsigned AS = getThisAddress(CGF).getAddressSpace(); in initializeHiddenVirtualInheritanceMembers()
1223 GetVirtualBaseClassOffset(CGF, getThisAddress(CGF), RD, VBase); in initializeHiddenVirtualInheritanceMembers()
1230 VtorDispValue = Builder.CreateTruncOrBitCast(VtorDispValue, CGF.Int32Ty); in initializeHiddenVirtualInheritanceMembers()
1233 Int8This = Builder.CreateBitCast(getThisValue(CGF), in initializeHiddenVirtualInheritanceMembers()
1234 CGF.Int8Ty->getPointerTo(AS)); in initializeHiddenVirtualInheritanceMembers()
1236 Builder.CreateInBoundsGEP(CGF.Int8Ty, Int8This, VBaseOffset); in initializeHiddenVirtualInheritanceMembers()
1238 VtorDispPtr = Builder.CreateConstGEP1_32(CGF.Int8Ty, VtorDispPtr, -4); in initializeHiddenVirtualInheritanceMembers()
1240 VtorDispPtr, CGF.Int32Ty->getPointerTo(AS), "vtordisp.ptr"); in initializeHiddenVirtualInheritanceMembers()
1274 void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF, in EmitVBPtrStores() argument
1276 Address This = getThisAddress(CGF); in EmitVBPtrStores()
1277 This = CGF.Builder.CreateElementBitCast(This, CGM.Int8Ty, "this.int8"); in EmitVBPtrStores()
1291 Address VBPtr = CGF.Builder.CreateConstInBoundsByteGEP(This, Offs); in EmitVBPtrStores()
1293 CGF.Builder.CreateConstInBoundsGEP2_32(GV->getValueType(), GV, 0, 0); in EmitVBPtrStores()
1294 VBPtr = CGF.Builder.CreateElementBitCast(VBPtr, GVPtr->getType(), in EmitVBPtrStores()
1296 CGF.Builder.CreateStore(GVPtr, VBPtr); in EmitVBPtrStores()
1428 CodeGenFunction &CGF, GlobalDecl GD, Address This, in adjustThisArgumentForVirtualFunctionCall() argument
1437 This = CGF.Builder.CreateElementBitCast(This, CGF.Int8Ty); in adjustThisArgumentForVirtualFunctionCall()
1439 return CGF.Builder.CreateConstByteGEP(This, Adjustment); in adjustThisArgumentForVirtualFunctionCall()
1468 Result = CGF.Builder.CreateElementBitCast(Result, CGF.Int8Ty); in adjustThisArgumentForVirtualFunctionCall()
1473 GetVirtualBaseClassOffset(CGF, Result, Derived, VBase); in adjustThisArgumentForVirtualFunctionCall()
1474 llvm::Value *VBasePtr = CGF.Builder.CreateInBoundsGEP( in adjustThisArgumentForVirtualFunctionCall()
1477 CGF.CGM.getVBaseAlignment(Result.getAlignment(), Derived, VBase); in adjustThisArgumentForVirtualFunctionCall()
1478 Result = Address(VBasePtr, CGF.Int8Ty, VBaseAlign); in adjustThisArgumentForVirtualFunctionCall()
1482 Result = CGF.Builder.CreateElementBitCast(Result, CGF.Int8Ty); in adjustThisArgumentForVirtualFunctionCall()
1488 Result = CGF.Builder.CreateConstByteGEP(Result, StaticOffset); in adjustThisArgumentForVirtualFunctionCall()
1490 Result = CGF.Builder.CreateConstInBoundsByteGEP(Result, StaticOffset); in adjustThisArgumentForVirtualFunctionCall()
1496 void MicrosoftCXXABI::addImplicitStructorParams(CodeGenFunction &CGF, in addImplicitStructorParams() argument
1500 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); in addImplicitStructorParams()
1504 Context, /*DC=*/nullptr, CGF.CurGD.getDecl()->getLocation(), in addImplicitStructorParams()
1514 getStructorImplicitParamDecl(CGF) = IsMostDerived; in addImplicitStructorParams()
1515 } else if (isDeletingDtor(CGF.CurGD)) { in addImplicitStructorParams()
1517 Context, /*DC=*/nullptr, CGF.CurGD.getDecl()->getLocation(), in addImplicitStructorParams()
1521 getStructorImplicitParamDecl(CGF) = ShouldDelete; in addImplicitStructorParams()
1525 void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) { in EmitInstanceFunctionProlog() argument
1527 if (CGF.CurFuncDecl && CGF.CurFuncDecl->hasAttr<NakedAttr>()) in EmitInstanceFunctionProlog()
1542 llvm::Value *This = loadIncomingCXXThis(CGF); in EmitInstanceFunctionProlog()
1543 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl()); in EmitInstanceFunctionProlog()
1544 if (!CGF.CurFuncIsThunk && MD->isVirtual()) { in EmitInstanceFunctionProlog()
1545 CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(CGF.CurGD); in EmitInstanceFunctionProlog()
1548 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS), in EmitInstanceFunctionProlog()
1550 This = CGF.Builder.CreateBitCast(This, charPtrTy); in EmitInstanceFunctionProlog()
1552 This = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, This, in EmitInstanceFunctionProlog()
1554 This = CGF.Builder.CreateBitCast(This, thisTy, "this.adjusted"); in EmitInstanceFunctionProlog()
1557 setCXXABIThisValue(CGF, This); in EmitInstanceFunctionProlog()
1567 if (HasThisReturn(CGF.CurGD)) in EmitInstanceFunctionProlog()
1568 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue); in EmitInstanceFunctionProlog()
1569 else if (hasMostDerivedReturn(CGF.CurGD)) in EmitInstanceFunctionProlog()
1570 CGF.Builder.CreateStore(CGF.EmitCastToVoidPtr(getThisValue(CGF)), in EmitInstanceFunctionProlog()
1571 CGF.ReturnValue); in EmitInstanceFunctionProlog()
1574 assert(getStructorImplicitParamDecl(CGF) && in EmitInstanceFunctionProlog()
1576 getStructorImplicitParamValue(CGF) in EmitInstanceFunctionProlog()
1577 = CGF.Builder.CreateLoad( in EmitInstanceFunctionProlog()
1578 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), in EmitInstanceFunctionProlog()
1582 if (isDeletingDtor(CGF.CurGD)) { in EmitInstanceFunctionProlog()
1583 assert(getStructorImplicitParamDecl(CGF) && in EmitInstanceFunctionProlog()
1585 getStructorImplicitParamValue(CGF) in EmitInstanceFunctionProlog()
1586 = CGF.Builder.CreateLoad( in EmitInstanceFunctionProlog()
1587 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)), in EmitInstanceFunctionProlog()
1593 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type, in getImplicitConstructorArgs() argument
1605 MostDerivedArg = getStructorImplicitParamValue(CGF); in getImplicitConstructorArgs()
1616 CodeGenFunction &CGF, const CXXDestructorDecl *DD, CXXDtorType Type, in getCXXDestructorImplicitParam() argument
1621 void MicrosoftCXXABI::EmitDestructorCall(CodeGenFunction &CGF, in EmitDestructorCall() argument
1638 This = adjustThisArgumentForVirtualFunctionCall(CGF, GlobalDecl(DD, Type), in EmitDestructorCall()
1643 if (ForVirtualBase && isa<CXXConstructorDecl>(CGF.CurCodeDecl)) { in EmitDestructorCall()
1644 BaseDtorEndBB = EmitDtorCompleteObjectHandler(CGF); in EmitDestructorCall()
1648 getCXXDestructorImplicitParam(CGF, DD, Type, ForVirtualBase, in EmitDestructorCall()
1650 CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, in EmitDestructorCall()
1655 CGF.Builder.CreateBr(BaseDtorEndBB); in EmitDestructorCall()
1656 CGF.EmitBlock(BaseDtorEndBB); in EmitDestructorCall()
1747 CodeGenFunction &CGF, CodeGenFunction::VPtr Vptr) { in isVirtualOffsetNeededForVTableField() argument
1752 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base, in getVTableAddressPointInStructor() argument
1921 CGCallee MicrosoftCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF, in getVirtualFunctionPointer() argument
1926 CGBuilderTy &Builder = CGF.Builder; in getVirtualFunctionPointer()
1930 adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true); in getVirtualFunctionPointer()
1933 llvm::Value *VTable = CGF.GetVTablePtr(VPtr, Ty->getPointerTo(), in getVirtualFunctionPointer()
1952 if (CGF.ShouldEmitVTableTypeCheckedLoad(MethodDecl->getParent())) { in getVirtualFunctionPointer()
1953 VFunc = CGF.EmitVTableTypeCheckedLoad( in getVirtualFunctionPointer()
1958 CGF.EmitTypeMetadataCodeForVCall(getObjectWithVPtr(), VTable, Loc); in getVirtualFunctionPointer()
1962 VFunc = Builder.CreateAlignedLoad(Ty, VFuncPtr, CGF.getPointerAlign()); in getVirtualFunctionPointer()
1970 CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType, in EmitVirtualDestructorCall() argument
1983 llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo); in EmitVirtualDestructorCall()
1988 llvm::IntegerType::getInt32Ty(CGF.getLLVMContext()), in EmitVirtualDestructorCall()
1998 This = adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true); in EmitVirtualDestructorCall()
1999 RValue RV = CGF.EmitCXXDestructorCall(GD, Callee, This.getPointer(), ThisTy, in EmitVirtualDestructorCall()
2074 CodeGenFunction CGF(CGM); in EmitVirtualMemPtrThunk() local
2075 CGF.CurGD = GlobalDecl(MD); in EmitVirtualMemPtrThunk()
2076 CGF.CurFuncIsThunk = true; in EmitVirtualMemPtrThunk()
2081 buildThisParam(CGF, FunctionArgs); in EmitVirtualMemPtrThunk()
2084 CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo, in EmitVirtualMemPtrThunk()
2086 setCXXABIThisValue(CGF, loadIncomingCXXThis(CGF)); in EmitVirtualMemPtrThunk()
2091 llvm::Value *VTable = CGF.GetVTablePtr( in EmitVirtualMemPtrThunk()
2092 getThisAddress(CGF), ThunkPtrTy->getPointerTo(), MD->getParent()); in EmitVirtualMemPtrThunk()
2094 llvm::Value *VFuncPtr = CGF.Builder.CreateConstInBoundsGEP1_64( in EmitVirtualMemPtrThunk()
2097 CGF.Builder.CreateAlignedLoad(ThunkPtrTy, VFuncPtr, CGF.getPointerAlign()); in EmitVirtualMemPtrThunk()
2099 CGF.EmitMustTailThunk(MD, getThisValue(CGF), {ThunkTy, Callee}); in EmitVirtualMemPtrThunk()
2192 llvm::Value *MicrosoftCXXABI::performThisAdjustment(CodeGenFunction &CGF, in performThisAdjustment() argument
2198 This = CGF.Builder.CreateElementBitCast(This, CGF.Int8Ty); in performThisAdjustment()
2207 CGF.Builder.CreateConstInBoundsByteGEP(This, in performThisAdjustment()
2209 VtorDispPtr = CGF.Builder.CreateElementBitCast(VtorDispPtr, CGF.Int32Ty); in performThisAdjustment()
2210 llvm::Value *VtorDisp = CGF.Builder.CreateLoad(VtorDispPtr, "vtordisp"); in performThisAdjustment()
2211 V = CGF.Builder.CreateGEP(This.getElementType(), This.getPointer(), in performThisAdjustment()
2212 CGF.Builder.CreateNeg(VtorDisp)); in performThisAdjustment()
2226 CGF, Address(V, CGF.Int8Ty, CGF.getPointerAlign()), in performThisAdjustment()
2229 V = CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, VBPtr, VBaseOffset); in performThisAdjustment()
2237 V = CGF.Builder.CreateConstGEP1_32(CGF.Int8Ty, V, TA.NonVirtual); in performThisAdjustment()
2245 MicrosoftCXXABI::performReturnAdjustment(CodeGenFunction &CGF, Address Ret, in performReturnAdjustment() argument
2251 Ret = CGF.Builder.CreateElementBitCast(Ret, CGF.Int8Ty); in performReturnAdjustment()
2256 int32_t IntSize = CGF.getIntSize().getQuantity(); in performReturnAdjustment()
2259 GetVBaseOffsetFromVBPtr(CGF, Ret, RA.Virtual.Microsoft.VBPtrOffset, in performReturnAdjustment()
2261 V = CGF.Builder.CreateInBoundsGEP(CGF.Int8Ty, VBPtr, VBaseOffset); in performReturnAdjustment()
2265 V = CGF.Builder.CreateConstInBoundsGEP1_32(CGF.Int8Ty, V, RA.NonVirtual); in performReturnAdjustment()
2268 return CGF.Builder.CreateBitCast(V, OrigTy); in performReturnAdjustment()
2292 llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF, in readArrayCookieImpl() argument
2296 CGF.Builder.CreateElementBitCast(allocPtr, CGF.SizeTy); in readArrayCookieImpl()
2297 return CGF.Builder.CreateLoad(numElementsPtr); in readArrayCookieImpl()
2300 Address MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF, in InitializeArrayCookie() argument
2315 = CGF.Builder.CreateElementBitCast(cookiePtr, CGF.SizeTy); in InitializeArrayCookie()
2316 CGF.Builder.CreateStore(numElements, numElementsPtr); in InitializeArrayCookie()
2320 return CGF.Builder.CreateConstInBoundsByteGEP(newPtr, cookieSize); in InitializeArrayCookie()
2323 static void emitGlobalDtorWithTLRegDtor(CodeGenFunction &CGF, const VarDecl &VD, in emitGlobalDtorWithTLRegDtor() argument
2327 llvm::Constant *DtorStub = CGF.createAtExitStub(VD, Dtor, Addr); in emitGlobalDtorWithTLRegDtor()
2331 CGF.IntTy, DtorStub->getType(), /*isVarArg=*/false); in emitGlobalDtorWithTLRegDtor()
2333 llvm::FunctionCallee TLRegDtor = CGF.CGM.CreateRuntimeFunction( in emitGlobalDtorWithTLRegDtor()
2339 CGF.EmitNounwindRuntimeCall(TLRegDtor, DtorStub); in emitGlobalDtorWithTLRegDtor()
2342 void MicrosoftCXXABI::registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, in registerGlobalDtor() argument
2349 return emitGlobalDtorWithTLRegDtor(CGF, D, Dtor, Addr); in registerGlobalDtor()
2352 CGF.registerGlobalDtorWithAtExit(D, Dtor, Addr); in registerGlobalDtor()
2436 static void emitTlsGuardCheck(CodeGenFunction &CGF, llvm::GlobalValue *TlsGuard, in emitTlsGuardCheck() argument
2440 CGF.Builder.CreateLoad(Address(TlsGuard, CGF.Int8Ty, CharUnits::One())); in emitTlsGuardCheck()
2442 CGF.Builder.CreateICmpEQ(TlsGuardValue, CGF.Builder.getInt8(0)); in emitTlsGuardCheck()
2443 CGF.Builder.CreateCondBr(CmpResult, DynInitBB, ContinueBB); in emitTlsGuardCheck()
2446 static void emitDynamicTlsInitializationCall(CodeGenFunction &CGF, in emitDynamicTlsInitializationCall() argument
2449 llvm::FunctionCallee Initializer = getDynTlsOnDemandInitFn(CGF.CGM); in emitDynamicTlsInitializationCall()
2452 llvm::CallInst *CallVal = CGF.Builder.CreateCall(InitializerFunction); in emitDynamicTlsInitializationCall()
2455 CGF.Builder.CreateBr(ContinueBB); in emitDynamicTlsInitializationCall()
2458 static void emitDynamicTlsInitialization(CodeGenFunction &CGF) { in emitDynamicTlsInitialization() argument
2460 CGF.createBasicBlock("dyntls.dyn_init", CGF.CurFn); in emitDynamicTlsInitialization()
2462 CGF.createBasicBlock("dyntls.continue", CGF.CurFn); in emitDynamicTlsInitialization()
2464 llvm::GlobalValue *TlsGuard = getTlsGuardVar(CGF.CGM); in emitDynamicTlsInitialization()
2466 emitTlsGuardCheck(CGF, TlsGuard, DynInitBB, ContinueBB); in emitDynamicTlsInitialization()
2467 CGF.Builder.SetInsertPoint(DynInitBB); in emitDynamicTlsInitialization()
2468 emitDynamicTlsInitializationCall(CGF, TlsGuard, ContinueBB); in emitDynamicTlsInitialization()
2469 CGF.Builder.SetInsertPoint(ContinueBB); in emitDynamicTlsInitialization()
2472 LValue MicrosoftCXXABI::EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, in EmitThreadLocalVarDeclLValue() argument
2480 emitDynamicTlsInitialization(CGF); in EmitThreadLocalVarDeclLValue()
2484 llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD); in EmitThreadLocalVarDeclLValue()
2485 llvm::Type *RealVarTy = CGF.getTypes().ConvertTypeForMem(VD->getType()); in EmitThreadLocalVarDeclLValue()
2488 V = CGF.Builder.CreateBitCast(V, RealVarTy->getPointerTo(AS)); in EmitThreadLocalVarDeclLValue()
2490 CharUnits Alignment = CGF.getContext().getDeclAlign(VD); in EmitThreadLocalVarDeclLValue()
2494 ? CGF.EmitLoadOfReferenceLValue(Addr, VD->getType(), in EmitThreadLocalVarDeclLValue()
2496 : CGF.MakeAddrLValue(Addr, LValType, AlignmentSource::Decl); in EmitThreadLocalVarDeclLValue()
2557 void Emit(CodeGenFunction &CGF, Flags flags) override { in Emit()
2560 CGBuilderTy &Builder = CGF.Builder; in Emit()
2563 llvm::ConstantInt::get(CGF.IntTy, ~(1ULL << GuardNum)); in Emit()
2572 void Emit(CodeGenFunction &CGF, Flags flags) override { in Emit()
2574 CGF.EmitNounwindRuntimeCall(getInitThreadAbortFn(CGF.CGM), Guard); in Emit()
2579 void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D, in EmitGuardedInit() argument
2586 llvm::Function *F = CGF.CurFn; in EmitGuardedInit()
2589 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit); in EmitGuardedInit()
2600 CGBuilderTy &Builder = CGF.Builder; in EmitGuardedInit()
2601 llvm::IntegerType *GuardTy = CGF.Int32Ty; in EmitGuardedInit()
2629 ErrorUnsupportedABI(CGF, "more than 32 guarded initializations"); in EmitGuardedInit()
2680 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init"); in EmitGuardedInit()
2681 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end"); in EmitGuardedInit()
2682 CGF.EmitCXXGuardedInitBranch(NeedsInit, InitBlock, EndBlock, in EmitGuardedInit()
2687 CGF.EmitBlock(InitBlock); in EmitGuardedInit()
2689 CGF.EHStack.pushCleanup<ResetGuardBit>(EHCleanup, GuardAddr, GuardNum); in EmitGuardedInit()
2690 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit); in EmitGuardedInit()
2691 CGF.PopCleanupBlock(); in EmitGuardedInit()
2695 CGF.EmitBlock(EndBlock); in EmitGuardedInit()
2716 llvm::BasicBlock *AttemptInitBlock = CGF.createBasicBlock("init.attempt"); in EmitGuardedInit()
2717 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end"); in EmitGuardedInit()
2718 CGF.EmitCXXGuardedInitBranch(IsUninitialized, AttemptInitBlock, EndBlock, in EmitGuardedInit()
2723 CGF.EmitBlock(AttemptInitBlock); in EmitGuardedInit()
2724 CGF.EmitNounwindRuntimeCall(getInitThreadHeaderFn(CGM), in EmitGuardedInit()
2730 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init"); in EmitGuardedInit()
2734 CGF.EmitBlock(InitBlock); in EmitGuardedInit()
2735 CGF.EHStack.pushCleanup<CallInitThreadAbort>(EHCleanup, GuardAddr); in EmitGuardedInit()
2736 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit); in EmitGuardedInit()
2737 CGF.PopCleanupBlock(); in EmitGuardedInit()
2738 CGF.EmitNounwindRuntimeCall(getInitThreadFooterFn(CGM), in EmitGuardedInit()
2742 CGF.EmitBlock(EndBlock); in EmitGuardedInit()
2982 MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF, in EmitMemberPointerComparison() argument
2987 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerComparison()
3042 MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF, in EmitMemberPointerIsNotNull() argument
3045 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerIsNotNull()
3104 MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF, in GetVBaseOffsetFromVBPtr() argument
3109 CGBuilderTy &Builder = CGF.Builder; in GetVBaseOffsetFromVBPtr()
3123 VBPtrAlign = CGF.getPointerAlign(); in GetVBaseOffsetFromVBPtr()
3145 CodeGenFunction &CGF, const Expr *E, const CXXRecordDecl *RD, in AdjustVirtualBase() argument
3147 CGBuilderTy &Builder = CGF.Builder; in AdjustVirtualBase()
3159 VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust"); in AdjustVirtualBase()
3160 SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust"); in AdjustVirtualBase()
3165 CGF.EmitBlock(VBaseAdjustBB); in AdjustVirtualBase()
3173 DiagnosticsEngine &Diags = CGF.CGM.getDiags(); in AdjustVirtualBase()
3185 GetVBaseOffsetFromVBPtr(CGF, Base, VBPtrOffset, VBTableOffset, &VBPtr); in AdjustVirtualBase()
3192 CGF.EmitBlock(SkipAdjustBB); in AdjustVirtualBase()
3202 CodeGenFunction &CGF, const Expr *E, Address Base, llvm::Value *MemPtr, in EmitMemberDataPointerAddress() argument
3207 CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS); in EmitMemberDataPointerAddress()
3208 CGBuilderTy &Builder = CGF.Builder; in EmitMemberDataPointerAddress()
3229 Addr = AdjustVirtualBase(CGF, E, RD, Base, VirtualBaseAdjustmentOffset, in EmitMemberDataPointerAddress()
3236 Addr = Builder.CreateBitCast(Addr, CGF.Int8Ty->getPointerTo(AS)); in EmitMemberDataPointerAddress()
3239 Addr = Builder.CreateInBoundsGEP(CGF.Int8Ty, Addr, FieldOffset, in EmitMemberDataPointerAddress()
3248 MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF, in EmitMemberPointerConversion() argument
3277 CGBuilderTy &Builder = CGF.Builder; in EmitMemberPointerConversion()
3280 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy); in EmitMemberPointerConversion()
3293 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert"); in EmitMemberPointerConversion()
3294 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted"); in EmitMemberPointerConversion()
3296 CGF.EmitBlock(ConvertBB); in EmitMemberPointerConversion()
3305 CGF.EmitBlock(ContinueBB); in EmitMemberPointerConversion()
3494 CodeGenFunction &CGF, const Expr *E, Address This, in EmitLoadOfMemberFunctionPointer() argument
3503 CGBuilderTy &Builder = CGF.Builder; in EmitLoadOfMemberFunctionPointer()
3526 ThisPtrForCall = AdjustVirtualBase(CGF, E, RD, This, in EmitLoadOfMemberFunctionPointer()
3534 llvm::Value *Ptr = Builder.CreateBitCast(ThisPtrForCall, CGF.Int8PtrTy); in EmitLoadOfMemberFunctionPointer()
3535 Ptr = Builder.CreateInBoundsGEP(CGF.Int8Ty, Ptr, NonVirtualBaseAdjustment); in EmitLoadOfMemberFunctionPointer()
4081 CodeGenFunction CGF(CGM); in getAddrOfCXXCtorClosure() local
4082 CGF.CurGD = GlobalDecl(CD, Ctor_Complete); in getAddrOfCXXCtorClosure()
4088 buildThisParam(CGF, FunctionArgs); in getAddrOfCXXCtorClosure()
4113 auto NL = ApplyDebugLocation::CreateEmpty(CGF); in getAddrOfCXXCtorClosure()
4114 CGF.StartFunction(GlobalDecl(), FnInfo.getReturnType(), ThunkFn, FnInfo, in getAddrOfCXXCtorClosure()
4117 auto AL = ApplyDebugLocation::CreateArtificial(CGF); in getAddrOfCXXCtorClosure()
4118 setCXXABIThisValue(CGF, loadIncomingCXXThis(CGF)); in getAddrOfCXXCtorClosure()
4119 llvm::Value *This = getThisValue(CGF); in getAddrOfCXXCtorClosure()
4122 IsCopy ? CGF.Builder.CreateLoad(CGF.GetAddrOfLocalVar(&SrcParam), "src") in getAddrOfCXXCtorClosure()
4142 CodeGenFunction::RunCleanupsScope Cleanups(CGF); in getAddrOfCXXCtorClosure()
4145 CGF.EmitCallArgs(Args, FPT, llvm::makeArrayRef(ArgVec), CD, IsCopy ? 1 : 0); in getAddrOfCXXCtorClosure()
4149 addImplicitConstructorArgs(CGF, CD, Ctor_Complete, in getAddrOfCXXCtorClosure()
4159 CGF.EmitCall(CalleeInfo, Callee, ReturnValueSlot(), Args); in getAddrOfCXXCtorClosure()
4165 CGF.FinishFunction(SourceLocation()); in getAddrOfCXXCtorClosure()
4442 void MicrosoftCXXABI::emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) { in emitThrow() argument
4448 Address AI = CGF.CreateMemTemp(ThrowType); in emitThrow()
4449 CGF.EmitAnyExprToMem(SubExpr, AI, ThrowType.getQualifiers(), in emitThrow()
4458 CGF.Builder.CreateBitCast(AI.getPointer(), CGM.Int8PtrTy), in emitThrow()
4461 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(), Args); in emitThrow()
4465 MicrosoftCXXABI::LoadVTablePtr(CodeGenFunction &CGF, Address This, in LoadVTablePtr() argument
4468 performBaseAdjustment(CGF, This, QualType(RD->getTypeForDecl(), 0)); in LoadVTablePtr()
4469 return {CGF.GetVTablePtr(This, CGM.Int8PtrTy, RD), RD}; in LoadVTablePtr()