Lines Matching defs:CGM

32 CodeGenVTables::CodeGenVTables(CodeGenModule &CGM)
33 : CGM(CGM), VTContext(CGM.getContext().getVTableContext()) {}
41 static void setThunkProperties(CodeGenModule &CGM, const ThunkInfo &Thunk,
44 CGM.setFunctionLinkage(GD, ThunkFn);
45 CGM.getCXXABI().setThunkLinkage(ThunkFn, ForVTable, GD,
49 CGM.setGVProperties(ThunkFn, GD);
51 if (!CGM.getCXXABI().exportThunk()) {
56 if (CGM.supportsCOMDAT() && ThunkFn->isWeakForLinker())
57 ThunkFn->setComdat(CGM.getModule().getOrInsertComdat(ThunkFn->getName()));
93 auto ClassAlign = CGF.CGM.getClassPointerAlignment(ClassDecl);
94 ReturnValue = CGF.CGM.getCXXABI().performReturnAdjustment(
175 llvm::Type *Ty = CGM.getTypes().GetFunctionType(FnInfo);
176 llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
183 CGM.ErrorUnsupported(MD, "return-adjusting thunk with variadic arguments");
205 if (CGM.ReturnTypeUsesSRet(FnInfo))
212 CGM.getClassPointerAlignment(MD->getParent()));
224 llvm::Value *AdjustedThisPtr = CGM.getCXXABI().performThisAdjustment(
260 ResultType = CGM.getContext().VoidTy;
261 else if (CGM.getCXXABI().HasThisReturn(GD))
263 else if (CGM.getCXXABI().hasMostDerivedReturn(GD))
264 ResultType = CGM.getContext().VoidPtrTy;
270 CGM.getCXXABI().buildThisParam(*this, FunctionArgs);
277 CGM.getCXXABI().addImplicitStructorParams(*this, ResultType,
289 CGM.getCXXABI().EmitInstanceFunctionProlog(*this);
318 Thunk ? CGM.getCXXABI().performThisAdjustment(*this, LoadCXXThisAddress(),
328 CGM.ErrorUnsupported(
334 CGM.ErrorUnsupported(
347 CGM.getCXXABI().adjustCallArgsForDestructorThunk(*this, CurGD, CallArgs);
359 const CGFunctionInfo &CallFnInfo = CGM.getTypes().arrangeCXXMethodCall(
376 QualType ResultType = CGM.getCXXABI().HasThisReturn(CurGD)
378 : CGM.getCXXABI().hasMostDerivedReturn(CurGD)
379 ? CGM.getContext().VoidPtrTy
401 CGM.getCXXABI().EmitReturnFromThunk(*this, RV, ResultType);
444 CGM.ConstructAttributeList(Callee.getCallee()->getName(), *CurFnInfo, GD,
476 Ty = CGM.getTypes().GetFunctionType(FnInfo);
478 llvm::Constant *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true);
485 static bool shouldEmitVTableThunk(CodeGenModule &CGM, const CXXMethodDecl *MD,
489 if (CGM.getTarget().getCXXABI().isMicrosoft())
497 return CGM.getCodeGenOpts().OptimizationLevel && !IsUnprototyped;
512 MangleContext &MCtx = CGM.getCXXABI().getMangleContext();
521 if (CGM.getContext().useAbbreviatedThunkName(GD, Name.str())) {
530 llvm::Type *ThunkVTableTy = CGM.getTypes().GetFunctionTypeForVTable(GD);
531 llvm::Constant *Thunk = CGM.GetAddrOfThunk(Name, ThunkVTableTy, GD);
534 bool IsUnprototyped = !CGM.getTypes().isFuncTypeConvertible(
536 if (!shouldEmitVTableThunk(CGM, MD, IsUnprototyped, ForVTable))
542 IsUnprototyped ? CGM.getTypes().arrangeUnprototypedMustTailThunk(MD)
543 : CGM.getTypes().arrangeGlobalDeclaration(GD);
544 llvm::FunctionType *ThunkFnTy = CGM.getTypes().GetFunctionType(FnInfo);
557 Name.str(), &CGM.getModule());
558 CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn, /*IsThunk=*/false);
568 bool ABIHasKeyFunctions = CGM.getTarget().getCXXABI().hasKeyFunctions();
577 setThunkProperties(CGM, TI, ThunkFn, ForVTable, GD);
588 CGM.SetLLVMFunctionAttributesForDefinition(GD.getDecl(), ThunkFn);
599 switch (CGM.getTriple().getArch()) {
615 CodeGenFunction(CGM).GenerateVarArgsThunk(ThunkFn, FnInfo, GD, TI);
618 CodeGenFunction(CGM).generateThunk(ThunkFn, FnInfo, GD, TI, IsUnprototyped);
621 setThunkProperties(CGM, TI, ThunkFn, ForVTable, GD);
650 return builder.add(llvm::ConstantInt::get(CGM.Int32Ty, 0));
654 llvm::Module &module = CGM.getModule();
703 builder.addRelativeOffsetToPosition(CGM.Int32Ty, target,
707 static bool UseRelativeLayout(const CodeGenModule &CGM) {
708 return CGM.getTarget().getCXXABI().isItaniumFamily() &&
709 CGM.getItaniumVTableContext().isRelativeLayout();
713 return UseRelativeLayout(CGM);
723 return CGM.getVTableComponentType();
726 static void AddPointerLayoutOffset(const CodeGenModule &CGM,
730 llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity()),
731 CGM.GlobalsInt8PtrTy));
734 static void AddRelativeLayoutOffset(const CodeGenModule &CGM,
737 builder.add(llvm::ConstantInt::get(CGM.Int32Ty, offset.getQuantity()));
754 return addOffsetConstant(CGM, builder, component.getVCallOffset());
757 return addOffsetConstant(CGM, builder, component.getVBaseOffset());
760 return addOffsetConstant(CGM, builder, component.getOffsetToTop());
775 if (CGM.getLangOpts().CUDA) {
783 CGM.getLangOpts().CUDAIsDevice
788 llvm::ConstantExpr::getNullValue(CGM.GlobalsInt8PtrTy));
801 return llvm::ConstantPointerNull::get(CGM.GlobalsInt8PtrTy);
805 if (CGM.getLangOpts().OpenMP && CGM.getLangOpts().OpenMPIsTargetDevice &&
806 CGM.getTriple().isNVPTX())
807 return llvm::ConstantPointerNull::get(CGM.GlobalsInt8PtrTy);
809 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
811 CGM.CreateRuntimeFunction(fnTy, name).getCallee());
823 getSpecialVirtualFn(CGM.getCXXABI().GetPureVirtualCallName());
830 getSpecialVirtualFn(CGM.getCXXABI().GetDeletedVirtualCallName());
841 if (CGM.getCodeGenOpts().PointerAuth.CXXVirtualFunctionPointers) {
848 llvm::Type *fnTy = CGM.getTypes().GetFunctionTypeForVTable(GD);
849 fnPtr = CGM.GetAddrOfFunction(GD, fnTy, /*ForVTable=*/true);
850 if (CGM.getCodeGenOpts().PointerAuth.CXXVirtualFunctionPointers)
864 unsigned GVAS = CGM.GlobalsInt8PtrTy->getPointerAddressSpace();
868 llvm::ConstantExpr::getAddrSpaceCast(fnPtr, CGM.GlobalsInt8PtrTy);
870 CGM.getCodeGenOpts().PointerAuth.CXXVirtualFunctionPointers)
878 return builder.add(llvm::ConstantExpr::getNullValue(CGM.Int32Ty));
880 return builder.addNullPointer(CGM.GlobalsInt8PtrTy);
892 return llvm::StructType::get(CGM.getLLVMContext(), tys);
923 if (CGDebugInfo *DI = CGM.getModuleDebugInfo())
936 cast<ItaniumMangleContext>(CGM.getCXXABI().getMangleContext())
943 UsingRelativeLayout && CGM.getModule().getNamedAlias(Name);
959 llvm::Align Align = CGM.getDataLayout().getABITypeAlign(VTType);
963 CGM.CreateOrReplaceCXXRuntimeVariable(Name, VTType, Linkage, Align);
968 llvm::Constant *RTTI = CGM.GetAddrOfRTTIDescriptor(
969 CGM.getContext().getTagDeclType(Base.getBase()));
972 ConstantInitBuilder builder(CGM);
981 CGM.setGVProperties(VTable, RD);
983 CGM.EmitVTableTypeMetadata(RD, VTable, *VTLayout.get());
1003 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::HWAddress)) {
1041 llvm::GlobalAlias *VTableAlias = CGM.getModule().getNamedAlias(AliasName);
1045 AliasName, &CGM.getModule());
1068 static bool shouldEmitAvailableExternallyVTable(const CodeGenModule &CGM,
1070 return CGM.getCodeGenOpts().OptimizationLevel > 0 &&
1071 CGM.getCXXABI().canSpeculativelyEmitVTable(RD);
1189 if (CGDebugInfo *DI = CGM.getModuleDebugInfo())
1193 CGM.getCXXABI().emitVirtualInheritanceTables(RD);
1195 CGM.getCXXABI().emitVTableDefinitions(*this, RD);
1213 if (CGM.getTarget().getCXXABI().isMicrosoft())
1235 const CXXMethodDecl *keyFunction = CGM.getContext().getCurrentKeyFunction(RD);
1247 static bool shouldEmitVTableAtEndOfTranslationUnit(CodeGenModule &CGM,
1250 if (!CGM.getVTables().isVTableExternal(RD))
1254 return shouldEmitAvailableExternallyVTable(CGM, RD);