xref: /aosp_15_r20/external/clang/lib/AST/CXXABI.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
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