|  | //===----- CXXABI.h - Interface to C++ ABIs ---------------------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This provides an abstract class for C++ AST support. Concrete | 
|  | // subclasses of this implement AST support for specific C++ ABIs. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_CLANG_LIB_AST_CXXABI_H | 
|  | #define LLVM_CLANG_LIB_AST_CXXABI_H | 
|  |  | 
|  | #include "clang/AST/Type.h" | 
|  |  | 
|  | namespace clang { | 
|  |  | 
|  | class ASTContext; | 
|  | class CXXConstructorDecl; | 
|  | class DeclaratorDecl; | 
|  | class Expr; | 
|  | class MemberPointerType; | 
|  | class MangleNumberingContext; | 
|  |  | 
|  | /// Implements C++ ABI-specific semantic analysis functions. | 
|  | class CXXABI { | 
|  | public: | 
|  | virtual ~CXXABI(); | 
|  |  | 
|  | struct MemberPointerInfo { | 
|  | uint64_t Width; | 
|  | unsigned Align; | 
|  | bool HasPadding; | 
|  | }; | 
|  |  | 
|  | /// Returns the width and alignment of a member pointer in bits, as well as | 
|  | /// whether it has padding. | 
|  | virtual MemberPointerInfo | 
|  | getMemberPointerInfo(const MemberPointerType *MPT) const = 0; | 
|  |  | 
|  | /// Returns the default calling convention for C++ methods. | 
|  | virtual CallingConv getDefaultMethodCallConv(bool isVariadic) const = 0; | 
|  |  | 
|  | /// Returns whether the given class is nearly empty, with just virtual | 
|  | /// pointers and no data except possibly virtual bases. | 
|  | virtual bool isNearlyEmpty(const CXXRecordDecl *RD) const = 0; | 
|  |  | 
|  | /// Returns a new mangling number context for this C++ ABI. | 
|  | virtual std::unique_ptr<MangleNumberingContext> | 
|  | createMangleNumberingContext() const = 0; | 
|  |  | 
|  | /// Adds a mapping from class to copy constructor for this C++ ABI. | 
|  | virtual void addCopyConstructorForExceptionObject(CXXRecordDecl *, | 
|  | CXXConstructorDecl *) = 0; | 
|  |  | 
|  | /// Retrieves the mapping from class to copy constructor for this C++ ABI. | 
|  | virtual const CXXConstructorDecl * | 
|  | getCopyConstructorForExceptionObject(CXXRecordDecl *) = 0; | 
|  |  | 
|  | virtual void addTypedefNameForUnnamedTagDecl(TagDecl *TD, | 
|  | TypedefNameDecl *DD) = 0; | 
|  |  | 
|  | virtual TypedefNameDecl * | 
|  | getTypedefNameForUnnamedTagDecl(const TagDecl *TD) = 0; | 
|  |  | 
|  | virtual void addDeclaratorForUnnamedTagDecl(TagDecl *TD, | 
|  | DeclaratorDecl *DD) = 0; | 
|  |  | 
|  | virtual DeclaratorDecl *getDeclaratorForUnnamedTagDecl(const TagDecl *TD) = 0; | 
|  | }; | 
|  |  | 
|  | /// Creates an instance of a C++ ABI class. | 
|  | CXXABI *CreateItaniumCXXABI(ASTContext &Ctx); | 
|  | CXXABI *CreateMicrosoftCXXABI(ASTContext &Ctx); | 
|  | } | 
|  |  | 
|  | #endif |