diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 7f569d288344..bb76c564cc94 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -713,7 +713,22 @@ enum CXTranslationUnit_Flags { * introduces some overhead to reparsing but improves the performance of * code-completion operations. */ - CXTranslationUnit_CacheCompletionResults = 0x08 + CXTranslationUnit_CacheCompletionResults = 0x08, + /** + * \brief Enable precompiled preambles in C++. + * + * Note: this is a *temporary* option that is available only while + * we are testing C++ precompiled preamble support. + */ + CXTranslationUnit_CXXPrecompiledPreamble = 0x10, + + /** + * \brief Enabled chained precompiled preambles in C++. + * + * Note: this is a *temporary* option that is available only while + * we are testing C++ precompiled preamble support. + */ + CXTranslationUnit_CXXChainedPCH = 0x20 }; /** diff --git a/clang/include/clang/Frontend/ASTUnit.h b/clang/include/clang/Frontend/ASTUnit.h index 1e08c3a92d8e..d8bc35a76a80 100644 --- a/clang/include/clang/Frontend/ASTUnit.h +++ b/clang/include/clang/Frontend/ASTUnit.h @@ -546,7 +546,9 @@ public: bool CaptureDiagnostics = false, bool PrecompilePreamble = false, bool CompleteTranslationUnit = true, - bool CacheCodeCompletionResults = false); + bool CacheCodeCompletionResults = false, + bool CXXPrecompilePreamble = false, + bool CXXChainedPCH = false); /// \brief Reparse the source files using the same command-line options that /// were originally used to produce this translation unit. diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index e8e80647b408..33abb0733167 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -1328,8 +1328,7 @@ bool ASTUnit::LoadFromCompilerInvocation(bool PrecompilePreamble) { llvm::MemoryBuffer *OverrideMainBuffer = 0; - // FIXME: When C++ PCH is ready, allow use of it for a precompiled preamble. - if (PrecompilePreamble && !Invocation->getLangOpts().CPlusPlus) { + if (PrecompilePreamble) { PreambleRebuildCounter = 1; OverrideMainBuffer = getMainBufferWithPrecompiledPreamble(*Invocation); @@ -1386,7 +1385,9 @@ ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin, bool CaptureDiagnostics, bool PrecompilePreamble, bool CompleteTranslationUnit, - bool CacheCodeCompletionResults) { + bool CacheCodeCompletionResults, + bool CXXPrecompilePreamble, + bool CXXChainedPCH) { bool CreatedDiagnosticsObject = false; if (!Diags.getPtr()) { @@ -1457,6 +1458,16 @@ ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin, // Override the resources path. CI->getHeaderSearchOpts().ResourceDir = ResourceFilesPath; + // Check whether we should precompile the preamble and/or use chained PCH. + // FIXME: This is a temporary hack while we debug C++ chained PCH. + if (CI->getLangOpts().CPlusPlus) { + PrecompilePreamble = PrecompilePreamble && CXXPrecompilePreamble; + + if (PrecompilePreamble && !CXXChainedPCH && + !CI->getPreprocessorOpts().ImplicitPCHInclude.empty()) + PrecompilePreamble = false; + } + // Create the AST unit. llvm::OwningPtr AST; AST.reset(new ASTUnit(false)); diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index c1e40de7142b..3262016c2b12 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -1972,7 +1972,8 @@ CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx, unsigned clang_defaultEditingTranslationUnitOptions() { return CXTranslationUnit_PrecompiledPreamble | - CXTranslationUnit_CacheCompletionResults; + CXTranslationUnit_CacheCompletionResults | + CXTranslationUnit_CXXPrecompiledPreamble; } CXTranslationUnit @@ -2020,6 +2021,10 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { = ((options & CXTranslationUnit_Incomplete) == 0); bool CacheCodeCompetionResults = options & CXTranslationUnit_CacheCompletionResults; + bool CXXPrecompilePreamble + = options & CXTranslationUnit_CXXPrecompiledPreamble; + bool CXXChainedPCH + = options & CXTranslationUnit_CXXChainedPCH; // Configure the diagnostics. DiagnosticOptions DiagOpts; @@ -2084,7 +2089,9 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { /*CaptureDiagnostics=*/true, PrecompilePreamble, CompleteTranslationUnit, - CacheCodeCompetionResults)); + CacheCodeCompetionResults, + CXXPrecompilePreamble, + CXXChainedPCH)); if (NumErrors != Diags->getNumErrors()) { // Make sure to check that 'Unit' is non-NULL.