1071cc7deffad608165b1ddd5263e8bf181861520Charles Davis//===----- CXXABI.h - Interface to C++ ABIs ---------------------*- C++ -*-===// 2071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// 3071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// The LLVM Compiler Infrastructure 4071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// 5071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// This file is distributed under the University of Illinois Open Source 6071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// License. See LICENSE.TXT for details. 7071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// 8071cc7deffad608165b1ddd5263e8bf181861520Charles Davis//===----------------------------------------------------------------------===// 9071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// 10071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// This provides an abstract class for C++ AST support. Concrete 11071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// subclasses of this implement AST support for specific C++ ABIs. 12071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// 13071cc7deffad608165b1ddd5263e8bf181861520Charles Davis//===----------------------------------------------------------------------===// 14071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 15071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#ifndef LLVM_CLANG_AST_CXXABI_H 16071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#define LLVM_CLANG_AST_CXXABI_H 17071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 18424ae9882e8a6eecc9dfe7c2d8623e72b2563873Charles Davis#include "clang/AST/Type.h" 19424ae9882e8a6eecc9dfe7c2d8623e72b2563873Charles Davis 20071cc7deffad608165b1ddd5263e8bf181861520Charles Davisnamespace clang { 21071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 22071cc7deffad608165b1ddd5263e8bf181861520Charles Davisclass ASTContext; 23071cc7deffad608165b1ddd5263e8bf181861520Charles Davisclass MemberPointerType; 24942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Klecknerclass MangleNumberingContext; 25071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 26071cc7deffad608165b1ddd5263e8bf181861520Charles Davis/// Implements C++ ABI-specific semantic analysis functions. 27071cc7deffad608165b1ddd5263e8bf181861520Charles Davisclass CXXABI { 28071cc7deffad608165b1ddd5263e8bf181861520Charles Davispublic: 29071cc7deffad608165b1ddd5263e8bf181861520Charles Davis virtual ~CXXABI(); 30071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 3184e9ab44af3a16f66d62590505db2036ef0aa03bReid Kleckner /// Returns the width and alignment of a member pointer in bits. 3284e9ab44af3a16f66d62590505db2036ef0aa03bReid Kleckner virtual std::pair<uint64_t, unsigned> 3384e9ab44af3a16f66d62590505db2036ef0aa03bReid Kleckner getMemberPointerWidthAndAlign(const MemberPointerType *MPT) const = 0; 34424ae9882e8a6eecc9dfe7c2d8623e72b2563873Charles Davis 35424ae9882e8a6eecc9dfe7c2d8623e72b2563873Charles Davis /// Returns the default calling convention for C++ methods. 368f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov virtual CallingConv getDefaultMethodCallConv(bool isVariadic) const = 0; 37dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson 38942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner /// Returns whether the given class is nearly empty, with just virtual 39942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner /// pointers and no data except possibly virtual bases. 40dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson virtual bool isNearlyEmpty(const CXXRecordDecl *RD) const = 0; 41942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner 42942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner /// Returns a new mangling number context for this C++ ABI. 43942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner virtual MangleNumberingContext *createMangleNumberingContext() const = 0; 44071cc7deffad608165b1ddd5263e8bf181861520Charles Davis}; 45071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 46071cc7deffad608165b1ddd5263e8bf181861520Charles Davis/// Creates an instance of a C++ ABI class. 47071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *CreateItaniumCXXABI(ASTContext &Ctx); 48071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *CreateMicrosoftCXXABI(ASTContext &Ctx); 49071cc7deffad608165b1ddd5263e8bf181861520Charles Davis} 50071cc7deffad608165b1ddd5263e8bf181861520Charles Davis 51071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#endif 52