|  | 
| 1 | 1 | // .debug_gdb_scripts binary section. | 
| 2 | 2 | 
 | 
|  | 3 | +use std::collections::BTreeSet; | 
| 3 | 4 | use std::ffi::CString; | 
| 4 | 5 | 
 | 
| 5 |  | -use rustc_codegen_ssa::base::collect_debugger_visualizers_transitive; | 
| 6 | 6 | use rustc_codegen_ssa::traits::*; | 
| 7 | 7 | use rustc_hir::def_id::LOCAL_CRATE; | 
| 8 | 8 | use rustc_middle::bug; | 
| 9 | 9 | use rustc_middle::middle::debugger_visualizer::DebuggerVisualizerType; | 
| 10 |  | -use rustc_session::config::{CrateType, DebugInfo}; | 
|  | 10 | +use rustc_session::config::DebugInfo; | 
| 11 | 11 | 
 | 
| 12 | 12 | use crate::builder::Builder; | 
| 13 | 13 | use crate::common::CodegenCx; | 
| @@ -51,10 +51,14 @@ pub(crate) fn get_or_insert_gdb_debug_scripts_section_global<'ll>( | 
| 51 | 51 | 
 | 
| 52 | 52 |         // Next, add the pretty printers that were specified via the `#[debugger_visualizer]` | 
| 53 | 53 |         // attribute. | 
| 54 |  | -        let visualizers = collect_debugger_visualizers_transitive( | 
| 55 |  | -            cx.tcx, | 
| 56 |  | -            DebuggerVisualizerType::GdbPrettyPrinter, | 
| 57 |  | -        ); | 
|  | 54 | +        let visualizers = cx | 
|  | 55 | +            .tcx | 
|  | 56 | +            .debugger_visualizers(LOCAL_CRATE) | 
|  | 57 | +            .iter() | 
|  | 58 | +            .filter(|visualizer| { | 
|  | 59 | +                visualizer.visualizer_type == DebuggerVisualizerType::GdbPrettyPrinter | 
|  | 60 | +            }) | 
|  | 61 | +            .collect::<BTreeSet<_>>(); | 
| 58 | 62 |         let crate_name = cx.tcx.crate_name(LOCAL_CRATE); | 
| 59 | 63 |         for (index, visualizer) in visualizers.iter().enumerate() { | 
| 60 | 64 |             // The initial byte `4` instructs GDB that the following pretty printer | 
| @@ -91,30 +95,5 @@ pub(crate) fn get_or_insert_gdb_debug_scripts_section_global<'ll>( | 
| 91 | 95 | } | 
| 92 | 96 | 
 | 
| 93 | 97 | pub(crate) fn needs_gdb_debug_scripts_section(cx: &CodegenCx<'_, '_>) -> bool { | 
| 94 |  | -    // We collect pretty printers transitively for all crates, so we make sure | 
| 95 |  | -    // that the section is only emitted for leaf crates. | 
| 96 |  | -    let embed_visualizers = cx.tcx.crate_types().iter().any(|&crate_type| match crate_type { | 
| 97 |  | -        CrateType::Executable | CrateType::Cdylib | CrateType::Staticlib | CrateType::Sdylib => { | 
| 98 |  | -            // These are crate types for which we will embed pretty printers since they | 
| 99 |  | -            // are treated as leaf crates. | 
| 100 |  | -            true | 
| 101 |  | -        } | 
| 102 |  | -        CrateType::ProcMacro => { | 
| 103 |  | -            // We could embed pretty printers for proc macro crates too but it does not | 
| 104 |  | -            // seem like a good default, since this is a rare use case and we don't | 
| 105 |  | -            // want to slow down the common case. | 
| 106 |  | -            false | 
| 107 |  | -        } | 
| 108 |  | -        CrateType::Rlib | CrateType::Dylib => { | 
| 109 |  | -            // Don't embed pretty printers for these crate types; the compiler | 
| 110 |  | -            // can see the `#[debug_visualizer]` attributes when using the | 
| 111 |  | -            // library, and emitting `.debug_gdb_scripts` regardless would | 
| 112 |  | -            // break `#![omit_gdb_pretty_printer_section]`. | 
| 113 |  | -            false | 
| 114 |  | -        } | 
| 115 |  | -    }); | 
| 116 |  | - | 
| 117 |  | -    cx.sess().opts.debuginfo != DebugInfo::None | 
| 118 |  | -        && cx.sess().target.emit_debug_gdb_scripts | 
| 119 |  | -        && embed_visualizers | 
|  | 98 | +    cx.sess().opts.debuginfo != DebugInfo::None && cx.sess().target.emit_debug_gdb_scripts | 
| 120 | 99 | } | 
0 commit comments