about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2018-12-14 16:47:18 -0800
committerAlex Crichton <alex@alexcrichton.com>2018-12-24 08:32:57 -0800
commit8d500572fa8f4110033fa3bc5e925831f6bbd18e (patch)
treec21fb3a40f8f8a4f57879ed39a9ce5ddc1f66fbd /src/libstd
parent50f3d6eccb85a24a02b7c1daf5e242768dddf3b5 (diff)
downloadrust-8d500572fa8f4110033fa3bc5e925831f6bbd18e.tar.gz
rust-8d500572fa8f4110033fa3bc5e925831f6bbd18e.zip
std: Use backtrace-sys from crates.io
This commit switches the standard library to using the `backtrace-sys`
crate from crates.io instead of duplicating the logic here in the Rust
repositor with the `backtrace-sys`'s crate's logic.

Eventually this will hopefully be a good step towards using the
`backtrace` crate directly from crates.io itself, but we're not quite
there yet! Hopefully this is a small incremental first step we can take.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/Cargo.toml4
-rw-r--r--src/libstd/build.rs76
-rw-r--r--src/libstd/lib.rs3
-rw-r--r--src/libstd/sys_common/backtrace.rs8
-rw-r--r--src/libstd/sys_common/gnu/libbacktrace.rs72
5 files changed, 34 insertions, 129 deletions
diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml
index 9e3d9af5ba2..5214f365a64 100644
--- a/src/libstd/Cargo.toml
+++ b/src/libstd/Cargo.toml
@@ -22,6 +22,7 @@ compiler_builtins = { version = "0.1.1" }
 profiler_builtins = { path = "../libprofiler_builtins", optional = true }
 unwind = { path = "../libunwind" }
 rustc-demangle = { version = "0.1.10", features = ['rustc-dep-of-std'] }
+backtrace-sys = { version = "0.1.24", features = ["rustc-dep-of-std"], optional = true }
 
 [dev-dependencies]
 rand = "0.6.1"
@@ -44,12 +45,11 @@ fortanix-sgx-abi = { version = "0.3.2", features = ['rustc-dep-of-std'] }
 
 [build-dependencies]
 cc = "1.0"
-build_helper = { path = "../build_helper" }
 
 [features]
 default = ["compiler_builtins_c"]
 
-backtrace = []
+backtrace = ["backtrace-sys"]
 panic-unwind = ["panic_unwind"]
 profiler = ["profiler_builtins"]
 compiler_builtins_c = ["compiler_builtins/c"]
diff --git a/src/libstd/build.rs b/src/libstd/build.rs
index 7143de55c88..69bd0e41504 100644
--- a/src/libstd/build.rs
+++ b/src/libstd/build.rs
@@ -10,24 +10,12 @@
 
 #![deny(warnings)]
 
-extern crate build_helper;
 extern crate cc;
 
-use build_helper::native_lib_boilerplate;
 use std::env;
-use std::fs::File;
 
 fn main() {
     let target = env::var("TARGET").expect("TARGET was not set");
-    if cfg!(feature = "backtrace") &&
-        !target.contains("cloudabi") &&
-        !target.contains("emscripten") &&
-        !target.contains("msvc") &&
-        !target.contains("wasm32")
-    {
-        let _ = build_libbacktrace(&target);
-    }
-
     if target.contains("linux") {
         if target.contains("android") {
             println!("cargo:rustc-link-lib=dl");
@@ -79,67 +67,3 @@ fn main() {
         println!("cargo:rustc-link-lib=compiler_rt");
     }
 }
-
-fn build_libbacktrace(target: &str) -> Result<(), ()> {
-    let native = native_lib_boilerplate(
-        "../libbacktrace".as_ref(),
-        "libbacktrace",
-        "backtrace",
-        "",
-    )?;
-
-    let mut build = cc::Build::new();
-    build
-        .flag("-fvisibility=hidden")
-        .include("../libbacktrace")
-        .include(&native.out_dir)
-        .out_dir(&native.out_dir)
-        .warnings(false)
-        .file("../libbacktrace/alloc.c")
-        .file("../libbacktrace/backtrace.c")
-        .file("../libbacktrace/dwarf.c")
-        .file("../libbacktrace/fileline.c")
-        .file("../libbacktrace/posix.c")
-        .file("../libbacktrace/read.c")
-        .file("../libbacktrace/sort.c")
-        .file("../libbacktrace/state.c");
-
-    let any_debug = env::var("RUSTC_DEBUGINFO").unwrap_or_default() == "true" ||
-        env::var("RUSTC_DEBUGINFO_LINES").unwrap_or_default() == "true";
-    build.debug(any_debug);
-
-    if target.contains("darwin") {
-        build.file("../libbacktrace/macho.c");
-    } else if target.contains("windows") {
-        build.file("../libbacktrace/pecoff.c");
-    } else {
-        build.file("../libbacktrace/elf.c");
-
-        let pointer_width = env::var("CARGO_CFG_TARGET_POINTER_WIDTH").unwrap();
-        if pointer_width == "64" {
-            build.define("BACKTRACE_ELF_SIZE", "64");
-        } else {
-            build.define("BACKTRACE_ELF_SIZE", "32");
-        }
-    }
-
-    File::create(native.out_dir.join("backtrace-supported.h")).unwrap();
-    build.define("BACKTRACE_SUPPORTED", "1");
-    build.define("BACKTRACE_USES_MALLOC", "1");
-    build.define("BACKTRACE_SUPPORTS_THREADS", "0");
-    build.define("BACKTRACE_SUPPORTS_DATA", "0");
-
-    File::create(native.out_dir.join("config.h")).unwrap();
-    if !target.contains("apple-ios") &&
-       !target.contains("solaris") &&
-       !target.contains("redox") &&
-       !target.contains("android") &&
-       !target.contains("haiku") {
-        build.define("HAVE_DL_ITERATE_PHDR", "1");
-    }
-    build.define("_GNU_SOURCE", "1");
-    build.define("_LARGE_FILES", "1");
-
-    build.compile("backtrace");
-    Ok(())
-}
diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs
index 4a693bffddf..af5d511c035 100644
--- a/src/libstd/lib.rs
+++ b/src/libstd/lib.rs
@@ -346,6 +346,9 @@ extern crate rustc_demangle;
 #[allow(unused_extern_crates)]
 extern crate unwind;
 
+#[cfg(feature = "backtrace")]
+extern crate backtrace_sys;
+
 // During testing, this crate is not actually the "real" std library, but rather
 // it links to the real std library, which was compiled from this same source
 // code. So any lang items std defines are conditionally excluded (or else they
diff --git a/src/libstd/sys_common/backtrace.rs b/src/libstd/sys_common/backtrace.rs
index e44113f76f4..08cd7b05e07 100644
--- a/src/libstd/sys_common/backtrace.rs
+++ b/src/libstd/sys_common/backtrace.rs
@@ -53,6 +53,14 @@ const MAX_NB_FRAMES: usize = 100;
 pub fn print(w: &mut dyn Write, format: PrintFormat) -> io::Result<()> {
     static LOCK: Mutex = Mutex::new();
 
+    // There are issues currently linking libbacktrace into tests, and in
+    // general during libstd's own unit tests we're not testing this path. In
+    // test mode immediately return here to optimize away any references to the
+    // libbacktrace symbols
+    if cfg!(test) {
+        return Ok(())
+    }
+
     // Use a lock to prevent mixed output in multithreading context.
     // Some platforms also requires it, like `SymFromAddr` on Windows.
     unsafe {
diff --git a/src/libstd/sys_common/gnu/libbacktrace.rs b/src/libstd/sys_common/gnu/libbacktrace.rs
index c2589d477ee..9321242fec8 100644
--- a/src/libstd/sys_common/gnu/libbacktrace.rs
+++ b/src/libstd/sys_common/gnu/libbacktrace.rs
@@ -9,6 +9,7 @@
 // except according to those terms.
 
 use libc;
+use backtrace_sys::{self, backtrace_state};
 
 use ffi::CStr;
 use io;
@@ -39,11 +40,13 @@ where F: FnMut(&[u8], u32) -> io::Result<()>
         let mut fileline_win: &mut [FileLine] = &mut fileline_buf;
         let fileline_addr = &mut fileline_win as *mut &mut [FileLine];
         ret = unsafe {
-            backtrace_pcinfo(state,
-                             frame.exact_position as libc::uintptr_t,
-                             pcinfo_cb,
-                             error_cb,
-                             fileline_addr as *mut libc::c_void)
+            backtrace_sys::backtrace_pcinfo(
+                state,
+                frame.exact_position as libc::uintptr_t,
+                pcinfo_cb,
+                error_cb,
+                fileline_addr as *mut libc::c_void,
+            )
         };
         FILELINE_SIZE - fileline_win.len()
     };
@@ -76,11 +79,13 @@ pub fn resolve_symname<F>(frame: Frame,
         let mut data: *const libc::c_char = ptr::null();
         let data_addr = &mut data as *mut *const libc::c_char;
         let ret = unsafe {
-            backtrace_syminfo(state,
-                              frame.symbol_addr as libc::uintptr_t,
-                              syminfo_cb,
-                              error_cb,
-                              data_addr as *mut libc::c_void)
+            backtrace_sys::backtrace_syminfo(
+                state,
+                frame.symbol_addr as libc::uintptr_t,
+                syminfo_cb,
+                error_cb,
+                data_addr as *mut libc::c_void,
+            )
         };
         if ret == 0 || data.is_null() {
             None
@@ -94,45 +99,6 @@ pub fn resolve_symname<F>(frame: Frame,
 }
 
 ////////////////////////////////////////////////////////////////////////
-// libbacktrace.h API
-////////////////////////////////////////////////////////////////////////
-type backtrace_syminfo_callback =
-extern "C" fn(data: *mut libc::c_void,
-              pc: libc::uintptr_t,
-              symname: *const libc::c_char,
-              symval: libc::uintptr_t,
-              symsize: libc::uintptr_t);
-type backtrace_full_callback =
-extern "C" fn(data: *mut libc::c_void,
-              pc: libc::uintptr_t,
-              filename: *const libc::c_char,
-              lineno: libc::c_int,
-              function: *const libc::c_char) -> libc::c_int;
-type backtrace_error_callback =
-extern "C" fn(data: *mut libc::c_void,
-              msg: *const libc::c_char,
-              errnum: libc::c_int);
-enum backtrace_state {}
-
-extern {
-    fn backtrace_create_state(filename: *const libc::c_char,
-                              threaded: libc::c_int,
-                              error: backtrace_error_callback,
-                              data: *mut libc::c_void)
-        -> *mut backtrace_state;
-    fn backtrace_syminfo(state: *mut backtrace_state,
-                         addr: libc::uintptr_t,
-                         cb: backtrace_syminfo_callback,
-                         error: backtrace_error_callback,
-                         data: *mut libc::c_void) -> libc::c_int;
-    fn backtrace_pcinfo(state: *mut backtrace_state,
-                        addr: libc::uintptr_t,
-                        cb: backtrace_full_callback,
-                        error: backtrace_error_callback,
-                        data: *mut libc::c_void) -> libc::c_int;
-}
-
-////////////////////////////////////////////////////////////////////////
 // helper callbacks
 ////////////////////////////////////////////////////////////////////////
 
@@ -210,7 +176,11 @@ unsafe fn init_state() -> *mut backtrace_state {
         Err(_) => ptr::null(),
     };
 
-    STATE = backtrace_create_state(filename, 0, error_cb,
-                                   ptr::null_mut());
+    STATE = backtrace_sys::backtrace_create_state(
+        filename,
+        0,
+        error_cb,
+        ptr::null_mut(),
+    );
     STATE
 }