diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-09-29 00:38:00 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-09-29 00:38:00 +0000 |
commit | aee526e77657afd1600276450e9c346953ad51d7 (patch) | |
tree | c21f821b09625211f00cbb5018546edb013a23b6 /lib/Frontend | |
parent | 4213df3b5da21ce25a4541ca5c447eeb28b515a3 (diff) |
Introduce a pure virtual clone() method to DiagnosticConsumer, so that
we have the ability to create a new, distict diagnostic consumer when
we go off and build a module. This avoids the currently horribleness
where the same diagnostic consumer sees diagnostics for multiple
translation units (and multiple SourceManagers!) causing all sorts of havok.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140743 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend')
-rw-r--r-- | lib/Frontend/ASTUnit.cpp | 6 | ||||
-rw-r--r-- | lib/Frontend/CompilerInstance.cpp | 26 | ||||
-rw-r--r-- | lib/Frontend/LogDiagnosticPrinter.cpp | 6 | ||||
-rw-r--r-- | lib/Frontend/TextDiagnosticBuffer.cpp | 4 | ||||
-rw-r--r-- | lib/Frontend/TextDiagnosticPrinter.cpp | 5 | ||||
-rw-r--r-- | lib/Frontend/VerifyDiagnosticConsumer.cpp | 8 |
6 files changed, 42 insertions, 13 deletions
diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 4e8226d651..e84f8bd6e2 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -458,6 +458,12 @@ public: virtual void HandleDiagnostic(DiagnosticsEngine::Level Level, const Diagnostic &Info); + + DiagnosticConsumer *clone(DiagnosticsEngine &Diags) const { + // Just drop any diagnostics that come from cloned consumers; they'll + // have different source managers anyway. + return new IgnoringDiagConsumer(); + } }; /// \brief RAII object that optionally captures diagnostics, if diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index ce5496562b..554ca352e1 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -141,9 +141,11 @@ static void SetUpDiagnosticLog(const DiagnosticOptions &DiagOpts, void CompilerInstance::createDiagnostics(int Argc, const char* const *Argv, DiagnosticConsumer *Client, - bool ShouldOwnClient) { + bool ShouldOwnClient, + bool ShouldCloneClient) { Diagnostics = createDiagnostics(getDiagnosticOpts(), Argc, Argv, Client, - ShouldOwnClient, &getCodeGenOpts()); + ShouldOwnClient, ShouldCloneClient, + &getCodeGenOpts()); } llvm::IntrusiveRefCntPtr<DiagnosticsEngine> @@ -151,6 +153,7 @@ CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, int Argc, const char* const *Argv, DiagnosticConsumer *Client, bool ShouldOwnClient, + bool ShouldCloneClient, const CodeGenOptions *CodeGenOpts) { llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); llvm::IntrusiveRefCntPtr<DiagnosticsEngine> @@ -158,9 +161,12 @@ CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, // Create the diagnostic client for reporting errors or for // implementing -verify. - if (Client) - Diags->setClient(Client, ShouldOwnClient); - else + if (Client) { + if (ShouldCloneClient) + Diags->setClient(Client->clone(*Diags), ShouldOwnClient); + else + Diags->setClient(Client, ShouldOwnClient); + } else Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts)); // Chain in -verify checker, if requested. @@ -691,7 +697,8 @@ static void compileModule(CompilerInstance &ImportingInstance, Instance.setInvocation(&*Invocation); Instance.createDiagnostics(/*argc=*/0, /*argv=*/0, &ImportingInstance.getDiagnosticClient(), - /*ShouldOwnClient=*/false); + /*ShouldOwnClient=*/true, + /*ShouldCloneClient=*/true); // Construct a module-generating action. GeneratePCHAction CreateModuleAction(true); @@ -699,13 +706,6 @@ static void compileModule(CompilerInstance &ImportingInstance, // Execute the action to actually build the module in-place. // FIXME: Need to synchronize when multiple processes do this. Instance.ExecuteAction(CreateModuleAction); - - // Tell the diagnostic client that it's (re-)starting to process a source - // file. - // FIXME: This is a hack. We probably want to clone the diagnostic client. - ImportingInstance.getDiagnosticClient() - .BeginSourceFile(ImportingInstance.getLangOpts(), - &ImportingInstance.getPreprocessor()); } ModuleKey CompilerInstance::loadModule(SourceLocation ImportLoc, diff --git a/lib/Frontend/LogDiagnosticPrinter.cpp b/lib/Frontend/LogDiagnosticPrinter.cpp index f295acfff3..8b585be90e 100644 --- a/lib/Frontend/LogDiagnosticPrinter.cpp +++ b/lib/Frontend/LogDiagnosticPrinter.cpp @@ -169,3 +169,9 @@ void LogDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level, // Record the diagnostic entry. Entries.push_back(DE); } + +DiagnosticConsumer * +LogDiagnosticPrinter::clone(DiagnosticsEngine &Diags) const { + return new LogDiagnosticPrinter(OS, *DiagOpts, /*OwnsOutputStream=*/false); +} + diff --git a/lib/Frontend/TextDiagnosticBuffer.cpp b/lib/Frontend/TextDiagnosticBuffer.cpp index cef46a27e8..f8ea9f1361 100644 --- a/lib/Frontend/TextDiagnosticBuffer.cpp +++ b/lib/Frontend/TextDiagnosticBuffer.cpp @@ -54,3 +54,7 @@ void TextDiagnosticBuffer::FlushDiagnostics(DiagnosticsEngine &Diags) const { Diags.Report(Diags.getCustomDiagID(DiagnosticsEngine::Note, it->second.c_str())); } + +DiagnosticConsumer *TextDiagnosticBuffer::clone(DiagnosticsEngine &) const { + return new TextDiagnosticBuffer(); +} diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp index 64a5c1bc9c..378e673812 100644 --- a/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/lib/Frontend/TextDiagnosticPrinter.cpp @@ -1264,3 +1264,8 @@ void TextDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level, OS.flush(); } + +DiagnosticConsumer * +TextDiagnosticPrinter::clone(DiagnosticsEngine &Diags) const { + return new TextDiagnosticPrinter(OS, *DiagOpts, /*OwnsOutputStream=*/false); +} diff --git a/lib/Frontend/VerifyDiagnosticConsumer.cpp b/lib/Frontend/VerifyDiagnosticConsumer.cpp index 983dc8eebb..cf35c8edc3 100644 --- a/lib/Frontend/VerifyDiagnosticConsumer.cpp +++ b/lib/Frontend/VerifyDiagnosticConsumer.cpp @@ -525,6 +525,14 @@ void VerifyDiagnosticConsumer::CheckDiagnostics() { Buffer.reset(new TextDiagnosticBuffer()); } +DiagnosticConsumer * +VerifyDiagnosticConsumer::clone(DiagnosticsEngine &Diags) const { + if (!Diags.getClient()) + Diags.setClient(PrimaryClient->clone(Diags)); + + return new VerifyDiagnosticConsumer(Diags); +} + Directive* Directive::Create(bool RegexKind, const SourceLocation &Location, const std::string &Text, unsigned Count) { if (RegexKind) |