Skip to content

Commit bab21f3

Browse files
committed
add stable_mir output test
1 parent aa33051 commit bab21f3

File tree

7 files changed

+87
-17
lines changed

7 files changed

+87
-17
lines changed

compiler/rustc_smir/src/rustc_smir/context.rs

+8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
//! This trait is currently the main interface between the Rust compiler,
44
//! and the `stable_mir` crate.
55
6+
use crate::rustc_smir::stable_mir::opaque;
67
use rustc_middle::ty::print::{with_forced_trimmed_paths, with_no_trimmed_paths};
78
use rustc_middle::ty::{GenericPredicates, Instance, ParamEnv, ScalarInt, ValTree};
89
use rustc_span::def_id::LOCAL_CRATE;
@@ -14,6 +15,7 @@ use stable_mir::ty::{
1415
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FnDef, GenericArgs, LineInfo,
1516
RigidTy, Span, TyKind,
1617
};
18+
use stable_mir::Opaque;
1719
use stable_mir::{self, Crate, CrateItem, Error, Filename, ItemKind, Symbol};
1820
use std::cell::RefCell;
1921

@@ -230,6 +232,12 @@ impl<'tcx> Context for TablesWrapper<'tcx> {
230232
internal(cnst).to_string()
231233
}
232234

235+
fn adt_literal(&self, adt: &AdtDef) -> Opaque {
236+
let mut tables = self.0.borrow_mut();
237+
let internal = adt.internal(&mut *tables);
238+
opaque(&internal)
239+
}
240+
233241
fn span_of_an_item(&self, def_id: stable_mir::DefId) -> Span {
234242
let mut tables = self.0.borrow_mut();
235243
tables.tcx.def_span(tables[def_id]).stable(&mut *tables)

compiler/stable_mir/src/compiler_interface.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use crate::ty::{
1414
Ty, TyKind,
1515
};
1616
use crate::{
17-
mir, Crate, CrateItem, CrateItems, DefId, Error, Filename, ImplTraitDecls, ItemKind, Symbol,
18-
TraitDecls,
17+
mir, Crate, CrateItem, CrateItems, DefId, Error, Filename, ImplTraitDecls, ItemKind, Opaque,
18+
Symbol, TraitDecls,
1919
};
2020

2121
/// This trait defines the interface between stable_mir and the Rust compiler.
@@ -79,6 +79,9 @@ pub trait Context {
7979
/// Returns literal value of a const as a string.
8080
fn const_literal(&self, cnst: &Const) -> String;
8181

82+
/// Returns literal version of a Adt as a Opaque
83+
fn adt_literal(&self, adt: &AdtDef) -> Opaque;
84+
8285
/// `Span` of an item
8386
fn span_of_an_item(&self, def_id: DefId) -> Span;
8487

compiler/stable_mir/src/mir/body.rs

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ impl Body {
8787
Ok(())
8888
})
8989
.collect::<Result<Vec<_>, _>>()?;
90+
writeln!(w, "}}")?;
9091
Ok(())
9192
}
9293
}

compiler/stable_mir/src/mir/pretty.rs

+21-14
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use crate::mir::{Operand, Rvalue, StatementKind};
33
use crate::ty::{DynKind, FloatTy, IntTy, RigidTy, TyKind, UintTy};
44
use crate::{with, Body, CrateItem, Mutability};
55

6+
use super::BorrowKind;
7+
68
pub fn function_name(item: CrateItem) -> String {
79
let mut pretty_name = String::new();
810
let body = item.body();
@@ -36,7 +38,6 @@ pub fn function_body(body: &Body) -> String {
3638
pretty_body.push_str(format!("{}", pretty_ty(local.ty.kind())).as_str());
3739
pretty_body.push_str(";\n");
3840
});
39-
pretty_body.push_str("}");
4041
pretty_body
4142
}
4243

@@ -98,6 +99,7 @@ pub fn pretty_rvalue(rval: &Rvalue) -> String {
9899
pretty.push_str(format!("(*_{})", addr.local).as_str());
99100
}
100101
Rvalue::Aggregate(aggregatekind, operands) => {
102+
// FIXME: Add pretty_aggregate function that returns a pretty string
101103
pretty.push_str(format!("{:#?}", aggregatekind).as_str());
102104
pretty.push_str("(");
103105
operands.iter().enumerate().for_each(|(i, op)| {
@@ -108,24 +110,26 @@ pub fn pretty_rvalue(rval: &Rvalue) -> String {
108110
});
109111
pretty.push_str(")");
110112
}
111-
Rvalue::BinaryOp(bin, op, op2) => {
112-
pretty.push_str(&pretty_operand(op));
113-
pretty.push_str(" ");
113+
Rvalue::BinaryOp(bin, op1, op2) => {
114114
pretty.push_str(format!("{:#?}", bin).as_str());
115-
pretty.push_str(" ");
116-
pretty.push_str(&pretty_operand(op2));
115+
pretty.push_str("(");
116+
pretty.push_str(format!("_{}", &pretty_operand(op1)).as_str());
117+
pretty.push_str(", ");
118+
pretty.push_str(format!("{}", &pretty_operand(op2)).as_str());
119+
pretty.push_str(")");
117120
}
118121
Rvalue::Cast(_, op, ty) => {
119122
pretty.push_str(&pretty_operand(op));
120123
pretty.push_str(" as ");
121124
pretty.push_str(&pretty_ty(ty.kind()));
122125
}
123126
Rvalue::CheckedBinaryOp(bin, op1, op2) => {
124-
pretty.push_str(&pretty_operand(op1));
125-
pretty.push_str(" ");
126-
pretty.push_str(format!("{:#?}", bin).as_str());
127-
pretty.push_str(" ");
128-
pretty.push_str(&pretty_operand(op2));
127+
pretty.push_str(format!("Checked{:#?}", bin).as_str());
128+
pretty.push_str("(");
129+
pretty.push_str(format!("_{}", &pretty_operand(op1)).as_str());
130+
pretty.push_str(", ");
131+
pretty.push_str(format!("{}", &pretty_operand(op2)).as_str());
132+
pretty.push_str(")");
129133
}
130134
Rvalue::CopyForDeref(deref) => {
131135
pretty.push_str("CopyForDeref");
@@ -140,8 +144,11 @@ pub fn pretty_rvalue(rval: &Rvalue) -> String {
140144
pretty.push_str(format!("{}", len.local).as_str());
141145
}
142146
Rvalue::Ref(_, borrowkind, place) => {
143-
pretty.push_str("ref");
144-
pretty.push_str(format!("{:#?}", borrowkind).as_str());
147+
match borrowkind {
148+
BorrowKind::Shared => pretty.push_str("&"),
149+
BorrowKind::Fake => pretty.push_str("&fake "),
150+
BorrowKind::Mut { .. } => pretty.push_str("&mut "),
151+
}
145152
pretty.push_str(format!("{}", place.local).as_str());
146153
}
147154
Rvalue::Repeat(op, cnst) => {
@@ -196,7 +203,7 @@ pub fn pretty_ty(ty: TyKind) -> String {
196203
FloatTy::F64 => "f64".to_string(),
197204
},
198205
RigidTy::Adt(def, _) => {
199-
format!("{:#?}", with(|cx| cx.def_ty(def.0)))
206+
format!("{}", with(|cx| cx.adt_literal(&def)))
200207
}
201208
RigidTy::Str => "str".to_string(),
202209
RigidTy::Array(ty, len) => {

src/tools/tidy/src/ui_tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use std::path::{Path, PathBuf};
1111
const ENTRY_LIMIT: usize = 900;
1212
// FIXME: The following limits should be reduced eventually.
1313
const ISSUES_ENTRY_LIMIT: usize = 1852;
14-
const ROOT_ENTRY_LIMIT: usize = 867;
14+
const ROOT_ENTRY_LIMIT: usize = 868;
1515

1616
const EXPECTED_TEST_FILE_EXTENSIONS: &[&str] = &[
1717
"rs", // test source files
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// compile-flags: -Z unpretty=stable-mir
2+
// check-pass
3+
4+
fn foo(i:i32) -> i32 {
5+
i + 1
6+
}
7+
8+
fn bar(vec: &mut Vec<i32>) -> Vec<i32> {
9+
let mut new_vec = vec.clone();
10+
new_vec.push(1);
11+
new_vec
12+
}
13+
14+
fn main(){}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// WARNING: This is highly experimental output it's intended for stable-mir developers only.
2+
// If you find a bug or want to improve the output open a issue at https://github.com/rust-lang/project-stable-mir.
3+
fn foo(_0: i32) -> i32 {
4+
let mut _0: (i32, bool);
5+
6+
bb0: {
7+
_2 = CheckedAdd(_1, const 1_i32)
8+
}
9+
bb1: {
10+
_0 = move _2
11+
}
12+
}
13+
fn bar(_0: &mut std::vec::Vec) -> std::vec::Vec {
14+
let mut _0: std::vec::Vec;
15+
let mut _1: &std::vec::Vec;
16+
let _2: ();
17+
let mut _3: &mut std::vec::Vec;
18+
19+
bb0: {
20+
_3 = &1
21+
}
22+
bb1: {
23+
_5 = &mut 2
24+
}
25+
bb2: {
26+
_0 = move _2
27+
}
28+
bb3: {
29+
}
30+
bb4: {
31+
}
32+
}
33+
fn main() -> () {
34+
35+
bb0: {
36+
}
37+
}

0 commit comments

Comments
 (0)