CXXABI.h revision 1.1.1.2
1//===----- CXXABI.h - Interface to C++ ABIs ---------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This provides an abstract class for C++ AST support. Concrete
10// subclasses of this implement AST support for specific C++ ABIs.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_LIB_AST_CXXABI_H
15#define LLVM_CLANG_LIB_AST_CXXABI_H
16
17#include "clang/AST/Type.h"
18
19namespace clang {
20
21class ASTContext;
22class CXXConstructorDecl;
23class DeclaratorDecl;
24class Expr;
25class MangleContext;
26class MangleNumberingContext;
27class MemberPointerType;
28
29/// Implements C++ ABI-specific semantic analysis functions.
30class CXXABI {
31public:
32  virtual ~CXXABI();
33
34  struct MemberPointerInfo {
35    uint64_t Width;
36    unsigned Align;
37    bool HasPadding;
38  };
39
40  /// Returns the width and alignment of a member pointer in bits, as well as
41  /// whether it has padding.
42  virtual MemberPointerInfo
43  getMemberPointerInfo(const MemberPointerType *MPT) const = 0;
44
45  /// Returns the default calling convention for C++ methods.
46  virtual CallingConv getDefaultMethodCallConv(bool isVariadic) const = 0;
47
48  /// Returns whether the given class is nearly empty, with just virtual
49  /// pointers and no data except possibly virtual bases.
50  virtual bool isNearlyEmpty(const CXXRecordDecl *RD) const = 0;
51
52  /// Returns a new mangling number context for this C++ ABI.
53  virtual std::unique_ptr<MangleNumberingContext>
54  createMangleNumberingContext() const = 0;
55
56  /// Adds a mapping from class to copy constructor for this C++ ABI.
57  virtual void addCopyConstructorForExceptionObject(CXXRecordDecl *,
58                                                    CXXConstructorDecl *) = 0;
59
60  /// Retrieves the mapping from class to copy constructor for this C++ ABI.
61  virtual const CXXConstructorDecl *
62  getCopyConstructorForExceptionObject(CXXRecordDecl *) = 0;
63
64  virtual void addTypedefNameForUnnamedTagDecl(TagDecl *TD,
65                                               TypedefNameDecl *DD) = 0;
66
67  virtual TypedefNameDecl *
68  getTypedefNameForUnnamedTagDecl(const TagDecl *TD) = 0;
69
70  virtual void addDeclaratorForUnnamedTagDecl(TagDecl *TD,
71                                              DeclaratorDecl *DD) = 0;
72
73  virtual DeclaratorDecl *getDeclaratorForUnnamedTagDecl(const TagDecl *TD) = 0;
74};
75
76/// Creates an instance of a C++ ABI class.
77CXXABI *CreateItaniumCXXABI(ASTContext &Ctx);
78CXXABI *CreateMicrosoftCXXABI(ASTContext &Ctx);
79std::unique_ptr<MangleNumberingContext>
80createItaniumNumberingContext(MangleContext *);
81}
82
83#endif
84