Auto merge of #111641 - michaelwoerister:debugger-visualizer-fixes, r=cjgillot
Fix dependency tracking for debugger visualizers This PR fixes dependency tracking for debugger visualizer files by changing the `debugger_visualizers` query to an `eval_always` query that scans the AST while it is still available. This way the set of visualizer files is already available when dep-info is emitted. Since the query is turned into an `eval_always` query, dependency tracking will now reliably detect changes to the visualizer script files themselves. TODO: - [x] perf.rlo - [x] Needs a bit more documentation in some places - [x] Needs regression test for the incr. comp. case Fixes https://github.com/rust-lang/rust/issues/111226 Fixes https://github.com/rust-lang/rust/issues/111227 Fixes https://github.com/rust-lang/rust/issues/111295 r? `@wesleywiser` cc `@gibbyfree`
This commit is contained in:
commit
17a681000b
27 changed files with 246 additions and 145 deletions
|
@ -1,4 +1,5 @@
|
|||
use crate::hir::{ModuleItems, Owner};
|
||||
use crate::middle::debugger_visualizer::DebuggerVisualizerFile;
|
||||
use crate::query::LocalCrate;
|
||||
use crate::ty::TyCtxt;
|
||||
use rustc_ast as ast;
|
||||
|
@ -1165,11 +1166,26 @@ pub(super) fn crate_hash(tcx: TyCtxt<'_>, _: LocalCrate) -> Svh {
|
|||
|
||||
source_file_names.sort_unstable();
|
||||
|
||||
// We have to take care of debugger visualizers explicitly. The HIR (and
|
||||
// thus `hir_body_hash`) contains the #[debugger_visualizer] attributes but
|
||||
// these attributes only store the file path to the visualizer file, not
|
||||
// their content. Yet that content is exported into crate metadata, so any
|
||||
// changes to it need to be reflected in the crate hash.
|
||||
let debugger_visualizers: Vec<_> = tcx
|
||||
.debugger_visualizers(LOCAL_CRATE)
|
||||
.iter()
|
||||
// We ignore the path to the visualizer file since it's not going to be
|
||||
// encoded in crate metadata and we already hash the full contents of
|
||||
// the file.
|
||||
.map(DebuggerVisualizerFile::path_erased)
|
||||
.collect();
|
||||
|
||||
let crate_hash: Fingerprint = tcx.with_stable_hashing_context(|mut hcx| {
|
||||
let mut stable_hasher = StableHasher::new();
|
||||
hir_body_hash.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
upstream_crates.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
source_file_names.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
debugger_visualizers.hash_stable(&mut hcx, &mut stable_hasher);
|
||||
if tcx.sess.opts.incremental_relative_spans() {
|
||||
let definitions = tcx.definitions_untracked();
|
||||
let mut owner_spans: Vec<_> = krate
|
||||
|
|
38
compiler/rustc_middle/src/middle/debugger_visualizer.rs
Normal file
38
compiler/rustc_middle/src/middle/debugger_visualizer.rs
Normal file
|
@ -0,0 +1,38 @@
|
|||
use rustc_data_structures::sync::Lrc;
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(HashStable)]
|
||||
#[derive(Copy, PartialEq, PartialOrd, Clone, Ord, Eq, Hash, Debug, Encodable, Decodable)]
|
||||
pub enum DebuggerVisualizerType {
|
||||
Natvis,
|
||||
GdbPrettyPrinter,
|
||||
}
|
||||
|
||||
/// A single debugger visualizer file.
|
||||
#[derive(HashStable)]
|
||||
#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Encodable, Decodable)]
|
||||
pub struct DebuggerVisualizerFile {
|
||||
/// The complete debugger visualizer source.
|
||||
pub src: Lrc<[u8]>,
|
||||
/// Indicates which visualizer type this targets.
|
||||
pub visualizer_type: DebuggerVisualizerType,
|
||||
/// The file path to the visualizer file. This is used for reporting
|
||||
/// visualizer files in dep-info. Before it is written to crate metadata,
|
||||
/// the path is erased to `None`, so as not to emit potentially privacy
|
||||
/// sensitive data.
|
||||
pub path: Option<PathBuf>,
|
||||
}
|
||||
|
||||
impl DebuggerVisualizerFile {
|
||||
pub fn new(src: Lrc<[u8]>, visualizer_type: DebuggerVisualizerType, path: PathBuf) -> Self {
|
||||
DebuggerVisualizerFile { src, visualizer_type, path: Some(path) }
|
||||
}
|
||||
|
||||
pub fn path_erased(&self) -> Self {
|
||||
DebuggerVisualizerFile {
|
||||
src: self.src.clone(),
|
||||
visualizer_type: self.visualizer_type,
|
||||
path: None,
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
pub mod codegen_fn_attrs;
|
||||
pub mod debugger_visualizer;
|
||||
pub mod dependency_format;
|
||||
pub mod exported_symbols;
|
||||
pub mod lang_items;
|
||||
|
|
|
@ -12,6 +12,7 @@ use crate::infer::canonical::{self, Canonical};
|
|||
use crate::lint::LintExpectation;
|
||||
use crate::metadata::ModChild;
|
||||
use crate::middle::codegen_fn_attrs::CodegenFnAttrs;
|
||||
use crate::middle::debugger_visualizer::DebuggerVisualizerFile;
|
||||
use crate::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
|
||||
use crate::middle::lib_features::LibFeatures;
|
||||
use crate::middle::privacy::EffectiveVisibilities;
|
||||
|
@ -1784,12 +1785,18 @@ rustc_queries! {
|
|||
desc { "looking at the source for a crate" }
|
||||
separate_provide_extern
|
||||
}
|
||||
|
||||
/// Returns the debugger visualizers defined for this crate.
|
||||
query debugger_visualizers(_: CrateNum) -> &'tcx Vec<rustc_span::DebuggerVisualizerFile> {
|
||||
/// NOTE: This query has to be marked `eval_always` because it reads data
|
||||
/// directly from disk that is not tracked anywhere else. I.e. it
|
||||
/// represents a genuine input to the query system.
|
||||
query debugger_visualizers(_: CrateNum) -> &'tcx Vec<DebuggerVisualizerFile> {
|
||||
arena_cache
|
||||
desc { "looking up the debugger visualizers for this crate" }
|
||||
separate_provide_extern
|
||||
eval_always
|
||||
}
|
||||
|
||||
query postorder_cnums(_: ()) -> &'tcx [CrateNum] {
|
||||
eval_always
|
||||
desc { "generating a postorder list of CrateNums" }
|
||||
|
|
|
@ -56,6 +56,7 @@ trivially_parameterized_over_tcx! {
|
|||
std::string::String,
|
||||
crate::metadata::ModChild,
|
||||
crate::middle::codegen_fn_attrs::CodegenFnAttrs,
|
||||
crate::middle::debugger_visualizer::DebuggerVisualizerFile,
|
||||
crate::middle::exported_symbols::SymbolExportInfo,
|
||||
crate::middle::resolve_bound_vars::ObjectLifetimeDefault,
|
||||
crate::mir::ConstQualifs,
|
||||
|
@ -91,7 +92,6 @@ trivially_parameterized_over_tcx! {
|
|||
rustc_session::cstore::ForeignModule,
|
||||
rustc_session::cstore::LinkagePreference,
|
||||
rustc_session::cstore::NativeLib,
|
||||
rustc_span::DebuggerVisualizerFile,
|
||||
rustc_span::ExpnData,
|
||||
rustc_span::ExpnHash,
|
||||
rustc_span::ExpnId,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue