diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-10-27 17:24:53 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-10-27 17:24:53 +0000 |
commit | 99ba202f659e1885fa5ee114f97c97cf6a857491 (patch) | |
tree | d4fe798c1847a9856a75b3d1febec6a167287825 | |
parent | 11893327d056a7ebd820da8f00a3286e7430a91c (diff) |
Introduce libclang-level options for C++ precompiled preambles,
separating out chaining precompiled preambles from non-chaining ones.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117457 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang-c/Index.h | 17 | ||||
-rw-r--r-- | include/clang/Frontend/ASTUnit.h | 4 | ||||
-rw-r--r-- | lib/Frontend/ASTUnit.cpp | 17 | ||||
-rw-r--r-- | tools/libclang/CIndex.cpp | 11 |
4 files changed, 42 insertions, 7 deletions
diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 7f569d2883..bb76c564cc 100644 --- a/include/clang-c/Index.h +++ b/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/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 1e08c3a92d..d8bc35a76a 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/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/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index e8e80647b4..33abb07331 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/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<ASTUnit> AST; AST.reset(new ASTUnit(false)); diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index c1e40de714..3262016c2b 100644 --- a/tools/libclang/CIndex.cpp +++ b/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. |