diff options
-rw-r--r-- | lib/Frontend/ASTUnit.cpp | 34 | ||||
-rw-r--r-- | lib/Serialization/ASTReader.cpp | 10 | ||||
-rw-r--r-- | test/Index/Inputs/a.h | 4 | ||||
-rw-r--r-- | test/Index/Inputs/b.h | 1 | ||||
-rw-r--r-- | test/Index/preamble-reparse-chained.c | 10 |
5 files changed, 52 insertions, 7 deletions
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index bd7e712bc7..b81f89390d 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/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<TopLevelDeclTrackerAction> 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<PrecompilePreambleAction> 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); diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 91f0d36118..cc593e9827 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -3362,11 +3362,11 @@ void ASTReader::InitializeSema(Sema &S) { // Makes sure any declarations that were deserialized "too early" // still get added to the identifier's declaration chains. - if (SemaObj->TUScope) { - for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) { + for (unsigned I = 0, N = PreloadedDecls.size(); I != N; ++I) { + if (SemaObj->TUScope) SemaObj->TUScope->AddDecl(PreloadedDecls[I]); - SemaObj->IdResolver.AddDecl(PreloadedDecls[I]); - } + + SemaObj->IdResolver.AddDecl(PreloadedDecls[I]); } PreloadedDecls.clear(); @@ -3564,8 +3564,8 @@ ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, // and add it to the declaration chain for this identifier, so // that (unqualified) name lookup will find it. SemaObj->TUScope->AddDecl(D); - SemaObj->IdResolver.AddDeclToIdentifierChain(II, D); } + SemaObj->IdResolver.AddDeclToIdentifierChain(II, D); } else { // Queue this declaration so that it will be added to the // translation unit scope and identifier's declaration chain diff --git a/test/Index/Inputs/a.h b/test/Index/Inputs/a.h new file mode 100644 index 0000000000..70ace8c90e --- /dev/null +++ b/test/Index/Inputs/a.h @@ -0,0 +1,4 @@ +#ifndef A_H +#define A_H +typedef int A; +#endif diff --git a/test/Index/Inputs/b.h b/test/Index/Inputs/b.h new file mode 100644 index 0000000000..02591d2532 --- /dev/null +++ b/test/Index/Inputs/b.h @@ -0,0 +1 @@ +typedef float B; diff --git a/test/Index/preamble-reparse-chained.c b/test/Index/preamble-reparse-chained.c new file mode 100644 index 0000000000..5be3b12f01 --- /dev/null +++ b/test/Index/preamble-reparse-chained.c @@ -0,0 +1,10 @@ +// RUN: c-index-test -write-pch %t.h.pch -x c-header %S/Inputs/a.h +// RUN: env CINDEXTEST_EDITING=1 c-index-test -test-load-source-reparse 5 all -I%S/Inputs -include %t.h %s | FileCheck %s +#include "a.h" +#include "b.h" + +A a; +B b; + +// CHECK: a.h:3:13: TypedefDecl=A:3:13 (Definition) Extent=[3:13 - 3:14] +// CHECK: b.h:1:15: TypedefDecl=B:1:15 (Definition) Extent=[1:15 - 1:16] |