clang 22.0.0git
ItaniumCXXABI.cpp File Reference
#include "CGCXXABI.h"
#include "CGCleanup.h"
#include "CGDebugInfo.h"
#include "CGRecordLayout.h"
#include "CGVTables.h"
#include "CodeGenFunction.h"
#include "CodeGenModule.h"
#include "TargetInfo.h"
#include "clang/AST/Attr.h"
#include "clang/AST/Mangle.h"
#include "clang/AST/StmtCXX.h"
#include "clang/AST/Type.h"
#include "clang/CodeGen/ConstantInitBuilder.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/ScopedPrinter.h"
#include <optional>
#include "clang/Basic/OpenCLImageTypes.def"
#include "clang/Basic/OpenCLExtensionTypes.def"
#include "clang/Basic/AArch64ACLETypes.def"
#include "clang/Basic/PPCTypes.def"
#include "clang/Basic/RISCVVTypes.def"
#include "clang/Basic/WebAssemblyReferenceTypes.def"
#include "clang/Basic/AMDGPUTypes.def"
#include "clang/Basic/HLSLIntangibleTypes.def"
#include "clang/AST/BuiltinTypes.def"
#include "clang/AST/TypeNodes.inc"

Go to the source code of this file.

Macros

#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext)
#define SVE_TYPE(Name, Id, SingletonId)
#define PPC_VECTOR_TYPE(Name, Id, Size)
#define RVV_TYPE(Name, Id, SingletonId)
#define WASM_TYPE(Name, Id, SingletonId)
#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align)
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)
#define BUILTIN_TYPE(Id, SingletonId)
#define PLACEHOLDER_TYPE(Id, SingletonId)
#define TYPE(Class, Base)
#define ABSTRACT_TYPE(Class, Base)
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
#define NON_CANONICAL_TYPE(Class, Base)
#define DEPENDENT_TYPE(Class, Base)
#define TYPE(Class, Base)
#define ABSTRACT_TYPE(Class, Base)
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
#define NON_CANONICAL_TYPE(Class, Base)
#define DEPENDENT_TYPE(Class, Base)

Functions

static llvm::Constant * pointerAuthResignConstant (llvm::Value *Ptr, const CGPointerAuthInfo &CurAuthInfo, const CGPointerAuthInfo &NewAuthInfo, CodeGenModule &CGM)
static llvm::Constant * pointerAuthResignMemberFunctionPointer (llvm::Constant *Src, QualType DestType, QualType SrcType, CodeGenModule &CGM)
static llvm::FunctionCallee getAllocateExceptionFn (CodeGenModule &CGM)
static llvm::FunctionCallee getThrowFn (CodeGenModule &CGM)
static llvm::FunctionCallee getItaniumDynamicCastFn (CodeGenFunction &CGF)
static llvm::FunctionCallee getBadCastFn (CodeGenFunction &CGF)
static CharUnits computeOffsetHint (ASTContext &Context, const CXXRecordDecl *Src, const CXXRecordDecl *Dst)
 Compute the src2dst_offset hint as described in the Itanium C++ ABI [2.9.7].
static llvm::FunctionCallee getBadTypeidFn (CodeGenFunction &CGF)
template<typename T>
static bool CXXRecordNonInlineHasAttr (const CXXRecordDecl *RD)
static void setVTableSelectiveDLLImportExport (CodeGenModule &CGM, llvm::GlobalVariable *VTable, const CXXRecordDecl *RD)
static llvm::ValueperformTypeAdjustment (CodeGenFunction &CGF, Address InitialPtr, const CXXRecordDecl *UnadjustedClass, int64_t NonVirtualAdjustment, int64_t VirtualAdjustment, bool IsReturnAdjustment)
static llvm::FunctionCallee getGuardAcquireFn (CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
static llvm::FunctionCallee getGuardReleaseFn (CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
static llvm::FunctionCallee getGuardAbortFn (CodeGenModule &CGM, llvm::PointerType *GuardPtrTy)
static void emitGlobalDtorWithCXAAtExit (CodeGenFunction &CGF, llvm::FunctionCallee dtor, llvm::Constant *addr, bool TLS)
 Register a global destructor using __cxa_atexit.
static llvm::Function * createGlobalInitOrCleanupFn (CodeGen::CodeGenModule &CGM, StringRef FnName)
static bool isThreadWrapperReplaceable (const VarDecl *VD, CodeGen::CodeGenModule &CGM)
static llvm::GlobalValue::LinkageTypes getThreadLocalWrapperLinkage (const VarDecl *VD, CodeGen::CodeGenModule &CGM)
 Get the appropriate linkage for the wrapper function.
static bool TypeInfoIsInStandardLibrary (const BuiltinType *Ty)
 TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type info for that type is defined in the standard library.
static bool TypeInfoIsInStandardLibrary (const PointerType *PointerTy)
static bool IsStandardLibraryRTTIDescriptor (QualType Ty)
 IsStandardLibraryRTTIDescriptor - Returns whether the type information for the given type exists in the standard library.
static bool ShouldUseExternalRTTIDescriptor (CodeGenModule &CGM, QualType Ty)
 ShouldUseExternalRTTIDescriptor - Returns whether the type information for the given type exists somewhere else, and that we should not emit the type information in this translation unit.
static bool IsIncompleteClassType (const RecordType *RecordTy)
 IsIncompleteClassType - Returns whether the given record type is incomplete.
static bool ContainsIncompleteClassType (QualType Ty)
 ContainsIncompleteClassType - Returns whether the given type contains an incomplete class type.
static bool CanUseSingleInheritance (const CXXRecordDecl *RD)
static llvm::GlobalVariable::LinkageTypes getTypeInfoLinkage (CodeGenModule &CGM, QualType Ty)
 Return the linkage that the type info and type info name constants should have for the given type.
static unsigned ComputeVMIClassTypeInfoFlags (const CXXBaseSpecifier *Base, SeenBases &Bases)
 ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in abi::__vmi_class_type_info.
static unsigned ComputeVMIClassTypeInfoFlags (const CXXRecordDecl *RD)
static unsigned extractPBaseFlags (ASTContext &Ctx, QualType &Type)
 Compute the flags for a __pbase_type_info, and remove the corresponding pieces from Type.
static StructorCodegen getCodegenToUse (CodeGenModule &CGM, const CXXMethodDecl *MD)
static void emitConstructorDestructorAlias (CodeGenModule &CGM, GlobalDecl AliasDecl, GlobalDecl TargetDecl)
static llvm::FunctionCallee getBeginCatchFn (CodeGenModule &CGM)
static llvm::FunctionCallee getEndCatchFn (CodeGenModule &CGM)
static llvm::FunctionCallee getGetExceptionPtrFn (CodeGenModule &CGM)
static llvm::ValueCallBeginCatch (CodeGenFunction &CGF, llvm::Value *Exn, bool EndMightThrow)
 Emits a call to __cxa_begin_catch and enters a cleanup to call __cxa_end_catch.
static void InitCatchParam (CodeGenFunction &CGF, const VarDecl &CatchParam, Address ParamAddr, SourceLocation Loc)
 A "special initializer" callback for initializing a catch parameter during catch initialization.
static llvm::FunctionCallee getClangCallTerminateFn (CodeGenModule &CGM)
 Get or define the following function: void @__clang_call_terminate(i8* exn) nounwind noreturn This code is used only in C++.

Macro Definition Documentation

◆ ABSTRACT_TYPE [1/2]

#define ABSTRACT_TYPE ( Class,
Base )

◆ ABSTRACT_TYPE [2/2]

#define ABSTRACT_TYPE ( Class,
Base )

◆ AMDGPU_TYPE

#define AMDGPU_TYPE ( Name,
Id,
SingletonId,
Width,
Align )
Value:
case BuiltinType::Id:

◆ BUILTIN_TYPE

#define BUILTIN_TYPE ( Id,
SingletonId )

◆ DEPENDENT_TYPE [1/2]

#define DEPENDENT_TYPE ( Class,
Base )
Value:
case Type::Class:

◆ DEPENDENT_TYPE [2/2]

#define DEPENDENT_TYPE ( Class,
Base )
Value:
case Type::Class:

◆ EXT_OPAQUE_TYPE

#define EXT_OPAQUE_TYPE ( ExtType,
Id,
Ext )
Value:
case BuiltinType::Id:

◆ HLSL_INTANGIBLE_TYPE

#define HLSL_INTANGIBLE_TYPE ( Name,
Id,
SingletonId )
Value:
case BuiltinType::Id:

◆ IMAGE_TYPE

#define IMAGE_TYPE ( ImgType,
Id,
SingletonId,
Access,
Suffix )
Value:
case BuiltinType::Id:

◆ NON_CANONICAL_TYPE [1/2]

#define NON_CANONICAL_TYPE ( Class,
Base )
Value:
case Type::Class:

◆ NON_CANONICAL_TYPE [2/2]

#define NON_CANONICAL_TYPE ( Class,
Base )
Value:
case Type::Class:

◆ NON_CANONICAL_UNLESS_DEPENDENT_TYPE [1/2]

#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE ( Class,
Base )
Value:
case Type::Class:

◆ NON_CANONICAL_UNLESS_DEPENDENT_TYPE [2/2]

#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE ( Class,
Base )
Value:
case Type::Class:

◆ PLACEHOLDER_TYPE

#define PLACEHOLDER_TYPE ( Id,
SingletonId )
Value:
case BuiltinType::Id:

◆ PPC_VECTOR_TYPE

#define PPC_VECTOR_TYPE ( Name,
Id,
Size )
Value:
case BuiltinType::Id:

◆ RVV_TYPE

#define RVV_TYPE ( Name,
Id,
SingletonId )
Value:
case BuiltinType::Id:

◆ SVE_TYPE

#define SVE_TYPE ( Name,
Id,
SingletonId )
Value:
case BuiltinType::Id:

◆ TYPE [1/2]

#define TYPE ( Class,
Base )

◆ TYPE [2/2]

#define TYPE ( Class,
Base )

◆ WASM_TYPE

#define WASM_TYPE ( Name,
Id,
SingletonId )
Value:
case BuiltinType::Id:

Function Documentation

◆ CallBeginCatch()

llvm::Value * CallBeginCatch ( CodeGenFunction & CGF,
llvm::Value * Exn,
bool EndMightThrow )
static

Emits a call to __cxa_begin_catch and enters a cleanup to call __cxa_end_catch.

If -fassume-nothrow-exception-dtor is specified, we assume that the exception object's dtor is nothrow, therefore the __cxa_end_catch call can be marked as nounwind even if EndMightThrow is true.

Parameters
EndMightThrow- true if __cxa_end_catch might throw

Definition at line 4902 of file ItaniumCXXABI.cpp.

References clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::EHStack, clang::CodeGen::CodeGenFunction::EmitNounwindRuntimeCall(), getBeginCatchFn(), clang::CodeGen::CodeGenModule::getLangOpts(), and clang::CodeGen::NormalAndEHCleanup.

Referenced by InitCatchParam().

◆ CanUseSingleInheritance()

◆ computeOffsetHint()

CharUnits computeOffsetHint ( ASTContext & Context,
const CXXRecordDecl * Src,
const CXXRecordDecl * Dst )
static

Compute the src2dst_offset hint as described in the Itanium C++ ABI [2.9.7].

Definition at line 1543 of file ItaniumCXXABI.cpp.

References clang::AS_public, clang::CharUnits::fromQuantity(), clang::ASTRecordLayout::getBaseClassOffset(), and clang::CXXRecordDecl::isDerivedFrom().

◆ ComputeVMIClassTypeInfoFlags() [1/2]

unsigned ComputeVMIClassTypeInfoFlags ( const CXXBaseSpecifier * Base,
SeenBases & Bases )
static

ComputeVMIClassTypeInfoFlags - Compute the value of the flags member in abi::__vmi_class_type_info.

Definition at line 4425 of file ItaniumCXXABI.cpp.

References ComputeVMIClassTypeInfoFlags().

Referenced by ComputeVMIClassTypeInfoFlags(), and ComputeVMIClassTypeInfoFlags().

◆ ComputeVMIClassTypeInfoFlags() [2/2]

unsigned ComputeVMIClassTypeInfoFlags ( const CXXRecordDecl * RD)
static

◆ ContainsIncompleteClassType()

bool ContainsIncompleteClassType ( QualType Ty)
static

ContainsIncompleteClassType - Returns whether the given type contains an incomplete class type.

This is true if

  • The given type is an incomplete class type.
  • The given type is a pointer type whose pointee type contains an incomplete class type.
  • The given type is a member pointer type whose class is an incomplete class type.
  • The given type is a member pointer type whoise pointee type contains an incomplete class type. is an indirect or direct pointer to an incomplete class type.

Definition at line 3869 of file ItaniumCXXABI.cpp.

References ContainsIncompleteClassType(), and IsIncompleteClassType().

Referenced by ContainsIncompleteClassType(), extractPBaseFlags(), and getTypeInfoLinkage().

◆ createGlobalInitOrCleanupFn()

◆ CXXRecordNonInlineHasAttr()

◆ emitConstructorDestructorAlias()

◆ emitGlobalDtorWithCXAAtExit()

◆ extractPBaseFlags()

unsigned extractPBaseFlags ( ASTContext & Ctx,
QualType & Type )
static

Compute the flags for a __pbase_type_info, and remove the corresponding pieces from Type.

Definition at line 4559 of file ItaniumCXXABI.cpp.

References ContainsIncompleteClassType(), clang::EST_None, clang::Type::getAs(), and clang::ASTContext::getFunctionTypeWithExceptionSpec().

◆ getAllocateExceptionFn()

◆ getBadCastFn()

◆ getBadTypeidFn()

◆ getBeginCatchFn()

llvm::FunctionCallee getBeginCatchFn ( CodeGenModule & CGM)
static

◆ getClangCallTerminateFn()

◆ getCodegenToUse()

◆ getEndCatchFn()

llvm::FunctionCallee getEndCatchFn ( CodeGenModule & CGM)
static

◆ getGetExceptionPtrFn()

llvm::FunctionCallee getGetExceptionPtrFn ( CodeGenModule & CGM)
static

◆ getGuardAbortFn()

llvm::FunctionCallee getGuardAbortFn ( CodeGenModule & CGM,
llvm::PointerType * GuardPtrTy )
static

◆ getGuardAcquireFn()

◆ getGuardReleaseFn()

llvm::FunctionCallee getGuardReleaseFn ( CodeGenModule & CGM,
llvm::PointerType * GuardPtrTy )
static

◆ getItaniumDynamicCastFn()

◆ getThreadLocalWrapperLinkage()

llvm::GlobalValue::LinkageTypes getThreadLocalWrapperLinkage ( const VarDecl * VD,
CodeGen::CodeGenModule & CGM )
static

Get the appropriate linkage for the wrapper function.

This is essentially the weak form of the variable's linkage; every translation unit which needs the wrapper emits a copy, and we want the linker to merge them.

Definition at line 3122 of file ItaniumCXXABI.cpp.

References clang::CodeGen::CodeGenModule::getLLVMLinkageVarDefinition(), and isThreadWrapperReplaceable().

◆ getThrowFn()

◆ getTypeInfoLinkage()

◆ InitCatchParam()

void InitCatchParam ( CodeGenFunction & CGF,
const VarDecl & CatchParam,
Address ParamAddr,
SourceLocation Loc )
static

A "special initializer" callback for initializing a catch parameter during catch initialization.

Definition at line 4917 of file ItaniumCXXABI.cpp.

References clang::CodeGen::CodeGenFunction::Builder, CallBeginCatch(), clang::cast(), clang::CodeGen::CodeGenFunction::CGM, clang::CodeGen::CodeGenFunction::ConvertTypeForMem(), clang::CodeGen::CGBuilderTy::CreateStore(), clang::CodeGen::CodeGenFunction::CreateTempAlloca(), clang::CodeGen::AggValueSlot::DoesNotNeedGCBarriers, clang::CodeGen::AggValueSlot::DoesNotOverlap, clang::CodeGen::CodeGenFunction::EHStack, clang::CodeGen::CodeGenFunction::EmitAggExpr(), clang::CodeGen::CodeGenFunction::EmitAggregateCopy(), clang::CodeGen::CodeGenFunction::EmitARCInitWeak(), clang::CodeGen::CodeGenFunction::EmitARCRetainNonBlock(), clang::CodeGen::CodeGenFunction::EmitLoadOfComplex(), clang::CodeGen::CodeGenFunction::EmitLoadOfScalar(), clang::CodeGen::CodeGenFunction::EmitNounwindRuntimeCall(), clang::CodeGen::Address::emitRawPointer(), clang::CodeGen::CodeGenFunction::EmitStoreOfComplex(), clang::CodeGen::CodeGenFunction::EmitStoreOfScalar(), clang::OpaqueValueExpr::findInCopyConstruct(), clang::CodeGen::AggValueSlot::forAddr(), clang::ASTContext::getCanonicalType(), clang::CodeGen::CodeGenModule::getClassPointerAlignment(), clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenFunction::getEvaluationKind(), clang::CodeGen::CodeGenFunction::getExceptionFromSlot(), getGetExceptionPtrFn(), clang::VarDecl::getInit(), clang::Qualifiers::getObjCLifetime(), clang::Type::getPointeeType(), clang::CodeGen::CodeGenTypeCache::getPointerAlign(), clang::CanQual< T >::getQualifiers(), clang::CodeGen::TargetCodeGenInfo::getSizeOfUnwindException(), clang::CodeGen::CodeGenModule::getTargetCodeGenInfo(), clang::ValueDecl::getType(), clang::CodeGen::CodeGenTypeCache::Int8Ty, clang::isa(), clang::CodeGen::AggValueSlot::IsNotAliased, clang::CodeGen::AggValueSlot::IsNotDestructed, clang::Type::isRecordType(), clang::CodeGen::CodeGenFunction::MakeAddrLValue(), clang::CodeGen::CodeGenFunction::MakeNaturalAlignAddrLValue(), clang::Qualifiers::OCL_Autoreleasing, clang::Qualifiers::OCL_ExplicitNone, clang::Qualifiers::OCL_None, clang::Qualifiers::OCL_Strong, clang::Qualifiers::OCL_Weak, clang::CodeGen::CodeGenFunction::OpaqueValueMapping::pop(), clang::CodeGen::EHScopeStack::popTerminate(), clang::CodeGen::EHScopeStack::pushTerminate(), clang::CodeGen::TEK_Aggregate, clang::CodeGen::TEK_Complex, clang::CodeGen::TEK_Scalar, and clang::CodeGen::CodeGenTypeCache::UnqualPtrTy.

◆ IsIncompleteClassType()

bool IsIncompleteClassType ( const RecordType * RecordTy)
static

IsIncompleteClassType - Returns whether the given record type is incomplete.

Definition at line 3852 of file ItaniumCXXABI.cpp.

Referenced by ContainsIncompleteClassType().

◆ IsStandardLibraryRTTIDescriptor()

bool IsStandardLibraryRTTIDescriptor ( QualType Ty)
static

IsStandardLibraryRTTIDescriptor - Returns whether the type information for the given type exists in the standard library.

Definition at line 3792 of file ItaniumCXXABI.cpp.

References TypeInfoIsInStandardLibrary().

◆ isThreadWrapperReplaceable()

◆ performTypeAdjustment()

◆ pointerAuthResignConstant()

◆ pointerAuthResignMemberFunctionPointer()

llvm::Constant * pointerAuthResignMemberFunctionPointer ( llvm::Constant * Src,
QualType DestType,
QualType SrcType,
CodeGenModule & CGM )
static

◆ setVTableSelectiveDLLImportExport()

void setVTableSelectiveDLLImportExport ( CodeGenModule & CGM,
llvm::GlobalVariable * VTable,
const CXXRecordDecl * RD )
static

◆ ShouldUseExternalRTTIDescriptor()

bool ShouldUseExternalRTTIDescriptor ( CodeGenModule & CGM,
QualType Ty )
static

ShouldUseExternalRTTIDescriptor - Returns whether the type information for the given type exists somewhere else, and that we should not emit the type information in this translation unit.

Assumes that it is not a standard-library type.

Definition at line 3809 of file ItaniumCXXABI.cpp.

References clang::cast(), false, clang::CodeGen::CodeGenModule::getContext(), clang::CodeGen::CodeGenModule::getTarget(), clang::CodeGen::CodeGenModule::getTriple(), clang::CodeGen::CodeGenModule::getVTables(), clang::Decl::hasAttr(), clang::CXXRecordDecl::hasDefinition(), clang::TargetInfo::hasPS4DLLImportExport(), clang::CXXRecordDecl::isDynamicClass(), and clang::CodeGen::CodeGenVTables::isVTableExternal().

Referenced by getTypeInfoLinkage().

◆ TypeInfoIsInStandardLibrary() [1/2]

bool TypeInfoIsInStandardLibrary ( const BuiltinType * Ty)
static

TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type info for that type is defined in the standard library.

Definition at line 3659 of file ItaniumCXXABI.cpp.

References clang::BuiltinType::getKind().

Referenced by IsStandardLibraryRTTIDescriptor(), and TypeInfoIsInStandardLibrary().

◆ TypeInfoIsInStandardLibrary() [2/2]