pnkfelix: Put a title, prefixed by ##
, and then on the next line, your name, colon, and a short prompt to start the conversation.
matt: are there any changes to compiler tooling since your blog post?
pnkfelix: Yep, e.g. -Z everybody-loops was removed.
Replaced every fn body with loop { }
, has type !
, and !
is subtype of every other type (at least informally).
matt: volunteering to write tool for loopifying and other minimization outside compiler
pnkfelix: rr -M
, flag includes process number running and event count
rr -a
, rr -a -M <event-count>
matt: will write blog post for rr
pnkfelix: use debuginfo-level=2
in general when using using debugger
watch -location diag.level; reverse-continue
. jump to the point where diagnostic is written
Mix of responses
First thing: debug! respect tree structure of modules.
Can turn on RUSTC_LOG=rustc_mir_transform, that will emit debugging for all submodules that occur under that root module (e.g. rustc_mir_transform::abort_unwinding_calls)
(pnkfelix doesn't know off hand if one can turn off subtrees once one has opted in from a parent module tree.)
Second: Look at stack trace, see the chain of modules referenced by the stack trace.
Third: guess compiler crates that might be relevant, grep for debug!
in the source.
Q: would it be useful to have cross-referencing of knowing other crates that one should turn on.
e.g. rustc_hir_typeck
, eventually realized that rustc_infer
was another good crate to turn on debug logging for.
A1: could the [dependencies]
of Cargo.toml for the rustc_ crate in question be of use in guiding search
A2: also look at the use
statements of the mod.rs
A3: (can the above be automated? Maybe, but it might not be what you want.)
Mapping between long unfolded internal structure (including def-id's etc) to the source code
THIR structure made by macro thir_with_elements
.
arms, blocks, expressions, statements, parameters
Descriptive image of ScopeTree
rustc_middle::middle::region::scope
Block is made of a series of statements, optionally followed by a tail expression. We don't put the data inline from the block, we use a statement Id to point to a structure located elsewhere. Ids act as conceptual pointers, indices in an array.
rustc_middle::thir