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
This commit is contained in:
subtly
2020-10-07 06:30:14 -05:00
committed by GitHub
parent 84ac3feef8
commit d91f0c3933
2 changed files with 6 additions and 3 deletions

View File

@@ -90,7 +90,7 @@ impl UnwindRegistry {
let mut eh_frame = EhFrame(EndianVec::new(RunTimeEndian::default())); let mut eh_frame = EhFrame(EndianVec::new(RunTimeEndian::default()));
table.write_eh_frame(&mut eh_frame).unwrap(); 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. // libgcc expects a terminating "empty" length, so write a 0 length at the end of the table.
eh_frame.0.write_u32(0).unwrap(); eh_frame.0.write_u32(0).unwrap();
} }
@@ -101,7 +101,7 @@ impl UnwindRegistry {
} }
unsafe fn register_frames(&mut self) { 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 // On gnu (libgcc), `__register_frame` will walk the FDEs until an entry of length 0
let ptr = self.frame_table.as_ptr(); let ptr = self.frame_table.as_ptr();
__register_frame(ptr); __register_frame(ptr);

View File

@@ -73,7 +73,7 @@ cfg_if::cfg_if! {
// On ARM, handle Unaligned Accesses. // On ARM, handle Unaligned Accesses.
// On Darwin, guard page accesses are raised as SIGBUS. // 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); register(&mut PREV_SIGBUS, libc::SIGBUS);
} }
} }
@@ -167,6 +167,9 @@ cfg_if::cfg_if! {
} else if #[cfg(target_os = "macos")] { } else if #[cfg(target_os = "macos")] {
let cx = &*(cx as *const libc::ucontext_t); let cx = &*(cx as *const libc::ucontext_t);
(*cx.uc_mcontext).__ss.__rip as *const u8 (*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 { } else {
compile_error!("unsupported platform"); compile_error!("unsupported platform");
} }