Ensure [rust] debuginfo-level-std
doesn't change core's MIR
This commit is contained in:
parent
6094063c35
commit
90b4c86335
9 changed files with 38 additions and 157 deletions
|
@ -699,7 +699,17 @@ impl<'tcx> Inliner<'tcx> {
|
||||||
// Insert all of the (mapped) parts of the callee body into the caller.
|
// Insert all of the (mapped) parts of the callee body into the caller.
|
||||||
caller_body.local_decls.extend(callee_body.drain_vars_and_temps());
|
caller_body.local_decls.extend(callee_body.drain_vars_and_temps());
|
||||||
caller_body.source_scopes.extend(&mut callee_body.source_scopes.drain(..));
|
caller_body.source_scopes.extend(&mut callee_body.source_scopes.drain(..));
|
||||||
if self.tcx.sess.opts.debuginfo != DebugInfo::None {
|
if self
|
||||||
|
.tcx
|
||||||
|
.sess
|
||||||
|
.opts
|
||||||
|
.unstable_opts
|
||||||
|
.inline_mir_preserve_debug
|
||||||
|
.unwrap_or(self.tcx.sess.opts.debuginfo != DebugInfo::None)
|
||||||
|
{
|
||||||
|
// Note that we need to preserve these in the standard library so that
|
||||||
|
// people working on rust can build with or without debuginfo while
|
||||||
|
// still getting consistent results from the mir-opt tests.
|
||||||
caller_body.var_debug_info.append(&mut callee_body.var_debug_info);
|
caller_body.var_debug_info.append(&mut callee_body.var_debug_info);
|
||||||
}
|
}
|
||||||
caller_body.basic_blocks_mut().extend(callee_body.basic_blocks_mut().drain(..));
|
caller_body.basic_blocks_mut().extend(callee_body.basic_blocks_mut().drain(..));
|
||||||
|
|
|
@ -1717,6 +1717,9 @@ options! {
|
||||||
"enable MIR inlining (default: no)"),
|
"enable MIR inlining (default: no)"),
|
||||||
inline_mir_hint_threshold: Option<usize> = (None, parse_opt_number, [TRACKED],
|
inline_mir_hint_threshold: Option<usize> = (None, parse_opt_number, [TRACKED],
|
||||||
"inlining threshold for functions with inline hint (default: 100)"),
|
"inlining threshold for functions with inline hint (default: 100)"),
|
||||||
|
inline_mir_preserve_debug: Option<bool> = (None, parse_opt_bool, [TRACKED],
|
||||||
|
"when MIR inlining, whether to preserve debug info for callee variables \
|
||||||
|
(default: preserve for debuginfo != None, otherwise remove)"),
|
||||||
inline_mir_threshold: Option<usize> = (None, parse_opt_number, [TRACKED],
|
inline_mir_threshold: Option<usize> = (None, parse_opt_number, [TRACKED],
|
||||||
"a default MIR inlining threshold (default: 50)"),
|
"a default MIR inlining threshold (default: 50)"),
|
||||||
input_stats: bool = (false, parse_bool, [UNTRACKED],
|
input_stats: bool = (false, parse_bool, [UNTRACKED],
|
||||||
|
|
|
@ -2102,6 +2102,14 @@ impl<'a> Builder<'a> {
|
||||||
// break when incremental compilation is enabled. So this overrides the "no inlining
|
// break when incremental compilation is enabled. So this overrides the "no inlining
|
||||||
// during incremental builds" heuristic for the standard library.
|
// during incremental builds" heuristic for the standard library.
|
||||||
rustflags.arg("-Zinline-mir");
|
rustflags.arg("-Zinline-mir");
|
||||||
|
|
||||||
|
// always pass this after the next `#[cfg(bootstrap)]` update.
|
||||||
|
if compiler.stage != 0 {
|
||||||
|
// Similarly, we need to keep debug info for functions inlined into other std functions,
|
||||||
|
// even if we're not going to output debuginfo for the crate we're currently building,
|
||||||
|
// so that it'll be available when downstream consumers of std try to use it.
|
||||||
|
rustflags.arg("-Zinline-mir-preserve-debug");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.config.rustc_parallel
|
if self.config.rustc_parallel
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
+ scope 3 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:19:5: 19:8}>::new) {
|
+ scope 3 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:19:5: 19:8}>::new) {
|
||||||
+ debug pointer => _3;
|
+ debug pointer => _3;
|
||||||
+ scope 4 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:19:5: 19:8}>::new_unchecked) {
|
+ scope 4 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:19:5: 19:8}>::new_unchecked) {
|
||||||
|
+ debug pointer => _3;
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ scope 5 (inlined g::{closure#0}) {
|
+ scope 5 (inlined g::{closure#0}) {
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
+ scope 3 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:19:5: 19:8}>::new) {
|
+ scope 3 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:19:5: 19:8}>::new) {
|
||||||
+ debug pointer => _3;
|
+ debug pointer => _3;
|
||||||
+ scope 4 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:19:5: 19:8}>::new_unchecked) {
|
+ scope 4 (inlined Pin::<&mut {coroutine@$DIR/inline_coroutine.rs:19:5: 19:8}>::new_unchecked) {
|
||||||
|
+ debug pointer => _3;
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ scope 5 (inlined g::{closure#0}) {
|
+ scope 5 (inlined g::{closure#0}) {
|
||||||
|
|
|
@ -13,11 +13,17 @@ fn checked_shl(_1: u32, _2: u32) -> Option<u32> {
|
||||||
debug b => _5;
|
debug b => _5;
|
||||||
}
|
}
|
||||||
scope 3 (inlined core::num::<impl u32>::overflowing_shl) {
|
scope 3 (inlined core::num::<impl u32>::overflowing_shl) {
|
||||||
|
debug self => _1;
|
||||||
|
debug rhs => _2;
|
||||||
let mut _4: u32;
|
let mut _4: u32;
|
||||||
let mut _5: bool;
|
let mut _5: bool;
|
||||||
scope 4 (inlined core::num::<impl u32>::wrapping_shl) {
|
scope 4 (inlined core::num::<impl u32>::wrapping_shl) {
|
||||||
|
debug self => _1;
|
||||||
|
debug rhs => _2;
|
||||||
let mut _3: u32;
|
let mut _3: u32;
|
||||||
scope 5 (inlined core::num::<impl u32>::unchecked_shl) {
|
scope 5 (inlined core::num::<impl u32>::unchecked_shl) {
|
||||||
|
debug self => _1;
|
||||||
|
debug rhs => _3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,11 +13,17 @@ fn checked_shl(_1: u32, _2: u32) -> Option<u32> {
|
||||||
debug b => _5;
|
debug b => _5;
|
||||||
}
|
}
|
||||||
scope 3 (inlined core::num::<impl u32>::overflowing_shl) {
|
scope 3 (inlined core::num::<impl u32>::overflowing_shl) {
|
||||||
|
debug self => _1;
|
||||||
|
debug rhs => _2;
|
||||||
let mut _4: u32;
|
let mut _4: u32;
|
||||||
let mut _5: bool;
|
let mut _5: bool;
|
||||||
scope 4 (inlined core::num::<impl u32>::wrapping_shl) {
|
scope 4 (inlined core::num::<impl u32>::wrapping_shl) {
|
||||||
|
debug self => _1;
|
||||||
|
debug rhs => _2;
|
||||||
let mut _3: u32;
|
let mut _3: u32;
|
||||||
scope 5 (inlined core::num::<impl u32>::unchecked_shl) {
|
scope 5 (inlined core::num::<impl u32>::unchecked_shl) {
|
||||||
|
debug self => _1;
|
||||||
|
debug rhs => _3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,89 +4,12 @@ fn step_forward(_1: u16, _2: usize) -> u16 {
|
||||||
debug x => _1;
|
debug x => _1;
|
||||||
debug n => _2;
|
debug n => _2;
|
||||||
let mut _0: u16;
|
let mut _0: u16;
|
||||||
scope 1 (inlined <u16 as Step>::forward) {
|
|
||||||
debug start => _1;
|
|
||||||
debug n => _2;
|
|
||||||
let mut _8: u16;
|
|
||||||
scope 2 {
|
|
||||||
}
|
|
||||||
scope 3 (inlined <u16 as Step>::forward_checked) {
|
|
||||||
scope 4 {
|
|
||||||
scope 6 (inlined core::num::<impl u16>::checked_add) {
|
|
||||||
let mut _7: bool;
|
|
||||||
scope 7 {
|
|
||||||
}
|
|
||||||
scope 8 (inlined core::num::<impl u16>::overflowing_add) {
|
|
||||||
let mut _5: (u16, bool);
|
|
||||||
let _6: bool;
|
|
||||||
scope 9 {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scope 5 (inlined convert::num::ptr_try_from_impls::<impl TryFrom<usize> for u16>::try_from) {
|
|
||||||
let mut _3: bool;
|
|
||||||
let mut _4: u16;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scope 10 (inlined Option::<u16>::is_none) {
|
|
||||||
scope 11 (inlined Option::<u16>::is_some) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scope 12 (inlined core::num::<impl u16>::wrapping_add) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
StorageLive(_4);
|
_0 = <u16 as Step>::forward(move _1, move _2) -> [return: bb1, unwind unreachable];
|
||||||
StorageLive(_3);
|
|
||||||
_3 = Gt(_2, const 65535_usize);
|
|
||||||
switchInt(move _3) -> [0: bb1, otherwise: bb5];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bb1: {
|
bb1: {
|
||||||
_4 = _2 as u16 (IntToInt);
|
|
||||||
StorageDead(_3);
|
|
||||||
StorageLive(_6);
|
|
||||||
StorageLive(_5);
|
|
||||||
_5 = CheckedAdd(_1, _4);
|
|
||||||
_6 = (_5.1: bool);
|
|
||||||
StorageDead(_5);
|
|
||||||
StorageLive(_7);
|
|
||||||
_7 = unlikely(move _6) -> [return: bb2, unwind unreachable];
|
|
||||||
}
|
|
||||||
|
|
||||||
bb2: {
|
|
||||||
switchInt(move _7) -> [0: bb3, otherwise: bb4];
|
|
||||||
}
|
|
||||||
|
|
||||||
bb3: {
|
|
||||||
StorageDead(_7);
|
|
||||||
StorageDead(_6);
|
|
||||||
goto -> bb7;
|
|
||||||
}
|
|
||||||
|
|
||||||
bb4: {
|
|
||||||
StorageDead(_7);
|
|
||||||
StorageDead(_6);
|
|
||||||
goto -> bb6;
|
|
||||||
}
|
|
||||||
|
|
||||||
bb5: {
|
|
||||||
StorageDead(_3);
|
|
||||||
goto -> bb6;
|
|
||||||
}
|
|
||||||
|
|
||||||
bb6: {
|
|
||||||
assert(!const true, "attempt to compute `{} + {}`, which would overflow", const core::num::<impl u16>::MAX, const 1_u16) -> [success: bb7, unwind unreachable];
|
|
||||||
}
|
|
||||||
|
|
||||||
bb7: {
|
|
||||||
StorageLive(_8);
|
|
||||||
_8 = _2 as u16 (IntToInt);
|
|
||||||
_0 = Add(_1, _8);
|
|
||||||
StorageDead(_8);
|
|
||||||
StorageDead(_4);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,89 +4,12 @@ fn step_forward(_1: u16, _2: usize) -> u16 {
|
||||||
debug x => _1;
|
debug x => _1;
|
||||||
debug n => _2;
|
debug n => _2;
|
||||||
let mut _0: u16;
|
let mut _0: u16;
|
||||||
scope 1 (inlined <u16 as Step>::forward) {
|
|
||||||
debug start => _1;
|
|
||||||
debug n => _2;
|
|
||||||
let mut _8: u16;
|
|
||||||
scope 2 {
|
|
||||||
}
|
|
||||||
scope 3 (inlined <u16 as Step>::forward_checked) {
|
|
||||||
scope 4 {
|
|
||||||
scope 6 (inlined core::num::<impl u16>::checked_add) {
|
|
||||||
let mut _7: bool;
|
|
||||||
scope 7 {
|
|
||||||
}
|
|
||||||
scope 8 (inlined core::num::<impl u16>::overflowing_add) {
|
|
||||||
let mut _5: (u16, bool);
|
|
||||||
let _6: bool;
|
|
||||||
scope 9 {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scope 5 (inlined convert::num::ptr_try_from_impls::<impl TryFrom<usize> for u16>::try_from) {
|
|
||||||
let mut _3: bool;
|
|
||||||
let mut _4: u16;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scope 10 (inlined Option::<u16>::is_none) {
|
|
||||||
scope 11 (inlined Option::<u16>::is_some) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
scope 12 (inlined core::num::<impl u16>::wrapping_add) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bb0: {
|
bb0: {
|
||||||
StorageLive(_4);
|
_0 = <u16 as Step>::forward(move _1, move _2) -> [return: bb1, unwind continue];
|
||||||
StorageLive(_3);
|
|
||||||
_3 = Gt(_2, const 65535_usize);
|
|
||||||
switchInt(move _3) -> [0: bb1, otherwise: bb5];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bb1: {
|
bb1: {
|
||||||
_4 = _2 as u16 (IntToInt);
|
|
||||||
StorageDead(_3);
|
|
||||||
StorageLive(_6);
|
|
||||||
StorageLive(_5);
|
|
||||||
_5 = CheckedAdd(_1, _4);
|
|
||||||
_6 = (_5.1: bool);
|
|
||||||
StorageDead(_5);
|
|
||||||
StorageLive(_7);
|
|
||||||
_7 = unlikely(move _6) -> [return: bb2, unwind unreachable];
|
|
||||||
}
|
|
||||||
|
|
||||||
bb2: {
|
|
||||||
switchInt(move _7) -> [0: bb3, otherwise: bb4];
|
|
||||||
}
|
|
||||||
|
|
||||||
bb3: {
|
|
||||||
StorageDead(_7);
|
|
||||||
StorageDead(_6);
|
|
||||||
goto -> bb7;
|
|
||||||
}
|
|
||||||
|
|
||||||
bb4: {
|
|
||||||
StorageDead(_7);
|
|
||||||
StorageDead(_6);
|
|
||||||
goto -> bb6;
|
|
||||||
}
|
|
||||||
|
|
||||||
bb5: {
|
|
||||||
StorageDead(_3);
|
|
||||||
goto -> bb6;
|
|
||||||
}
|
|
||||||
|
|
||||||
bb6: {
|
|
||||||
assert(!const true, "attempt to compute `{} + {}`, which would overflow", const core::num::<impl u16>::MAX, const 1_u16) -> [success: bb7, unwind continue];
|
|
||||||
}
|
|
||||||
|
|
||||||
bb7: {
|
|
||||||
StorageLive(_8);
|
|
||||||
_8 = _2 as u16 (IntToInt);
|
|
||||||
_0 = Add(_1, _8);
|
|
||||||
StorageDead(_8);
|
|
||||||
StorageDead(_4);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue