//===----- 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
