@@ -649,58 +649,15 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> {
649
649
& self ,
650
650
allocs_seen : & mut FxHashSet < AllocId > ,
651
651
allocs_to_print : & mut VecDeque < AllocId > ,
652
- mut msg : String ,
653
652
alloc : & Allocation < Tag , Extra > ,
654
- extra : String ,
655
653
) {
656
- use std:: fmt:: Write ;
657
-
658
- let prefix_len = msg. len ( ) ;
659
- let mut relocations = vec ! [ ] ;
660
-
661
- for i in 0 ..alloc. size . bytes ( ) {
662
- let i = Size :: from_bytes ( i) ;
663
- if let Some ( & ( _, target_id) ) = alloc. relocations ( ) . get ( & i) {
664
- if allocs_seen. insert ( target_id) {
665
- allocs_to_print. push_back ( target_id) ;
666
- }
667
- relocations. push ( ( i, target_id) ) ;
668
- }
669
- if alloc. undef_mask ( ) . is_range_defined ( i, i + Size :: from_bytes ( 1 ) ) . is_ok ( ) {
670
- // this `as usize` is fine, since `i` came from a `usize`
671
- let i = i. bytes_usize ( ) ;
672
-
673
- // Checked definedness (and thus range) and relocations. This access also doesn't
674
- // influence interpreter execution but is only for debugging.
675
- let bytes = alloc. inspect_with_undef_and_ptr_outside_interpreter ( i..i + 1 ) ;
676
- write ! ( msg, "{:02x} " , bytes[ 0 ] ) . unwrap ( ) ;
677
- } else {
678
- msg. push_str ( "__ " ) ;
654
+ for & ( _, ( _, target_id) ) in alloc. relocations ( ) . iter ( ) {
655
+ if allocs_seen. insert ( target_id) {
656
+ allocs_to_print. push_back ( target_id) ;
679
657
}
680
658
}
681
-
682
- eprintln ! (
683
- "{}({} bytes, alignment {}){}" ,
684
- msg,
685
- alloc. size. bytes( ) ,
686
- alloc. align. bytes( ) ,
687
- extra
688
- ) ;
689
-
690
- if !relocations. is_empty ( ) {
691
- msg. clear ( ) ;
692
- write ! ( msg, "{:1$}" , "" , prefix_len) . unwrap ( ) ; // Print spaces.
693
- let mut pos = Size :: ZERO ;
694
- let relocation_width = ( self . pointer_size ( ) . bytes ( ) - 1 ) * 3 ;
695
- for ( i, target_id) in relocations {
696
- write ! ( msg, "{:1$}" , "" , ( ( i - pos) * 3 ) . bytes_usize( ) ) . unwrap ( ) ;
697
- let target = format ! ( "({})" , target_id) ;
698
- // this `as usize` is fine, since we can't print more chars than `usize::MAX`
699
- write ! ( msg, "└{0:─^1$}┘ " , target, relocation_width as usize ) . unwrap ( ) ;
700
- pos = i + self . pointer_size ( ) ;
701
- }
702
- eprintln ! ( "{}" , msg) ;
703
- }
659
+ crate :: util:: pretty:: write_allocation ( self . tcx . tcx , alloc, & mut std:: io:: stderr ( ) , "" )
660
+ . unwrap ( ) ;
704
661
}
705
662
706
663
/// Print a list of allocations and all allocations they point to, recursively.
@@ -713,45 +670,42 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> {
713
670
let mut allocs_seen = FxHashSet :: default ( ) ;
714
671
715
672
while let Some ( id) = allocs_to_print. pop_front ( ) {
716
- let msg = format ! ( "Alloc {:<5} " , format!( "{}:" , id) ) ;
673
+ eprint ! ( "Alloc {:<5}: " , id) ;
674
+ fn msg < Tag , Extra > ( alloc : & Allocation < Tag , Extra > , extra : & str ) {
675
+ eprintln ! (
676
+ "({} bytes, alignment {}){}" ,
677
+ alloc. size. bytes( ) ,
678
+ alloc. align. bytes( ) ,
679
+ extra
680
+ )
681
+ } ;
717
682
718
683
// normal alloc?
719
684
match self . alloc_map . get_or ( id, || Err ( ( ) ) ) {
720
685
Ok ( ( kind, alloc) ) => {
721
- let extra = match kind {
722
- MemoryKind :: Stack => " (stack)" . to_owned ( ) ,
723
- MemoryKind :: Vtable => " (vtable)" . to_owned ( ) ,
724
- MemoryKind :: CallerLocation => " (caller_location)" . to_owned ( ) ,
725
- MemoryKind :: Machine ( m) => format ! ( " ({:?})" , m) ,
686
+ match kind {
687
+ MemoryKind :: Stack => msg ( alloc , " (stack)" ) ,
688
+ MemoryKind :: Vtable => msg ( alloc , " (vtable)" ) ,
689
+ MemoryKind :: CallerLocation => msg ( alloc , " (caller_location)" ) ,
690
+ MemoryKind :: Machine ( m) => msg ( alloc , & format ! ( " ({:?})" , m) ) ,
726
691
} ;
727
- self . dump_alloc_helper (
728
- & mut allocs_seen,
729
- & mut allocs_to_print,
730
- msg,
731
- alloc,
732
- extra,
733
- ) ;
692
+ self . dump_alloc_helper ( & mut allocs_seen, & mut allocs_to_print, alloc) ;
734
693
}
735
694
Err ( ( ) ) => {
736
695
// global alloc?
737
696
match self . tcx . alloc_map . lock ( ) . get ( id) {
738
697
Some ( GlobalAlloc :: Memory ( alloc) ) => {
739
- self . dump_alloc_helper (
740
- & mut allocs_seen,
741
- & mut allocs_to_print,
742
- msg,
743
- alloc,
744
- " (immutable)" . to_owned ( ) ,
745
- ) ;
698
+ msg ( alloc, " (immutable)" ) ;
699
+ self . dump_alloc_helper ( & mut allocs_seen, & mut allocs_to_print, alloc) ;
746
700
}
747
701
Some ( GlobalAlloc :: Function ( func) ) => {
748
- eprintln ! ( "{} {}" , msg , func) ;
702
+ eprintln ! ( "{}" , func) ;
749
703
}
750
704
Some ( GlobalAlloc :: Static ( did) ) => {
751
- eprintln ! ( "{} { :?}" , msg , did) ;
705
+ eprintln ! ( "{:?}" , did) ;
752
706
}
753
707
None => {
754
- eprintln ! ( "{} (deallocated)" , msg ) ;
708
+ eprintln ! ( "(deallocated)" ) ;
755
709
}
756
710
}
757
711
}
0 commit comments