From aa3e6babe646329310388e5b7e0c9045e0018715 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 8 Oct 2010 04:03:57 +0000 Subject: [PATCH] Fix three related, wily issues with the recompilation of precompiled preambles: - When we rebuild a precompiled preamble, make sure to disable skipping anything in the main file; we may have had leftover preamble-skipping values in the lexer, which leads to very empty preamble. This is a correctness issue. - When we rebuild a precompiled preamble, clear out any prior state in the Diagnostic object. Otherwise, we might think that there were errors when we were building the preamble itself, and therefore reject the resulting preamble. This is mainly a performance issue. - Don't remove old remappings when digging out the remapping for the main file. Having the old mappings around does not hurt in the common case (later remappings will just overwrite them), and is important when we fail to find a preamble: we don't want to have removed the remapping, because we'll need it later. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116041 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Frontend/ASTUnit.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 2a8e40a8f8..c2037a38ca 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -787,7 +787,7 @@ bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) { // results yet, do so now. if (ShouldCacheCodeCompletionResults && CachedCompletionResults.empty()) CacheCodeCompletionResults(); - + return false; error: @@ -878,12 +878,6 @@ ASTUnit::ComputePreamble(CompilerInvocation &Invocation, return std::make_pair((llvm::MemoryBuffer*)0, std::make_pair(0, true)); CreatedBuffer = true; - - // Remove this remapping. We've captured the buffer already. - M = PreprocessorOpts.eraseRemappedFile(M); - E = PreprocessorOpts.remapped_file_end(); - if (M == E) - break; } } } @@ -905,12 +899,6 @@ ASTUnit::ComputePreamble(CompilerInvocation &Invocation, } Buffer = const_cast(M->second); - - // Remove this remapping. We've captured the buffer already. - M = PreprocessorOpts.eraseRemappedFile(M); - E = PreprocessorOpts.remapped_file_buffer_end(); - if (M == E) - break; } } } @@ -1090,7 +1078,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( // return now. if (!AllowRebuild) return 0; - + // We can't reuse the previously-computed preamble. Build a new one. Preamble.clear(); llvm::sys::Path(PreambleFile).eraseFromDisk(); @@ -1162,6 +1150,8 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( FrontendOpts.ChainedPCH = true; // FIXME: Generate the precompiled header into memory? FrontendOpts.OutputFile = PreamblePCHPath; + PreprocessorOpts.PrecompiledPreambleBytes.first = 0; + PreprocessorOpts.PrecompiledPreambleBytes.second = false; // Create the compiler instance to use for building the precompiled preamble. CompilerInstance Clang; @@ -1204,6 +1194,7 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( "IR inputs not support here!"); // Clear out old caches and data. + getDiagnostics().Reset(); StoredDiagnostics.clear(); TopLevelDecls.clear(); TopLevelDeclsInPreamble.clear(); -- 2.40.0