mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-26 06:35:27 +00:00
std: xous: take eh_frame address from main args
The main() function takes an argument that contains the eh_frame address. Implement `unwinding` support by looking for unwinding data at this address. Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
parent
2a533df5bd
commit
a6b8de68a6
@ -7,6 +7,28 @@ use crate::marker::PhantomData;
|
||||
use crate::os::xous::ffi::Error as XousError;
|
||||
use crate::path::{self, PathBuf};
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[cfg(feature = "panic_unwind")]
|
||||
mod eh_unwinding {
|
||||
pub(crate) struct EhFrameFinder(usize /* eh_frame */);
|
||||
pub(crate) static mut EH_FRAME_SETTINGS: EhFrameFinder = EhFrameFinder(0);
|
||||
impl EhFrameFinder {
|
||||
pub(crate) unsafe fn init(&mut self, eh_frame: usize) {
|
||||
unsafe {
|
||||
EH_FRAME_SETTINGS.0 = eh_frame;
|
||||
}
|
||||
}
|
||||
}
|
||||
unsafe impl unwind::EhFrameFinder for EhFrameFinder {
|
||||
fn find(&self, _pc: usize) -> Option<unwind::FrameInfo> {
|
||||
Some(unwind::FrameInfo {
|
||||
text_base: None,
|
||||
kind: unwind::FrameInfoKind::EhFrame(self.0),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
mod c_compat {
|
||||
use crate::os::xous::ffi::exit;
|
||||
@ -20,7 +42,12 @@ mod c_compat {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn _start() {
|
||||
pub extern "C" fn _start(eh_frame: usize) {
|
||||
#[cfg(feature = "panic_unwind")]
|
||||
unsafe {
|
||||
super::eh_unwinding::EH_FRAME_SETTINGS.init(eh_frame);
|
||||
unwind::set_custom_eh_frame_finder(&super::eh_unwinding::EH_FRAME_SETTINGS).ok();
|
||||
}
|
||||
exit(unsafe { main() });
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user