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