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