From 24a5a02752bc164fe926317a2f73ff14fc9596be Mon Sep 17 00:00:00 2001 From: Jakob Stoklund Olesen Date: Fri, 15 Sep 2017 10:48:53 -0700 Subject: [PATCH] Add a RegDiversions::display() function. Display the current register diversions for debugging purposes. --- lib/cretonne/src/regalloc/diversion.rs | 32 +++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/cretonne/src/regalloc/diversion.rs b/lib/cretonne/src/regalloc/diversion.rs index 103c624d5e..769998de3a 100644 --- a/lib/cretonne/src/regalloc/diversion.rs +++ b/lib/cretonne/src/regalloc/diversion.rs @@ -9,7 +9,8 @@ use entity::EntityMap; use ir::{Value, ValueLoc}; -use isa::RegUnit; +use isa::{RegUnit, RegInfo}; +use std::fmt; /// A diversion of a value from its original register location to a new register. /// @@ -99,6 +100,35 @@ impl RegDiversions { }, ) } + + /// Return an object that can display the diversions. + pub fn display<'a, R: Into>>(&'a self, regs: R) -> DisplayDiversions<'a> { + DisplayDiversions(self, regs.into()) + } +} + +/// Object that displays register diversions. +pub struct DisplayDiversions<'a>(&'a RegDiversions, Option<&'a RegInfo>); + +impl<'a> fmt::Display for DisplayDiversions<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{{")?; + for div in self.0.all() { + match self.1 { + Some(regs) => { + write!( + f, + " {}: {} -> {}", + div.value, + regs.display_regunit(div.from), + regs.display_regunit(div.to) + )? + } + None => write!(f, " {}: %{} -> %{}", div.value, div.from, div.to)?, + } + } + write!(f, " }}") + } } #[cfg(test)]