1212795Sdim//===----- CXXABI.h - Interface to C++ ABIs ---------------------*- C++ -*-===// 2212795Sdim// 3212795Sdim// The LLVM Compiler Infrastructure 4212795Sdim// 5212795Sdim// This file is distributed under the University of Illinois Open Source 6212795Sdim// License. See LICENSE.TXT for details. 7212795Sdim// 8212795Sdim//===----------------------------------------------------------------------===// 9212795Sdim// 10212795Sdim// This provides an abstract class for C++ AST support. Concrete 11212795Sdim// subclasses of this implement AST support for specific C++ ABIs. 12212795Sdim// 13212795Sdim//===----------------------------------------------------------------------===// 14212795Sdim 15212795Sdim#ifndef LLVM_CLANG_AST_CXXABI_H 16212795Sdim#define LLVM_CLANG_AST_CXXABI_H 17212795Sdim 18218893Sdim#include "clang/AST/Type.h" 19218893Sdim 20212795Sdimnamespace clang { 21212795Sdim 22212795Sdimclass ASTContext; 23212795Sdimclass MemberPointerType; 24263508Sdimclass MangleNumberingContext; 25212795Sdim 26212795Sdim/// Implements C++ ABI-specific semantic analysis functions. 27212795Sdimclass CXXABI { 28212795Sdimpublic: 29212795Sdim virtual ~CXXABI(); 30212795Sdim 31249423Sdim /// Returns the width and alignment of a member pointer in bits. 32249423Sdim virtual std::pair<uint64_t, unsigned> 33249423Sdim getMemberPointerWidthAndAlign(const MemberPointerType *MPT) const = 0; 34218893Sdim 35218893Sdim /// Returns the default calling convention for C++ methods. 36239462Sdim virtual CallingConv getDefaultMethodCallConv(bool isVariadic) const = 0; 37218893Sdim 38263508Sdim /// Returns whether the given class is nearly empty, with just virtual 39263508Sdim /// pointers and no data except possibly virtual bases. 40218893Sdim virtual bool isNearlyEmpty(const CXXRecordDecl *RD) const = 0; 41263508Sdim 42263508Sdim /// Returns a new mangling number context for this C++ ABI. 43263508Sdim virtual MangleNumberingContext *createMangleNumberingContext() const = 0; 44212795Sdim}; 45212795Sdim 46212795Sdim/// Creates an instance of a C++ ABI class. 47212795SdimCXXABI *CreateARMCXXABI(ASTContext &Ctx); 48212795SdimCXXABI *CreateItaniumCXXABI(ASTContext &Ctx); 49212795SdimCXXABI *CreateMicrosoftCXXABI(ASTContext &Ctx); 50212795Sdim} 51212795Sdim 52212795Sdim#endif 53