Skip to content

Commit 5ad84ed

Browse files
committed
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.
1 parent 42ae1a7 commit 5ad84ed

File tree

6 files changed

+2021
-1986
lines changed

6 files changed

+2021
-1986
lines changed

compiler/rustc_smir/src/rustc_internal/mod.rs

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

0 commit comments

Comments
 (0)