Skip to content

Commit

Permalink
Flush pending diagnostics on crash. (#4337)
Browse files Browse the repository at this point in the history
This risks diagnsotic formatting crashing, but I think we more
frequently see cases where it'd be interesting to know what diagnostics
were being delayed as part of the default sorting.
  • Loading branch information
jonmeow authored Sep 25, 2024
1 parent dc32aa2 commit ee38363
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 0 deletions.
2 changes: 2 additions & 0 deletions toolchain/diagnostics/diagnostic_consumer.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ class StreamDiagnosticConsumer : public DiagnosticConsumer {
auto HandleDiagnostic(Diagnostic diagnostic) -> void override;
auto Flush() -> void override { stream_->flush(); }

auto set_stream(llvm::raw_ostream* stream) -> void { stream_ = stream; }

private:
auto Print(const DiagnosticMessage& message, llvm::StringRef prefix) -> void;

Expand Down
1 change: 1 addition & 0 deletions toolchain/driver/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ cc_library(
"//common:ostream",
"//common:version",
"//common:vlog",
"//toolchain/base:pretty_stack_trace_function",
"//toolchain/base:value_store",
"//toolchain/check",
"//toolchain/codegen",
Expand Down
24 changes: 24 additions & 0 deletions toolchain/driver/compile_subcommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "common/vlog.h"
#include "llvm/ADT/ScopeExit.h"
#include "toolchain/base/pretty_stack_trace_function.h"
#include "toolchain/check/check.h"
#include "toolchain/codegen/codegen.h"
#include "toolchain/diagnostics/sorting_diagnostic_consumer.h"
Expand Down Expand Up @@ -485,6 +486,10 @@ class CompilationUnit {
consumer_->Flush();
}

// Flushes diagnostics, specifically as part of generating stack trace
// information.
auto FlushForStackTrace() -> void { consumer_->Flush(); }

auto input_filename() -> llvm::StringRef { return input_filename_; }
auto success() -> bool { return success_; }
auto has_source() -> bool { return source_.has_value(); }
Expand Down Expand Up @@ -660,6 +665,25 @@ auto CompileSubcommand::Run(DriverEnv& driver_env) -> DriverResult {
stream_consumer.Flush();
});

PrettyStackTraceFunction flush_on_crash([&](llvm::raw_ostream& out) {
// When crashing, flush diagnostics. If sorting diagnostics, they can be
// redirected to the crash stream; if streaming, the original stream is
// flushed.
// TODO: Eventually we'll want to limit the count.
if (options_.stream_errors) {
out << "Flushing diagnostics\n";
} else {
out << "Pending diagnostics:\n";
stream_consumer.set_stream(&out);
}

for (auto& unit : units) {
unit->FlushForStackTrace();
}
stream_consumer.Flush();
stream_consumer.set_stream(&driver_env.error_stream);
});

// Returns a DriverResult object. Called whenever Compile returns.
auto make_result = [&]() {
DriverResult result = {.success = true};
Expand Down

0 comments on commit ee38363

Please sign in to comment.