Skip to content

Commit 6d99dd9

Browse files
committed
Address comments
1 parent 453e919 commit 6d99dd9

File tree

6 files changed

+19
-25
lines changed

6 files changed

+19
-25
lines changed

compiler/rustc_middle/src/query/erase.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use std::mem::{size_of, transmute_copy, MaybeUninit};
33

44
#[derive(Copy, Clone)]
55
pub struct Erased<T: Copy> {
6+
// We use `MaybeUninit` here so we can store any value
7+
// in `data` since we aren't actually storing a `T`.
68
data: MaybeUninit<T>,
79
}
810

@@ -12,7 +14,7 @@ pub trait EraseType: Copy {
1214

1315
// Allow `type_alias_bounds` since compilation will fail without `EraseType`.
1416
#[allow(type_alias_bounds)]
15-
pub type Erase<T: Copy + EraseType> = Erased<impl Copy>;
17+
pub type Erase<T: EraseType> = Erased<impl Copy>;
1618

1719
#[inline(always)]
1820
pub fn erase<T: EraseType>(src: T) -> Erase<T> {

compiler/rustc_query_impl/src/lib.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,11 @@ pub use on_disk_cache::OnDiskCache;
4545
mod profiling_support;
4646
pub use self::profiling_support::alloc_self_profile_query_strings;
4747

48-
trait QueryToConfig<'tcx>: 'tcx {
49-
type Value;
50-
type Config: QueryConfig<QueryCtxt<'tcx>>;
48+
/// This is implemented per query and restoring query values from their erased state.
49+
trait QueryConfigRestored<'tcx>: QueryConfig<QueryCtxt<'tcx>> + Default {
50+
type RestoredValue;
5151

52-
fn config(qcx: QueryCtxt<'tcx>) -> Self::Config;
53-
fn restore(value: <Self::Config as QueryConfig<QueryCtxt<'tcx>>>::Value) -> Self::Value;
52+
fn restore(value: <Self as QueryConfig<QueryCtxt<'tcx>>>::Value) -> Self::RestoredValue;
5453
}
5554

5655
rustc_query_append! { define_queries! }

compiler/rustc_query_impl/src/on_disk_cache.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use rustc_middle::mir::{self, interpret};
1313
use rustc_middle::ty::codec::{RefDecodable, TyDecoder, TyEncoder};
1414
use rustc_middle::ty::{self, Ty, TyCtxt};
1515
use rustc_query_system::dep_graph::DepContext;
16-
use rustc_query_system::query::QueryConfig;
1716
use rustc_query_system::query::{QueryCache, QuerySideEffects};
1817
use rustc_serialize::{
1918
opaque::{FileEncodeResult, FileEncoder, IntEncodedWithFixedSize, MemDecoder},
@@ -1066,13 +1065,13 @@ impl<'a, 'tcx> Encodable<CacheEncoder<'a, 'tcx>> for [u8] {
10661065
}
10671066

10681067
pub(crate) fn encode_query_results<'a, 'tcx, Q>(
1069-
query: Q::Config,
1068+
query: Q,
10701069
qcx: QueryCtxt<'tcx>,
10711070
encoder: &mut CacheEncoder<'a, 'tcx>,
10721071
query_result_index: &mut EncodedDepNodeIndex,
10731072
) where
1074-
Q: super::QueryToConfig<'tcx>,
1075-
Q::Value: Encodable<CacheEncoder<'a, 'tcx>>,
1073+
Q: super::QueryConfigRestored<'tcx>,
1074+
Q::RestoredValue: Encodable<CacheEncoder<'a, 'tcx>>,
10761075
{
10771076
let _timer = qcx
10781077
.tcx

compiler/rustc_query_impl/src/plumbing.rs

+5-12
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,7 @@ macro_rules! define_queries {
564564
}
565565

566566
#[inline]
567-
fn from_cycle_error(
567+
fn value_from_cycle_error(
568568
self,
569569
tcx: TyCtxt<'tcx>,
570570
cycle: &[QueryInfo<DepKind>],
@@ -609,17 +609,11 @@ macro_rules! define_queries {
609609
}
610610
})*
611611

612-
$(impl<'tcx> QueryToConfig<'tcx> for queries::$name<'tcx> {
613-
type Value = query_values::$name<'tcx>;
614-
type Config = Self;
612+
$(impl<'tcx> QueryConfigRestored<'tcx> for queries::$name<'tcx> {
613+
type RestoredValue = query_values::$name<'tcx>;
615614

616615
#[inline(always)]
617-
fn config(_qcx: QueryCtxt<'tcx>) -> Self::Config {
618-
Self::default()
619-
}
620-
621-
#[inline(always)]
622-
fn restore(value: <Self::Config as QueryConfig<QueryCtxt<'tcx>>>::Value) -> Self::Value {
616+
fn restore(value: <Self as QueryConfig<QueryCtxt<'tcx>>>::Value) -> Self::RestoredValue {
623617
restore::<query_values::$name<'tcx>>(value)
624618
}
625619
})*
@@ -695,7 +689,6 @@ macro_rules! define_queries {
695689
use $crate::profiling_support::QueryKeyStringCache;
696690
use rustc_query_system::query::QueryMap;
697691
use rustc_middle::dep_graph::DepKind;
698-
use crate::QueryToConfig;
699692

700693
pub(super) const fn dummy_query_struct<'tcx>() -> QueryStruct<'tcx> {
701694
fn noop_try_collect_active_jobs(_: QueryCtxt<'_>, _: &mut QueryMap<DepKind>) -> Option<()> {
@@ -740,7 +733,7 @@ macro_rules! define_queries {
740733
},
741734
encode_query_results: expand_if_cached!([$($modifiers)*], |qcx, encoder, query_result_index|
742735
$crate::on_disk_cache::encode_query_results::<super::queries::$name<'tcx>>(
743-
super::queries::$name::config(qcx),
736+
super::queries::$name::default(),
744737
qcx,
745738
encoder,
746739
query_result_index,

compiler/rustc_query_system/src/query/config.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ pub trait QueryConfig<Qcx: QueryContext>: Copy {
4747

4848
fn loadable_from_disk(self, qcx: Qcx, key: &Self::Key, idx: SerializedDepNodeIndex) -> bool;
4949

50-
fn from_cycle_error(
50+
/// Synthesize an error value to let compilation continue after a cycle.
51+
fn value_from_cycle_error(
5152
self,
5253
tcx: Qcx::DepContext,
5354
cycle: &[QueryInfo<Qcx::DepKind>],

compiler/rustc_query_system/src/query/plumbing.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ where
148148
match handler {
149149
Error => {
150150
error.emit();
151-
query.from_cycle_error(*qcx.dep_context(), &cycle_error.cycle)
151+
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle)
152152
}
153153
Fatal => {
154154
error.emit();
@@ -157,7 +157,7 @@ where
157157
}
158158
DelayBug => {
159159
error.delay_as_bug();
160-
query.from_cycle_error(*qcx.dep_context(), &cycle_error.cycle)
160+
query.value_from_cycle_error(*qcx.dep_context(), &cycle_error.cycle)
161161
}
162162
}
163163
}

0 commit comments

Comments
 (0)