54 lines
2.5 KiB
Markdown
54 lines
2.5 KiB
Markdown
This directory contains unit tests for the MIR-based dataflow
|
|
analysis.
|
|
|
|
These unit tests check the dataflow analysis by embedding calls to a
|
|
special `rustc_peek` intrinsic within the code, in tandem with an
|
|
attribute `#[rustc_mir(rustc_peek_maybe_init)]` (\*). With that
|
|
attribute in place, `rustc_peek` calls are a signal to the compiler to
|
|
lookup the computed dataflow state for the Lvalue corresponding to the
|
|
argument expression being fed to `rustc_peek`. If the dataflow state
|
|
for that Lvalue is a 1-bit at that point in the control flow, then no
|
|
error is emitted by the compiler at that point; if it is a 0-bit, then
|
|
that invocation of `rustc_peek` will emit an error with the message
|
|
"rustc_peek: bit not set".
|
|
|
|
(\*): Or `#[rustc_mir(rustc_peek_maybe_uninit)]`, and perhaps other
|
|
variants in the future.
|
|
|
|
The end effect is that one can write unit tests for MIR dataflow that
|
|
perform simple-queries of the computed dataflow state, and the tests
|
|
should be able to be robust in the face of changes to how MIR is
|
|
represented or constructed.
|
|
|
|
----
|
|
|
|
Sometimes understanding the dataflow results is difficult without
|
|
looking at the actual MIR control-flow graph being processed with the
|
|
corresponding GEN and KILL sets.
|
|
|
|
For a graphviz-rendering with dataflow annotations, add the attribute
|
|
`#[rustc_mir(borrowck_graphviz_postflow="/path/to/suffix.dot")]` to
|
|
the function in question. (You can change the content of
|
|
`"suffix.dot"` to control the filenames used for the output). This
|
|
will generate a separate file for each dataflow analysis, adding a
|
|
prefix (corresponding to the name of the analysis) to the filename in
|
|
each generated output path.
|
|
|
|
* For example, the above attribute will currently cause two files to
|
|
be generated: `/path/to/maybe_init_suffix.dot` and
|
|
`/path/to/maybe_uninit_suffix.dot`.
|
|
|
|
* The generated `.dot` file shows both the computed dataflow results
|
|
on *entry* to each block, as well as the gen- and kill-sets that
|
|
were so-called "transfer functions" summarizing the effect of each
|
|
basic block.
|
|
|
|
* (In addition to the `borrowck_graphviz_postflow` attribute-key
|
|
noted above, there is also `borrowck_graphviz_preflow`; it has the
|
|
same interface and generates the same set of files, but it renders
|
|
the dataflow state after building the gen- and kill-sets but
|
|
*before* running the dataflow analysis itself, so each entry-set is
|
|
just the initial default state for that dataflow analysis. This is
|
|
less useful for understanding the error message output in these
|
|
tests.)
|