From 8c1372f80adce4622182a497b5c60f89da69917e Mon Sep 17 00:00:00 2001 From: triton Date: Fri, 9 Aug 2013 01:53:45 +0100 Subject: [PATCH] Fixed Clang parser initialization to be a bit more robust with invalid triples. --- src/Parser/Parser.cpp | 85 ++++++++++++++++++++++++++----------------- src/Parser/Parser.h | 1 - 2 files changed, 51 insertions(+), 35 deletions(-) diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 7a97431f..c138448e 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -66,6 +66,19 @@ static std::string GetClangBuiltinIncludeDir() //-----------------------------------// +static std::string GetCXXABIString(clang::TargetCXXABI::Kind Kind) +{ + switch(Kind) + { + case clang::TargetCXXABI::GenericItanium: + return "itanium"; + case clang::TargetCXXABI::Microsoft: + return "microsoft"; + } + + llvm_unreachable("Unknown C++ ABI kind"); +} + #ifdef _MSC_VER std::vector GetWindowsSystemIncludeDirs(); #endif @@ -101,84 +114,88 @@ void Parser::SetupHeader() C->setInvocation(Inv); TargetOptions& TO = Inv->getTargetOpts(); + TargetABI = Opts->MicrosoftMode ? TargetCXXABI::Microsoft + : TargetCXXABI::GenericItanium; + TO.CXXABI = GetCXXABIString(TargetABI); + + TO.Triple = llvm::sys::getDefaultTargetTriple(); if (!System::String::IsNullOrWhiteSpace(Opts->TargetTriple)) TO.Triple = marshalString(Opts->TargetTriple); - else + + TargetInfo* TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO); + if (!TI) + { + // We might have no target info due to an invalid user-provided triple. + // Try again with the default triple. TO.Triple = llvm::sys::getDefaultTargetTriple(); + TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO); + } - TargetABI = Opts->MicrosoftMode ? TargetCXXABI::Microsoft - : TargetCXXABI::GenericItanium; + assert(TI && "Expected valid target info"); - TargetInfo* TI = TargetInfo::CreateTargetInfo(C->getDiagnostics(), &TO); TI->setCXXABI(TargetABI); C->setTarget(TI); C->createFileManager(); C->createSourceManager(C->getFileManager()); + auto& HSOpts = C->getHeaderSearchOpts(); + auto& PPOpts = C->getPreprocessorOpts(); + auto& LangOpts = C->getLangOpts(); + if (Opts->NoStandardIncludes) { - auto HSOpts = C->getHeaderSearchOpts(); HSOpts.UseStandardSystemIncludes = false; HSOpts.UseStandardCXXIncludes = false; } if (Opts->NoBuiltinIncludes) - { - auto HSOpts = C->getHeaderSearchOpts(); HSOpts.UseBuiltinIncludes = false; - } if (Opts->Verbose) - C->getHeaderSearchOpts().Verbose = true; + HSOpts.Verbose = true; for each(System::String^% include in Opts->IncludeDirs) { String s = marshalString(include); - C->getHeaderSearchOpts().AddPath(s, frontend::Angled, false, false); + HSOpts.AddPath(s, frontend::Angled, false, false); } for each(System::String^% include in Opts->SystemIncludeDirs) { String s = marshalString(include); - C->getHeaderSearchOpts().AddPath(s, frontend::System, false, false); + HSOpts.AddPath(s, frontend::System, false, false); } - for each(System::String^% def in Opts->Defines) - { - String s = marshalString(def); - C->getPreprocessorOpts().addMacroDef(s); - } + for each(System::String^% define in Opts->Defines) + PPOpts.addMacroDef(marshalString(define)); // Initialize the default platform headers. - std::string ResourceDir = GetClangResourceDir("."); - C->getHeaderSearchOpts().ResourceDir = ResourceDir; - C->getHeaderSearchOpts().AddPath(GetClangBuiltinIncludeDir(), - clang::frontend::System, false, false); + HSOpts.ResourceDir = GetClangResourceDir("."); + HSOpts.AddPath(GetClangBuiltinIncludeDir(), clang::frontend::System, + /*IsFramework=*/false, /*IgnoreSysRoot=*/false); #ifdef _MSC_VER if (!Opts->NoBuiltinIncludes) { std::vector SystemDirs = GetWindowsSystemIncludeDirs(); - clang::HeaderSearchOptions& HSOpts = C->getHeaderSearchOpts(); - - for(size_t i = 0; i < SystemDirs.size(); ++i) - { - HSOpts.AddPath(SystemDirs[i], frontend::System, false, false); - } + for(auto Path : SystemDirs) + HSOpts.AddPath(Path, frontend::System, /*IsFramework=*/false, + /*IgnoreSysRoot=*/false); } + #endif + // Enable preprocessing record. + PPOpts.DetailedRecord = true; + C->createPreprocessor(); - C->createASTContext(); - if (C->hasPreprocessor()) - { - Preprocessor& P = C->getPreprocessor(); - P.createPreprocessingRecord(); - P.getBuiltinInfo().InitializeBuiltins(P.getIdentifierTable(), - P.getLangOpts()); - } + Preprocessor& PP = C->getPreprocessor(); + PP.getBuiltinInfo().InitializeBuiltins(PP.getIdentifierTable(), + PP.getLangOpts()); + + C->createASTContext(); } //-----------------------------------// diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index bcfcc8ed..39fb3147 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -60,7 +60,6 @@ public ref struct ParserOptions CppSharp::AST::Library^ Library; - // Toolset version - 2005 - 8, 2008 - 9, 2010 - 10, 0 - autoprobe for any. int ToolSetToUse; System::String^ TargetTriple;