mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-04 09:41:05 +01:00
Move dumping into the phase factory functions (#5747)
By moving dumping, we can have dumping occur before verification that might CHECK-fail (e.g. parse tree and llvm IR verification). I'm dropping vlogging of raw semir. It was only done when dumping, so `-v` would print zero copies and `-v --dump-raw-sem-ir` would print two copies. The lack of complaints about this suggests it's not needed. I'm making a small change to drop newlines between textual and raw semir. This is an edge case so I don't expect people to really notice in general, but it seemed unusually aware of what's on a stream, and it made it harder to do the dump_stream/raw_dump_stream approach, which I felt would be decent in general, since check is the only phase that can emit two different things (which I could also just drop -- we don't really use raw semir anymore, it doesn't seem like a big need to be able to print it with textual semir, but I'm assuming to just maintain existing behavior). In parse, we were previously dumping the tree on verification errors. I'm removing that because now `--dump-parse-tree` should work fine, where previously it wouldn't.
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include "toolchain/parse/context.h"
|
||||
#include "toolchain/parse/handle.h"
|
||||
#include "toolchain/parse/node_kind.h"
|
||||
#include "toolchain/parse/tree_and_subtrees.h"
|
||||
|
||||
namespace Carbon::Parse {
|
||||
|
||||
@@ -48,14 +49,22 @@ auto Parse(Lex::TokenizedBuffer& tokens, ParseOptions options) -> Tree {
|
||||
// from the tokenized buffer or we diagnosed new errors.
|
||||
tree.set_has_errors(tokens.has_errors() || context.has_errors());
|
||||
|
||||
if (options.vlog_stream || options.dump_stream) {
|
||||
// Flush diagnostics before printing.
|
||||
consumer->Flush();
|
||||
}
|
||||
CARBON_VLOG_TO(options.vlog_stream, "*** Parse::Tree ***\n{0}", tree);
|
||||
if (options.dump_stream) {
|
||||
Parse::TreeAndSubtrees tree_and_subtrees(tokens, tree);
|
||||
if (options.dump_preorder_parse_tree) {
|
||||
tree_and_subtrees.PrintPreorder(*options.dump_stream);
|
||||
} else {
|
||||
tree_and_subtrees.Print(*options.dump_stream);
|
||||
}
|
||||
}
|
||||
|
||||
if (auto verify = tree.Verify(); !verify.ok()) {
|
||||
// TODO: This is temporarily printing to stderr directly during development.
|
||||
// If we can, restrict this to a subtree with the error and add it to the
|
||||
// stack trace (such as with PrettyStackTraceFunction). Otherwise, switch
|
||||
// back to vlog_stream prior to broader distribution so that end users are
|
||||
// hopefully comfortable copy-pasting stderr when there are bugs in tree
|
||||
// construction.
|
||||
tree.Print(llvm::errs());
|
||||
// TODO: Consider printing a subtree as part of the error.
|
||||
CARBON_FATAL("Invalid tree returned by Parse(): {0}", verify.error());
|
||||
}
|
||||
return tree;
|
||||
|
||||
Reference in New Issue
Block a user