Lines Matching defs:CGM
64 ItaniumCXXABI(CodeGen::CodeGenModule &CGM,
67 CGCXXABI(CGM), UseARMMethodPtrABI(UseARMMethodPtrABI),
200 if (!CGM.getCodeGenOpts().AssumeUniqueVTables ||
206 if (!CGM.shouldEmitRTTI())
211 if (!llvm::GlobalValue::isWeakForLinker(CGM.getVTableLinkage(RD)))
219 if (CGM.GetLLVMVisibility(RD->getVisibility()) !=
334 CGM.setGVProperties(Thunk, GD);
377 CodeGenModule &CGM,
437 CGM.getItaniumVTableContext().getVTableLayout(RD);
448 StringRef Name = CGM.getMangledName(VtableComponent.getGlobalDecl());
449 auto *Entry = CGM.GetGlobalValue(Name);
463 CGM.getItaniumVTableContext().getVTableLayout(RD);
483 ARMCXXABI(CodeGen::CodeGenModule &CGM) :
484 ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
504 AppleARM64CXXABI(CodeGen::CodeGenModule &CGM) : ARMCXXABI(CGM) {
514 explicit FuchsiaCXXABI(CodeGen::CodeGenModule &CGM)
515 : ItaniumCXXABI(CGM) {}
523 explicit WebAssemblyCXXABI(CodeGen::CodeGenModule &CGM)
524 : ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
538 explicit XLCXXABI(CodeGen::CodeGenModule &CGM)
539 : ItaniumCXXABI(CGM) {}
553 CodeGen::CGCXXABI *CodeGen::CreateItaniumCXXABI(CodeGenModule &CGM) {
554 switch (CGM.getContext().getCXXABIKind()) {
560 return new ARMCXXABI(CGM);
563 return new AppleARM64CXXABI(CGM);
566 return new FuchsiaCXXABI(CGM);
572 return new ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true,
576 return new ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true);
579 return new WebAssemblyCXXABI(CGM);
582 return new XLCXXABI(CGM);
585 if (CGM.getContext().getTargetInfo().getTriple().getArch()
590 return new ItaniumCXXABI(CGM, /*UseARMMethodPtrABI=*/true);
592 return new ItaniumCXXABI(CGM);
603 return CGM.PtrDiffTy;
604 return llvm::StructType::get(CGM.PtrDiffTy, CGM.PtrDiffTy);
638 llvm::Constant *ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
677 llvm::Type *VTableTy = CGF.CGM.GlobalsInt8PtrTy;
679 CGF.CGM.getDynamicOffsetAlignment(ThisAddr.getAlignment(), RD,
692 VTableOffset = Builder.CreateZExt(VTableOffset, CGM.PtrDiffTy);
700 CGM.HasHiddenLTOVisibility(RD);
701 bool ShouldEmitVFEInfo = CGM.getCodeGenOpts().VirtualFunctionElimination &&
702 CGM.HasHiddenLTOVisibility(RD);
704 CGM.getCodeGenOpts().WholeProgramVTables &&
706 !CGM.AlwaysHasLTOVisibilityPublic(RD);
718 CGM.CreateMetadataIdentifierForVirtualMemPtrType(QualType(MPT, 0));
732 CGM.getIntrinsic(llvm::Intrinsic::type_checked_load),
733 {VFPAddr, llvm::ConstantInt::get(CGM.Int32Ty, 0), TypeId});
742 llvm::Intrinsic::ID IID = CGM.HasHiddenLTOVisibility(RD)
747 Builder.CreateCall(CGM.getIntrinsic(IID), {VFPAddr, TypeId});
750 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
752 CGM.getIntrinsic(llvm::Intrinsic::load_relative,
778 if (CGM.getCodeGenOpts().SanitizeTrap.has(SanitizerKind::CFIMFCall)) {
782 CGM.getLLVMContext(),
783 llvm::MDString::get(CGM.getLLVMContext(), "all-vtables"));
785 CGM.getIntrinsic(llvm::Intrinsic::type_test), {VTable, AllVtables});
816 for (const CXXRecordDecl *Base : CGM.getMostBaseClasses(RD)) {
817 llvm::Metadata *MD = CGM.CreateMetadataIdentifierForType(
825 Builder.CreateCall(CGM.getIntrinsic(llvm::Intrinsic::type_test),
847 CGM.getCodeGenOpts().PointerAuth.CXXMemberFunctionPointers) {
852 CGM.getMemberFunctionPointerAuthInfo(QualType(MPT, 0));
871 assert(MemPtr->getType() == CGM.PtrDiffTy);
883 const CGPointerAuthInfo &NewAuthInfo, CodeGenModule &CGM) {
894 return CGM.getConstantSignedPointer(
939 CGM.getMemberFunctionPointerAuthInfo(DstType)) {
942 const auto &CurAuthInfo = CGM.getMemberFunctionPointerAuthInfo(SrcType);
953 llvm::Constant *Ptrdiff_1 = llvm::ConstantInt::get(CGM.PtrDiffTy, 1);
960 llvm::Type *PtrTy = llvm::PointerType::getUnqual(CGM.Int8Ty);
1022 QualType SrcType, CodeGenModule &CGM) {
1029 const auto &NewAuthInfo = CGM.getMemberFunctionPointerAuthInfo(DestType);
1030 const auto &CurAuthInfo = CGM.getMemberFunctionPointerAuthInfo(SrcType);
1043 cast<llvm::User>(MemFnPtr)->getOperand(0), CurAuthInfo, NewAuthInfo, CGM);
1059 src, DstType, E->getSubExpr()->getType(), CGM);
1109 return llvm::ConstantInt::get(CGM.PtrDiffTy, -1ULL, /*isSigned=*/true);
1111 llvm::Constant *Zero = llvm::ConstantInt::get(CGM.PtrDiffTy, 0);
1122 return llvm::ConstantInt::get(CGM.PtrDiffTy, offset.getQuantity());
1134 CodeGenTypes &Types = CGM.getTypes();
1139 uint64_t Index = CGM.getItaniumVTableContext().getMethodVTableIndex(MD);
1141 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1174 CGM.getCodeGenOpts().PointerAuth.CXXMemberFunctionPointers;
1177 getSignedVirtualMemberFunctionPointer(MD), CGM.PtrDiffTy);
1179 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset);
1183 CGM.PtrDiffTy, 2 * ThisAdjustment.getQuantity() + !Schema);
1189 MemPtr[0] = llvm::ConstantInt::get(CGM.PtrDiffTy, VTableOffset + 1);
1190 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
1203 Ty = CGM.PtrDiffTy;
1205 llvm::Constant *addr = CGM.getMemberFunctionPointer(MD, Ty);
1207 MemPtr[0] = llvm::ConstantExpr::getPtrToInt(addr, CGM.PtrDiffTy);
1208 MemPtr[1] = llvm::ConstantInt::get(CGM.PtrDiffTy,
1229 return pointerAuthResignMemberFunctionPointer(Src, MPType, SrcType, CGM);
1323 assert(MemPtr->getType() == CGM.PtrDiffTy);
1356 auto Align = CGM.getContext().getTypeAlignInChars(FI.getReturnType());
1416 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
1418 llvm::FunctionCallee Fn = CGM.CreateRuntimeFunction(FTy, "__cxa_rethrow");
1426 static llvm::FunctionCallee getAllocateExceptionFn(CodeGenModule &CGM) {
1430 llvm::FunctionType::get(CGM.Int8PtrTy, CGM.SizeTy, /*isVarArg=*/false);
1432 return CGM.CreateRuntimeFunction(FTy, "__cxa_allocate_exception");
1435 static llvm::FunctionCallee getThrowFn(CodeGenModule &CGM) {
1439 llvm::Type *Args[3] = { CGM.Int8PtrTy, CGM.GlobalsInt8PtrTy, CGM.Int8PtrTy };
1441 llvm::FunctionType::get(CGM.VoidTy, Args, /*isVarArg=*/false);
1443 return CGM.CreateRuntimeFunction(FTy, "__cxa_throw");
1452 llvm::FunctionCallee AllocExceptionFn = getAllocateExceptionFn(CGM);
1458 E->getSubExpr(), Address(ExceptionPtr, CGM.Int8Ty, ExnAlign));
1461 llvm::Constant *TypeInfo = CGM.GetAddrOfRTTIDescriptor(ThrowType,
1478 Dtor = CGM.getAddrOfCXXStructor(GlobalDecl(DtorD, Dtor_Complete));
1479 Dtor = CGM.getFunctionPointer(Dtor, DtorTy);
1482 if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy);
1485 CGF.EmitNoreturnRuntimeCallOrInvoke(getThrowFn(CGM), args);
1511 return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1517 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1576 return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
1596 llvm::Value *Value = CGF.GetVTablePtr(ThisPtr, CGM.GlobalsInt8PtrTy,
1599 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1602 CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}),
1603 {Value, llvm::ConstantInt::get(CGM.Int32Ty, -4)});
1625 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1627 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1638 if (CGM.getCodeGenOpts().PointerAuth.CXXVTablePointers) {
1645 CGF.GetVTablePtr(ThisAddr, CGM.Int8PtrTy, SrcDecl,
1735 CGM.DecorateInstructionWithTBAA(
1736 VPtr, CGM.getTBAAVTablePtrAccessInfo(CGF.VoidPtrPtrTy));
1754 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1761 CGF.Builder.CreateConstInBoundsGEP1_32(CGM.Int32Ty, VTable, -2U);
1763 CGM.Int32Ty, OffsetToTop, CharUnits::fromQuantity(4), "offset.to.top");
1796 llvm::Value *VTablePtr = CGF.GetVTablePtr(This, CGM.Int8PtrTy, ClassDecl);
1798 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(ClassDecl,
1806 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
1812 CGM.PtrDiffTy, VBaseOffsetPtr, CGF.getPointerAlign(), "vbase.offset");
1819 assert(CGM.getTarget().getCXXABI().hasConstructorVariants());
1823 CGM.EmitGlobal(GlobalDecl(D, Ctor_Base));
1829 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
1845 LangAS AS = CGM.GetGlobalVarAddressSpace(nullptr);
1857 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
1861 CGM.EmitGlobal(GlobalDecl(D, Dtor_Complete));
1867 CGM.EmitGlobal(GlobalDecl(D, Dtor_Deleting));
1881 LangAS AS = CGM.GetGlobalVarAddressSpace(nullptr);
1930 LangAS AS = CGM.GetGlobalVarAddressSpace(nullptr);
1958 Callee = CGCallee::forDirect(CGM.getAddrOfCXXStructor(GD), GD);
1980 static void setVTableSelectiveDLLImportExport(CodeGenModule &CGM,
1988 if (CGM.getVTables().isVTableExternal(RD)) {
2001 ItaniumVTableContext &VTContext = CGM.getItaniumVTableContext();
2003 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
2005 CGM.GetAddrOfRTTIDescriptor(CGM.getContext().getTagDeclType(RD));
2008 ConstantInitBuilder builder(CGM);
2017 if (CGM.supportsCOMDAT() && VTable->isWeakForLinker())
2018 VTable->setComdat(CGM.getModule().getOrInsertComdat(VTable->getName()));
2020 if (CGM.getTarget().hasPS4DLLImportExport())
2021 setVTableSelectiveDLLImportExport(CGM, VTable, RD);
2024 CGM.setGVProperties(VTable, RD);
2043 CGM.getCodeGenOpts().WholeProgramVTables) {
2044 CGM.EmitVTableTypeMetadata(RD, VTable, VTLayout);
2049 assert(CGM.getCodeGenOpts().WholeProgramVTables);
2050 CGM.addCompilerUsedGlobal(VTable);
2088 CGM.getItaniumVTableContext().getVTableLayout(VTableClass);
2092 llvm::ConstantInt::get(CGM.Int32Ty, 0),
2093 llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint.VTableIndex),
2094 llvm::ConstantInt::get(CGM.Int32Ty, AddressPoint.AddressPointIndex),
2100 CGM.getDataLayout().getTypeAllocSize(CGM.getVTableComponentType());
2118 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base);
2131 if (auto &Schema = CGF.CGM.getCodeGenOpts().PointerAuth.CXXVTTVTablePointers) {
2150 CGM.addDeferredVTable(RD);
2157 CGM.getItaniumVTableContext().getVTableLayout(RD);
2158 llvm::Type *VTableType = CGM.getVTables().getVTableType(VTLayout);
2163 LangAS AS = CGM.GetGlobalVarAddressSpace(nullptr);
2164 unsigned PAlign = CGM.getItaniumVTableContext().isRelativeLayout()
2166 : CGM.getTarget().getPointerAlign(AS);
2168 VTable = CGM.CreateOrReplaceCXXRuntimeVariable(
2173 if (CGM.getTarget().hasPS4DLLImportExport())
2174 setVTableSelectiveDLLImportExport(CGM, VTable, RD);
2176 CGM.setGVProperties(VTable, RD);
2185 llvm::Type *PtrTy = CGM.GlobalsInt8PtrTy;
2189 uint64_t VTableIndex = CGM.getItaniumVTableContext().getMethodVTableIndex(GD);
2191 auto &Schema = CGM.getCodeGenOpts().PointerAuth.CXXVirtualFunctionPointers;
2196 CGM.getContext().getTargetInfo().getPointerWidth(LangAS::Default) /
2202 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
2204 CGM.getIntrinsic(llvm::Intrinsic::load_relative, {CGM.Int32Ty}),
2205 {VTable, llvm::ConstantInt::get(CGM.Int32Ty, 4 * VTableIndex)});
2219 if (CGM.getCodeGenOpts().OptimizationLevel > 0 &&
2220 CGM.getCodeGenOpts().StrictVTablePointers) {
2224 llvm::MDNode::get(CGM.getLLVMContext(),
2234 GD = CGM.getItaniumVTableContext().findOriginalMethod(GD.getCanonicalDecl());
2252 &CGM.getTypes().arrangeCXXStructorDeclaration(GD);
2253 llvm::FunctionType *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
2269 CodeGenVTables &VTables = CGM.getVTables();
2271 VTables.EmitVTTDefinition(VTT, CGM.getVTableLinkage(RD), RD);
2278 if (CGM.getLangOpts().AppleKext)
2286 if (CGM.getCodeGenOpts().ForceEmitVTables)
2360 if (CGF.CGM.getItaniumVTableContext().isRelativeLayout()) {
2424 return std::max(CharUnits::fromQuantity(CGM.SizeSizeInBytes),
2425 CGM.getContext().getPreferredTypeAlignInChars(elementType));
2456 if (CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) && AS == 0 &&
2458 CGM.getCodeGenOpts().SanitizeAddressPoisonCustomArrayCookie)) {
2462 llvm::FunctionType::get(CGM.VoidTy, NumElementsPtr.getType(), false);
2464 CGM.CreateRuntimeFunction(FTy, "__asan_poison_cxx_array_cookie");
2485 if (!CGM.getLangOpts().Sanitize.has(SanitizerKind::Address) || AS != 0)
2495 CGM.CreateRuntimeFunction(FTy, "__asan_load_cxx_array_cookie");
2508 return std::max(CharUnits::fromQuantity(2 * CGM.SizeSizeInBytes),
2509 CGM.getContext().getTypeAlignInChars(elementType));
2552 static llvm::FunctionCallee getGuardAcquireFn(CodeGenModule &CGM,
2556 llvm::FunctionType::get(CGM.getTypes().ConvertType(CGM.getContext().IntTy),
2558 return CGM.CreateRuntimeFunction(
2560 llvm::AttributeList::get(CGM.getLLVMContext(),
2565 static llvm::FunctionCallee getGuardReleaseFn(CodeGenModule &CGM,
2569 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
2570 return CGM.CreateRuntimeFunction(
2572 llvm::AttributeList::get(CGM.getLLVMContext(),
2577 static llvm::FunctionCallee getGuardAbortFn(CodeGenModule &CGM,
2581 llvm::FunctionType::get(CGM.VoidTy, GuardPtrTy, /*isVarArg=*/false);
2582 return CGM.CreateRuntimeFunction(
2584 llvm::AttributeList::get(CGM.getLLVMContext(),
2595 CGF.EmitNounwindRuntimeCall(getGuardAbortFn(CGF.CGM, Guard->getType()),
2640 CharUnits::fromQuantity(CGM.getDataLayout().getABITypeAlign(guardTy));
2644 CGF.CGM.getLLVMContext(),
2645 CGF.CGM.getDataLayout().getDefaultGlobalsAddressSpace());
2649 llvm::GlobalVariable *guard = CGM.getStaticLocalDeclGuardAddress(&D);
2661 guard = new llvm::GlobalVariable(CGM.getModule(), guardTy,
2677 (CGM.getTarget().getTriple().isOSBinFormatELF() ||
2678 CGM.getTarget().getTriple().isOSBinFormatWasm())) {
2680 } else if (CGM.supportsCOMDAT() && guard->isWeakForLinker()) {
2681 guard->setComdat(CGM.getModule().getOrInsertComdat(guard->getName()));
2684 CGM.setStaticLocalDeclGuardAddress(&D, guard);
2715 Builder.CreateLoad(guardAddr.withElementType(CGM.Int8Ty));
2748 ? Builder.CreateAnd(LI, llvm::ConstantInt::get(CGM.Int8Ty, 1))
2780 = CGF.EmitNounwindRuntimeCall(getGuardAcquireFn(CGM, guardPtrTy), guard);
2795 Builder.CreateStore(llvm::ConstantInt::get(CGM.Int8Ty, 1),
2796 guardAddr.withElementType(CGM.Int8Ty));
2807 CGF.EmitNounwindRuntimeCall(getGuardReleaseFn(CGM, guardPtrTy),
2813 Builder.CreateStore(llvm::ConstantInt::get(CGM.Int8Ty, 1),
2814 guardAddr.withElementType(CGM.Int8Ty));
2845 CGF.CGM.CreateRuntimeVariable(CGF.Int8Ty, "__dso_handle");
2855 llvm::FunctionCallee atexit = CGF.CGM.CreateRuntimeFunction(atexitTy, Name);
2859 const auto &Context = CGF.CGM.getContext();
2865 dtorCallee = CGF.CGM.getFunctionPointer(dtorCallee, fnType);
2878 static llvm::Function *createGlobalInitOrCleanupFn(CodeGen::CodeGenModule &CGM,
2882 llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
2883 llvm::Function *GlobalInitOrCleanupFn = CGM.CreateGlobalInitOrCleanUpFunction(
2884 FTy, FnName, CGM.getTypes().arrangeNullaryFunction(), SourceLocation());
2989 if (D.isNoDestroy(CGM.getContext()))
2997 if (!CGM.getLangOpts().hasAtExit() && !D.isStaticLocal())
3004 if (CGM.getCodeGenOpts().CXAAtExit || D.getTLSKind())
3009 if (CGM.getLangOpts().AppleKext) {
3011 return CGM.AddCXXDtorEntry(dtor, addr);
3018 CodeGen::CodeGenModule &CGM) {
3023 CGM.getTarget().getTriple().isOSDarwin();
3030 getThreadLocalWrapperLinkage(const VarDecl *VD, CodeGen::CodeGenModule &CGM) {
3032 CGM.getLLVMLinkageVarDefinition(VD);
3039 if (isThreadWrapperReplaceable(VD, CGM))
3058 if (llvm::Value *V = CGM.getModule().getNamedValue(WrapperName))
3065 const CGFunctionInfo &FI = CGM.getTypes().arrangeBuiltinFunctionDeclaration(
3068 llvm::FunctionType *FnTy = CGM.getTypes().GetFunctionType(FI);
3070 llvm::Function::Create(FnTy, getThreadLocalWrapperLinkage(VD, CGM),
3071 WrapperName.str(), &CGM.getModule());
3073 if (CGM.supportsCOMDAT() && Wrapper->isWeakForLinker())
3074 Wrapper->setComdat(CGM.getModule().getOrInsertComdat(Wrapper->getName()));
3076 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, Wrapper, /*IsThunk=*/false);
3080 if (!isThreadWrapperReplaceable(VD, CGM) ||
3086 if (isThreadWrapperReplaceable(VD, CGM)) {
3096 CodeGenModule &CGM, ArrayRef<const VarDecl *> CXXThreadLocals,
3117 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
3118 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
3119 InitFunc = CGM.CreateGlobalInitOrCleanUpFunction(FTy, "__tls_init", FI,
3123 CGM.getModule(), CGM.Int8Ty, /*isConstant=*/false,
3125 llvm::ConstantInt::get(CGM.Int8Ty, 0), "__tls_guard");
3127 Guard->setThreadLocalMode(CGM.GetDefaultLLVMTLSModel());
3132 CodeGenFunction(CGM).GenerateCXXGlobalInitFunc(
3133 InitFunc, OrderedInits, ConstantAddress(Guard, CGM.Int8Ty, GuardAlign));
3135 if (CGM.getTarget().getTriple().isOSDarwin()) {
3146 llvm::GlobalValue *GV = CGM.GetGlobalValue(CGM.getMangledName(VD));
3155 cast<llvm::GlobalVariable>(CGM.GetGlobalValue(CGM.getMangledName(VD)));
3162 if (isThreadWrapperReplaceable(VD, CGM)) {
3173 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, Wrapper);
3182 llvm::FunctionType *InitFnTy = llvm::FunctionType::get(CGM.VoidTy, false);
3207 InitFnName.str(), &CGM.getModule());
3208 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
3209 CGM.SetLLVMFunctionAttributes(
3216 if (!CGM.getTriple().isOSWindows() || !Init->hasExternalWeakLinkage())
3220 llvm::LLVMContext &Context = CGM.getModule().getContext();
3227 if (CGM.getTriple().isOSAIX() && VD->hasDefinition() &&
3237 InitFnTy, Var->getLinkage(), InitFnName.str(), &CGM.getModule());
3238 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
3239 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI,
3244 CGBuilderTy Builder(CGM, Entry);
3249 CGBuilderTy Builder(CGM, Entry);
3255 if (isThreadWrapperReplaceable(VD, CGM)) {
3262 } else if (CGM.getTriple().isOSAIX()) {
3290 CharUnits Align = CGM.getContext().getDeclAlign(VD);
3301 llvm::Value *Val = CGF.CGM.GetAddrOfGlobalVar(VD);
3346 CGM.getModule().getNamedValue(ThunkName))))
3349 const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeCXXMethodDeclaration(MD);
3350 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo);
3355 llvm::Function::Create(ThunkTy, Linkage, ThunkName, &CGM.getModule());
3360 CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn, /*IsThunk=*/true);
3361 CGM.SetLLVMFunctionAttributesForDefinition(MD, ThunkFn);
3369 CodeGenFunction CGF(CGM);
3389 CGM.getTypes().arrangeCXXMethodCall(CallArgs, FPT, Required, 0);
3411 CodeGenModule &CGM; // Per-module state.
3452 : CGM(ABI.CGM), VMContext(CGM.getModule().getContext()), CXXABI(ABI) {}
3514 CGM.getCXXABI().getMangleContext().mangleCXXRTTIName(Ty, Out);
3521 auto Align = CGM.getContext().getTypeAlignInChars(CGM.getContext().CharTy);
3523 llvm::GlobalVariable *GV = CGM.CreateOrReplaceCXXRuntimeVariable(
3536 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
3539 llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name);
3547 CGM.getModule(), CGM.GlobalsInt8PtrTy,
3550 CGM.setGVProperties(GV, RD);
3553 if (CGM.getTarget().hasPS4DLLImportExport()) {
3556 CGM.setDSOLocal(GV);
3714 static bool ShouldUseExternalRTTIDescriptor(CodeGenModule &CGM,
3716 ASTContext &Context = CGM.getContext();
3737 if (CGM.getTriple().isWindowsGNUEnvironment())
3740 if (CGM.getVTables().isVTableExternal(RD)) {
3741 if (CGM.getTarget().hasPS4DLLImportExport())
3744 return IsDLLImport && !CGM.getTriple().isWindowsItaniumEnvironment()
3941 if (CGM.getItaniumVTableContext().isRelativeLayout())
3942 VTable = CGM.getModule().getNamedAlias(VTableName);
3944 llvm::Type *Ty = llvm::ArrayType::get(CGM.GlobalsInt8PtrTy, 0);
3945 VTable = CGM.getModule().getOrInsertGlobal(VTableName, Ty);
3948 CGM.setDSOLocal(cast<llvm::GlobalValue>(VTable->stripPointerCasts()));
3951 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType());
3954 if (CGM.getItaniumVTableContext().isRelativeLayout()) {
3957 llvm::Constant *Eight = llvm::ConstantInt::get(CGM.Int32Ty, 8);
3959 llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8Ty, VTable, Eight);
3962 VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.GlobalsInt8PtrTy,
3966 if (auto &Schema = CGM.getCodeGenOpts().PointerAuth.CXXTypeInfoVTablePointer)
3967 VTable = CGM.getConstantSignedPointer(VTable, Schema, nullptr, GlobalDecl(),
3975 static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage(CodeGenModule &CGM,
4003 if (!CGM.getLangOpts().RTTI)
4010 if (CGM.getTriple().isWindowsItaniumEnvironment())
4012 ShouldUseExternalRTTIDescriptor(CGM, Ty))
4016 !CGM.getContext()
4020 return CGM.getVTableLinkage(RD);
4036 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
4038 llvm::GlobalVariable *OldGV = CGM.getModule().getNamedGlobal(Name);
4048 ShouldUseExternalRTTIDescriptor(CGM, Ty))
4052 llvm::GlobalVariable::LinkageTypes Linkage = getTypeInfoLinkage(CGM, Ty);
4069 if ((CGM.getTriple().isWindowsItaniumEnvironment() &&
4071 (CGM.shouldMapVisibilityToDLLExport(RD) &&
4098 TypeNameField = llvm::ConstantExpr::getPtrToInt(TypeName, CGM.Int64Ty);
4100 llvm::ConstantInt::get(CGM.Int64Ty, ((uint64_t)1) << 63);
4103 llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.GlobalsInt8PtrTy);
4204 CGM.getCXXABI().getMangleContext().mangleCXXRTTI(Ty, Out);
4205 llvm::Module &M = CGM.getModule();
4213 if (CGM.getTarget().hasPS4DLLImportExport() &&
4230 if (CGM.supportsCOMDAT() && GV->isWeakForLinker())
4233 CharUnits Align = CGM.getContext().toCharUnitsFromBits(
4234 CGM.getTarget().getPointerAlign(CGM.GetGlobalVarAddressSpace(nullptr)));
4253 CGM.setDSOLocal(TypeName);
4256 CGM.setDSOLocal(GV);
4261 TypeName->setPartition(CGM.getCodeGenOpts().SymbolPartition);
4262 GV->setPartition(CGM.getCodeGenOpts().SymbolPartition);
4284 QualType SuperTy = CGM.getContext().getObjCInterfaceType(Super);
4368 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
4408 QualType OffsetFlagsTy = CGM.getContext().LongTy;
4409 const TargetInfo &TI = CGM.getContext().getTargetInfo();
4412 OffsetFlagsTy = CGM.getContext().LongLongTy;
4414 CGM.getTypes().ConvertType(OffsetFlagsTy);
4432 CGM.getItaniumVTableContext().getVirtualBaseOffsetOffset(RD, BaseDecl);
4434 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
4486 unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy);
4489 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
4509 unsigned Flags = extractPBaseFlags(CGM.getContext(), PointeeTy);
4516 CGM.getTypes().ConvertType(CGM.getContext().UnsignedIntTy);
4556 RD->hasAttr<DLLExportAttr>() || CGM.shouldMapVisibilityToDLLExport(RD)
4603 static StructorCodegen getCodegenToUse(CodeGenModule &CGM,
4605 if (!CGM.getCodeGenOpts().CXXCtorDtorAliases)
4620 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
4631 if (CGM.getTarget().getTriple().isOSBinFormatELF() ||
4632 CGM.getTarget().getTriple().isOSBinFormatWasm())
4640 static void emitConstructorDestructorAlias(CodeGenModule &CGM,
4643 llvm::GlobalValue::LinkageTypes Linkage = CGM.getFunctionLinkage(AliasDecl);
4645 StringRef MangledName = CGM.getMangledName(AliasDecl);
4646 llvm::GlobalValue *Entry = CGM.GetGlobalValue(MangledName);
4650 auto *Aliasee = cast<llvm::GlobalValue>(CGM.GetAddrOfGlobal(TargetDecl));
4670 CGM.SetCommonAttributes(AliasDecl, Alias);
4678 StructorCodegen CGType = getCodegenToUse(CGM, MD);
4689 emitConstructorDestructorAlias(CGM, GD, BaseDecl);
4694 StringRef MangledName = CGM.getMangledName(GD);
4695 auto *Aliasee = CGM.GetAddrOfGlobal(BaseDecl);
4696 CGM.addReplacement(MangledName, Aliasee);
4707 !CGM.TryEmitBaseDestructorAsAlias(DD))
4722 llvm::Function *Fn = CGM.codegenCXXStructor(GD);
4731 llvm::Comdat *C = CGM.getModule().getOrInsertComdat(Out.str());
4734 CGM.maybeSetTrivialComdat(*MD, *Fn);
4738 static llvm::FunctionCallee getBeginCatchFn(CodeGenModule &CGM) {
4741 CGM.Int8PtrTy, CGM.Int8PtrTy, /*isVarArg=*/false);
4743 return CGM.CreateRuntimeFunction(FTy, "__cxa_begin_catch");
4746 static llvm::FunctionCallee getEndCatchFn(CodeGenModule &CGM) {
4749 llvm::FunctionType::get(CGM.VoidTy, /*isVarArg=*/false);
4751 return CGM.CreateRuntimeFunction(FTy, "__cxa_end_catch");
4754 static llvm::FunctionCallee getGetExceptionPtrFn(CodeGenModule &CGM) {
4757 CGM.Int8PtrTy, CGM.Int8PtrTy, /*isVarArg=*/false);
4759 return CGM.CreateRuntimeFunction(FTy, "__cxa_get_exception_ptr");
4781 CGF.EmitNounwindRuntimeCall(getEndCatchFn(CGF.CGM));
4785 CGF.EmitRuntimeCallOrInvoke(getEndCatchFn(CGF.CGM));
4800 CGF.EmitNounwindRuntimeCall(getBeginCatchFn(CGF.CGM), Exn);
4804 EndMightThrow && !CGF.CGM.getLangOpts().AssumeNothrowExceptionDtor);
4819 CGF.CGM.getContext().getCanonicalType(CatchParam.getType());
4844 CGF.CGM.getTargetCodeGenInfo().getSizeOfUnwindException();
4934 CharUnits caughtExnAlignment = CGF.CGM.getClassPointerAlignment(catchRD);
4954 CGF.EmitNounwindRuntimeCall(getGetExceptionPtrFn(CGF.CGM), Exn);
5030 static llvm::FunctionCallee getClangCallTerminateFn(CodeGenModule &CGM) {
5031 ASTContext &C = CGM.getContext();
5032 const CGFunctionInfo &FI = CGM.getTypes().arrangeBuiltinFunctionDeclaration(
5034 llvm::FunctionType *fnTy = CGM.getTypes().GetFunctionType(FI);
5035 llvm::FunctionCallee fnRef = CGM.CreateRuntimeFunction(
5040 CGM.SetLLVMFunctionAttributes(GlobalDecl(), FI, fn, /*IsThunk=*/false);
5041 CGM.SetLLVMFunctionAttributesForDefinition(nullptr, fn);
5054 if (CGM.supportsCOMDAT())
5055 fn->setComdat(CGM.getModule().getOrInsertComdat(fn->getName()));
5059 llvm::BasicBlock::Create(CGM.getLLVMContext(), "", fn);
5060 CGBuilderTy builder(CGM, entry);
5066 llvm::CallInst *catchCall = builder.CreateCall(getBeginCatchFn(CGM), exn);
5068 catchCall->setCallingConv(CGM.getRuntimeCC());
5071 llvm::CallInst *termCall = builder.CreateCall(CGM.getTerminateFn());
5074 termCall->setCallingConv(CGM.getRuntimeCC());
5087 assert(CGF.CGM.getLangOpts().CPlusPlus);
5088 return CGF.EmitNounwindRuntimeCall(getClangCallTerminateFn(CGF.CGM), Exn);
5090 return CGF.EmitNounwindRuntimeCall(CGF.CGM.getTerminateFn());
5096 return {CGF.GetVTablePtr(This, CGM.Int8PtrTy, RD), RD};
5102 cast<CXXMethodDecl>(CGM.getItaniumVTableContext()
5106 QualType funcType = CGM.getContext().getMemberPointerType(
5108 return CGM.getMemberFunctionPointer(thunk, funcType);
5140 llvm::FunctionType::get(CGM.IntTy, {CGM.IntTy, PtrTy}, true);
5144 CGM.CreateRuntimeFunction(AtExitTy, "__pt_atexit_np");
5151 llvm::Value *NV = llvm::Constant::getNullValue(CGM.IntTy);
5172 llvm::FunctionType *FTy = llvm::FunctionType::get(CGM.VoidTy, false);
5180 const CGFunctionInfo &FI = CGM.getTypes().arrangeNullaryFunction();
5181 llvm::Function *StermFinalizer = CGM.CreateGlobalInitOrCleanUpFunction(
5184 CodeGenFunction CGF(CGM);
5186 CGF.StartFunction(GlobalDecl(), CGM.getContext().VoidTy, StermFinalizer, FI,
5218 CGM.AddCXXPrioritizedStermFinalizerEntry(StermFinalizer,
5226 CGM.AddCXXStermFinalizerToGlobalDtor(StermFinalizer, 65535);
5228 CGM.AddCXXStermFinalizerEntry(StermFinalizer);