diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index e6a3c5a2..c4ecd312 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1067,6 +1067,25 @@ Cxxi::Enumeration^ Parser::WalkEnum(clang::EnumDecl* ED) //-----------------------------------// +clang::CallingConv Parser::GetAbiCallConv(clang::CallingConv CC, + bool IsInstMethod, + bool IsVariadic) +{ + using namespace clang; + + // TODO: Itanium ABI + + if (CC == CC_Default) { + if (IsInstMethod) { + CC = AST->getDefaultCXXMethodCallConv(IsVariadic); + } else { + CC = CC_C; + } + } + + return CC; +} + static Cxxi::CallingConvention ConvertCallConv(clang::CallingConv CC) { using namespace clang; @@ -1109,7 +1128,9 @@ void Parser::WalkFunction(clang::FunctionDecl* FD, Cxxi::Function^ F, F->Namespace = NS; F->IsVariadic = FD->isVariadic(); F->IsInline = FD->isInlined(); - F->CallingConvention = ConvertCallConv(CC); + + auto AbiCC = GetAbiCallConv(CC, FD->isCXXInstanceMember(), FD->isVariadic()); + F->CallingConvention = ConvertCallConv(AbiCC); TypeLoc RTL; if (auto TSI = FD->getTypeSourceInfo()) diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index 37079758..76f4e7d1 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -132,6 +132,9 @@ protected: Cxxi::TranslationUnit^ GetModule(clang::SourceLocation Loc); Cxxi::Namespace^ GetNamespace(const clang::NamedDecl*); + clang::CallingConv GetAbiCallConv(clang::CallingConv CC, + bool IsInstMethod, bool IsVariadic); + int Index; gcroot Lib; llvm::OwningPtr C;