Skip to content

Commit 9260305

Browse files
committed
rustc_mir: pretty-print all locals into their respective scopes.
1 parent d20da13 commit 9260305

File tree

5 files changed

+74
-96
lines changed

5 files changed

+74
-96
lines changed

src/librustc_mir/util/pretty.rs

+52-74
Original file line numberDiff line numberDiff line change
@@ -461,9 +461,7 @@ fn comment(tcx: TyCtxt<'_, '_, '_>, SourceInfo { span, scope }: SourceInfo) -> S
461461
)
462462
}
463463

464-
/// Prints user-defined variables in a scope tree.
465-
///
466-
/// Returns the total number of variables printed.
464+
/// Prints local variables in a scope tree.
467465
fn write_scope_tree(
468466
tcx: TyCtxt<'_, '_, '_>,
469467
mir: &Mir<'_>,
@@ -474,57 +472,64 @@ fn write_scope_tree(
474472
) -> io::Result<()> {
475473
let indent = depth * INDENT.len();
476474

475+
// Local variable types (including the user's name in a comment).
476+
for (local, local_decl) in mir.local_decls.iter_enumerated() {
477+
if (1..mir.arg_count+1).contains(&local.index()) {
478+
// Skip over argument locals, they're printed in the signature.
479+
continue;
480+
}
481+
482+
if local_decl.source_info.scope != parent {
483+
// Not declared in this scope.
484+
continue;
485+
}
486+
487+
let mut_str = if local_decl.mutability == Mutability::Mut {
488+
"mut "
489+
} else {
490+
""
491+
};
492+
493+
let mut indented_decl = format!(
494+
"{0:1$}let {2}{3:?}: {4:?}",
495+
INDENT,
496+
indent,
497+
mut_str,
498+
local,
499+
local_decl.ty
500+
);
501+
for user_ty in local_decl.user_ty.projections() {
502+
write!(indented_decl, " as {:?}", user_ty).unwrap();
503+
}
504+
indented_decl.push_str(";");
505+
506+
let local_name = if local == RETURN_PLACE {
507+
format!(" return place")
508+
} else if let Some(name) = local_decl.name {
509+
format!(" \"{}\"", name)
510+
} else {
511+
String::new()
512+
};
513+
514+
writeln!(
515+
w,
516+
"{0:1$} //{2} in {3}",
517+
indented_decl,
518+
ALIGN,
519+
local_name,
520+
comment(tcx, local_decl.source_info),
521+
)?;
522+
}
523+
477524
let children = match scope_tree.get(&parent) {
478-
Some(children) => children,
525+
Some(childs) => childs,
479526
None => return Ok(()),
480527
};
481528

482529
for &child in children {
483-
let data = &mir.source_scopes[child];
484-
assert_eq!(data.parent_scope, Some(parent));
530+
assert_eq!(mir.source_scopes[child].parent_scope, Some(parent));
485531
writeln!(w, "{0:1$}scope {2} {{", "", indent, child.index())?;
486-
487-
// User variable types (including the user's name in a comment).
488-
for local in mir.vars_iter() {
489-
let var = &mir.local_decls[local];
490-
let (name, source_info) = if var.source_info.scope == child {
491-
(var.name.unwrap(), var.source_info)
492-
} else {
493-
// Not a variable or not declared in this scope.
494-
continue;
495-
};
496-
497-
let mut_str = if var.mutability == Mutability::Mut {
498-
"mut "
499-
} else {
500-
""
501-
};
502-
503-
let indent = indent + INDENT.len();
504-
let mut indented_var = format!(
505-
"{0:1$}let {2}{3:?}: {4:?}",
506-
INDENT,
507-
indent,
508-
mut_str,
509-
local,
510-
var.ty
511-
);
512-
for user_ty in var.user_ty.projections() {
513-
write!(indented_var, " as {:?}", user_ty).unwrap();
514-
}
515-
indented_var.push_str(";");
516-
writeln!(
517-
w,
518-
"{0:1$} // \"{2}\" in {3}",
519-
indented_var,
520-
ALIGN,
521-
name,
522-
comment(tcx, source_info)
523-
)?;
524-
}
525-
526532
write_scope_tree(tcx, mir, scope_tree, w, child, depth + 1)?;
527-
528533
writeln!(w, "{0:1$}}}", "", depth * INDENT.len())?;
529534
}
530535

@@ -556,19 +561,8 @@ pub fn write_mir_intro<'a, 'gcx, 'tcx>(
556561
}
557562
}
558563

559-
// Print return place
560-
let indented_retptr = format!("{}let mut {:?}: {};",
561-
INDENT,
562-
RETURN_PLACE,
563-
mir.local_decls[RETURN_PLACE].ty);
564-
writeln!(w, "{0:1$} // return place",
565-
indented_retptr,
566-
ALIGN)?;
567-
568564
write_scope_tree(tcx, mir, &scope_tree, w, OUTERMOST_SOURCE_SCOPE, 1)?;
569565

570-
write_temp_decls(mir, w)?;
571-
572566
// Add an empty line before the first block is printed.
573567
writeln!(w, "")?;
574568

@@ -632,22 +626,6 @@ fn write_mir_sig(
632626
Ok(())
633627
}
634628

635-
fn write_temp_decls(mir: &Mir<'_>, w: &mut dyn Write) -> io::Result<()> {
636-
// Compiler-introduced temporary types.
637-
for temp in mir.temps_iter() {
638-
writeln!(
639-
w,
640-
"{}let {}{:?}: {};",
641-
INDENT,
642-
if mir.local_decls[temp].mutability == Mutability::Mut {"mut "} else {""},
643-
temp,
644-
mir.local_decls[temp].ty
645-
)?;
646-
}
647-
648-
Ok(())
649-
}
650-
651629
fn write_user_type_annotations(mir: &Mir<'_>, w: &mut dyn Write) -> io::Result<()> {
652630
if !mir.user_type_annotations.is_empty() {
653631
writeln!(w, "| User Type Annotations")?;

src/test/mir-opt/box_expr.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,14 @@ impl Drop for S {
2222
// END RUST SOURCE
2323
// START rustc.main.ElaborateDrops.before.mir
2424
// let mut _0: ();
25+
// let mut _2: std::boxed::Box<S>;
26+
// let mut _3: ();
27+
// let mut _4: std::boxed::Box<S>;
2528
// scope 1 {
2629
// }
2730
// scope 2 {
2831
// let _1: std::boxed::Box<S>;
2932
// }
30-
// let mut _2: std::boxed::Box<S>;
31-
// let mut _3: ();
32-
// let mut _4: std::boxed::Box<S>;
33-
//
3433
// bb0: {
3534
// StorageLive(_1);
3635
// StorageLive(_2);

src/test/mir-opt/issue-41110.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -29,27 +29,28 @@ impl S {
2929
// END RUST SOURCE
3030
// START rustc.main.ElaborateDrops.after.mir
3131
// let mut _0: ();
32+
// let mut _2: S;
33+
// let mut _3: S;
34+
// let mut _4: S;
35+
// let mut _5: bool;
3236
// scope 1 {
3337
// }
3438
// scope 2 {
3539
// let _1: ();
3640
// }
37-
// let mut _2: S;
38-
// let mut _3: S;
39-
// let mut _4: S;
40-
// let mut _5: bool;
41+
// ...
4142
// bb0: {
4243
// END rustc.main.ElaborateDrops.after.mir
4344
// START rustc.test.ElaborateDrops.after.mir
4445
// let mut _0: ();
46+
// let mut _3: ();
47+
// let mut _4: S;
48+
// let mut _5: S;
49+
// let mut _6: bool;
4550
// ...
4651
// let mut _2: S;
4752
// ...
4853
// let _1: S;
4954
// ...
50-
// let mut _3: ();
51-
// let mut _4: S;
52-
// let mut _5: S;
53-
// let mut _6: bool;
5455
// bb0: {
5556
// END rustc.test.ElaborateDrops.after.mir

src/test/mir-opt/issue-49232.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ fn main() {
1717
// START rustc.main.mir_map.0.mir
1818
// fn main() -> (){
1919
// let mut _0: ();
20-
// scope 1 {
21-
// }
22-
// scope 2 {
23-
// let _2: i32;
24-
// }
2520
// let mut _1: ();
2621
// let mut _3: bool;
2722
// let mut _4: !;
2823
// let mut _5: ();
2924
// let mut _6: &i32;
25+
// scope 1 {
26+
// }
27+
// scope 2 {
28+
// let _2: i32;
29+
// }
3030
// bb0: {
3131
// goto -> bb1;
3232
// }

src/test/mir-opt/packed-struct-drop-aligned.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ impl Drop for Droppy {
1818
// START rustc.main.EraseRegions.before.mir
1919
// fn main() -> () {
2020
// let mut _0: ();
21-
// scope 1 {
22-
// }
23-
// scope 2 {
24-
// let mut _1: Packed;
25-
// }
2621
// let mut _2: Aligned;
2722
// let mut _3: Droppy;
2823
// let mut _4: Aligned;
2924
// let mut _5: Droppy;
3025
// let mut _6: Aligned;
26+
// scope 1 {
27+
// }
28+
// scope 2 {
29+
// let mut _1: Packed;
30+
// }
3131
//
3232
// bb0: {
3333
// StorageLive(_1);

0 commit comments

Comments
 (0)