From 2fb99df2c3a3b5d12dfb3781ff16df8c15c782a5 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 24 Sep 2010 23:29:12 +0000 Subject: When setting the globally-visible declarations for a particular identifier, we may have a Sema object but no translation unit scope (because parsing is finished). In this case, we still need to update the IdResolver, which might still be used when writing a PCH containing another PCH (without chaining). This bug manifested as a failure with precompiled preambles. Also, add a little environment-variable-sensitive logging for libclang. llvm-svn: 114774 --- clang/lib/Frontend/ASTUnit.cpp | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'clang/lib/Frontend/ASTUnit.cpp') diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index bd7e712bc78..b81f89390d8 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -749,9 +749,20 @@ bool ASTUnit::Parse(llvm::MemoryBuffer *OverrideMainBuffer) { getSourceManager()); StoredDiagnostics[I].setLocation(Loc); } + + if (getenv("LIBCLANG_LOGGING")) + fprintf(stderr, "libclang: using precompiled preamble for \"%s\" at " + "\"%s\"\n", + OriginalSourceFile.c_str(), + PreambleFile.c_str()); + } else { PreprocessorOpts.PrecompiledPreambleBytes.first = 0; PreprocessorOpts.PrecompiledPreambleBytes.second = false; + + if (getenv("LIBCLANG_LOGGING")) + fprintf(stderr, "libclang: not using precompiled preamble for \"%s\"\n", + OriginalSourceFile.c_str()); } llvm::OwningPtr Act; @@ -1215,6 +1226,13 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( // Create the source manager. Clang.setSourceManager(new SourceManager(getDiagnostics())); + if (getenv("LIBCLANG_LOGGING")) + fprintf(stderr, "libclang: creating precompiled preamble for \"%s\" at " + "\"%s\" (%u bytes)\n", + OriginalSourceFile.c_str(), + PreamblePCHPath.c_str(), + (unsigned)Preamble.size()); + llvm::OwningPtr Act; Act.reset(new PrecompilePreambleAction(*this)); if (!Act->BeginSourceFile(Clang, Clang.getFrontendOpts().Inputs[0].second, @@ -1229,6 +1247,11 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( PreambleRebuildCounter = DefaultPreambleRebuildInterval; PreprocessorOpts.eraseRemappedFile( PreprocessorOpts.remapped_file_buffer_end() - 1); + + if (getenv("LIBCLANG_LOGGING")) + fprintf(stderr, "libclang: precompiled preamble compilation for \"%s\" " + "failed\n", OriginalSourceFile.c_str()); + return 0; } @@ -1239,7 +1262,10 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( if (Diagnostics->hasErrorOccurred()) { // There were errors parsing the preamble, so no precompiled header was // generated. Forget that we even tried. - // FIXME: Should we leave a note for ourselves to try again? + + if (getenv("LIBCLANG_LOGGING")) + fprintf(stderr, "libclang: precompiled preamble compilation for \"%s\" " + "failed\n", OriginalSourceFile.c_str()); llvm::sys::Path(FrontendOpts.OutputFile).eraseFromDisk(); Preamble.clear(); if (CreatedPreambleBuffer) @@ -1278,7 +1304,11 @@ llvm::MemoryBuffer *ASTUnit::getMainBufferWithPrecompiledPreamble( if (PreambleTimer) PreambleTimer->stopTimer(); - + + if (getenv("LIBCLANG_LOGGING")) + fprintf(stderr, "libclang: precompiled preamble for \"%s\" completed\n", + OriginalSourceFile.c_str()); + PreambleRebuildCounter = 1; PreprocessorOpts.eraseRemappedFile( PreprocessorOpts.remapped_file_buffer_end() - 1); -- cgit v1.2.3