diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-09-13 01:26:44 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-09-13 01:26:44 +0000 |
commit | 78243658c533168d51fd076fba328437932ba6f1 (patch) | |
tree | 5ac50b68c9aacb2e986d1a4afecfcdbab1d1f931 /lib/Frontend | |
parent | 21cae2059a06f7d89eee169409c9266def1b1aca (diff) |
When compiling a module on-demand, re-use the diagnostics client
already provided. This required a little bit of clean-up in the way
that VerifyDiagnosticsClient managed ownership of its underlying
"primary" client, because now it will no longer always take ownership.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139570 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend')
-rw-r--r-- | lib/Frontend/CompilerInstance.cpp | 29 | ||||
-rw-r--r-- | lib/Frontend/VerifyDiagnosticsClient.cpp | 20 |
2 files changed, 33 insertions, 16 deletions
diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 1f1a2f77bb..f39b119c32 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -140,15 +140,17 @@ static void SetUpDiagnosticLog(const DiagnosticOptions &DiagOpts, } void CompilerInstance::createDiagnostics(int Argc, const char* const *Argv, - DiagnosticClient *Client) { + DiagnosticClient *Client, + bool ShouldOwnClient) { Diagnostics = createDiagnostics(getDiagnosticOpts(), Argc, Argv, Client, - &getCodeGenOpts()); + ShouldOwnClient, &getCodeGenOpts()); } llvm::IntrusiveRefCntPtr<Diagnostic> CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, int Argc, const char* const *Argv, DiagnosticClient *Client, + bool ShouldOwnClient, const CodeGenOptions *CodeGenOpts) { llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); llvm::IntrusiveRefCntPtr<Diagnostic> Diags(new Diagnostic(DiagID)); @@ -156,13 +158,13 @@ CompilerInstance::createDiagnostics(const DiagnosticOptions &Opts, // Create the diagnostic client for reporting errors or for // implementing -verify. if (Client) - Diags->setClient(Client); + Diags->setClient(Client, ShouldOwnClient); else Diags->setClient(new TextDiagnosticPrinter(llvm::errs(), Opts)); // Chain in -verify checker, if requested. - if (Opts.VerifyDiagnostics) - Diags->setClient(new VerifyDiagnosticsClient(*Diags, Diags->takeClient())); + if (Opts.VerifyDiagnostics) + Diags->setClient(new VerifyDiagnosticsClient(*Diags)); // Chain in -diagnostic-log-file dumper, if requested. if (!Opts.DiagnosticLogFile.empty()) @@ -659,6 +661,9 @@ static void compileModule(CompilerInstance &ImportingInstance, FrontendOpts.Inputs.push_back( std::make_pair(getSourceInputKindFromOptions(Invocation->getLangOpts()), UmbrellaHeader)); + + Invocation->getDiagnosticOpts().VerifyDiagnostics = 0; + // FIXME: Strip away all of the compilation options that won't be transferred // down to the module. This presumably includes -D flags, optimization // settings, etc. @@ -667,9 +672,9 @@ static void compileModule(CompilerInstance &ImportingInstance, // module. CompilerInstance Instance; Instance.setInvocation(&*Invocation); - // Instance.setDiagnostics(&ImportingInstance.getDiagnostics()); - // FIXME: Need to route diagnostics over to the same diagnostic client! - Instance.createDiagnostics(0, 0, 0); + Instance.createDiagnostics(/*argc=*/0, /*argv=*/0, + &ImportingInstance.getDiagnosticClient(), + /*ShouldOwnClient=*/false); // Construct a module-generating action. GeneratePCHAction CreateModuleAction(true); @@ -681,7 +686,13 @@ static void compileModule(CompilerInstance &ImportingInstance, // Tell the importing instance's file manager to forget about the module // file, since we've just created it. ImportingInstance.getFileManager().forgetFile(ModuleFile); -} + + // Tell the diagnostic client that it's (re-)starting to process a source + // file. + ImportingInstance.getDiagnosticClient() + .BeginSourceFile(ImportingInstance.getLangOpts(), + &ImportingInstance.getPreprocessor()); +} ModuleKey CompilerInstance::loadModule(SourceLocation ImportLoc, IdentifierInfo &ModuleName, diff --git a/lib/Frontend/VerifyDiagnosticsClient.cpp b/lib/Frontend/VerifyDiagnosticsClient.cpp index 16c945b417..f53e0dac23 100644 --- a/lib/Frontend/VerifyDiagnosticsClient.cpp +++ b/lib/Frontend/VerifyDiagnosticsClient.cpp @@ -20,14 +20,19 @@ #include "llvm/Support/raw_ostream.h" using namespace clang; -VerifyDiagnosticsClient::VerifyDiagnosticsClient(Diagnostic &_Diags, - DiagnosticClient *_Primary) - : Diags(_Diags), PrimaryClient(_Primary), - Buffer(new TextDiagnosticBuffer()), CurrentPreprocessor(0) { +VerifyDiagnosticsClient::VerifyDiagnosticsClient(Diagnostic &_Diags) + : Diags(_Diags), PrimaryClient(Diags.getClient()), + OwnsPrimaryClient(Diags.ownsClient()), + Buffer(new TextDiagnosticBuffer()), CurrentPreprocessor(0) +{ + Diags.takeClient(); } VerifyDiagnosticsClient::~VerifyDiagnosticsClient() { - CheckDiagnostics(); + CheckDiagnostics(); + Diags.takeClient(); + if (OwnsPrimaryClient) + delete PrimaryClient; } // DiagnosticClient interface. @@ -477,8 +482,9 @@ void VerifyDiagnosticsClient::CheckDiagnostics() { ExpectedData ED; // Ensure any diagnostics go to the primary client. + bool OwnsCurClient = Diags.ownsClient(); DiagnosticClient *CurClient = Diags.takeClient(); - Diags.setClient(PrimaryClient.get()); + Diags.setClient(PrimaryClient, false); // If we have a preprocessor, scan the source for expected diagnostic // markers. If not then any diagnostics are unexpected. @@ -513,7 +519,7 @@ void VerifyDiagnosticsClient::CheckDiagnostics() { } Diags.takeClient(); - Diags.setClient(CurClient); + Diags.setClient(CurClient, OwnsCurClient); // Reset the buffer, we have processed all the diagnostics in it. Buffer.reset(new TextDiagnosticBuffer()); |