summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_passes/src/debugger_visualizer.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
commit9835e2ae736235810b4ea1c162ca5e65c547e770 (patch)
tree3fcebf40ed70e581d776a8a4c65923e8ec20e026 /compiler/rustc_passes/src/debugger_visualizer.rs
parentReleasing progress-linux version 1.70.0+dfsg2-1~progress7.99u1. (diff)
downloadrustc-9835e2ae736235810b4ea1c162ca5e65c547e770.tar.xz
rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.zip
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_passes/src/debugger_visualizer.rs')
-rw-r--r--compiler/rustc_passes/src/debugger_visualizer.rs127
1 files changed, 68 insertions, 59 deletions
diff --git a/compiler/rustc_passes/src/debugger_visualizer.rs b/compiler/rustc_passes/src/debugger_visualizer.rs
index 9dd39a5c9..3483f7da5 100644
--- a/compiler/rustc_passes/src/debugger_visualizer.rs
+++ b/compiler/rustc_passes/src/debugger_visualizer.rs
@@ -1,61 +1,69 @@
//! Detecting usage of the `#[debugger_visualizer]` attribute.
-use hir::CRATE_HIR_ID;
-use rustc_data_structures::fx::FxHashSet;
+use rustc_ast::Attribute;
+use rustc_data_structures::sync::Lrc;
use rustc_expand::base::resolve_path;
-use rustc_hir as hir;
-use rustc_hir::HirId;
-use rustc_middle::ty::TyCtxt;
-use rustc_middle::{query::LocalCrate, ty::query::Providers};
-use rustc_span::{sym, DebuggerVisualizerFile, DebuggerVisualizerType};
+use rustc_middle::{
+ middle::debugger_visualizer::{DebuggerVisualizerFile, DebuggerVisualizerType},
+ query::{LocalCrate, Providers},
+ ty::TyCtxt,
+};
+use rustc_session::Session;
+use rustc_span::sym;
-use std::sync::Arc;
+use crate::errors::{DebugVisualizerInvalid, DebugVisualizerUnreadable};
-use crate::errors::DebugVisualizerUnreadable;
-
-fn check_for_debugger_visualizer(
- tcx: TyCtxt<'_>,
- hir_id: HirId,
- debugger_visualizers: &mut FxHashSet<DebuggerVisualizerFile>,
-) {
- let attrs = tcx.hir().attrs(hir_id);
- for attr in attrs {
+impl DebuggerVisualizerCollector<'_> {
+ fn check_for_debugger_visualizer(&mut self, attr: &Attribute) {
if attr.has_name(sym::debugger_visualizer) {
- let Some(list) = attr.meta_item_list() else {
- continue
+ let Some(hints) = attr.meta_item_list() else {
+ self.sess.emit_err(DebugVisualizerInvalid { span: attr.span });
+ return;
};
- let meta_item = match list.len() {
- 1 => match list[0].meta_item() {
- Some(meta_item) => meta_item,
- _ => continue,
- },
- _ => continue,
+ let hint = if hints.len() == 1 {
+ &hints[0]
+ } else {
+ self.sess.emit_err(DebugVisualizerInvalid { span: attr.span });
+ return;
};
- let visualizer_type = match meta_item.name_or_empty() {
- sym::natvis_file => DebuggerVisualizerType::Natvis,
- sym::gdb_script_file => DebuggerVisualizerType::GdbPrettyPrinter,
- _ => continue,
+ let Some(meta_item) = hint.meta_item() else {
+ self.sess.emit_err(DebugVisualizerInvalid { span: attr.span });
+ return;
};
- let file = match meta_item.value_str() {
- Some(value) => {
- match resolve_path(&tcx.sess.parse_sess, value.as_str(), attr.span) {
- Ok(file) => file,
- _ => continue,
+ let (visualizer_type, visualizer_path) =
+ match (meta_item.name_or_empty(), meta_item.value_str()) {
+ (sym::natvis_file, Some(value)) => (DebuggerVisualizerType::Natvis, value),
+ (sym::gdb_script_file, Some(value)) => {
+ (DebuggerVisualizerType::GdbPrettyPrinter, value)
}
- }
- None => continue,
- };
+ (_, _) => {
+ self.sess.emit_err(DebugVisualizerInvalid { span: meta_item.span });
+ return;
+ }
+ };
+
+ let file =
+ match resolve_path(&self.sess.parse_sess, visualizer_path.as_str(), attr.span) {
+ Ok(file) => file,
+ Err(mut err) => {
+ err.emit();
+ return;
+ }
+ };
match std::fs::read(&file) {
Ok(contents) => {
- debugger_visualizers
- .insert(DebuggerVisualizerFile::new(Arc::from(contents), visualizer_type));
+ self.visualizers.push(DebuggerVisualizerFile::new(
+ Lrc::from(contents),
+ visualizer_type,
+ file,
+ ));
}
Err(error) => {
- tcx.sess.emit_err(DebugVisualizerUnreadable {
+ self.sess.emit_err(DebugVisualizerUnreadable {
span: meta_item.span,
file: &file,
error,
@@ -66,29 +74,30 @@ fn check_for_debugger_visualizer(
}
}
-/// Traverses and collects the debugger visualizers for a specific crate.
-fn debugger_visualizers(tcx: TyCtxt<'_>, _: LocalCrate) -> Vec<DebuggerVisualizerFile> {
- // Initialize the collector.
- let mut debugger_visualizers = FxHashSet::default();
+struct DebuggerVisualizerCollector<'a> {
+ sess: &'a Session,
+ visualizers: Vec<DebuggerVisualizerFile>,
+}
- // Collect debugger visualizers in this crate.
- tcx.hir().for_each_module(|id| {
- check_for_debugger_visualizer(
- tcx,
- tcx.hir().local_def_id_to_hir_id(id),
- &mut debugger_visualizers,
- )
- });
+impl<'ast> rustc_ast::visit::Visitor<'ast> for DebuggerVisualizerCollector<'_> {
+ fn visit_attribute(&mut self, attr: &'ast Attribute) {
+ self.check_for_debugger_visualizer(attr);
+ rustc_ast::visit::walk_attribute(self, attr);
+ }
+}
- // Collect debugger visualizers on the crate attributes.
- check_for_debugger_visualizer(tcx, CRATE_HIR_ID, &mut debugger_visualizers);
+/// Traverses and collects the debugger visualizers for a specific crate.
+fn debugger_visualizers(tcx: TyCtxt<'_>, _: LocalCrate) -> Vec<DebuggerVisualizerFile> {
+ let resolver_and_krate = tcx.resolver_for_lowering(()).borrow();
+ let krate = &*resolver_and_krate.1;
- // Extract out the found debugger_visualizer items.
- let mut visualizers = debugger_visualizers.into_iter().collect::<Vec<_>>();
+ let mut visitor = DebuggerVisualizerCollector { sess: tcx.sess, visualizers: Vec::new() };
+ rustc_ast::visit::Visitor::visit_crate(&mut visitor, krate);
- // Sort the visualizers so we always get a deterministic query result.
- visualizers.sort();
- visualizers
+ // We are collecting visualizers in AST-order, which is deterministic,
+ // so we don't need to do any explicit sorting in order to get a
+ // deterministic query result
+ visitor.visualizers
}
pub fn provide(providers: &mut Providers) {