Skip to content

Commit addc880

Browse files
committed
Merge {get,ensure,force}_query into call_query.
1 parent 500ddc5 commit addc880

File tree

3 files changed

+68
-23
lines changed

3 files changed

+68
-23
lines changed

compiler/rustc_macros/src/query.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -500,11 +500,11 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream {
500500
::rustc_middle::dep_graph::DepKind::#name => {
501501
if <#arg as DepNodeParams<TyCtxt<'_>>>::can_reconstruct_query_key() {
502502
if let Some(key) = <#arg as DepNodeParams<TyCtxt<'_>>>::recover($tcx, $dep_node) {
503-
force_query::<crate::ty::query::queries::#name<'_>, _>(
503+
crate::ty::query::queries::#name::query(
504504
$tcx,
505-
key,
506505
DUMMY_SP,
507-
*$dep_node
506+
key,
507+
QueryCaller::Force(*$dep_node),
508508
);
509509
return true;
510510
}

compiler/rustc_middle/src/ty/query/plumbing.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ macro_rules! define_queries_inner {
338338
// HACK(eddyb) this is like the `impl QueryConfig for queries::$name`
339339
// below, but using type aliases instead of associated types, to bypass
340340
// the limitations around normalizing under HRTB - for example, this:
341-
// `for<'tcx> fn(...) -> <queries::$name<'tcx> as QueryConfig<TyCtxt<'tcx>>>::Value`
341+
// `for<'tcx> fn(...) -> <queries::$name<'tcx> as QueryConfig>::Value`
342342
// doesn't currently normalize to `for<'tcx> fn(...) -> query_values::$name<'tcx>`.
343343
// This is primarily used by the `provide!` macro in `rustc_metadata`.
344344
#[allow(nonstandard_style, unused_lifetimes)]
@@ -402,6 +402,19 @@ macro_rules! define_queries_inner {
402402
) -> Self::Value {
403403
handle_cycle_error!([$($modifiers)*][tcx, error])
404404
}
405+
}
406+
407+
impl queries::$name<$tcx> {
408+
$(#[$attr])*
409+
#[inline(always)]
410+
pub fn query(
411+
tcx: TyCtxt<$tcx>,
412+
span: Span,
413+
key: query_keys::$name<$tcx>,
414+
caller: QueryCaller<DepKind>,
415+
) -> Option<<queries::$name<$tcx> as QueryConfig>::Stored> {
416+
call_query::<queries::$name<'_>, _>(tcx, span, key, caller)
417+
}
405418
})*
406419

407420
#[derive(Copy, Clone)]
@@ -413,7 +426,12 @@ macro_rules! define_queries_inner {
413426
$($(#[$attr])*
414427
#[inline(always)]
415428
pub fn $name(self, key: query_helper_param_ty!($($K)*)) {
416-
ensure_query::<queries::$name<'_>, _>(self.tcx, key.into_query_param())
429+
queries::$name::query(
430+
self.tcx,
431+
DUMMY_SP,
432+
key.into_query_param(),
433+
QueryCaller::Ensure,
434+
);
417435
})*
418436
}
419437

@@ -496,7 +514,13 @@ macro_rules! define_queries_inner {
496514
pub fn $name(self, key: query_helper_param_ty!($($K)*))
497515
-> <queries::$name<$tcx> as QueryConfig>::Stored
498516
{
499-
get_query::<queries::$name<'_>, _>(self.tcx, self.span, key.into_query_param())
517+
let ret = queries::$name::query(
518+
self.tcx,
519+
self.span,
520+
key.into_query_param(),
521+
QueryCaller::Get,
522+
);
523+
ret.unwrap()
500524
})*
501525
}
502526

compiler/rustc_query_system/src/query/plumbing.rs

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -729,34 +729,55 @@ fn force_query_impl<CTX, C>(
729729
);
730730
}
731731

732-
#[inline(always)]
733-
pub fn get_query<Q, CTX>(tcx: CTX, span: Span, key: Q::Key) -> Q::Stored
734-
where
735-
Q: QueryDescription<CTX>,
736-
Q::Key: crate::dep_graph::DepNodeParams<CTX>,
737-
CTX: QueryContext,
738-
{
739-
debug!("ty::query::get_query<{}>(key={:?}, span={:?})", Q::NAME, key, span);
740-
741-
get_query_impl(tcx, Q::query_state(tcx), span, key, &Q::VTABLE)
732+
pub enum QueryCaller<DK> {
733+
Ensure,
734+
Get,
735+
Force(DepNode<DK>),
742736
}
743737

744-
#[inline(always)]
745-
pub fn ensure_query<Q, CTX>(tcx: CTX, key: Q::Key)
738+
#[inline(never)]
739+
fn call_query_impl<CTX, C>(
740+
tcx: CTX,
741+
state: &QueryState<CTX::DepKind, CTX::Query, C>,
742+
span: Span,
743+
key: C::Key,
744+
caller: QueryCaller<CTX::DepKind>,
745+
query: &QueryVtable<CTX, C::Key, C::Value>,
746+
) -> Option<C::Stored>
746747
where
747-
Q: QueryDescription<CTX>,
748-
Q::Key: crate::dep_graph::DepNodeParams<CTX>,
748+
C: QueryCache,
749+
C::Key: Eq + Clone + crate::dep_graph::DepNodeParams<CTX>,
750+
C::Stored: Clone,
749751
CTX: QueryContext,
750752
{
751-
ensure_query_impl(tcx, Q::query_state(tcx), key, &Q::VTABLE)
753+
match caller {
754+
QueryCaller::Ensure => {
755+
ensure_query_impl(tcx, state, key, query);
756+
None
757+
}
758+
QueryCaller::Get => {
759+
let ret = get_query_impl(tcx, state, span, key, query);
760+
Some(ret)
761+
}
762+
QueryCaller::Force(dep_node) => {
763+
force_query_impl(tcx, state, key, span, dep_node, query);
764+
None
765+
}
766+
}
752767
}
753768

754769
#[inline(always)]
755-
pub fn force_query<Q, CTX>(tcx: CTX, key: Q::Key, span: Span, dep_node: DepNode<CTX::DepKind>)
770+
pub fn call_query<Q, CTX>(
771+
tcx: CTX,
772+
span: Span,
773+
key: Q::Key,
774+
caller: QueryCaller<CTX::DepKind>,
775+
) -> Option<Q::Stored>
756776
where
757777
Q: QueryDescription<CTX>,
758778
Q::Key: crate::dep_graph::DepNodeParams<CTX>,
759779
CTX: QueryContext,
760780
{
761-
force_query_impl(tcx, Q::query_state(tcx), key, span, dep_node, &Q::VTABLE)
781+
debug!("ty::query::get_query<{}>(key={:?}, span={:?})", Q::NAME, key, span);
782+
call_query_impl(tcx, Q::query_state(tcx), span, key, caller, &Q::VTABLE)
762783
}

0 commit comments

Comments
 (0)