Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow a unique name to be assigned to dataflow graphviz output #76724

Merged
merged 2 commits into from
Sep 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions compiler/rustc_mir/src/borrow_check/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ fn do_mir_borrowck<'a, 'tcx>(

let mut flow_inits = MaybeInitializedPlaces::new(tcx, &body, &mdpe)
.into_engine(tcx, &body, def.did.to_def_id())
.pass_name("borrowck")
.iterate_to_fixpoint()
.into_results_cursor(&body);

Expand Down Expand Up @@ -264,12 +265,15 @@ fn do_mir_borrowck<'a, 'tcx>(

let flow_borrows = Borrows::new(tcx, &body, regioncx.clone(), &borrow_set)
.into_engine(tcx, &body, def.did.to_def_id())
.pass_name("borrowck")
.iterate_to_fixpoint();
let flow_uninits = MaybeUninitializedPlaces::new(tcx, &body, &mdpe)
.into_engine(tcx, &body, def.did.to_def_id())
.pass_name("borrowck")
.iterate_to_fixpoint();
let flow_ever_inits = EverInitializedPlaces::new(tcx, &body, &mdpe)
.into_engine(tcx, &body, def.did.to_def_id())
.pass_name("borrowck")
.iterate_to_fixpoint();

let movable_generator = match tcx.hir().get(id) {
Expand Down
22 changes: 20 additions & 2 deletions compiler/rustc_mir/src/dataflow/framework/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ where
def_id: DefId,
dead_unwinds: Option<&'a BitSet<BasicBlock>>,
entry_sets: IndexVec<BasicBlock, A::Domain>,
pass_name: Option<&'static str>,
analysis: A,

/// Cached, cumulative transfer functions for each block.
Expand Down Expand Up @@ -174,6 +175,7 @@ where
body,
def_id,
dead_unwinds: None,
pass_name: None,
entry_sets,
apply_trans_for_block,
}
Expand All @@ -189,6 +191,15 @@ where
self
}

/// Adds an identifier to the graphviz output for this particular run of a dataflow analysis.
///
/// Some analyses are run multiple times in the compilation pipeline. Give them a `pass_name`
/// to differentiate them. Otherwise, only the results for the latest run will be saved.
pub fn pass_name(mut self, name: &'static str) -> Self {
self.pass_name = Some(name);
self
}

/// Computes the fixpoint for this dataflow problem and returns it.
pub fn iterate_to_fixpoint(self) -> Results<'tcx, A>
where
Expand All @@ -202,6 +213,7 @@ where
mut entry_sets,
tcx,
apply_trans_for_block,
pass_name,
..
} = self;

Expand Down Expand Up @@ -249,7 +261,7 @@ where

let results = Results { analysis, entry_sets };

let res = write_graphviz_results(tcx, def_id, &body, &results);
let res = write_graphviz_results(tcx, def_id, &body, &results, pass_name);
if let Err(e) = res {
warn!("Failed to write graphviz dataflow results: {}", e);
}
Expand All @@ -267,6 +279,7 @@ fn write_graphviz_results<A>(
def_id: DefId,
body: &mir::Body<'tcx>,
results: &Results<'tcx, A>,
pass_name: Option<&'static str>,
) -> std::io::Result<()>
where
A: Analysis<'tcx>,
Expand All @@ -285,12 +298,17 @@ where
None if tcx.sess.opts.debugging_opts.dump_mir_dataflow
&& dump_enabled(tcx, A::NAME, def_id) =>
{
// FIXME: Use some variant of `pretty::dump_path` for this
let mut path = PathBuf::from(&tcx.sess.opts.debugging_opts.dump_mir_dir);

let crate_name = tcx.crate_name(def_id.krate);
let item_name = ty::print::with_forced_impl_filename_line(|| {
tcx.def_path(def_id).to_filename_friendly_no_crate()
});
path.push(format!("rustc.{}.{}.dot", item_name, A::NAME));

let pass_name = pass_name.map(|s| format!(".{}", s)).unwrap_or_default();

path.push(format!("{}.{}.{}{}.dot", crate_name, item_name, A::NAME, pass_name));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So these changes change the output file to

myowncrate.itemname....

from

rustc.itemname...

I guess this is intended?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, pretty::dump_path was updated to include the crate name, so nothing else in the mir_dump directory uses rustc. However, I don't have a MirSource, and the format is not quite right, so this was easier.

path
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ impl Qualifs<'mir, 'tcx> {
MaybeMutBorrowedLocals::mut_borrows_only(tcx, &body, param_env)
.unsound_ignore_borrow_on_drop()
.into_engine(tcx, &body, def_id.to_def_id())
.pass_name("const_qualification")
.iterate_to_fixpoint()
.into_results_cursor(&body)
});
Expand Down
3 changes: 3 additions & 0 deletions compiler/rustc_mir/src/transform/elaborate_drops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,15 @@ impl<'tcx> MirPass<'tcx> for ElaborateDrops {
let inits = MaybeInitializedPlaces::new(tcx, body, &env)
.into_engine(tcx, body, def_id)
.dead_unwinds(&dead_unwinds)
.pass_name("elaborate_drops")
.iterate_to_fixpoint()
.into_results_cursor(body);

let uninits = MaybeUninitializedPlaces::new(tcx, body, &env)
.mark_inactive_variants_as_uninit()
.into_engine(tcx, body, def_id)
.dead_unwinds(&dead_unwinds)
.pass_name("elaborate_drops")
.iterate_to_fixpoint()
.into_results_cursor(body);

Expand Down Expand Up @@ -83,6 +85,7 @@ fn find_dead_unwinds<'tcx>(
let mut dead_unwinds = BitSet::new_empty(body.basic_blocks().len());
let mut flow_inits = MaybeInitializedPlaces::new(tcx, body, &env)
.into_engine(tcx, body, def_id)
.pass_name("find_dead_unwinds")
.iterate_to_fixpoint()
.into_results_cursor(body);
for (bb, bb_data) in body.basic_blocks().iter_enumerated() {
Expand Down
7 changes: 5 additions & 2 deletions compiler/rustc_mir/src/transform/generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -467,8 +467,10 @@ fn locals_live_across_suspend_points(

// Calculate the MIR locals which have been previously
// borrowed (even if they are still active).
let borrowed_locals_results =
MaybeBorrowedLocals::all_borrows().into_engine(tcx, body_ref, def_id).iterate_to_fixpoint();
let borrowed_locals_results = MaybeBorrowedLocals::all_borrows()
.into_engine(tcx, body_ref, def_id)
.pass_name("generator")
.iterate_to_fixpoint();

let mut borrowed_locals_cursor =
dataflow::ResultsCursor::new(body_ref, &borrowed_locals_results);
Expand All @@ -484,6 +486,7 @@ fn locals_live_across_suspend_points(
// Calculate the liveness of MIR locals ignoring borrows.
let mut liveness = MaybeLiveLocals
.into_engine(tcx, body_ref, def_id)
.pass_name("generator")
.iterate_to_fixpoint()
.into_results_cursor(body_ref);

Expand Down
1 change: 1 addition & 0 deletions src/tools/clippy/clippy_lints/src/redundant_clone.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ impl<'tcx> LateLintPass<'tcx> for RedundantClone {

let maybe_storage_live_result = MaybeStorageLive
.into_engine(cx.tcx, mir, def_id.to_def_id())
.pass_name("redundant_clone")
.iterate_to_fixpoint()
.into_results_cursor(mir);
let mut possible_borrower = {
Expand Down