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.
This commit is contained in:
parent
50f3d6eccb
commit
8d500572fa
9 changed files with 40 additions and 138 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -41,9 +41,6 @@
|
||||||
[submodule "src/tools/lld"]
|
[submodule "src/tools/lld"]
|
||||||
path = src/tools/lld
|
path = src/tools/lld
|
||||||
url = https://github.com/rust-lang/lld.git
|
url = https://github.com/rust-lang/lld.git
|
||||||
[submodule "src/libbacktrace"]
|
|
||||||
path = src/libbacktrace
|
|
||||||
url = https://github.com/rust-lang-nursery/libbacktrace.git
|
|
||||||
[submodule "src/tools/lldb"]
|
[submodule "src/tools/lldb"]
|
||||||
path = src/tools/lldb
|
path = src/tools/lldb
|
||||||
url = https://github.com/rust-lang-nursery/lldb.git
|
url = https://github.com/rust-lang-nursery/lldb.git
|
||||||
|
|
10
Cargo.lock
10
Cargo.lock
|
@ -85,7 +85,7 @@ name = "backtrace"
|
||||||
version = "0.3.11"
|
version = "0.3.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)",
|
"backtrace-sys 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-demangle 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-demangle 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -94,11 +94,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "backtrace-sys"
|
name = "backtrace-sys"
|
||||||
version = "0.1.24"
|
version = "0.1.27"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"compiler_builtins 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"rustc-std-workspace-core 1.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2887,7 +2889,7 @@ name = "std"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"alloc 0.0.0",
|
"alloc 0.0.0",
|
||||||
"build_helper 0.1.0",
|
"backtrace-sys 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"compiler_builtins 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"compiler_builtins 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"core 0.0.0",
|
"core 0.0.0",
|
||||||
|
@ -3388,7 +3390,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum assert_cli 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98589b0e465a6c510d95fceebd365bb79bedece7f6e18a480897f2015f85ec51"
|
"checksum assert_cli 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98589b0e465a6c510d95fceebd365bb79bedece7f6e18a480897f2015f85ec51"
|
||||||
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
|
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
|
||||||
"checksum backtrace 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "18b65ea1161bfb2dd6da6fade5edd4dbd08fba85012123dd333d2fd1b90b2782"
|
"checksum backtrace 0.3.11 (registry+https://github.com/rust-lang/crates.io-index)" = "18b65ea1161bfb2dd6da6fade5edd4dbd08fba85012123dd333d2fd1b90b2782"
|
||||||
"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0"
|
"checksum backtrace-sys 0.1.27 (registry+https://github.com/rust-lang/crates.io-index)" = "6ea90dd7b012b3d1a2cb6bec16670a0db2c95d4e931e84f4047e0460c1b34c8d"
|
||||||
"checksum bit-set 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f1efcc46c18245a69c38fcc5cc650f16d3a59d034f3106e9ed63748f695730a"
|
"checksum bit-set 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f1efcc46c18245a69c38fcc5cc650f16d3a59d034f3106e9ed63748f695730a"
|
||||||
"checksum bit-vec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440d5cb623bb7390ae27fec0bb6c61111969860f8e3ae198bfa0663645e67cf"
|
"checksum bit-vec 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4440d5cb623bb7390ae27fec0bb6c61111969860f8e3ae198bfa0663645e67cf"
|
||||||
"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
|
"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
|
||||||
|
|
|
@ -858,7 +858,6 @@ impl Step for Src {
|
||||||
let std_src_dirs = [
|
let std_src_dirs = [
|
||||||
"src/build_helper",
|
"src/build_helper",
|
||||||
"src/liballoc",
|
"src/liballoc",
|
||||||
"src/libbacktrace",
|
|
||||||
"src/libcore",
|
"src/libcore",
|
||||||
"src/libpanic_abort",
|
"src/libpanic_abort",
|
||||||
"src/libpanic_unwind",
|
"src/libpanic_unwind",
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit f4d02bbdbf8a2c5a31f0801dfef597a86caad9e3
|
|
|
@ -22,6 +22,7 @@ compiler_builtins = { version = "0.1.1" }
|
||||||
profiler_builtins = { path = "../libprofiler_builtins", optional = true }
|
profiler_builtins = { path = "../libprofiler_builtins", optional = true }
|
||||||
unwind = { path = "../libunwind" }
|
unwind = { path = "../libunwind" }
|
||||||
rustc-demangle = { version = "0.1.10", features = ['rustc-dep-of-std'] }
|
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]
|
[dev-dependencies]
|
||||||
rand = "0.6.1"
|
rand = "0.6.1"
|
||||||
|
@ -44,12 +45,11 @@ fortanix-sgx-abi = { version = "0.3.2", features = ['rustc-dep-of-std'] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cc = "1.0"
|
cc = "1.0"
|
||||||
build_helper = { path = "../build_helper" }
|
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["compiler_builtins_c"]
|
default = ["compiler_builtins_c"]
|
||||||
|
|
||||||
backtrace = []
|
backtrace = ["backtrace-sys"]
|
||||||
panic-unwind = ["panic_unwind"]
|
panic-unwind = ["panic_unwind"]
|
||||||
profiler = ["profiler_builtins"]
|
profiler = ["profiler_builtins"]
|
||||||
compiler_builtins_c = ["compiler_builtins/c"]
|
compiler_builtins_c = ["compiler_builtins/c"]
|
||||||
|
|
|
@ -10,24 +10,12 @@
|
||||||
|
|
||||||
#![deny(warnings)]
|
#![deny(warnings)]
|
||||||
|
|
||||||
extern crate build_helper;
|
|
||||||
extern crate cc;
|
extern crate cc;
|
||||||
|
|
||||||
use build_helper::native_lib_boilerplate;
|
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs::File;
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let target = env::var("TARGET").expect("TARGET was not set");
|
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("linux") {
|
||||||
if target.contains("android") {
|
if target.contains("android") {
|
||||||
println!("cargo:rustc-link-lib=dl");
|
println!("cargo:rustc-link-lib=dl");
|
||||||
|
@ -79,67 +67,3 @@ fn main() {
|
||||||
println!("cargo:rustc-link-lib=compiler_rt");
|
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(())
|
|
||||||
}
|
|
||||||
|
|
|
@ -346,6 +346,9 @@ extern crate rustc_demangle;
|
||||||
#[allow(unused_extern_crates)]
|
#[allow(unused_extern_crates)]
|
||||||
extern crate unwind;
|
extern crate unwind;
|
||||||
|
|
||||||
|
#[cfg(feature = "backtrace")]
|
||||||
|
extern crate backtrace_sys;
|
||||||
|
|
||||||
// During testing, this crate is not actually the "real" std library, but rather
|
// 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
|
// 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
|
// code. So any lang items std defines are conditionally excluded (or else they
|
||||||
|
|
|
@ -53,6 +53,14 @@ const MAX_NB_FRAMES: usize = 100;
|
||||||
pub fn print(w: &mut dyn Write, format: PrintFormat) -> io::Result<()> {
|
pub fn print(w: &mut dyn Write, format: PrintFormat) -> io::Result<()> {
|
||||||
static LOCK: Mutex = Mutex::new();
|
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.
|
// Use a lock to prevent mixed output in multithreading context.
|
||||||
// Some platforms also requires it, like `SymFromAddr` on Windows.
|
// Some platforms also requires it, like `SymFromAddr` on Windows.
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use libc;
|
use libc;
|
||||||
|
use backtrace_sys::{self, backtrace_state};
|
||||||
|
|
||||||
use ffi::CStr;
|
use ffi::CStr;
|
||||||
use io;
|
use io;
|
||||||
|
@ -39,11 +40,13 @@ where F: FnMut(&[u8], u32) -> io::Result<()>
|
||||||
let mut fileline_win: &mut [FileLine] = &mut fileline_buf;
|
let mut fileline_win: &mut [FileLine] = &mut fileline_buf;
|
||||||
let fileline_addr = &mut fileline_win as *mut &mut [FileLine];
|
let fileline_addr = &mut fileline_win as *mut &mut [FileLine];
|
||||||
ret = unsafe {
|
ret = unsafe {
|
||||||
backtrace_pcinfo(state,
|
backtrace_sys::backtrace_pcinfo(
|
||||||
frame.exact_position as libc::uintptr_t,
|
state,
|
||||||
pcinfo_cb,
|
frame.exact_position as libc::uintptr_t,
|
||||||
error_cb,
|
pcinfo_cb,
|
||||||
fileline_addr as *mut libc::c_void)
|
error_cb,
|
||||||
|
fileline_addr as *mut libc::c_void,
|
||||||
|
)
|
||||||
};
|
};
|
||||||
FILELINE_SIZE - fileline_win.len()
|
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 mut data: *const libc::c_char = ptr::null();
|
||||||
let data_addr = &mut data as *mut *const libc::c_char;
|
let data_addr = &mut data as *mut *const libc::c_char;
|
||||||
let ret = unsafe {
|
let ret = unsafe {
|
||||||
backtrace_syminfo(state,
|
backtrace_sys::backtrace_syminfo(
|
||||||
frame.symbol_addr as libc::uintptr_t,
|
state,
|
||||||
syminfo_cb,
|
frame.symbol_addr as libc::uintptr_t,
|
||||||
error_cb,
|
syminfo_cb,
|
||||||
data_addr as *mut libc::c_void)
|
error_cb,
|
||||||
|
data_addr as *mut libc::c_void,
|
||||||
|
)
|
||||||
};
|
};
|
||||||
if ret == 0 || data.is_null() {
|
if ret == 0 || data.is_null() {
|
||||||
None
|
None
|
||||||
|
@ -93,45 +98,6 @@ pub fn resolve_symname<F>(frame: Frame,
|
||||||
callback(symname)
|
callback(symname)
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
// 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
|
// helper callbacks
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -210,7 +176,11 @@ unsafe fn init_state() -> *mut backtrace_state {
|
||||||
Err(_) => ptr::null(),
|
Err(_) => ptr::null(),
|
||||||
};
|
};
|
||||||
|
|
||||||
STATE = backtrace_create_state(filename, 0, error_cb,
|
STATE = backtrace_sys::backtrace_create_state(
|
||||||
ptr::null_mut());
|
filename,
|
||||||
|
0,
|
||||||
|
error_cb,
|
||||||
|
ptr::null_mut(),
|
||||||
|
);
|
||||||
STATE
|
STATE
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue