about summary refs log tree commit diff
path: root/library/std/src
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2022-01-20 17:10:40 +0100
committerGitHub <noreply@github.com>2022-01-20 17:10:40 +0100
commit1cb57e2d2b6400ed6fb6d498cb5639fe6fd5d984 (patch)
tree5e3dcae0bc73dd3264e076302666a31f26993119 /library/std/src
parented3bf67db74ffa0165bef56d1d6597f5fa56a5fa (diff)
parentc2807525a5d7adff0e340007f73b9558f45e38b5 (diff)
downloadrust-1cb57e2d2b6400ed6fb6d498cb5639fe6fd5d984.tar.gz
rust-1cb57e2d2b6400ed6fb6d498cb5639fe6fd5d984.zip
Rollup merge of #92992 - kornelski:backtraceopt, r=Mark-Simulacrum
Help optimize out backtraces when disabled

The comment in `rust_backtrace_env` says:

>    // If the `backtrace` feature of this crate isn't enabled quickly return
>   // `None` so this can be constant propagated all over the place to turn
>  // optimize away callers.

but this optimization has regressed, because the only caller of this function had an alternative path that unconditionally (and pointlessly) asked for a full backtrace, so the disabled state couldn't propagate.

I've added a getter for the full format that respects the feature flag, so that the caller will now be able to really optimize out the disabled backtrace path. I've also made `rust_backtrace_env` trivially inlineable when backtraces are disabled.
Diffstat (limited to 'library/std/src')
-rw-r--r--library/std/src/panicking.rs2
-rw-r--r--library/std/src/sys_common/backtrace.rs25
2 files changed, 19 insertions, 8 deletions
diff --git a/library/std/src/panicking.rs b/library/std/src/panicking.rs
index 44f573297ee..d0f332fe5e8 100644
--- a/library/std/src/panicking.rs
+++ b/library/std/src/panicking.rs
@@ -263,7 +263,7 @@ fn default_hook(info: &PanicInfo<'_>) {
     // If this is a double panic, make sure that we print a backtrace
     // for this panic. Otherwise only print it if logging is enabled.
     let backtrace_env = if panic_count::get_count() >= 2 {
-        RustBacktrace::Print(crate::backtrace_rs::PrintFmt::Full)
+        backtrace::rust_backtrace_print_full()
     } else {
         backtrace::rust_backtrace_env()
     };
diff --git a/library/std/src/sys_common/backtrace.rs b/library/std/src/sys_common/backtrace.rs
index d5e8f12414f..dc581a0675b 100644
--- a/library/std/src/sys_common/backtrace.rs
+++ b/library/std/src/sys_common/backtrace.rs
@@ -150,16 +150,18 @@ pub enum RustBacktrace {
     RuntimeDisabled,
 }
 
+// If the `backtrace` feature of this crate isn't enabled quickly return
+// `Disabled` so this can be constant propagated all over the place to
+// optimize away callers.
+#[cfg(not(feature = "backtrace"))]
+pub fn rust_backtrace_env() -> RustBacktrace {
+    RustBacktrace::Disabled
+}
+
 // For now logging is turned off by default, and this function checks to see
 // whether the magical environment variable is present to see if it's turned on.
+#[cfg(feature = "backtrace")]
 pub fn rust_backtrace_env() -> RustBacktrace {
-    // If the `backtrace` feature of this crate isn't enabled quickly return
-    // `None` so this can be constant propagated all over the place to turn
-    // optimize away callers.
-    if !cfg!(feature = "backtrace") {
-        return RustBacktrace::Disabled;
-    }
-
     // Setting environment variables for Fuchsia components isn't a standard
     // or easily supported workflow. For now, always display backtraces.
     if cfg!(target_os = "fuchsia") {
@@ -189,6 +191,15 @@ pub fn rust_backtrace_env() -> RustBacktrace {
     format
 }
 
+/// Setting for printing the full backtrace, unless backtraces are completely disabled
+pub(crate) fn rust_backtrace_print_full() -> RustBacktrace {
+    if cfg!(feature = "backtrace") {
+        RustBacktrace::Print(PrintFmt::Full)
+    } else {
+        RustBacktrace::Disabled
+    }
+}
+
 /// Prints the filename of the backtrace frame.
 ///
 /// See also `output`.