From 8e5ca4b793e928b5a7545f6d1010b7663a9d30ae Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 14 Mar 2014 10:34:29 -0700 Subject: std: Fix backtraces on arm linux On android, libgcc is missing the _Unwind_GetIP symbol because it's defined as a macro. This is the same case for arm linux, so this commit adds the necessary cfgs in place to use the "expanded macro" in rust for arm linux. --- src/libstd/rt/libunwind.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'src/libstd') diff --git a/src/libstd/rt/libunwind.rs b/src/libstd/rt/libunwind.rs index bdb049fbb5f..a556db2a053 100644 --- a/src/libstd/rt/libunwind.rs +++ b/src/libstd/rt/libunwind.rs @@ -98,9 +98,18 @@ extern "C" { pub fn _Unwind_Backtrace(trace: _Unwind_Trace_Fn, trace_argument: *libc::c_void) -> _Unwind_Reason_Code; - #[cfg(not(target_os = "android"))] + #[cfg(stage0, not(target_os = "android"))] pub fn _Unwind_GetIP(ctx: *_Unwind_Context) -> libc::uintptr_t; - #[cfg(not(target_os = "android"))] + #[cfg(stage0, not(target_os = "android"))] + pub fn _Unwind_FindEnclosingFunction(pc: *libc::c_void) -> *libc::c_void; + + #[cfg(not(stage0), + not(target_os = "android"), + not(target_os = "linux", target_arch = "arm"))] + pub fn _Unwind_GetIP(ctx: *_Unwind_Context) -> libc::uintptr_t; + #[cfg(not(stage0), + not(target_os = "android"), + not(target_os = "linux", target_arch = "arm"))] pub fn _Unwind_FindEnclosingFunction(pc: *libc::c_void) -> *libc::c_void; } @@ -108,6 +117,7 @@ extern "C" { // of the macro. This is all copy/pasted directly from the header file with the // definition of _Unwind_GetIP. #[cfg(target_os = "android")] +#[cfg(target_os = "linux", target_os = "arm")] pub unsafe fn _Unwind_GetIP(ctx: *_Unwind_Context) -> libc::uintptr_t { #[repr(C)] enum _Unwind_VRS_Result { @@ -151,6 +161,7 @@ pub unsafe fn _Unwind_GetIP(ctx: *_Unwind_Context) -> libc::uintptr_t { // This function also doesn't exist on android, so make it a no-op #[cfg(target_os = "android")] +#[cfg(target_os = "linux", target_os = "arm")] pub unsafe fn _Unwind_FindEnclosingFunction(pc: *libc::c_void) -> *libc::c_void{ pc } -- cgit 1.4.1-3-g733a5