Auto merge of #95573 - cjgillot:lower-query, r=michaelwoerister
Make lowering a query Split from https://github.com/rust-lang/rust/pull/88186. This PR refactors the relationship between lowering and the resolver outputs in order to make lowering itself a query. In a first part, lowering is changed to avoid modifying resolver outputs, by maintaining its own data structures for creating new `NodeId`s and so. Then, the `TyCtxt` is modified to allow creating new `LocalDefId`s from inside it. This is done by: - enclosing `Definitions` in a lock, so as to allow modification; - creating a query `register_def` whose purpose is to declare a `LocalDefId` to the query system. See `TyCtxt::create_def` and `TyCtxt::iter_local_def_id` for more detailed explanations of the design.
This commit is contained in:
commit
0f573a0c54
37 changed files with 462 additions and 391 deletions
|
@ -131,12 +131,11 @@ where
|
|||
|
||||
#[inline(always)]
|
||||
default fn to_fingerprint(&self, tcx: Ctxt) -> Fingerprint {
|
||||
let mut hcx = tcx.create_stable_hashing_context();
|
||||
let mut hasher = StableHasher::new();
|
||||
|
||||
self.hash_stable(&mut hcx, &mut hasher);
|
||||
|
||||
hasher.finish()
|
||||
tcx.with_stable_hashing_context(|mut hcx| {
|
||||
let mut hasher = StableHasher::new();
|
||||
self.hash_stable(&mut hcx, &mut hasher);
|
||||
hasher.finish()
|
||||
})
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
|
|
|
@ -43,6 +43,7 @@ rustc_index::newtype_index! {
|
|||
impl DepNodeIndex {
|
||||
pub const INVALID: DepNodeIndex = DepNodeIndex::MAX;
|
||||
pub const SINGLETON_DEPENDENCYLESS_ANON_NODE: DepNodeIndex = DepNodeIndex::from_u32(0);
|
||||
pub const FOREVER_RED_NODE: DepNodeIndex = DepNodeIndex::from_u32(1);
|
||||
}
|
||||
|
||||
impl std::convert::From<DepNodeIndex> for QueryInvocationId {
|
||||
|
@ -124,6 +125,8 @@ impl<K: DepKind> DepGraph<K> {
|
|||
record_stats,
|
||||
);
|
||||
|
||||
let colors = DepNodeColorMap::new(prev_graph_node_count);
|
||||
|
||||
// Instantiate a dependy-less node only once for anonymous queries.
|
||||
let _green_node_index = current.intern_new_node(
|
||||
profiler,
|
||||
|
@ -131,7 +134,19 @@ impl<K: DepKind> DepGraph<K> {
|
|||
smallvec![],
|
||||
Fingerprint::ZERO,
|
||||
);
|
||||
debug_assert_eq!(_green_node_index, DepNodeIndex::SINGLETON_DEPENDENCYLESS_ANON_NODE);
|
||||
assert_eq!(_green_node_index, DepNodeIndex::SINGLETON_DEPENDENCYLESS_ANON_NODE);
|
||||
|
||||
// Instantiate a dependy-less red node only once for anonymous queries.
|
||||
let (_red_node_index, _prev_and_index) = current.intern_node(
|
||||
profiler,
|
||||
&prev_graph,
|
||||
DepNode { kind: DepKind::RED, hash: Fingerprint::ZERO.into() },
|
||||
smallvec![],
|
||||
None,
|
||||
false,
|
||||
);
|
||||
assert_eq!(_red_node_index, DepNodeIndex::FOREVER_RED_NODE);
|
||||
assert!(matches!(_prev_and_index, None | Some((_, DepNodeColor::Red))));
|
||||
|
||||
DepGraph {
|
||||
data: Some(Lrc::new(DepGraphData {
|
||||
|
@ -140,7 +155,7 @@ impl<K: DepKind> DepGraph<K> {
|
|||
current,
|
||||
processed_side_effects: Default::default(),
|
||||
previous: prev_graph,
|
||||
colors: DepNodeColorMap::new(prev_graph_node_count),
|
||||
colors,
|
||||
debug_loaded_from_disk: Default::default(),
|
||||
})),
|
||||
virtual_dep_node_index: Lrc::new(AtomicU32::new(0)),
|
||||
|
@ -328,10 +343,8 @@ impl<K: DepKind> DepGraph<K> {
|
|||
|
||||
let dcx = cx.dep_context();
|
||||
let hashing_timer = dcx.profiler().incr_result_hashing();
|
||||
let current_fingerprint = hash_result.map(|f| {
|
||||
let mut hcx = dcx.create_stable_hashing_context();
|
||||
f(&mut hcx, &result)
|
||||
});
|
||||
let current_fingerprint =
|
||||
hash_result.map(|f| dcx.with_stable_hashing_context(|mut hcx| f(&mut hcx, &result)));
|
||||
|
||||
let print_status = cfg!(debug_assertions) && dcx.sess().opts.debugging_opts.dep_tasks;
|
||||
|
||||
|
@ -971,6 +984,7 @@ impl<K: DepKind> CurrentDepGraph<K> {
|
|||
let nanos = duration.as_secs() * 1_000_000_000 + duration.subsec_nanos() as u64;
|
||||
let mut stable_hasher = StableHasher::new();
|
||||
nanos.hash(&mut stable_hasher);
|
||||
let anon_id_seed = stable_hasher.finish();
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
let forbidden_edge = match env::var("RUST_FORBID_DEP_GRAPH_EDGE") {
|
||||
|
@ -1006,7 +1020,7 @@ impl<K: DepKind> CurrentDepGraph<K> {
|
|||
)
|
||||
}),
|
||||
prev_index_to_index: Lock::new(IndexVec::from_elem_n(None, prev_graph_node_count)),
|
||||
anon_id_seed: stable_hasher.finish(),
|
||||
anon_id_seed,
|
||||
#[cfg(debug_assertions)]
|
||||
forbidden_edge,
|
||||
total_read_count: AtomicU64::new(0),
|
||||
|
|
|
@ -23,7 +23,7 @@ pub trait DepContext: Copy {
|
|||
type DepKind: self::DepKind;
|
||||
|
||||
/// Create a hashing context for hashing new results.
|
||||
fn create_stable_hashing_context(&self) -> StableHashingContext<'_>;
|
||||
fn with_stable_hashing_context<R>(&self, f: impl FnOnce(StableHashingContext<'_>) -> R) -> R;
|
||||
|
||||
/// Access the DepGraph.
|
||||
fn dep_graph(&self) -> &DepGraph<Self::DepKind>;
|
||||
|
@ -85,8 +85,12 @@ impl FingerprintStyle {
|
|||
|
||||
/// Describe the different families of dependency nodes.
|
||||
pub trait DepKind: Copy + fmt::Debug + Eq + Hash + Send + Encodable<FileEncoder> + 'static {
|
||||
/// DepKind to use when incr. comp. is turned off.
|
||||
const NULL: Self;
|
||||
|
||||
/// DepKind to use to create the initial forever-red node.
|
||||
const RED: Self;
|
||||
|
||||
/// Implementation of `std::fmt::Debug` for `DepNode`.
|
||||
fn debug_node(node: &DepNode<Self>, f: &mut fmt::Formatter<'_>) -> fmt::Result;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue