Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Query-ify Instance::resolve #67797

Merged
merged 1 commit into from
Apr 5, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/librustc_interface/callbacks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,4 @@ pub fn setup_callbacks() {
rustc_span::SPAN_DEBUG.swap(&(span_debug as fn(_, &mut fmt::Formatter<'_>) -> _));
rustc_hir::def_id::DEF_ID_DEBUG.swap(&(def_id_debug as fn(_, &mut fmt::Formatter<'_>) -> _));
TRACK_DIAGNOSTICS.swap(&(track_diagnostic as fn(&_)));
rustc_middle::ty::RESOLVE_INSTANCE.swap(&(rustc_ty::instance::resolve_instance as _));
}
4 changes: 4 additions & 0 deletions src/librustc_middle/query/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1257,5 +1257,9 @@ rustc_queries! {
eval_always
desc { "looking up enabled feature gates" }
}

query resolve_instance(key: (ty::ParamEnv<'tcx>, DefId, SubstsRef<'tcx>)) -> Option<ty::Instance<'tcx>> {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just spotted this: whenever you have a ty::ParamEnv and some thing referring the to same parameters it adds bounds in scope of, like (DefId, SubstsRef) here, the right thing to do is to use ty::ParamEnvAnd<(DefId, SubstsRef)>.

Doing so should result in better caching (as the bounds in scope aren't kept if they're not needed by the SubtsRef), and is more semantically meaningful.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do this in a drive-by commit.

desc { "resolving instance `{:?}` `{:?}` with {:?}", key.1, key.2, key.0 }
}
}
}
23 changes: 3 additions & 20 deletions src/librustc_middle/ty/instance.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use crate::middle::codegen_fn_attrs::CodegenFnAttrFlags;
use crate::ty::print::{FmtPrinter, Printer};
use crate::ty::{self, SubstsRef, Ty, TyCtxt, TypeFoldable};
use rustc_data_structures::AtomicRef;
use rustc_hir::def::Namespace;
use rustc_hir::def_id::{CrateNum, DefId};
use rustc_hir::lang_items::DropInPlaceFnLangItem;
Expand Down Expand Up @@ -289,7 +288,9 @@ impl<'tcx> Instance<'tcx> {
def_id: DefId,
substs: SubstsRef<'tcx>,
) -> Option<Instance<'tcx>> {
(*RESOLVE_INSTANCE)(tcx, param_env, def_id, substs)
// All regions in the result of this query are erased, so it's
// fine to erase all of the input regions.
tcx.resolve_instance((tcx.erase_regions(&param_env), def_id, tcx.erase_regions(&substs)))
}

pub fn resolve_for_fn_ptr(
Expand Down Expand Up @@ -440,21 +441,3 @@ fn needs_fn_once_adapter_shim(
(ty::ClosureKind::FnMut, _) | (ty::ClosureKind::FnOnce, _) => Err(()),
}
}

fn resolve_instance_default(
_tcx: TyCtxt<'tcx>,
_param_env: ty::ParamEnv<'tcx>,
_def_id: DefId,
_substs: SubstsRef<'tcx>,
) -> Option<Instance<'tcx>> {
unimplemented!()
}

pub static RESOLVE_INSTANCE: AtomicRef<
for<'tcx> fn(
TyCtxt<'tcx>,
ty::ParamEnv<'tcx>,
DefId,
SubstsRef<'tcx>,
) -> Option<Instance<'tcx>>,
> = AtomicRef::new(&(resolve_instance_default as _));
1 change: 0 additions & 1 deletion src/librustc_middle/ty/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@ pub use self::context::{
CtxtInterners, GeneratorInteriorTypeCause, GlobalCtxt, Lift, TypeckTables,
};

pub use self::instance::RESOLVE_INSTANCE;
pub use self::instance::{Instance, InstanceDef};

pub use self::trait_def::TraitDef;
Expand Down
11 changes: 11 additions & 0 deletions src/librustc_middle/ty/query/keys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,3 +296,14 @@ impl Key for (Symbol, u32, u32) {
DUMMY_SP
}
}

impl<'tcx> Key for (ty::ParamEnv<'tcx>, DefId, SubstsRef<'tcx>) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess a strong hint is that you had to add a new Key impl: generally, you shouldn't need one.

type CacheSelector = DefaultCacheSelector;

fn query_crate(&self) -> CrateNum {
self.1.krate
}
fn default_span(&self, tcx: TyCtxt<'_>) -> Span {
tcx.def_span(self.1)
}
}
8 changes: 5 additions & 3 deletions src/librustc_ty/instance.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@ use log::debug;

pub fn resolve_instance<'tcx>(
tcx: TyCtxt<'tcx>,
param_env: ty::ParamEnv<'tcx>,
def_id: DefId,
substs: SubstsRef<'tcx>,
(param_env, def_id, substs): (ty::ParamEnv<'tcx>, DefId, SubstsRef<'tcx>),
) -> Option<Instance<'tcx>> {
debug!("resolve(def_id={:?}, substs={:?})", def_id, substs);
let result = if let Some(trait_def_id) = tcx.trait_of_item(def_id) {
Expand Down Expand Up @@ -199,3 +197,7 @@ fn resolve_associated_item<'tcx>(
traits::VtableAutoImpl(..) | traits::VtableParam(..) | traits::VtableTraitAlias(..) => None,
}
}

pub fn provide(providers: &mut ty::query::Providers<'_>) {
*providers = ty::query::Providers { resolve_instance, ..*providers };
}
1 change: 1 addition & 0 deletions src/librustc_ty/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ pub fn provide(providers: &mut Providers<'_>) {
common_traits::provide(providers);
needs_drop::provide(providers);
ty::provide(providers);
instance::provide(providers);
}