aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-10-27 17:24:53 +0000
committerDouglas Gregor <dgregor@apple.com>2010-10-27 17:24:53 +0000
commit99ba202f659e1885fa5ee114f97c97cf6a857491 (patch)
treed4fe798c1847a9856a75b3d1febec6a167287825
parent11893327d056a7ebd820da8f00a3286e7430a91c (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.h17
-rw-r--r--include/clang/Frontend/ASTUnit.h4
-rw-r--r--lib/Frontend/ASTUnit.cpp17
-rw-r--r--tools/libclang/CIndex.cpp11
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.