From b60954757eb1acd4069ddbc28a51f4a5bb7d42c9 Mon Sep 17 00:00:00 2001
From: Ralf Jung <post@ralfj.de>
Date: Sat, 14 Sep 2019 10:23:10 +0200
Subject: [PATCH] std: always depend on backtrace, but only enable its features
 on demand

---
 src/bootstrap/lib.rs               |  2 +-
 src/libstd/Cargo.toml              | 18 +++++++++---------
 src/libstd/build.rs                |  2 +-
 src/libstd/panicking.rs            |  6 +++---
 src/libstd/rt.rs                   |  4 ++--
 src/libstd/sys_common/backtrace.rs |  5 ++++-
 src/libstd/sys_common/mod.rs       |  1 -
 src/libstd/thread/mod.rs           |  4 ++--
 src/libtest/Cargo.toml             |  2 +-
 9 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index 5d7581c8211..e4f1b773a69 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -490,7 +490,7 @@ impl Build {
             features.push_str(" llvm-libunwind");
         }
         if self.config.backtrace {
-            features.push_str(" backtrace");
+            features.push_str(" backtrace_support");
         }
         if self.config.profiler {
             features.push_str(" profiler");
diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml
index 20442abc588..2da73c11907 100644
--- a/src/libstd/Cargo.toml
+++ b/src/libstd/Cargo.toml
@@ -27,15 +27,8 @@ hashbrown = { version = "0.5.0", features = ['rustc-dep-of-std'] }
 
 [dependencies.backtrace]
 version = "0.3.37"
-default-features = false # don't use coresymbolication on OSX
-features = [
-  "rustc-dep-of-std", # enable build support for integrating into libstd
-  "dbghelp",          # backtrace/symbolize on MSVC
-  "libbacktrace",     # symbolize on most platforms
-  "libunwind",        # backtrace on most platforms
-  "dladdr",           # symbolize on platforms w/o libbacktrace
-]
-optional = true
+default-features = false # without the libstd `backtrace` feature, stub out everything
+features = [ "rustc-dep-of-std" ] # enable build support for integrating into libstd
 
 [dev-dependencies]
 rand = "0.7"
@@ -65,6 +58,13 @@ cc = "1.0"
 [features]
 default = ["std_detect_file_io", "std_detect_dlsym_getauxval"]
 
+backtrace_support = [
+  "backtrace/dbghelp",          # backtrace/symbolize on MSVC
+  "backtrace/libbacktrace",     # symbolize on most platforms
+  "backtrace/libunwind",        # backtrace on most platforms
+  "backtrace/dladdr",           # symbolize on platforms w/o libbacktrace
+]
+
 panic-unwind = ["panic_unwind"]
 profiler = ["profiler_builtins"]
 compiler-builtins-c = ["alloc/compiler-builtins-c"]
diff --git a/src/libstd/build.rs b/src/libstd/build.rs
index 8db7bc12cd3..3209332eeb6 100644
--- a/src/libstd/build.rs
+++ b/src/libstd/build.rs
@@ -49,7 +49,7 @@ fn main() {
         println!("cargo:rustc-link-lib=zircon");
         println!("cargo:rustc-link-lib=fdio");
     } else if target.contains("cloudabi") {
-        if cfg!(feature = "backtrace") {
+        if cfg!(feature = "backtrace_support") {
             println!("cargo:rustc-link-lib=unwind");
         }
         println!("cargo:rustc-link-lib=c");
diff --git a/src/libstd/panicking.rs b/src/libstd/panicking.rs
index db4089c2948..93a17d6eea5 100644
--- a/src/libstd/panicking.rs
+++ b/src/libstd/panicking.rs
@@ -157,12 +157,12 @@ pub fn take_hook() -> Box<dyn Fn(&PanicInfo<'_>) + 'static + Sync + Send> {
 }
 
 fn default_hook(info: &PanicInfo<'_>) {
-    #[cfg(feature = "backtrace")]
+    #[cfg(feature = "backtrace_support")]
     use crate::sys_common::{backtrace as backtrace_mod};
 
     // If this is a double panic, make sure that we print a backtrace
     // for this panic. Otherwise only print it if logging is enabled.
-    #[cfg(feature = "backtrace")]
+    #[cfg(feature = "backtrace_support")]
     let log_backtrace = {
         let panics = update_panic_count(0);
 
@@ -190,7 +190,7 @@ fn default_hook(info: &PanicInfo<'_>) {
         let _ = writeln!(err, "thread '{}' panicked at '{}', {}",
                          name, msg, location);
 
-        #[cfg(feature = "backtrace")]
+        #[cfg(feature = "backtrace_support")]
         {
             use crate::sync::atomic::{AtomicBool, Ordering};
 
diff --git a/src/libstd/rt.rs b/src/libstd/rt.rs
index cf45eb0daba..f73bd6c6e74 100644
--- a/src/libstd/rt.rs
+++ b/src/libstd/rt.rs
@@ -44,11 +44,11 @@ fn lang_start_internal(main: &(dyn Fn() -> i32 + Sync + crate::panic::RefUnwindS
         sys::args::init(argc, argv);
 
         // Let's run some code!
-        #[cfg(feature = "backtrace")]
+        #[cfg(feature = "backtrace_support")]
         let exit_code = panic::catch_unwind(|| {
             sys_common::backtrace::__rust_begin_short_backtrace(move || main())
         });
-        #[cfg(not(feature = "backtrace"))]
+        #[cfg(not(feature = "backtrace_support"))]
         let exit_code = panic::catch_unwind(move || main());
 
         sys_common::cleanup();
diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs
index 1a78abf5086..52890668c35 100644
--- a/src/libstd/sys_common/backtrace.rs
+++ b/src/libstd/sys_common/backtrace.rs
@@ -7,7 +7,6 @@ use crate::io;
 use crate::borrow::Cow;
 use crate::io::prelude::*;
 use crate::path::{self, Path, PathBuf};
-use crate::sync::atomic::{self, Ordering};
 use crate::sys::mutex::Mutex;
 
 use backtrace::{BacktraceFmt, BytesOrWideString, PrintFmt};
@@ -34,6 +33,7 @@ pub fn lock() -> impl Drop {
 }
 
 /// Prints the current backtrace.
+#[cfg(feature = "backtrace_support")]
 pub fn print(w: &mut dyn Write, format: PrintFmt) -> io::Result<()> {
     // There are issues currently linking libbacktrace into tests, and in
     // general during libstd's own unit tests we're not testing this path. In
@@ -129,7 +129,10 @@ where
 
 // 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_support")]
 pub fn log_enabled() -> Option<PrintFmt> {
+    use crate::sync::atomic::{self, Ordering};
+
     // Setting environment variables for Fuchsia components isn't a standard
     // or easily supported workflow. For now, always display backtraces.
     if cfg!(target_os = "fuchsia") {
diff --git a/src/libstd/sys_common/mod.rs b/src/libstd/sys_common/mod.rs
index 9190a3b0d5f..cba3eca5386 100644
--- a/src/libstd/sys_common/mod.rs
+++ b/src/libstd/sys_common/mod.rs
@@ -41,7 +41,6 @@ macro_rules! rtunwrap {
 
 pub mod alloc;
 pub mod at_exit_imp;
-#[cfg(feature = "backtrace")]
 pub mod backtrace;
 pub mod condvar;
 pub mod io;
diff --git a/src/libstd/thread/mod.rs b/src/libstd/thread/mod.rs
index 764041d2f42..85fd80e16af 100644
--- a/src/libstd/thread/mod.rs
+++ b/src/libstd/thread/mod.rs
@@ -465,11 +465,11 @@ impl Builder {
             }
 
             thread_info::set(imp::guard::current(), their_thread);
-            #[cfg(feature = "backtrace")]
+            #[cfg(feature = "backtrace_support")]
             let try_result = panic::catch_unwind(panic::AssertUnwindSafe(|| {
                 crate::sys_common::backtrace::__rust_begin_short_backtrace(f)
             }));
-            #[cfg(not(feature = "backtrace"))]
+            #[cfg(not(feature = "backtrace_support"))]
             let try_result = panic::catch_unwind(panic::AssertUnwindSafe(f));
             *their_packet.get() = Some(try_result);
         };
diff --git a/src/libtest/Cargo.toml b/src/libtest/Cargo.toml
index 170fbb984cf..f0041bcf67c 100644
--- a/src/libtest/Cargo.toml
+++ b/src/libtest/Cargo.toml
@@ -23,7 +23,7 @@ proc_macro = { path = "../libproc_macro" }
 
 # Forward features to the `std` crate as necessary
 [features]
-backtrace = ["std/backtrace"]
+backtrace_support = ["std/backtrace_support"]
 compiler-builtins-c = ["std/compiler-builtins-c"]
 llvm-libunwind = ["std/llvm-libunwind"]
 panic-unwind = ["std/panic_unwind"]