#include "CXXABI.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/RecordLayout.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/Type.h"
#include "clang/Basic/TargetInfo.h"
using namespace clang;
namespace {
class ItaniumCXXABI : public CXXABI {
protected:
ASTContext &Context;
public:
ItaniumCXXABI(ASTContext &Ctx) : Context(Ctx) { }
unsigned getMemberPointerSize(const MemberPointerType *MPT) const {
QualType Pointee = MPT->getPointeeType();
if (Pointee->isFunctionType()) return 2;
return 1;
}
CallingConv getDefaultMethodCallConv(bool isVariadic) const {
return CC_C;
}
bool isNearlyEmpty(const CXXRecordDecl *RD) const {
if (!RD->isDynamicClass())
return false;
const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD);
CharUnits PointerSize =
Context.toCharUnitsFromBits(Context.getTargetInfo().getPointerWidth(0));
return Layout.getNonVirtualSize() == PointerSize;
}
};
class ARMCXXABI : public ItaniumCXXABI {
public:
ARMCXXABI(ASTContext &Ctx) : ItaniumCXXABI(Ctx) { }
};
}
CXXABI *clang::CreateItaniumCXXABI(ASTContext &Ctx) {
return new ItaniumCXXABI(Ctx);
}
CXXABI *clang::CreateARMCXXABI(ASTContext &Ctx) {
return new ARMCXXABI(Ctx);
}