Skip to content

Commit 17a6810

Browse files
committed
Auto merge of rust-lang#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 rust-lang#111226 Fixes rust-lang#111227 Fixes rust-lang#111295 r? `@wesleywiser` cc `@gibbyfree`
2 parents 2d17294 + 987655a commit 17a6810

File tree

27 files changed

+246
-145
lines changed

27 files changed

+246
-145
lines changed

compiler/rustc_ast_lowering/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ use rustc_errors::{
5858
use rustc_fluent_macro::fluent_messages;
5959
use rustc_hir as hir;
6060
use rustc_hir::def::{DefKind, LifetimeRes, Namespace, PartialRes, PerNS, Res};
61-
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID};
61+
use rustc_hir::def_id::{LocalDefId, CRATE_DEF_ID, LOCAL_CRATE};
6262
use rustc_hir::definitions::DefPathData;
6363
use rustc_hir::{ConstArg, GenericArg, ItemLocalId, ParamName, TraitCandidate};
6464
use rustc_index::{Idx, IndexSlice, IndexVec};
@@ -435,6 +435,7 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
435435
// Queries that borrow `resolver_for_lowering`.
436436
tcx.ensure_with_value().output_filenames(());
437437
tcx.ensure_with_value().early_lint_checks(());
438+
tcx.ensure_with_value().debugger_visualizers(LOCAL_CRATE);
438439
let (mut resolver, krate) = tcx.resolver_for_lowering(()).steal();
439440

440441
let ast_index = index_crate(&resolver.node_id_to_def_id, &krate);

compiler/rustc_codegen_llvm/src/debuginfo/gdb.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,9 @@ use rustc_ast::attr;
99
use rustc_codegen_ssa::base::collect_debugger_visualizers_transitive;
1010
use rustc_codegen_ssa::traits::*;
1111
use rustc_hir::def_id::LOCAL_CRATE;
12-
use rustc_middle::bug;
12+
use rustc_middle::{bug, middle::debugger_visualizer::DebuggerVisualizerType};
1313
use rustc_session::config::{CrateType, DebugInfo};
1414
use rustc_span::symbol::sym;
15-
use rustc_span::DebuggerVisualizerType;
1615

1716
/// Inserts a side-effect free instruction sequence that makes sure that the
1817
/// .debug_gdb_scripts global is referenced, so it isn't removed by the linker.

compiler/rustc_codegen_ssa/src/back/link.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use rustc_fs_util::fix_windows_verbatim_for_gcc;
99
use rustc_hir::def_id::{CrateNum, LOCAL_CRATE};
1010
use rustc_metadata::find_native_static_library;
1111
use rustc_metadata::fs::{emit_wrapper_file, METADATA_FILENAME};
12+
use rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile;
1213
use rustc_middle::middle::dependency_format::Linkage;
1314
use rustc_middle::middle::exported_symbols::SymbolExportKind;
1415
use rustc_session::config::{self, CFGuard, CrateType, DebugInfo, LdImpl, Strip};
@@ -21,7 +22,6 @@ use rustc_session::utils::NativeLibKind;
2122
/// need out of the shared crate context before we get rid of it.
2223
use rustc_session::{filesearch, Session};
2324
use rustc_span::symbol::Symbol;
24-
use rustc_span::DebuggerVisualizerFile;
2525
use rustc_target::spec::crt_objects::{CrtObjects, LinkSelfContainedDefault};
2626
use rustc_target::spec::{Cc, LinkOutputKind, LinkerFlavor, LinkerFlavorCli, Lld, PanicStrategy};
2727
use rustc_target::spec::{RelocModel, RelroLevel, SanitizerSet, SplitDebuginfo};

compiler/rustc_codegen_ssa/src/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use rustc_hir::def_id::{DefId, LOCAL_CRATE};
2323
use rustc_hir::lang_items::LangItem;
2424
use rustc_metadata::EncodedMetadata;
2525
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
26+
use rustc_middle::middle::debugger_visualizer::{DebuggerVisualizerFile, DebuggerVisualizerType};
2627
use rustc_middle::middle::exported_symbols;
2728
use rustc_middle::middle::exported_symbols::SymbolExportKind;
2829
use rustc_middle::middle::lang_items;
@@ -35,7 +36,6 @@ use rustc_session::config::{self, CrateType, EntryFnType, OutputType};
3536
use rustc_session::Session;
3637
use rustc_span::symbol::sym;
3738
use rustc_span::Symbol;
38-
use rustc_span::{DebuggerVisualizerFile, DebuggerVisualizerType};
3939
use rustc_target::abi::{Align, FIRST_VARIANT};
4040

4141
use std::collections::BTreeSet;

compiler/rustc_codegen_ssa/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ use rustc_errors::{DiagnosticMessage, SubdiagnosticMessage};
2828
use rustc_fluent_macro::fluent_messages;
2929
use rustc_hir::def_id::CrateNum;
3030
use rustc_middle::dep_graph::WorkProduct;
31+
use rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile;
3132
use rustc_middle::middle::dependency_format::Dependencies;
3233
use rustc_middle::middle::exported_symbols::SymbolExportKind;
3334
use rustc_middle::query::{ExternProviders, Providers};
@@ -38,7 +39,6 @@ use rustc_session::cstore::{self, CrateSource};
3839
use rustc_session::utils::NativeLibKind;
3940
use rustc_session::Session;
4041
use rustc_span::symbol::Symbol;
41-
use rustc_span::DebuggerVisualizerFile;
4242
use std::collections::BTreeSet;
4343
use std::io;
4444
use std::path::{Path, PathBuf};

compiler/rustc_interface/src/passes.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,11 @@ fn write_out_deps(tcx: TyCtxt<'_>, outputs: &OutputFilenames, out_filenames: &[P
487487
files.push(normalize_path(profile_sample.as_path().to_path_buf()));
488488
}
489489

490+
// Debugger visualizer files
491+
for debugger_visualizer in tcx.debugger_visualizers(LOCAL_CRATE) {
492+
files.push(normalize_path(debugger_visualizer.path.clone().unwrap()));
493+
}
494+
490495
if sess.binary_dep_depinfo() {
491496
if let Some(ref backend) = sess.opts.unstable_opts.codegen_backend {
492497
if backend.contains('.') {

compiler/rustc_metadata/src/rmeta/decoder.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use rustc_hir::definitions::{DefKey, DefPath, DefPathData, DefPathHash};
1919
use rustc_hir::diagnostic_items::DiagnosticItems;
2020
use rustc_index::{Idx, IndexVec};
2121
use rustc_middle::metadata::ModChild;
22+
use rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile;
2223
use rustc_middle::middle::exported_symbols::{ExportedSymbol, SymbolExportInfo};
2324
use rustc_middle::mir::interpret::{AllocDecodingSession, AllocDecodingState};
2425
use rustc_middle::ty::codec::TyDecoder;
@@ -958,7 +959,7 @@ impl<'a, 'tcx> CrateMetadataRef<'a> {
958959
.decode((self, sess))
959960
}
960961

961-
fn get_debugger_visualizers(self) -> Vec<rustc_span::DebuggerVisualizerFile> {
962+
fn get_debugger_visualizers(self) -> Vec<DebuggerVisualizerFile> {
962963
self.root.debugger_visualizers.decode(self).collect::<Vec<_>>()
963964
}
964965

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use rustc_hir::definitions::DefPathData;
1919
use rustc_hir::intravisit::{self, Visitor};
2020
use rustc_hir::lang_items::LangItem;
2121
use rustc_middle::hir::nested_filter;
22+
use rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile;
2223
use rustc_middle::middle::dependency_format::Linkage;
2324
use rustc_middle::middle::exported_symbols::{
2425
metadata_symbol_name, ExportedSymbol, SymbolExportInfo,
@@ -36,9 +37,7 @@ use rustc_session::config::{CrateType, OptLevel};
3637
use rustc_session::cstore::{ForeignModule, LinkagePreference, NativeLib};
3738
use rustc_span::hygiene::{ExpnIndex, HygieneEncodeContext, MacroKind};
3839
use rustc_span::symbol::{sym, Symbol};
39-
use rustc_span::{
40-
self, DebuggerVisualizerFile, ExternalSource, FileName, SourceFile, Span, SyntaxContext,
41-
};
40+
use rustc_span::{self, ExternalSource, FileName, SourceFile, Span, SyntaxContext};
4241
use std::borrow::Borrow;
4342
use std::collections::hash_map::Entry;
4443
use std::hash::Hash;
@@ -1855,7 +1854,16 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
18551854

18561855
fn encode_debugger_visualizers(&mut self) -> LazyArray<DebuggerVisualizerFile> {
18571856
empty_proc_macro!(self);
1858-
self.lazy_array(self.tcx.debugger_visualizers(LOCAL_CRATE).iter())
1857+
self.lazy_array(
1858+
self.tcx
1859+
.debugger_visualizers(LOCAL_CRATE)
1860+
.iter()
1861+
// Erase the path since it may contain privacy sensitive data
1862+
// that we don't want to end up in crate metadata.
1863+
// The path is only needed for the local crate because of
1864+
// `--emit dep-info`.
1865+
.map(DebuggerVisualizerFile::path_erased),
1866+
)
18591867
}
18601868

18611869
fn encode_crate_deps(&mut self) -> LazyArray<CrateDep> {

compiler/rustc_metadata/src/rmeta/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::creader::CrateMetadataRef;
22
use decoder::Metadata;
33
use def_path_hash_map::DefPathHashMapRef;
44
use rustc_data_structures::fx::FxHashMap;
5+
use rustc_middle::middle::debugger_visualizer::DebuggerVisualizerFile;
56
use table::TableBuilder;
67

78
use rustc_ast as ast;
@@ -245,7 +246,7 @@ pub(crate) struct CrateRoot {
245246
proc_macro_data: Option<ProcMacroData>,
246247

247248
tables: LazyTables,
248-
debugger_visualizers: LazyArray<rustc_span::DebuggerVisualizerFile>,
249+
debugger_visualizers: LazyArray<DebuggerVisualizerFile>,
249250

250251
exported_symbols: LazyArray<(ExportedSymbol<'static>, SymbolExportInfo)>,
251252

compiler/rustc_middle/src/hir/map/mod.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::hir::{ModuleItems, Owner};
2+
use crate::middle::debugger_visualizer::DebuggerVisualizerFile;
23
use crate::query::LocalCrate;
34
use crate::ty::TyCtxt;
45
use rustc_ast as ast;
@@ -1165,11 +1166,26 @@ pub(super) fn crate_hash(tcx: TyCtxt<'_>, _: LocalCrate) -> Svh {
11651166

11661167
source_file_names.sort_unstable();
11671168

1169+
// We have to take care of debugger visualizers explicitly. The HIR (and
1170+
// thus `hir_body_hash`) contains the #[debugger_visualizer] attributes but
1171+
// these attributes only store the file path to the visualizer file, not
1172+
// their content. Yet that content is exported into crate metadata, so any
1173+
// changes to it need to be reflected in the crate hash.
1174+
let debugger_visualizers: Vec<_> = tcx
1175+
.debugger_visualizers(LOCAL_CRATE)
1176+
.iter()
1177+
// We ignore the path to the visualizer file since it's not going to be
1178+
// encoded in crate metadata and we already hash the full contents of
1179+
// the file.
1180+
.map(DebuggerVisualizerFile::path_erased)
1181+
.collect();
1182+
11681183
let crate_hash: Fingerprint = tcx.with_stable_hashing_context(|mut hcx| {
11691184
let mut stable_hasher = StableHasher::new();
11701185
hir_body_hash.hash_stable(&mut hcx, &mut stable_hasher);
11711186
upstream_crates.hash_stable(&mut hcx, &mut stable_hasher);
11721187
source_file_names.hash_stable(&mut hcx, &mut stable_hasher);
1188+
debugger_visualizers.hash_stable(&mut hcx, &mut stable_hasher);
11731189
if tcx.sess.opts.incremental_relative_spans() {
11741190
let definitions = tcx.definitions_untracked();
11751191
let mut owner_spans: Vec<_> = krate

0 commit comments

Comments
 (0)