|  | 
|  | 1 | +use std::collections::BTreeSet; | 
|  | 2 | +use std::fmt::Write as _; | 
|  | 3 | +use std::fmt::{Debug, Display}; | 
|  | 4 | +use std::fs; | 
|  | 5 | +use std::io::{self, Write}; | 
|  | 6 | +use std::path::{Path, PathBuf}; | 
|  | 7 | + | 
| 1 | 8 | use super::graphviz::write_mir_fn_graphviz; | 
| 2 | 9 | use crate::transform::MirSource; | 
| 3 | 10 | use either::Either; | 
| 4 | 11 | use rustc_data_structures::fx::FxHashMap; | 
| 5 | 12 | use rustc_hir::def_id::{DefId, LOCAL_CRATE}; | 
| 6 | 13 | use rustc_index::vec::Idx; | 
| 7 | 14 | use rustc_middle::mir::interpret::{ | 
| 8 |  | - read_target_uint, AllocId, Allocation, ConstValue, GlobalAlloc, | 
|  | 15 | + read_target_uint, AllocId, Allocation, ConstValue, GlobalAlloc, Pointer, | 
| 9 | 16 | }; | 
| 10 | 17 | use rustc_middle::mir::visit::Visitor; | 
| 11 | 18 | use rustc_middle::mir::*; | 
| 12 | 19 | use rustc_middle::ty::{self, TyCtxt, TypeFoldable, TypeVisitor}; | 
| 13 | 20 | use rustc_target::abi::Size; | 
| 14 |  | -use std::collections::BTreeSet; | 
| 15 |  | -use std::fmt::Display; | 
| 16 |  | -use std::fmt::Write as _; | 
| 17 |  | -use std::fs; | 
| 18 |  | -use std::io::{self, Write}; | 
| 19 |  | -use std::path::{Path, PathBuf}; | 
| 20 | 21 | 
 | 
| 21 | 22 | const INDENT: &str = " "; | 
| 22 | 23 | /// Alignment for lining up comments following MIR statements | 
| @@ -635,7 +636,7 @@ pub fn write_allocations<'tcx>( | 
| 635 | 636 | /// After the hex dump, an ascii dump follows, replacing all unprintable characters (control | 
| 636 | 637 | /// characters or characters whose value is larger than 127) with a `.` | 
| 637 | 638 | /// This also prints relocations adequately. | 
| 638 |  | -pub fn write_allocation<Tag, Extra>( | 
|  | 639 | +pub fn write_allocation<Tag: Copy + Debug, Extra>( | 
| 639 | 640 |  tcx: TyCtxt<'tcx>, | 
| 640 | 641 |  alloc: &Allocation<Tag, Extra>, | 
| 641 | 642 |  w: &mut dyn Write, | 
| @@ -679,7 +680,7 @@ fn write_allocation_newline( | 
| 679 | 680 | /// The `prefix` argument allows callers to add an arbitrary prefix before each line (even if there | 
| 680 | 681 | /// is only one line). Note that your prefix should contain a trailing space as the lines are | 
| 681 | 682 | /// printed directly after it. | 
| 682 |  | -fn write_allocation_bytes<Tag, Extra>( | 
|  | 683 | +fn write_allocation_bytes<Tag: Copy + Debug, Extra>( | 
| 683 | 684 |  tcx: TyCtxt<'tcx>, | 
| 684 | 685 |  alloc: &Allocation<Tag, Extra>, | 
| 685 | 686 |  w: &mut dyn Write, | 
| @@ -715,14 +716,20 @@ fn write_allocation_bytes<Tag, Extra>( | 
| 715 | 716 |  if i != line_start { | 
| 716 | 717 |  write!(w, " ")?; | 
| 717 | 718 |  } | 
| 718 |  | - if let Some(&(_, target_id)) = alloc.relocations().get(&i) { | 
|  | 719 | + if let Some(&(tag, target_id)) = alloc.relocations().get(&i) { | 
| 719 | 720 |  // Memory with a relocation must be defined | 
| 720 | 721 |  let j = i.bytes_usize(); | 
| 721 | 722 |  let offset = | 
| 722 | 723 |  alloc.inspect_with_undef_and_ptr_outside_interpreter(j..j + ptr_size.bytes_usize()); | 
| 723 | 724 |  let offset = read_target_uint(tcx.data_layout.endian, offset).unwrap(); | 
|  | 725 | + let offset = Size::from_bytes(offset); | 
| 724 | 726 |  let relocation_width = |bytes| bytes * 3; | 
| 725 |  | - let mut target = format!("{}+{}", target_id, offset); | 
|  | 727 | + let ptr = Pointer::new_with_tag(target_id, offset, tag); | 
|  | 728 | + let mut target = format!("{:?}", ptr); | 
|  | 729 | + if target.len() > relocation_width(ptr_size.bytes_usize() - 1) { | 
|  | 730 | + // This is too long, try to save some space. | 
|  | 731 | + target = format!("{:#?}", ptr); | 
|  | 732 | + } | 
| 726 | 733 |  if ((i - line_start) + ptr_size).bytes_usize() > BYTES_PER_LINE { | 
| 727 | 734 |  // This branch handles the situation where a relocation starts in the current line | 
| 728 | 735 |  // but ends in the next one. | 
|  | 
0 commit comments