diff options
Diffstat (limited to 'src/librustc/mir/repr.rs')
-rw-r--r-- | src/librustc/mir/repr.rs | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/librustc/mir/repr.rs b/src/librustc/mir/repr.rs index 11bb381ec33..06d68af8838 100644 --- a/src/librustc/mir/repr.rs +++ b/src/librustc/mir/repr.rs @@ -14,6 +14,7 @@ use rustc_const_eval::{ConstUsize, ConstInt}; use middle::def_id::DefId; use middle::subst::Substs; use middle::ty::{self, AdtDef, ClosureSubsts, FnOutput, Region, Ty}; +use util::ppaux; use rustc_back::slice; use rustc_front::hir::InlineAsm; use std::ascii; @@ -177,6 +178,10 @@ pub struct TempDecl<'tcx> { #[derive(Clone, Debug, RustcEncodable, RustcDecodable)] pub struct ArgDecl<'tcx> { pub ty: Ty<'tcx>, + + /// If true, this argument is a tuple after monomorphization, + /// and has to be collected from multiple actual arguments. + pub spread: bool } /////////////////////////////////////////////////////////////////////////// @@ -675,7 +680,11 @@ pub enum Rvalue<'tcx> { from_end: usize, }, - InlineAsm(InlineAsm), + InlineAsm { + asm: InlineAsm, + outputs: Vec<Lvalue<'tcx>>, + inputs: Vec<Operand<'tcx>> + } } #[derive(Clone, Copy, Debug, PartialEq, Eq, RustcEncodable, RustcDecodable)] @@ -760,7 +769,9 @@ impl<'tcx> Debug for Rvalue<'tcx> { BinaryOp(ref op, ref a, ref b) => write!(fmt, "{:?}({:?}, {:?})", op, a, b), UnaryOp(ref op, ref a) => write!(fmt, "{:?}({:?})", op, a), Box(ref t) => write!(fmt, "Box({:?})", t), - InlineAsm(ref asm) => write!(fmt, "InlineAsm({:?})", asm), + InlineAsm { ref asm, ref outputs, ref inputs } => { + write!(fmt, "asm!({:?} : {:?} : {:?})", asm, outputs, inputs) + } Slice { ref input, from_start, from_end } => write!(fmt, "{:?}[{:?}..-{:?}]", input, from_start, from_end), @@ -775,8 +786,8 @@ impl<'tcx> Debug for Rvalue<'tcx> { Aggregate(ref kind, ref lvs) => { use self::AggregateKind::*; - fn fmt_tuple(fmt: &mut Formatter, name: &str, lvs: &[Operand]) -> fmt::Result { - let mut tuple_fmt = fmt.debug_tuple(name); + fn fmt_tuple(fmt: &mut Formatter, lvs: &[Operand]) -> fmt::Result { + let mut tuple_fmt = fmt.debug_tuple(""); for lv in lvs { tuple_fmt.field(lv); } @@ -790,19 +801,24 @@ impl<'tcx> Debug for Rvalue<'tcx> { match lvs.len() { 0 => write!(fmt, "()"), 1 => write!(fmt, "({:?},)", lvs[0]), - _ => fmt_tuple(fmt, "", lvs), + _ => fmt_tuple(fmt, lvs), } } - Adt(adt_def, variant, _) => { + Adt(adt_def, variant, substs) => { let variant_def = &adt_def.variants[variant]; - let name = ty::tls::with(|tcx| tcx.item_path_str(variant_def.did)); + + try!(ppaux::parameterized(fmt, substs, variant_def.did, + ppaux::Ns::Value, &[], + |tcx| { + tcx.lookup_item_type(variant_def.did).generics + })); match variant_def.kind() { - ty::VariantKind::Unit => write!(fmt, "{}", name), - ty::VariantKind::Tuple => fmt_tuple(fmt, &name, lvs), + ty::VariantKind::Unit => Ok(()), + ty::VariantKind::Tuple => fmt_tuple(fmt, lvs), ty::VariantKind::Struct => { - let mut struct_fmt = fmt.debug_struct(&name); + let mut struct_fmt = fmt.debug_struct(""); for (field, lv) in variant_def.fields.iter().zip(lvs) { struct_fmt.field(&field.name.as_str(), lv); } @@ -882,8 +898,10 @@ impl<'tcx> Debug for Literal<'tcx> { fn fmt(&self, fmt: &mut Formatter) -> fmt::Result { use self::Literal::*; match *self { - Item { def_id, .. } => - write!(fmt, "{}", item_path_str(def_id)), + Item { def_id, substs } => { + ppaux::parameterized(fmt, substs, def_id, ppaux::Ns::Value, &[], + |tcx| tcx.lookup_item_type(def_id).generics) + } Value { ref value } => { try!(write!(fmt, "const ")); fmt_const_val(fmt, value) |