Skip to content

Commit dd23814

Browse files
committed
Ban getting mir_for_ctfe of trivial consts
1 parent 314bd45 commit dd23814

File tree

11 files changed

+46
-13
lines changed

11 files changed

+46
-13
lines changed

compiler/rustc_const_eval/src/const_eval/eval_queries.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -292,10 +292,8 @@ pub fn eval_to_const_value_raw_provider<'tcx>(
292292
tcx: TyCtxt<'tcx>,
293293
key: ty::PseudoCanonicalInput<'tcx, GlobalId<'tcx>>,
294294
) -> ::rustc_middle::mir::interpret::EvalToConstValueResult<'tcx> {
295-
if let Some(def) = key.value.instance.def_id().as_local() {
296-
if let Some(value) = tcx.is_trivial_const(def) {
297-
return Ok(value);
298-
}
295+
if let Some((value, _ty)) = tcx.is_trivial_const(key.value.instance.def_id()) {
296+
return Ok(value);
299297
}
300298
tcx.eval_to_allocation_raw(key).map(|val| turn_into_const_value(tcx, val, key))
301299
}
@@ -361,6 +359,7 @@ fn eval_in_interpreter<'tcx, R: InterpretationResult<'tcx>>(
361359
typing_env: ty::TypingEnv<'tcx>,
362360
) -> Result<R, ErrorHandled> {
363361
let def = cid.instance.def.def_id();
362+
364363
let is_static = tcx.is_static(def);
365364

366365
let mut ecx = InterpCx::new(
@@ -373,6 +372,18 @@ fn eval_in_interpreter<'tcx, R: InterpretationResult<'tcx>>(
373372
// so we have to reject reading mutable global memory.
374373
CompileTimeMachine::new(CanAccessMutGlobal::from(is_static), CheckAlignment::Error),
375374
);
375+
376+
if let Some((value, ty)) = tcx.is_trivial_const(def) {
377+
let layout = ecx.layout_of(ty).unwrap();
378+
let opty = ecx.const_val_to_op(value, ty, Some(layout)).unwrap();
379+
let res = ecx.allocate(layout, MemoryKind::Stack).unwrap();
380+
ecx.copy_op(&opty, &res).unwrap();
381+
382+
intern_const_alloc_recursive(&mut ecx, InternKind::Constant, &res).unwrap();
383+
384+
return Ok(R::make_result(res, &mut ecx));
385+
}
386+
376387
let res = ecx.load_mir(cid.instance.def, cid.promoted);
377388
res.and_then(|body| eval_body_using_ecx(&mut ecx, cid, body))
378389
.report_err()

compiler/rustc_interface/src/passes.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1198,7 +1198,9 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) {
11981198
if tcx.sess.opts.unstable_opts.validate_mir {
11991199
sess.time("ensuring_final_MIR_is_computable", || {
12001200
tcx.par_hir_body_owners(|def_id| {
1201-
tcx.instance_mir(ty::InstanceKind::Item(def_id.into()));
1201+
if tcx.is_trivial_const(def_id).is_none() {
1202+
tcx.instance_mir(ty::InstanceKind::Item(def_id.into()));
1203+
}
12021204
});
12031205
});
12041206
}

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ provide! { tcx, def_id, other, cdata,
240240
thir_abstract_const => { table }
241241
optimized_mir => { table }
242242
mir_for_ctfe => { table }
243+
is_trivial_const => { table }
243244
closure_saved_names_of_captured_variables => { table }
244245
mir_coroutine_witnesses => { table }
245246
promoted_mir => { table }

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1792,7 +1792,11 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
17921792
}
17931793
}
17941794
if encode_const {
1795-
record!(self.tables.mir_for_ctfe[def_id.to_def_id()] <- tcx.mir_for_ctfe(def_id));
1795+
if let Some((val, ty)) = tcx.is_trivial_const(def_id) {
1796+
record!(self.tables.is_trivial_const[def_id.to_def_id()] <- (val, ty));
1797+
} else {
1798+
record!(self.tables.mir_for_ctfe[def_id.to_def_id()] <- tcx.mir_for_ctfe(def_id));
1799+
}
17961800

17971801
// FIXME(generic_const_exprs): this feels wrong to have in `encode_mir`
17981802
let abstract_const = tcx.thir_abstract_const(def_id);

compiler/rustc_metadata/src/rmeta/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
2929
use rustc_middle::middle::lib_features::FeatureStability;
3030
use rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault;
3131
use rustc_middle::mir;
32+
use rustc_middle::mir::ConstValue;
3233
use rustc_middle::ty::fast_reject::SimplifiedType;
3334
use rustc_middle::ty::{self, Ty, TyCtxt, UnusedGenericParams};
3435
use rustc_middle::util::Providers;
@@ -426,6 +427,7 @@ define_tables! {
426427
object_lifetime_default: Table<DefIndex, LazyValue<ObjectLifetimeDefault>>,
427428
optimized_mir: Table<DefIndex, LazyValue<mir::Body<'static>>>,
428429
mir_for_ctfe: Table<DefIndex, LazyValue<mir::Body<'static>>>,
430+
is_trivial_const: Table<DefIndex, LazyValue<(ConstValue, Ty<'static>)>>,
429431
closure_saved_names_of_captured_variables: Table<DefIndex, LazyValue<IndexVec<FieldIdx, Symbol>>>,
430432
mir_coroutine_witnesses: Table<DefIndex, LazyValue<mir::CoroutineLayout<'static>>>,
431433
promoted_mir: Table<DefIndex, LazyValue<IndexVec<mir::Promoted, mir::Body<'static>>>>,

compiler/rustc_metadata/src/rmeta/parameterized.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ trivially_parameterized_over_tcx! {
102102
rustc_middle::middle::lib_features::FeatureStability,
103103
rustc_middle::middle::resolve_bound_vars::ObjectLifetimeDefault,
104104
rustc_middle::mir::ConstQualifs,
105+
rustc_middle::mir::ConstValue,
105106
rustc_middle::ty::AnonConstKind,
106107
rustc_middle::ty::AssocContainer,
107108
rustc_middle::ty::AsyncDestructor,

compiler/rustc_middle/src/mir/graphviz.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ where
1616

1717
let mirs = def_ids
1818
.iter()
19+
.filter(|def_id| tcx.is_trivial_const(*def_id).is_none())
1920
.flat_map(|def_id| {
2021
if tcx.is_const_fn(*def_id) {
2122
vec![tcx.optimized_mir(*def_id), tcx.mir_for_ctfe(*def_id)]

compiler/rustc_middle/src/mir/pretty.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,8 +353,10 @@ pub fn write_mir_pretty<'tcx>(
353353
// are shared between mir_for_ctfe and optimized_mir
354354
writer.write_mir_fn(tcx.mir_for_ctfe(def_id), w)?;
355355
} else {
356-
let instance_mir = tcx.instance_mir(ty::InstanceKind::Item(def_id));
357-
render_body(w, instance_mir)?;
356+
if tcx.is_trivial_const(def_id).is_none() {
357+
let instance_mir = tcx.instance_mir(ty::InstanceKind::Item(def_id));
358+
render_body(w, instance_mir)?;
359+
}
358360
}
359361
}
360362
Ok(())

compiler/rustc_middle/src/query/erase.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ impl EraseType for Option<mir::ConstValue> {
164164
type Result = [u8; size_of::<Option<mir::ConstValue>>()];
165165
}
166166

167+
impl EraseType for Option<(mir::ConstValue, Ty<'_>)> {
168+
type Result = [u8; size_of::<Option<(mir::ConstValue, Ty<'_>)>>()];
169+
}
170+
167171
impl EraseType for EvalToValTreeResult<'_> {
168172
type Result = [u8; size_of::<EvalToValTreeResult<'static>>()];
169173
}

compiler/rustc_middle/src/query/mod.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2719,8 +2719,10 @@ rustc_queries! {
27192719
separate_provide_extern
27202720
}
27212721

2722-
query is_trivial_const(def_id: LocalDefId) -> Option<mir::ConstValue> {
2722+
query is_trivial_const(def_id: DefId) -> Option<(mir::ConstValue, Ty<'tcx>)> {
27232723
desc { |tcx| "checking if `{}` is a trivial const", tcx.def_path_str(def_id) }
2724+
cache_on_disk_if { def_id.is_local() }
2725+
separate_provide_extern
27242726
}
27252727

27262728
/// Checks for the nearest `#[sanitize(xyz = "off")]` or

0 commit comments

Comments
 (0)