Introduce libclang-level options for C++ precompiled preambles,

separating out chaining precompiled preambles from non-chaining ones.

llvm-svn: 117457
This commit is contained in:
Douglas Gregor 2010-10-27 17:24:53 +00:00
parent 9d798a07e4
commit f5a1854655
4 changed files with 42 additions and 7 deletions

View File

@ -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
};
/**

View File

@ -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.

View File

@ -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));

View File

@ -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.