1071cc7deffad608165b1ddd5263e8bf181861520Charles Davis//===------- ItaniumCXXABI.cpp - AST support for the Itanium C++ ABI ------===//
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//
10fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// This provides C++ AST support targeting the Itanium C++ ABI, which is
11071cc7deffad608165b1ddd5263e8bf181861520Charles Davis// documented at:
12071cc7deffad608165b1ddd5263e8bf181861520Charles Davis//  http://www.codesourcery.com/public/cxx-abi/abi.html
13071cc7deffad608165b1ddd5263e8bf181861520Charles Davis//  http://www.codesourcery.com/public/cxx-abi/abi-eh.html
14ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall//
15ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall// It also supports the closely-related ARM C++ ABI, documented at:
16ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall// http://infocenter.arm.com/help/topic/com.arm.doc.ihi0041c/IHI0041C_cppabi.pdf
17ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall//
18071cc7deffad608165b1ddd5263e8bf181861520Charles Davis//===----------------------------------------------------------------------===//
19071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
20071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#include "CXXABI.h"
21071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#include "clang/AST/ASTContext.h"
22dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson#include "clang/AST/RecordLayout.h"
23dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson#include "clang/AST/DeclCXX.h"
24071cc7deffad608165b1ddd5263e8bf181861520Charles Davis#include "clang/AST/Type.h"
25dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson#include "clang/Basic/TargetInfo.h"
26071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
27071cc7deffad608165b1ddd5263e8bf181861520Charles Davisusing namespace clang;
28071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
29071cc7deffad608165b1ddd5263e8bf181861520Charles Davisnamespace {
30071cc7deffad608165b1ddd5263e8bf181861520Charles Davisclass ItaniumCXXABI : public CXXABI {
31ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCallprotected:
32071cc7deffad608165b1ddd5263e8bf181861520Charles Davis  ASTContext &Context;
33071cc7deffad608165b1ddd5263e8bf181861520Charles Davispublic:
34071cc7deffad608165b1ddd5263e8bf181861520Charles Davis  ItaniumCXXABI(ASTContext &Ctx) : Context(Ctx) { }
35071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
36071cc7deffad608165b1ddd5263e8bf181861520Charles Davis  unsigned getMemberPointerSize(const MemberPointerType *MPT) const {
37071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    QualType Pointee = MPT->getPointeeType();
38071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    if (Pointee->isFunctionType()) return 2;
39071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    return 1;
40071cc7deffad608165b1ddd5263e8bf181861520Charles Davis  }
41424ae9882e8a6eecc9dfe7c2d8623e72b2563873Charles Davis
42424ae9882e8a6eecc9dfe7c2d8623e72b2563873Charles Davis  CallingConv getDefaultMethodCallConv() const {
43424ae9882e8a6eecc9dfe7c2d8623e72b2563873Charles Davis    return CC_C;
44424ae9882e8a6eecc9dfe7c2d8623e72b2563873Charles Davis  }
45dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson
46dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  // We cheat and just check that the class has a vtable pointer, and that it's
47dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  // only big enough to have a vtable pointer and nothing more (or less).
48dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  bool isNearlyEmpty(const CXXRecordDecl *RD) const {
49dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson
50dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson    // Check that the class has a vtable pointer.
51dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson    if (!RD->isDynamicClass())
52dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson      return false;
53dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson
54dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson    const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
555c3633fa57f27b0909ab5767715c4e66b8920165Ken Dyck    CharUnits PointerSize =
56bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor      Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
575c3633fa57f27b0909ab5767715c4e66b8920165Ken Dyck    return Layout.getNonVirtualSize() == PointerSize;
58dae0cb52e4e3d46bbfc9a4510909522197a92e54Anders Carlsson  }
59071cc7deffad608165b1ddd5263e8bf181861520Charles Davis};
60ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall
61ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCallclass ARMCXXABI : public ItaniumCXXABI {
62ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCallpublic:
63ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall  ARMCXXABI(ASTContext &Ctx) : ItaniumCXXABI(Ctx) { }
64ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall};
65071cc7deffad608165b1ddd5263e8bf181861520Charles Davis}
66071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
67071cc7deffad608165b1ddd5263e8bf181861520Charles DavisCXXABI *clang::CreateItaniumCXXABI(ASTContext &Ctx) {
68071cc7deffad608165b1ddd5263e8bf181861520Charles Davis  return new ItaniumCXXABI(Ctx);
69071cc7deffad608165b1ddd5263e8bf181861520Charles Davis}
70071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
71ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCallCXXABI *clang::CreateARMCXXABI(ASTContext &Ctx) {
72ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall  return new ARMCXXABI(Ctx);
73ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall}
74