1*67e74705SXin Li //===----- CXXABI.h - Interface to C++ ABIs ---------------------*- C++ -*-===// 2*67e74705SXin Li // 3*67e74705SXin Li // The LLVM Compiler Infrastructure 4*67e74705SXin Li // 5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source 6*67e74705SXin Li // License. See LICENSE.TXT for details. 7*67e74705SXin Li // 8*67e74705SXin Li //===----------------------------------------------------------------------===// 9*67e74705SXin Li // 10*67e74705SXin Li // This provides an abstract class for C++ AST support. Concrete 11*67e74705SXin Li // subclasses of this implement AST support for specific C++ ABIs. 12*67e74705SXin Li // 13*67e74705SXin Li //===----------------------------------------------------------------------===// 14*67e74705SXin Li 15*67e74705SXin Li #ifndef LLVM_CLANG_LIB_AST_CXXABI_H 16*67e74705SXin Li #define LLVM_CLANG_LIB_AST_CXXABI_H 17*67e74705SXin Li 18*67e74705SXin Li #include "clang/AST/Type.h" 19*67e74705SXin Li 20*67e74705SXin Li namespace clang { 21*67e74705SXin Li 22*67e74705SXin Li class ASTContext; 23*67e74705SXin Li class CXXConstructorDecl; 24*67e74705SXin Li class DeclaratorDecl; 25*67e74705SXin Li class Expr; 26*67e74705SXin Li class MemberPointerType; 27*67e74705SXin Li class MangleNumberingContext; 28*67e74705SXin Li 29*67e74705SXin Li /// Implements C++ ABI-specific semantic analysis functions. 30*67e74705SXin Li class CXXABI { 31*67e74705SXin Li public: 32*67e74705SXin Li virtual ~CXXABI(); 33*67e74705SXin Li 34*67e74705SXin Li /// Returns the width and alignment of a member pointer in bits. 35*67e74705SXin Li virtual std::pair<uint64_t, unsigned> 36*67e74705SXin Li getMemberPointerWidthAndAlign(const MemberPointerType *MPT) const = 0; 37*67e74705SXin Li 38*67e74705SXin Li /// Returns the default calling convention for C++ methods. 39*67e74705SXin Li virtual CallingConv getDefaultMethodCallConv(bool isVariadic) const = 0; 40*67e74705SXin Li 41*67e74705SXin Li /// Returns whether the given class is nearly empty, with just virtual 42*67e74705SXin Li /// pointers and no data except possibly virtual bases. 43*67e74705SXin Li virtual bool isNearlyEmpty(const CXXRecordDecl *RD) const = 0; 44*67e74705SXin Li 45*67e74705SXin Li /// Returns a new mangling number context for this C++ ABI. 46*67e74705SXin Li virtual MangleNumberingContext *createMangleNumberingContext() const = 0; 47*67e74705SXin Li 48*67e74705SXin Li /// Adds a mapping from class to copy constructor for this C++ ABI. 49*67e74705SXin Li virtual void addCopyConstructorForExceptionObject(CXXRecordDecl *, 50*67e74705SXin Li CXXConstructorDecl *) = 0; 51*67e74705SXin Li 52*67e74705SXin Li /// Retrieves the mapping from class to copy constructor for this C++ ABI. 53*67e74705SXin Li virtual const CXXConstructorDecl * 54*67e74705SXin Li getCopyConstructorForExceptionObject(CXXRecordDecl *) = 0; 55*67e74705SXin Li 56*67e74705SXin Li virtual void addDefaultArgExprForConstructor(const CXXConstructorDecl *CD, 57*67e74705SXin Li unsigned ParmIdx, Expr *DAE) = 0; 58*67e74705SXin Li 59*67e74705SXin Li virtual Expr *getDefaultArgExprForConstructor(const CXXConstructorDecl *CD, 60*67e74705SXin Li unsigned ParmIdx) = 0; 61*67e74705SXin Li 62*67e74705SXin Li virtual void addTypedefNameForUnnamedTagDecl(TagDecl *TD, 63*67e74705SXin Li TypedefNameDecl *DD) = 0; 64*67e74705SXin Li 65*67e74705SXin Li virtual TypedefNameDecl * 66*67e74705SXin Li getTypedefNameForUnnamedTagDecl(const TagDecl *TD) = 0; 67*67e74705SXin Li 68*67e74705SXin Li virtual void addDeclaratorForUnnamedTagDecl(TagDecl *TD, 69*67e74705SXin Li DeclaratorDecl *DD) = 0; 70*67e74705SXin Li 71*67e74705SXin Li virtual DeclaratorDecl *getDeclaratorForUnnamedTagDecl(const TagDecl *TD) = 0; 72*67e74705SXin Li }; 73*67e74705SXin Li 74*67e74705SXin Li /// Creates an instance of a C++ ABI class. 75*67e74705SXin Li CXXABI *CreateItaniumCXXABI(ASTContext &Ctx); 76*67e74705SXin Li CXXABI *CreateMicrosoftCXXABI(ASTContext &Ctx); 77*67e74705SXin Li } 78*67e74705SXin Li 79*67e74705SXin Li #endif 80