зеркало из https://github.com/microsoft/clang-1.git
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114774 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
37bf9d2bb7
Коммит
76dc8890b6
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
#ifndef A_H
|
||||
#define A_H
|
||||
typedef int A;
|
||||
#endif
|
|
@ -0,0 +1 @@
|
|||
typedef float B;
|
|
@ -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]
|
Загрузка…
Ссылка в новой задаче