diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index df7bc12e..9c7d90c3 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -103,6 +103,24 @@ static std::string GetCXXABIString(clang::TargetCXXABI::Kind Kind) std::vector GetWindowsSystemIncludeDirs(); #endif +static clang::TargetCXXABI::Kind +ConvertToClangTargetCXXABI(CppSharp::CppParser::AST::CppAbi abi) +{ + using namespace clang; + + switch (abi) + { + case CppSharp::CppParser::AST::CppAbi::Itanium: + return TargetCXXABI::GenericItanium; + case CppSharp::CppParser::AST::CppAbi::Microsoft: + return TargetCXXABI::Microsoft; + case CppSharp::CppParser::AST::CppAbi::ARM: + return TargetCXXABI::GenericARM; + } + + llvm_unreachable("Unsupported C++ ABI."); +} + void Parser::SetupHeader() { using namespace clang; @@ -149,8 +167,7 @@ void Parser::SetupHeader() C->setInvocation(Inv); auto& TO = Inv->TargetOpts; - TargetABI = (Opts->Abi == CppAbi::Microsoft) ? TargetCXXABI::Microsoft - : TargetCXXABI::GenericItanium; + TargetABI = ConvertToClangTargetCXXABI(Opts->Abi); TO->Triple = llvm::sys::getDefaultTargetTriple(); if (!Opts->TargetTriple.empty()) @@ -267,9 +284,6 @@ std::string Parser::GetDeclMangledName(clang::Decl* D, clang::TargetCXXABI ABI, switch(ABI.getKind()) { default: - llvm_unreachable("Unknown mangling ABI"); - break; - case TargetCXXABI::GenericItanium: MC.reset(ItaniumMangleContext::create(*AST, AST->getDiagnostics())); break; case TargetCXXABI::Microsoft: @@ -277,6 +291,9 @@ std::string Parser::GetDeclMangledName(clang::Decl* D, clang::TargetCXXABI ABI, break; } + if (!MC) + llvm_unreachable("Unknown mangling ABI"); + std::string Mangled; llvm::raw_string_ostream Out(Mangled);