Only test if key is local.

This commit is contained in:
Camille GILLOT 2021-05-15 10:55:53 +02:00
parent fd318a2f9b
commit 8ed82ebb2a
3 changed files with 110 additions and 76 deletions

View File

@ -14,7 +14,7 @@ use rustc_span::{Span, DUMMY_SP};
pub trait Key { pub trait Key {
/// Given an instance of this key, what crate is it referring to? /// Given an instance of this key, what crate is it referring to?
/// This is used to find the provider. /// This is used to find the provider.
fn query_crate(&self) -> CrateNum; fn query_crate_is_local(&self) -> bool;
/// In the event that a cycle occurs, if no explicit span has been /// In the event that a cycle occurs, if no explicit span has been
/// given for a query with key `self`, what span should we use? /// given for a query with key `self`, what span should we use?
@ -22,8 +22,9 @@ pub trait Key {
} }
impl Key for () { impl Key for () {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
@ -32,8 +33,9 @@ impl Key for () {
} }
impl<'tcx> Key for ty::InstanceDef<'tcx> { impl<'tcx> Key for ty::InstanceDef<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
@ -42,8 +44,9 @@ impl<'tcx> Key for ty::InstanceDef<'tcx> {
} }
impl<'tcx> Key for ty::Instance<'tcx> { impl<'tcx> Key for ty::Instance<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
@ -52,8 +55,9 @@ impl<'tcx> Key for ty::Instance<'tcx> {
} }
impl<'tcx> Key for mir::interpret::GlobalId<'tcx> { impl<'tcx> Key for mir::interpret::GlobalId<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.instance.query_crate() fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
@ -62,8 +66,9 @@ impl<'tcx> Key for mir::interpret::GlobalId<'tcx> {
} }
impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> { impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
@ -72,8 +77,9 @@ impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> {
} }
impl Key for CrateNum { impl Key for CrateNum {
fn query_crate(&self) -> CrateNum { #[inline(always)]
*self fn query_crate_is_local(&self) -> bool {
*self == LOCAL_CRATE
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -81,8 +87,9 @@ impl Key for CrateNum {
} }
impl Key for LocalDefId { impl Key for LocalDefId {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.to_def_id().query_crate() fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.to_def_id().default_span(tcx) self.to_def_id().default_span(tcx)
@ -90,8 +97,9 @@ impl Key for LocalDefId {
} }
impl Key for DefId { impl Key for DefId {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.krate fn query_crate_is_local(&self) -> bool {
self.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(*self) tcx.def_span(*self)
@ -99,8 +107,9 @@ impl Key for DefId {
} }
impl Key for ty::WithOptConstParam<LocalDefId> { impl Key for ty::WithOptConstParam<LocalDefId> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.did.query_crate() fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.did.default_span(tcx) self.did.default_span(tcx)
@ -108,8 +117,9 @@ impl Key for ty::WithOptConstParam<LocalDefId> {
} }
impl Key for (DefId, DefId) { impl Key for (DefId, DefId) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.0.krate fn query_crate_is_local(&self) -> bool {
self.0.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.1.default_span(tcx) self.1.default_span(tcx)
@ -117,8 +127,9 @@ impl Key for (DefId, DefId) {
} }
impl Key for (ty::Instance<'tcx>, LocalDefId) { impl Key for (ty::Instance<'tcx>, LocalDefId) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.0.query_crate() fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
@ -126,8 +137,9 @@ impl Key for (ty::Instance<'tcx>, LocalDefId) {
} }
impl Key for (DefId, LocalDefId) { impl Key for (DefId, LocalDefId) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.0.krate fn query_crate_is_local(&self) -> bool {
self.0.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.1.default_span(tcx) self.1.default_span(tcx)
@ -135,8 +147,9 @@ impl Key for (DefId, LocalDefId) {
} }
impl Key for (LocalDefId, DefId) { impl Key for (LocalDefId, DefId) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
@ -144,8 +157,9 @@ impl Key for (LocalDefId, DefId) {
} }
impl Key for (DefId, Option<Ident>) { impl Key for (DefId, Option<Ident>) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.0.krate fn query_crate_is_local(&self) -> bool {
self.0.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.0) tcx.def_span(self.0)
@ -153,8 +167,9 @@ impl Key for (DefId, Option<Ident>) {
} }
impl Key for (DefId, LocalDefId, Ident) { impl Key for (DefId, LocalDefId, Ident) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.0.krate fn query_crate_is_local(&self) -> bool {
self.0.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.1.default_span(tcx) self.1.default_span(tcx)
@ -162,8 +177,9 @@ impl Key for (DefId, LocalDefId, Ident) {
} }
impl Key for (CrateNum, DefId) { impl Key for (CrateNum, DefId) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.0 fn query_crate_is_local(&self) -> bool {
self.0 == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.1.default_span(tcx) self.1.default_span(tcx)
@ -171,8 +187,9 @@ impl Key for (CrateNum, DefId) {
} }
impl Key for (DefId, SimplifiedType) { impl Key for (DefId, SimplifiedType) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.0.krate fn query_crate_is_local(&self) -> bool {
self.0.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
@ -180,8 +197,9 @@ impl Key for (DefId, SimplifiedType) {
} }
impl<'tcx> Key for SubstsRef<'tcx> { impl<'tcx> Key for SubstsRef<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -189,8 +207,9 @@ impl<'tcx> Key for SubstsRef<'tcx> {
} }
impl<'tcx> Key for (DefId, SubstsRef<'tcx>) { impl<'tcx> Key for (DefId, SubstsRef<'tcx>) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.0.krate fn query_crate_is_local(&self) -> bool {
self.0.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
@ -203,8 +222,9 @@ impl<'tcx> Key
(ty::WithOptConstParam<DefId>, SubstsRef<'tcx>), (ty::WithOptConstParam<DefId>, SubstsRef<'tcx>),
) )
{ {
fn query_crate(&self) -> CrateNum { #[inline(always)]
(self.0).0.did.krate fn query_crate_is_local(&self) -> bool {
(self.0).0.did.krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
(self.0).0.did.default_span(tcx) (self.0).0.did.default_span(tcx)
@ -212,8 +232,9 @@ impl<'tcx> Key
} }
impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) { impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.0.default_span(tcx) self.0.default_span(tcx)
@ -221,8 +242,9 @@ impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) {
} }
impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) { impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.1.def_id().krate fn query_crate_is_local(&self) -> bool {
self.1.def_id().krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.1.def_id()) tcx.def_span(self.1.def_id())
@ -230,8 +252,9 @@ impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) {
} }
impl<'tcx> Key for (&'tcx ty::Const<'tcx>, mir::Field) { impl<'tcx> Key for (&'tcx ty::Const<'tcx>, mir::Field) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -239,8 +262,9 @@ impl<'tcx> Key for (&'tcx ty::Const<'tcx>, mir::Field) {
} }
impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> { impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -248,8 +272,9 @@ impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> {
} }
impl<'tcx> Key for ty::PolyTraitRef<'tcx> { impl<'tcx> Key for ty::PolyTraitRef<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.def_id().krate fn query_crate_is_local(&self) -> bool {
self.def_id().krate == LOCAL_CRATE
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.def_id()) tcx.def_span(self.def_id())
@ -257,8 +282,9 @@ impl<'tcx> Key for ty::PolyTraitRef<'tcx> {
} }
impl<'tcx> Key for GenericArg<'tcx> { impl<'tcx> Key for GenericArg<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -266,8 +292,9 @@ impl<'tcx> Key for GenericArg<'tcx> {
} }
impl<'tcx> Key for mir::ConstantKind<'tcx> { impl<'tcx> Key for mir::ConstantKind<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -275,8 +302,9 @@ impl<'tcx> Key for mir::ConstantKind<'tcx> {
} }
impl<'tcx> Key for &'tcx ty::Const<'tcx> { impl<'tcx> Key for &'tcx ty::Const<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -284,8 +312,9 @@ impl<'tcx> Key for &'tcx ty::Const<'tcx> {
} }
impl<'tcx> Key for Ty<'tcx> { impl<'tcx> Key for Ty<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -293,8 +322,9 @@ impl<'tcx> Key for Ty<'tcx> {
} }
impl<'tcx> Key for &'tcx ty::List<ty::Predicate<'tcx>> { impl<'tcx> Key for &'tcx ty::List<ty::Predicate<'tcx>> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -302,8 +332,9 @@ impl<'tcx> Key for &'tcx ty::List<ty::Predicate<'tcx>> {
} }
impl<'tcx> Key for ty::ParamEnv<'tcx> { impl<'tcx> Key for ty::ParamEnv<'tcx> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _: TyCtxt<'_>) -> Span { fn default_span(&self, _: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -311,8 +342,9 @@ impl<'tcx> Key for ty::ParamEnv<'tcx> {
} }
impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> { impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
self.value.query_crate() fn query_crate_is_local(&self) -> bool {
self.value.query_crate_is_local()
} }
fn default_span(&self, tcx: TyCtxt<'_>) -> Span { fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
self.value.default_span(tcx) self.value.default_span(tcx)
@ -320,8 +352,9 @@ impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> {
} }
impl Key for Symbol { impl Key for Symbol {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
DUMMY_SP DUMMY_SP
@ -331,8 +364,9 @@ impl Key for Symbol {
/// Canonical query goals correspond to abstract trait operations that /// Canonical query goals correspond to abstract trait operations that
/// are not tied to any crate in particular. /// are not tied to any crate in particular.
impl<'tcx, T> Key for Canonical<'tcx, T> { impl<'tcx, T> Key for Canonical<'tcx, T> {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
@ -341,8 +375,9 @@ impl<'tcx, T> Key for Canonical<'tcx, T> {
} }
impl Key for (Symbol, u32, u32) { impl Key for (Symbol, u32, u32) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {
@ -351,8 +386,9 @@ impl Key for (Symbol, u32, u32) {
} }
impl<'tcx> Key for (DefId, Ty<'tcx>, SubstsRef<'tcx>, ty::ParamEnv<'tcx>) { impl<'tcx> Key for (DefId, Ty<'tcx>, SubstsRef<'tcx>, ty::ParamEnv<'tcx>) {
fn query_crate(&self) -> CrateNum { #[inline(always)]
LOCAL_CRATE fn query_crate_is_local(&self) -> bool {
true
} }
fn default_span(&self, _tcx: TyCtxt<'_>) -> Span { fn default_span(&self, _tcx: TyCtxt<'_>) -> Span {

View File

@ -19,7 +19,6 @@ extern crate tracing;
use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fingerprint::Fingerprint;
use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
use rustc_errors::{DiagnosticBuilder, Handler}; use rustc_errors::{DiagnosticBuilder, Handler};
use rustc_hir::def_id::LOCAL_CRATE;
use rustc_middle::dep_graph; use rustc_middle::dep_graph;
use rustc_middle::ich::StableHashingContext; use rustc_middle::ich::StableHashingContext;
use rustc_middle::ty::query::{query_keys, query_storage, query_stored, query_values}; use rustc_middle::ty::query::{query_keys, query_storage, query_stored, query_values};

View File

@ -389,8 +389,7 @@ macro_rules! define_queries {
fn compute_fn(tcx: QueryCtxt<'tcx>, key: &Self::Key) -> fn compute_fn(tcx: QueryCtxt<'tcx>, key: &Self::Key) ->
fn(TyCtxt<'tcx>, Self::Key) -> Self::Value fn(TyCtxt<'tcx>, Self::Key) -> Self::Value
{ {
let is_local = key.query_crate() == LOCAL_CRATE; if key.query_crate_is_local() {
if is_local {
tcx.queries.local_providers.$name tcx.queries.local_providers.$name
} else { } else {
tcx.queries.extern_providers.$name tcx.queries.extern_providers.$name