Skip to content

Commit 3f513bd

Browse files
authored
Rollup merge of rust-lang#118266 - celinval:smir-break-files, r=compiler-errors
Move stuff around on `stable_mir` and `rustc_smir` crate 1. Break down rustc_smir/mod.rs file. - This file was getting too big and causing a lot of merge conflicts. All these changes shouldn't be visible to users since this module is private. 2. Move the compiler interface defs to its own module - Separate items that are exposed in the `stable_mir` crate to be used by the compiler from items that we expect to be used by tool developers.
2 parents 23461fd + f8c2478 commit 3f513bd

File tree

8 files changed

+2205
-2150
lines changed

8 files changed

+2205
-2150
lines changed

compiler/rustc_smir/src/rustc_internal/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//! For that, we define APIs that will temporarily be public to 3P that exposes rustc internal APIs
44
//! until stable MIR is complete.
55
6-
use crate::rustc_smir::{Stable, Tables, TablesWrapper};
6+
use crate::rustc_smir::{context::TablesWrapper, Stable, Tables};
77
use rustc_data_structures::fx;
88
use rustc_data_structures::fx::FxIndexMap;
99
use rustc_middle::mir::interpret::AllocId;
@@ -181,7 +181,7 @@ where
181181
instances: IndexMap::default(),
182182
constants: IndexMap::default(),
183183
}));
184-
stable_mir::run(&tables, || init(&tables, f))
184+
stable_mir::compiler_interface::run(&tables, || init(&tables, f))
185185
}
186186

187187
#[macro_export]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,376 @@
1+
//! Implementation of `[stable_mir::compiler_interface::Context]` trait.
2+
//!
3+
//! This trait is currently the main interface between the Rust compiler,
4+
//! and the `stable_mir` crate.
5+
6+
use rustc_middle::ty::print::{with_forced_trimmed_paths, with_no_trimmed_paths};
7+
use rustc_middle::ty::{GenericPredicates, Instance, ParamEnv, ScalarInt, ValTree};
8+
use rustc_span::def_id::LOCAL_CRATE;
9+
use stable_mir::compiler_interface::Context;
10+
use stable_mir::mir::alloc::GlobalAlloc;
11+
use stable_mir::mir::mono::{InstanceDef, StaticDef};
12+
use stable_mir::mir::Body;
13+
use stable_mir::ty::{
14+
AdtDef, AdtKind, Allocation, ClosureDef, ClosureKind, Const, FnDef, GenericArgs, LineInfo,
15+
RigidTy, Span, TyKind,
16+
};
17+
use stable_mir::{self, Crate, CrateItem, Error, Filename, ItemKind, Symbol};
18+
use std::cell::RefCell;
19+
20+
use crate::rustc_internal::{internal, RustcInternal};
21+
use crate::rustc_smir::builder::BodyBuilder;
22+
use crate::rustc_smir::{new_item_kind, smir_crate, Stable, Tables};
23+
24+
impl<'tcx> Context for TablesWrapper<'tcx> {
25+
fn entry_fn(&self) -> Option<stable_mir::CrateItem> {
26+
let mut tables = self.0.borrow_mut();
27+
let tcx = tables.tcx;
28+
Some(tables.crate_item(tcx.entry_fn(())?.0))
29+
}
30+
31+
fn all_local_items(&self) -> stable_mir::CrateItems {
32+
let mut tables = self.0.borrow_mut();
33+
tables.tcx.mir_keys(()).iter().map(|item| tables.crate_item(item.to_def_id())).collect()
34+
}
35+
36+
fn mir_body(&self, item: stable_mir::DefId) -> stable_mir::mir::Body {
37+
let mut tables = self.0.borrow_mut();
38+
let def_id = tables[item];
39+
tables.tcx.instance_mir(rustc_middle::ty::InstanceDef::Item(def_id)).stable(&mut tables)
40+
}
41+
42+
fn all_trait_decls(&self) -> stable_mir::TraitDecls {
43+
let mut tables = self.0.borrow_mut();
44+
tables
45+
.tcx
46+
.traits(LOCAL_CRATE)
47+
.iter()
48+
.map(|trait_def_id| tables.trait_def(*trait_def_id))
49+
.collect()
50+
}
51+
52+
fn trait_decl(&self, trait_def: &stable_mir::ty::TraitDef) -> stable_mir::ty::TraitDecl {
53+
let mut tables = self.0.borrow_mut();
54+
let def_id = tables[trait_def.0];
55+
let trait_def = tables.tcx.trait_def(def_id);
56+
trait_def.stable(&mut *tables)
57+
}
58+
59+
fn all_trait_impls(&self) -> stable_mir::ImplTraitDecls {
60+
let mut tables = self.0.borrow_mut();
61+
tables
62+
.tcx
63+
.trait_impls_in_crate(LOCAL_CRATE)
64+
.iter()
65+
.map(|impl_def_id| tables.impl_def(*impl_def_id))
66+
.collect()
67+
}
68+
69+
fn trait_impl(&self, impl_def: &stable_mir::ty::ImplDef) -> stable_mir::ty::ImplTrait {
70+
let mut tables = self.0.borrow_mut();
71+
let def_id = tables[impl_def.0];
72+
let impl_trait = tables.tcx.impl_trait_ref(def_id).unwrap();
73+
impl_trait.stable(&mut *tables)
74+
}
75+
76+
fn generics_of(&self, def_id: stable_mir::DefId) -> stable_mir::ty::Generics {
77+
let mut tables = self.0.borrow_mut();
78+
let def_id = tables[def_id];
79+
let generics = tables.tcx.generics_of(def_id);
80+
generics.stable(&mut *tables)
81+
}
82+
83+
fn predicates_of(&self, def_id: stable_mir::DefId) -> stable_mir::ty::GenericPredicates {
84+
let mut tables = self.0.borrow_mut();
85+
let def_id = tables[def_id];
86+
let GenericPredicates { parent, predicates } = tables.tcx.predicates_of(def_id);
87+
stable_mir::ty::GenericPredicates {
88+
parent: parent.map(|did| tables.trait_def(did)),
89+
predicates: predicates
90+
.iter()
91+
.map(|(clause, span)| {
92+
(
93+
clause.as_predicate().kind().skip_binder().stable(&mut *tables),
94+
span.stable(&mut *tables),
95+
)
96+
})
97+
.collect(),
98+
}
99+
}
100+
101+
fn explicit_predicates_of(
102+
&self,
103+
def_id: stable_mir::DefId,
104+
) -> stable_mir::ty::GenericPredicates {
105+
let mut tables = self.0.borrow_mut();
106+
let def_id = tables[def_id];
107+
let GenericPredicates { parent, predicates } = tables.tcx.explicit_predicates_of(def_id);
108+
stable_mir::ty::GenericPredicates {
109+
parent: parent.map(|did| tables.trait_def(did)),
110+
predicates: predicates
111+
.iter()
112+
.map(|(clause, span)| {
113+
(
114+
clause.as_predicate().kind().skip_binder().stable(&mut *tables),
115+
span.stable(&mut *tables),
116+
)
117+
})
118+
.collect(),
119+
}
120+
}
121+
122+
fn local_crate(&self) -> stable_mir::Crate {
123+
let tables = self.0.borrow();
124+
smir_crate(tables.tcx, LOCAL_CRATE)
125+
}
126+
127+
fn external_crates(&self) -> Vec<stable_mir::Crate> {
128+
let tables = self.0.borrow();
129+
tables.tcx.crates(()).iter().map(|crate_num| smir_crate(tables.tcx, *crate_num)).collect()
130+
}
131+
132+
fn find_crates(&self, name: &str) -> Vec<stable_mir::Crate> {
133+
let tables = self.0.borrow();
134+
let crates: Vec<stable_mir::Crate> = [LOCAL_CRATE]
135+
.iter()
136+
.chain(tables.tcx.crates(()).iter())
137+
.map(|crate_num| {
138+
let crate_name = tables.tcx.crate_name(*crate_num).to_string();
139+
(name == crate_name).then(|| smir_crate(tables.tcx, *crate_num))
140+
})
141+
.into_iter()
142+
.filter_map(|c| c)
143+
.collect();
144+
crates
145+
}
146+
147+
fn def_name(&self, def_id: stable_mir::DefId, trimmed: bool) -> Symbol {
148+
let tables = self.0.borrow();
149+
if trimmed {
150+
with_forced_trimmed_paths!(tables.tcx.def_path_str(tables[def_id]))
151+
} else {
152+
with_no_trimmed_paths!(tables.tcx.def_path_str(tables[def_id]))
153+
}
154+
}
155+
156+
fn span_to_string(&self, span: stable_mir::ty::Span) -> String {
157+
let tables = self.0.borrow();
158+
tables.tcx.sess.source_map().span_to_diagnostic_string(tables[span])
159+
}
160+
161+
fn get_filename(&self, span: &Span) -> Filename {
162+
let tables = self.0.borrow();
163+
tables
164+
.tcx
165+
.sess
166+
.source_map()
167+
.span_to_filename(tables[*span])
168+
.display(rustc_span::FileNameDisplayPreference::Local)
169+
.to_string()
170+
}
171+
172+
fn get_lines(&self, span: &Span) -> LineInfo {
173+
let tables = self.0.borrow();
174+
let lines = &tables.tcx.sess.source_map().span_to_location_info(tables[*span]);
175+
LineInfo { start_line: lines.1, start_col: lines.2, end_line: lines.3, end_col: lines.4 }
176+
}
177+
178+
fn item_kind(&self, item: CrateItem) -> ItemKind {
179+
let tables = self.0.borrow();
180+
new_item_kind(tables.tcx.def_kind(tables[item.0]))
181+
}
182+
183+
fn is_foreign_item(&self, item: CrateItem) -> bool {
184+
let tables = self.0.borrow();
185+
tables.tcx.is_foreign_item(tables[item.0])
186+
}
187+
188+
fn adt_kind(&self, def: AdtDef) -> AdtKind {
189+
let mut tables = self.0.borrow_mut();
190+
def.internal(&mut *tables).adt_kind().stable(&mut *tables)
191+
}
192+
193+
fn adt_is_box(&self, def: AdtDef) -> bool {
194+
let mut tables = self.0.borrow_mut();
195+
def.internal(&mut *tables).is_box()
196+
}
197+
198+
fn eval_target_usize(&self, cnst: &Const) -> Result<u64, Error> {
199+
let mut tables = self.0.borrow_mut();
200+
let mir_const = cnst.internal(&mut *tables);
201+
mir_const
202+
.try_eval_target_usize(tables.tcx, ParamEnv::empty())
203+
.ok_or_else(|| Error::new(format!("Const `{cnst:?}` cannot be encoded as u64")))
204+
}
205+
206+
fn usize_to_const(&self, val: u64) -> Result<Const, Error> {
207+
let mut tables = self.0.borrow_mut();
208+
let ty = tables.tcx.types.usize;
209+
let size = tables.tcx.layout_of(ParamEnv::empty().and(ty)).unwrap().size;
210+
211+
let scalar = ScalarInt::try_from_uint(val, size).ok_or_else(|| {
212+
Error::new(format!("Value overflow: cannot convert `{val}` to usize."))
213+
})?;
214+
Ok(rustc_middle::ty::Const::new_value(tables.tcx, ValTree::from_scalar_int(scalar), ty)
215+
.stable(&mut *tables))
216+
}
217+
218+
fn new_rigid_ty(&self, kind: RigidTy) -> stable_mir::ty::Ty {
219+
let mut tables = self.0.borrow_mut();
220+
let internal_kind = kind.internal(&mut *tables);
221+
tables.tcx.mk_ty_from_kind(internal_kind).stable(&mut *tables)
222+
}
223+
224+
fn def_ty(&self, item: stable_mir::DefId) -> stable_mir::ty::Ty {
225+
let mut tables = self.0.borrow_mut();
226+
tables.tcx.type_of(item.internal(&mut *tables)).instantiate_identity().stable(&mut *tables)
227+
}
228+
229+
fn const_literal(&self, cnst: &stable_mir::ty::Const) -> String {
230+
internal(cnst).to_string()
231+
}
232+
233+
fn span_of_an_item(&self, def_id: stable_mir::DefId) -> Span {
234+
let mut tables = self.0.borrow_mut();
235+
tables.tcx.def_span(tables[def_id]).stable(&mut *tables)
236+
}
237+
238+
fn ty_kind(&self, ty: stable_mir::ty::Ty) -> TyKind {
239+
let mut tables = self.0.borrow_mut();
240+
tables.types[ty].kind().stable(&mut *tables)
241+
}
242+
243+
fn instance_body(&self, def: InstanceDef) -> Option<Body> {
244+
let mut tables = self.0.borrow_mut();
245+
let instance = tables.instances[def];
246+
tables
247+
.has_body(instance)
248+
.then(|| BodyBuilder::new(tables.tcx, instance).build(&mut *tables))
249+
}
250+
251+
fn instance_ty(&self, def: InstanceDef) -> stable_mir::ty::Ty {
252+
let mut tables = self.0.borrow_mut();
253+
let instance = tables.instances[def];
254+
instance.ty(tables.tcx, ParamEnv::empty()).stable(&mut *tables)
255+
}
256+
257+
fn instance_def_id(&self, def: InstanceDef) -> stable_mir::DefId {
258+
let mut tables = self.0.borrow_mut();
259+
let def_id = tables.instances[def].def_id();
260+
tables.create_def_id(def_id)
261+
}
262+
263+
fn instance_mangled_name(&self, instance: InstanceDef) -> Symbol {
264+
let tables = self.0.borrow_mut();
265+
let instance = tables.instances[instance];
266+
tables.tcx.symbol_name(instance).name.to_string()
267+
}
268+
269+
fn mono_instance(&self, item: stable_mir::CrateItem) -> stable_mir::mir::mono::Instance {
270+
let mut tables = self.0.borrow_mut();
271+
let def_id = tables[item.0];
272+
Instance::mono(tables.tcx, def_id).stable(&mut *tables)
273+
}
274+
275+
fn requires_monomorphization(&self, def_id: stable_mir::DefId) -> bool {
276+
let tables = self.0.borrow();
277+
let def_id = tables[def_id];
278+
let generics = tables.tcx.generics_of(def_id);
279+
let result = generics.requires_monomorphization(tables.tcx);
280+
result
281+
}
282+
283+
fn resolve_instance(
284+
&self,
285+
def: stable_mir::ty::FnDef,
286+
args: &stable_mir::ty::GenericArgs,
287+
) -> Option<stable_mir::mir::mono::Instance> {
288+
let mut tables = self.0.borrow_mut();
289+
let def_id = def.0.internal(&mut *tables);
290+
let args_ref = args.internal(&mut *tables);
291+
match Instance::resolve(tables.tcx, ParamEnv::reveal_all(), def_id, args_ref) {
292+
Ok(Some(instance)) => Some(instance.stable(&mut *tables)),
293+
Ok(None) | Err(_) => None,
294+
}
295+
}
296+
297+
fn resolve_drop_in_place(&self, ty: stable_mir::ty::Ty) -> stable_mir::mir::mono::Instance {
298+
let mut tables = self.0.borrow_mut();
299+
let internal_ty = ty.internal(&mut *tables);
300+
let instance = Instance::resolve_drop_in_place(tables.tcx, internal_ty);
301+
instance.stable(&mut *tables)
302+
}
303+
304+
fn resolve_for_fn_ptr(
305+
&self,
306+
def: FnDef,
307+
args: &GenericArgs,
308+
) -> Option<stable_mir::mir::mono::Instance> {
309+
let mut tables = self.0.borrow_mut();
310+
let def_id = def.0.internal(&mut *tables);
311+
let args_ref = args.internal(&mut *tables);
312+
Instance::resolve_for_fn_ptr(tables.tcx, ParamEnv::reveal_all(), def_id, args_ref)
313+
.stable(&mut *tables)
314+
}
315+
316+
fn resolve_closure(
317+
&self,
318+
def: ClosureDef,
319+
args: &GenericArgs,
320+
kind: ClosureKind,
321+
) -> Option<stable_mir::mir::mono::Instance> {
322+
let mut tables = self.0.borrow_mut();
323+
let def_id = def.0.internal(&mut *tables);
324+
let args_ref = args.internal(&mut *tables);
325+
let closure_kind = kind.internal(&mut *tables);
326+
Instance::resolve_closure(tables.tcx, def_id, args_ref, closure_kind).stable(&mut *tables)
327+
}
328+
329+
fn eval_static_initializer(&self, def: StaticDef) -> Result<Allocation, Error> {
330+
let mut tables = self.0.borrow_mut();
331+
let def_id = def.0.internal(&mut *tables);
332+
tables.tcx.eval_static_initializer(def_id).stable(&mut *tables)
333+
}
334+
335+
fn global_alloc(&self, alloc: stable_mir::mir::alloc::AllocId) -> GlobalAlloc {
336+
let mut tables = self.0.borrow_mut();
337+
let alloc_id = alloc.internal(&mut *tables);
338+
tables.tcx.global_alloc(alloc_id).stable(&mut *tables)
339+
}
340+
341+
fn vtable_allocation(
342+
&self,
343+
global_alloc: &GlobalAlloc,
344+
) -> Option<stable_mir::mir::alloc::AllocId> {
345+
let mut tables = self.0.borrow_mut();
346+
let GlobalAlloc::VTable(ty, trait_ref) = global_alloc else { return None };
347+
let alloc_id = tables
348+
.tcx
349+
.vtable_allocation((ty.internal(&mut *tables), trait_ref.internal(&mut *tables)));
350+
Some(alloc_id.stable(&mut *tables))
351+
}
352+
353+
fn krate(&self, def_id: stable_mir::DefId) -> Crate {
354+
let tables = self.0.borrow();
355+
smir_crate(tables.tcx, tables[def_id].krate)
356+
}
357+
358+
/// Retrieve the instance name for diagnostic messages.
359+
///
360+
/// This will return the specialized name, e.g., `Vec<char>::new`.
361+
fn instance_name(&self, def: InstanceDef, trimmed: bool) -> Symbol {
362+
let tables = self.0.borrow_mut();
363+
let instance = tables.instances[def];
364+
if trimmed {
365+
with_forced_trimmed_paths!(
366+
tables.tcx.def_path_str_with_args(instance.def_id(), instance.args)
367+
)
368+
} else {
369+
with_no_trimmed_paths!(
370+
tables.tcx.def_path_str_with_args(instance.def_id(), instance.args)
371+
)
372+
}
373+
}
374+
}
375+
376+
pub struct TablesWrapper<'tcx>(pub RefCell<Tables<'tcx>>);

0 commit comments

Comments
 (0)