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