15 #ifndef LLVM_CLANG_LIB_CODEGEN_CGCXXABI_H
16 #define LLVM_CLANG_LIB_CODEGEN_CGCXXABI_H
30 class CXXConstructorDecl;
31 class CXXDestructorDecl;
38 class CodeGenFunction;
52 return CGF.CXXABIThisDecl;
55 return CGF.CXXABIThisValue;
65 return CGF.CXXStructorImplicitParamDecl;
68 return CGF.CXXStructorImplicitParamValue;
156 llvm::Constant *Src);
223 virtual llvm::CallInst *
228 virtual llvm::Constant *
236 llvm::Type *StdTypeInfoPtrTy) = 0;
244 QualType DestRecordTy, llvm::BasicBlock *CastEnd) = 0;
339 bool ForVirtualBase,
bool Delegating,
352 const CXXRecordDecl *NearestVBase,
bool &NeedsVirtualOffset) = 0;
356 virtual llvm::Constant *
491 llvm::GlobalVariable *DeclPtr,
492 bool PerformInit) = 0;
500 llvm::Constant *Dtor,
501 llvm::Constant *Addr) = 0;
516 ArrayRef<std::pair<const VarDecl *, llvm::GlobalVariable *>>
virtual llvm::Value * adjustThisParameterInVirtualFunctionPrologue(CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This)
virtual void EmitBadTypeidCall(CodeGenFunction &CGF)=0
virtual llvm::Constant * EmitMemberPointer(const APValue &MP, QualType MPT)
Create a member pointer for the given member pointer constant.
virtual llvm::Value * EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy, llvm::Value *ThisPtr, llvm::Type *StdTypeInfoPtrTy)=0
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
virtual void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E)=0
virtual llvm::Value * readArrayCookieImpl(CodeGenFunction &IGF, llvm::Value *ptr, CharUnits cookieSize)
virtual void EmitReturnFromThunk(CodeGenFunction &CGF, RValue RV, QualType ResultType)
virtual void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy, FunctionArgList &Params)=0
virtual bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy)=0
virtual bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr, QualType SrcRecordTy)=0
virtual StringRef GetDeletedVirtualCallName()=0
Gets the deleted virtual member call name.
ImplicitParamDecl *& getThisDecl(CodeGenFunction &CGF)
Represents a C++ constructor within a class.
virtual llvm::Value * performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This, const ThisAdjustment &TA)=0
llvm::Value *& getStructorImplicitParamValue(CodeGenFunction &CGF)
virtual llvm::BasicBlock * EmitCtorCompleteObjectHandler(CodeGenFunction &CGF, const CXXRecordDecl *RD)
virtual void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, llvm::Value *Ptr, QualType ElementType, const CXXDestructorDecl *Dtor)=0
A this pointer adjustment.
A C++ throw-expression (C++ [except.throw]).
virtual llvm::Value * performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret, const ReturnAdjustment &RA)=0
void EmitThisParam(CodeGenFunction &CGF)
virtual bool hasMostDerivedReturn(GlobalDecl GD) const
virtual bool requiresArrayCookie(const CXXDeleteExpr *E, QualType eltType)
virtual llvm::Constant * getVTableAddressPointForConstExpr(BaseSubobject Base, const CXXRecordDecl *VTableClass)=0
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
virtual llvm::Value * getVTableAddressPointInStructor(CodeGenFunction &CGF, const CXXRecordDecl *RD, BaseSubobject Base, const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset)=0
virtual void EmitInstanceFunctionProlog(CodeGenFunction &CGF)=0
Emit the ABI-specific prolog for the function.
virtual void emitVTableDefinitions(CodeGenVTables &CGVT, const CXXRecordDecl *RD)=0
Emits the VTable definitions required for the given record type.
virtual bool isTypeInfoCalculable(QualType Ty) const
virtual llvm::Value * getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This, llvm::Type *Ty, SourceLocation Loc)=0
Build a virtual function pointer in the ABI-specific way.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
const CXXRecordDecl * getParent() const
virtual llvm::Value * EmitMemberPointerIsNotNull(CodeGenFunction &CGF, llvm::Value *MemPtr, const MemberPointerType *MPT)
Determine if a member pointer is non-null. Returns an i1.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Def If non-NULL, and the type refers to some kind of declaration that can be completed (such as a C s...
virtual llvm::Type * ConvertMemberPointerType(const MemberPointerType *MPT)
virtual bool isZeroInitializable(const MemberPointerType *MPT)
virtual bool isSRetParameterAfterThis() const
virtual CharUnits GetArrayCookieSize(const CXXNewExpr *expr)
virtual LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD, QualType LValType)=0
virtual bool isMemberPointerConvertible(const MemberPointerType *MPT) const
Return whether or not a member pointers type is convertible to an IR type.
ImplicitParamDecl *& getStructorImplicitParamDecl(CodeGenFunction &CGF)
virtual void ReadArrayCookie(CodeGenFunction &CGF, llvm::Value *Ptr, const CXXDeleteExpr *expr, QualType ElementType, llvm::Value *&NumElements, llvm::Value *&AllocPtr, CharUnits &CookieSize)
CXXDtorType
C++ destructor types.
virtual void EmitCXXConstructors(const CXXConstructorDecl *D)=0
Emit constructor variants required by this ABI.
virtual llvm::Value * EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy, QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd)=0
virtual void EmitCXXDestructors(const CXXDestructorDecl *D)=0
Emit destructor variants required by this ABI.
virtual CharUnits getArrayCookieSizeImpl(QualType elementType)
virtual llvm::Constant * getAddrOfCXXCatchHandlerType(QualType Ty, QualType CatchHandlerType)=0
Represents a C++ destructor within a class.
CGCXXABI(CodeGenModule &CGM)
virtual StringRef GetPureVirtualCallName()=0
Gets the pure virtual member call function.
virtual void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D, llvm::GlobalVariable *DeclPtr, bool PerformInit)=0
virtual bool classifyReturnType(CGFunctionInfo &FI) const =0
virtual bool EmitBadCastCall(CodeGenFunction &CGF)=0
ASTContext & getContext() const
virtual void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, llvm::Constant *Dtor, llvm::Constant *Addr)=0
virtual llvm::Value * EmitVirtualDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType, llvm::Value *This, const CXXMemberCallExpr *CE)=0
Emit the ABI-specific virtual destructor call.
virtual llvm::Constant * EmitMemberFunctionPointer(const CXXMethodDecl *MD)
Create a member pointer for the given method.
virtual bool HasThisReturn(GlobalDecl GD) const
void ErrorUnsupportedABI(CodeGenFunction &CGF, StringRef S)
Issue a diagnostic about unsupported features in the ABI.
virtual void adjustCallArgsForDestructorThunk(CodeGenFunction &CGF, GlobalDecl GD, CallArgList &CallArgs)
virtual void EmitThreadLocalInitFuncs(CodeGenModule &CGM, ArrayRef< std::pair< const VarDecl *, llvm::GlobalVariable * >> CXXThreadLocals, ArrayRef< llvm::Function * > CXXThreadLocalInits, ArrayRef< llvm::GlobalVariable * > CXXThreadLocalInitVars)=0
Pass it as a pointer to temporary memory.
virtual unsigned addImplicitConstructorArgs(CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type, bool ForVirtualBase, bool Delegating, CallArgList &Args)=0
virtual void emitRethrow(CodeGenFunction &CGF, bool isNoReturn)=0
virtual llvm::Value * EmitMemberPointerConversion(CodeGenFunction &CGF, const CastExpr *E, llvm::Value *Src)
virtual bool NeedsVTTParameter(GlobalDecl GD)
Return whether the given global decl needs a VTT parameter.
Encodes a location in the source. The SourceManager can decode this to get at the full include stack...
bool canCopyArgument(const CXXRecordDecl *RD) const
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)"...
Represents a static or instance method of a struct/union/class.
virtual size_t getSrcArgforCopyCtor(const CXXConstructorDecl *, FunctionArgList &Args) const =0
virtual llvm::Value * EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, const Expr *E, llvm::Value *&This, llvm::Value *MemPtr, const MemberPointerType *MPT)
virtual llvm::Value * GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This, const CXXRecordDecl *ClassDecl, const CXXRecordDecl *BaseClassDecl)=0
virtual void emitVirtualInheritanceTables(const CXXRecordDecl *RD)=0
MangleContext & getMangleContext()
Gets the mangle context.
CGCXXABI * CreateMicrosoftCXXABI(CodeGenModule &CGM)
Creates a Microsoft-family ABI.
virtual llvm::Constant * EmitNullMemberPointer(const MemberPointerType *MPT)
Create a null member pointer of the given type.
CXXCtorType
C++ constructor types.
llvm::Constant * getMemberPointerAdjustment(const CastExpr *E)
virtual llvm::Value * EmitMemberPointerComparison(CodeGenFunction &CGF, llvm::Value *L, llvm::Value *R, const MemberPointerType *MPT, bool Inequality)
Emit a comparison between two member pointers. Returns an i1.
Represents a delete expression for memory deallocation and destructor calls, e.g. "delete[] pArray"...
virtual llvm::GlobalVariable * getAddrOfVTable(const CXXRecordDecl *RD, CharUnits VPtrOffset)=0
virtual void buildStructorSignature(const CXXMethodDecl *MD, StructorType T, SmallVectorImpl< CanQualType > &ArgTys)=0
virtual void emitCXXStructor(const CXXMethodDecl *MD, StructorType Type)=0
void buildThisParam(CodeGenFunction &CGF, FunctionArgList &Params)
Build a parameter variable suitable for 'this'.
std::unique_ptr< MangleContext > MangleCtx
virtual void initializeHiddenVirtualInheritanceMembers(CodeGenFunction &CGF, const CXXRecordDecl *RD)
virtual llvm::Value * EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr, const MemberPointerType *MPT)
Calculate an l-value from an object and a data member pointer.
virtual llvm::Constant * getAddrOfRTTIDescriptor(QualType Ty)=0
Implements C++ ABI-specific code generation functions.
virtual bool usesThreadWrapperFunction() const =0
ASTContext & getContext() const
virtual llvm::Constant * EmitMemberDataPointer(const MemberPointerType *MPT, CharUnits offset)
Create a member pointer for the given field.
virtual void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD, CXXDtorType Type, bool ForVirtualBase, bool Delegating, llvm::Value *This)=0
Emit the destructor call.
Represents a C++ struct/union/class.
CGCXXABI * CreateItaniumCXXABI(CodeGenModule &CGM)
Creates an Itanium-family ABI.
virtual const CXXRecordDecl * getThisArgumentTypeForMethod(const CXXMethodDecl *MD)
virtual RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const =0
Returns how an argument of the given record type should be passed.
virtual llvm::Value * adjustThisArgumentForVirtualFunctionCall(CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This, bool VirtualCall)
virtual llvm::CallInst * emitTerminateForUnexpectedException(CodeGenFunction &CGF, llvm::Value *Exn)
virtual bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor, CXXDtorType DT) const =0
virtual void emitBeginCatch(CodeGenFunction &CGF, const CXXCatchStmt *C)=0
virtual llvm::GlobalVariable * getThrowInfo(QualType T)
virtual llvm::Value * EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy, QualType DestTy)=0
virtual llvm::Value * InitializeArrayCookie(CodeGenFunction &CGF, llvm::Value *NewPtr, llvm::Value *NumElements, const CXXNewExpr *expr, QualType ElementType)
RecordArgABI
Specify how one should pass an argument of a record type.
virtual void setThunkLinkage(llvm::Function *Thunk, bool ForVTable, GlobalDecl GD, bool ReturnAdjustment)=0
llvm::Value *& getThisValue(CodeGenFunction &CGF)
llvm::Constant * GetBogusMemberPointer(QualType T)
Get a null value for unsupported member pointers.
CharUnits getMemberPointerPathAdjustment(const APValue &MP)
Computes the non-virtual adjustment needed for a member pointer conversion along an inheritance path ...