Auto merge of #80602 - tgnottingham:cratemetadata_you_aint_special, r=michaelwoerister
Remove DepKind::CrateMetadata and pre-allocation of DepNodes Remove much of the special-case handling around crate metadata dependency tracking by replacing `DepKind::CrateMetadata` and the pre-allocation of corresponding `DepNodes` with on-demand invocation of the `crate_hash` query.
This commit is contained in:
commit
fcbd305ee9
10 changed files with 15 additions and 107 deletions
|
@ -207,17 +207,6 @@ pub mod dep_kind {
|
|||
try_load_from_on_disk_cache: |_, _| {},
|
||||
};
|
||||
|
||||
// Represents metadata from an extern crate.
|
||||
pub const CrateMetadata: DepKindStruct = DepKindStruct {
|
||||
has_params: true,
|
||||
is_anon: false,
|
||||
is_eval_always: true,
|
||||
|
||||
can_reconstruct_query_key: || true,
|
||||
force_from_dep_node: |_, dep_node| bug!("force_from_dep_node: encountered {:?}", dep_node),
|
||||
try_load_from_on_disk_cache: |_, _| {},
|
||||
};
|
||||
|
||||
pub const TraitSelect: DepKindStruct = DepKindStruct {
|
||||
has_params: false,
|
||||
is_anon: true,
|
||||
|
@ -353,9 +342,6 @@ rustc_dep_node_append!([define_dep_nodes!][ <'tcx>
|
|||
// We use this for most things when incr. comp. is turned off.
|
||||
[] Null,
|
||||
|
||||
// Represents metadata from an extern crate.
|
||||
[eval_always] CrateMetadata(CrateNum),
|
||||
|
||||
[anon] TraitSelect,
|
||||
|
||||
// WARNING: if `Symbol` is changed, make sure you update `make_compile_codegen_unit` below.
|
||||
|
|
|
@ -116,20 +116,9 @@ impl<'tcx> DepContext for TyCtxt<'tcx> {
|
|||
// be removed. https://github.com/rust-lang/rust/issues/62649 is one such
|
||||
// bug that must be fixed before removing this.
|
||||
match dep_node.kind {
|
||||
DepKind::hir_owner | DepKind::hir_owner_nodes | DepKind::CrateMetadata => {
|
||||
DepKind::hir_owner | DepKind::hir_owner_nodes => {
|
||||
if let Some(def_id) = dep_node.extract_def_id(*self) {
|
||||
if def_id_corresponds_to_hir_dep_node(*self, def_id.expect_local()) {
|
||||
if dep_node.kind == DepKind::CrateMetadata {
|
||||
// The `DefPath` has corresponding node,
|
||||
// and that node should have been marked
|
||||
// either red or green in `data.colors`.
|
||||
bug!(
|
||||
"DepNode {:?} should have been \
|
||||
pre-marked as red or green but wasn't.",
|
||||
dep_node
|
||||
);
|
||||
}
|
||||
} else {
|
||||
if !def_id_corresponds_to_hir_dep_node(*self, def_id.expect_local()) {
|
||||
// This `DefPath` does not have a
|
||||
// corresponding `DepNode` (e.g. a
|
||||
// struct field), and the ` DefPath`
|
||||
|
|
|
@ -1240,6 +1240,8 @@ rustc_queries! {
|
|||
eval_always
|
||||
desc { "looking up the disambiguator a crate" }
|
||||
}
|
||||
// The macro which defines `rustc_metadata::provide_extern` depends on this query's name.
|
||||
// Changing the name should cause a compiler error, but in case that changes, be aware.
|
||||
query crate_hash(_: CrateNum) -> Svh {
|
||||
eval_always
|
||||
desc { "looking up the hash a crate" }
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
//! Type context book-keeping.
|
||||
|
||||
use crate::arena::Arena;
|
||||
use crate::dep_graph::{self, DepGraph, DepKind, DepNode, DepNodeExt};
|
||||
use crate::dep_graph::DepGraph;
|
||||
use crate::hir::exports::ExportMap;
|
||||
use crate::ich::{NodeIdHashingMode, StableHashingContext};
|
||||
use crate::infer::canonical::{Canonical, CanonicalVarInfo, CanonicalVarInfos};
|
||||
|
@ -37,8 +37,7 @@ use rustc_data_structures::sync::{self, Lock, Lrc, WorkerLocal};
|
|||
use rustc_errors::ErrorReported;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId};
|
||||
use rustc_hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE};
|
||||
use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, LOCAL_CRATE};
|
||||
use rustc_hir::definitions::Definitions;
|
||||
use rustc_hir::intravisit::Visitor;
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
|
@ -1315,28 +1314,6 @@ impl<'tcx> TyCtxt<'tcx> {
|
|||
StableHashingContext::ignore_spans(self.sess, krate, self.definitions, &*self.cstore)
|
||||
}
|
||||
|
||||
// This method makes sure that we have a DepNode and a Fingerprint for
|
||||
// every upstream crate. It needs to be called once right after the tcx is
|
||||
// created.
|
||||
// With full-fledged red/green, the method will probably become unnecessary
|
||||
// as this will be done on-demand.
|
||||
pub fn allocate_metadata_dep_nodes(self) {
|
||||
// We cannot use the query versions of crates() and crate_hash(), since
|
||||
// those would need the DepNodes that we are allocating here.
|
||||
for cnum in self.cstore.crates_untracked() {
|
||||
let def_path_hash = self.def_path_hash(DefId { krate: cnum, index: CRATE_DEF_INDEX });
|
||||
let dep_node = DepNode::from_def_path_hash(def_path_hash, DepKind::CrateMetadata);
|
||||
let crate_hash = self.cstore.crate_hash_untracked(cnum);
|
||||
self.dep_graph.with_task(
|
||||
dep_node,
|
||||
self,
|
||||
crate_hash,
|
||||
|_, x| x, // No transformation needed
|
||||
dep_graph::hash_result,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn serialize_query_result_cache(self, encoder: &mut FileEncoder) -> FileEncodeResult {
|
||||
self.queries.on_disk_cache.as_ref().map_or(Ok(()), |c| c.serialize(self, encoder))
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue