aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Frontend/ASTUnit.cpp34
-rw-r--r--lib/Serialization/ASTReader.cpp10
-rw-r--r--test/Index/Inputs/a.h4
-rw-r--r--test/Index/Inputs/b.h1
-rw-r--r--test/Index/preamble-reparse-chained.c10
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]