From 32440a0f488fb1d8fb5ad468adc66a8ffc2afbe2 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sun, 17 May 2009 02:06:04 +0000 Subject: Use the Itanium ABI for member pointers. Add a missing 'break' statement and a test case llvm-svn: 71972 --- clang/lib/AST/ASTContext.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'clang/lib') diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index ccd3762da05..329d6c478d5 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -475,18 +475,18 @@ ASTContext::getTypeInfo(const Type *T) { // pointer size. return getTypeInfo(cast(T)->getPointeeType()); case Type::MemberPointer: { - // FIXME: This is not only platform- but also ABI-dependent. We follow - // the GCC ABI, where pointers to data are one pointer large, pointers to - // functions two pointers. But if we want to support ABI compatibility with - // other compilers too, we need to delegate this completely to TargetInfo - // or some ABI abstraction layer. + // FIXME: This is ABI dependent. We use the Itanium C++ ABI. + // http://www.codesourcery.com/public/cxx-abi/abi.html#member-pointers + // If we ever want to support other ABIs this needs to be abstracted. + QualType Pointee = cast(T)->getPointeeType(); - unsigned AS = Pointee.getAddressSpace(); - Width = Target.getPointerWidth(AS); + std::pair PtrDiffInfo = + getTypeInfo(getPointerDiffType()); + Width = PtrDiffInfo.first; if (Pointee->isFunctionType()) Width *= 2; - Align = Target.getPointerAlign(AS); - // GCC aligns at single pointer width. + Align = PtrDiffInfo.second; + break; } case Type::Complex: { // Complex types have the same alignment as their elements, but twice the -- cgit v1.2.3