Browse Source
get pc for freebsd (#2270)
* get pc for freebsd
* whitespace :|
* fix; i386 to x86
* remove x86 since uc_mcontext isn't yet in libc
* freebsd build of rust uses libcc/unwind
pull/2251/head
subtly
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
6 additions and
3 deletions
-
crates/jit/src/unwind/systemv.rs
-
crates/runtime/src/traphandlers.rs
|
|
@ -90,7 +90,7 @@ impl UnwindRegistry { |
|
|
|
let mut eh_frame = EhFrame(EndianVec::new(RunTimeEndian::default())); |
|
|
|
table.write_eh_frame(&mut eh_frame).unwrap(); |
|
|
|
|
|
|
|
if cfg!(all(target_os = "linux", target_env = "gnu")) { |
|
|
|
if cfg!(any(all(target_os = "linux", target_env = "gnu"), target_os = "freebsd")) { |
|
|
|
// libgcc expects a terminating "empty" length, so write a 0 length at the end of the table.
|
|
|
|
eh_frame.0.write_u32(0).unwrap(); |
|
|
|
} |
|
|
@ -101,7 +101,7 @@ impl UnwindRegistry { |
|
|
|
} |
|
|
|
|
|
|
|
unsafe fn register_frames(&mut self) { |
|
|
|
if cfg!(all(target_os = "linux", target_env = "gnu")) { |
|
|
|
if cfg!(any(all(target_os = "linux", target_env = "gnu"), target_os = "freebsd")) { |
|
|
|
// On gnu (libgcc), `__register_frame` will walk the FDEs until an entry of length 0
|
|
|
|
let ptr = self.frame_table.as_ptr(); |
|
|
|
__register_frame(ptr); |
|
|
|
|
|
@ -73,7 +73,7 @@ cfg_if::cfg_if! { |
|
|
|
|
|
|
|
// On ARM, handle Unaligned Accesses.
|
|
|
|
// On Darwin, guard page accesses are raised as SIGBUS.
|
|
|
|
if cfg!(target_arch = "arm") || cfg!(target_os = "macos") { |
|
|
|
if cfg!(target_arch = "arm") || cfg!(target_os = "macos") || cfg!(target_os = "freebsd") { |
|
|
|
register(&mut PREV_SIGBUS, libc::SIGBUS); |
|
|
|
} |
|
|
|
} |
|
|
@ -167,6 +167,9 @@ cfg_if::cfg_if! { |
|
|
|
} else if #[cfg(target_os = "macos")] { |
|
|
|
let cx = &*(cx as *const libc::ucontext_t); |
|
|
|
(*cx.uc_mcontext).__ss.__rip as *const u8 |
|
|
|
} else if #[cfg(all(target_os = "freebsd", target_arch = "x86_64"))] { |
|
|
|
let cx = &*(cx as *const libc::ucontext_t); |
|
|
|
cx.uc_mcontext.mc_rip as *const u8 |
|
|
|
} else { |
|
|
|
compile_error!("unsupported platform"); |
|
|
|
} |
|
|
|