mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-10 17:07:36 +00:00

Stop pessimizing the use of local variables in core by skipping debug info for MIR temporaries in tiny (single-BB) functions. For functions as simple as this -- `Pin::new`, etc -- nobody every actually wants debuginfo for them in the first place. They're more like intrinsics than real functions, and stepping over them is good.
35 lines
1.3 KiB
Rust
35 lines
1.3 KiB
Rust
use rustc_middle::mir::*;
|
|
use rustc_middle::ty::TyCtxt;
|
|
use rustc_session::config::MirStripDebugInfo;
|
|
|
|
/// Conditionally remove some of the VarDebugInfo in MIR.
|
|
///
|
|
/// In particular, stripping non-parameter debug info for tiny, primitive-like
|
|
/// methods in core saves work later, and nobody ever wanted to use it anyway.
|
|
pub(super) struct StripDebugInfo;
|
|
|
|
impl<'tcx> crate::MirPass<'tcx> for StripDebugInfo {
|
|
fn is_enabled(&self, sess: &rustc_session::Session) -> bool {
|
|
sess.opts.unstable_opts.mir_strip_debuginfo != MirStripDebugInfo::None
|
|
}
|
|
|
|
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
|
match tcx.sess.opts.unstable_opts.mir_strip_debuginfo {
|
|
MirStripDebugInfo::None => return,
|
|
MirStripDebugInfo::AllLocals => {}
|
|
MirStripDebugInfo::LocalsInTinyFunctions
|
|
if let TerminatorKind::Return { .. } =
|
|
body.basic_blocks[START_BLOCK].terminator().kind => {}
|
|
MirStripDebugInfo::LocalsInTinyFunctions => return,
|
|
}
|
|
|
|
body.var_debug_info.retain(|vdi| {
|
|
matches!(
|
|
vdi.value,
|
|
VarDebugInfoContents::Place(place)
|
|
if place.local.as_usize() <= body.arg_count && place.local != RETURN_PLACE,
|
|
)
|
|
});
|
|
}
|
|
}
|