avoid nesting the user-defined main so deeply on the stack
This commit is contained in:
parent
9f7fe81d53
commit
471d830106
5 changed files with 26 additions and 45 deletions
|
@ -157,7 +157,7 @@ fn lang_start_internal(
|
||||||
argc: isize,
|
argc: isize,
|
||||||
argv: *const *const u8,
|
argv: *const *const u8,
|
||||||
sigpipe: u8,
|
sigpipe: u8,
|
||||||
) -> Result<isize, !> {
|
) -> isize {
|
||||||
// Guard against the code called by this function from unwinding outside of the Rust-controlled
|
// Guard against the code called by this function from unwinding outside of the Rust-controlled
|
||||||
// code, which is UB. This is a requirement imposed by a combination of how the
|
// code, which is UB. This is a requirement imposed by a combination of how the
|
||||||
// `#[lang="start"]` attribute is implemented as well as by the implementation of the panicking
|
// `#[lang="start"]` attribute is implemented as well as by the implementation of the panicking
|
||||||
|
@ -174,18 +174,24 @@ fn lang_start_internal(
|
||||||
panic::catch_unwind(move || {
|
panic::catch_unwind(move || {
|
||||||
// SAFETY: Only called once during runtime initialization.
|
// SAFETY: Only called once during runtime initialization.
|
||||||
unsafe { init(argc, argv, sigpipe) };
|
unsafe { init(argc, argv, sigpipe) };
|
||||||
let ret_code =
|
|
||||||
panic::catch_unwind(move || panic::catch_unwind(main).unwrap_or(101) as isize).map_err(
|
let ret_code = panic::catch_unwind(main).unwrap_or_else(move |payload| {
|
||||||
move |e| {
|
// Carefully dispose of the panic payload.
|
||||||
// Print a specific error when we abort due to a panicing payload destructor.
|
let payload = panic::AssertUnwindSafe(payload);
|
||||||
mem::forget(e);
|
panic::catch_unwind(move || drop({ payload }.0)).unwrap_or_else(move |e| {
|
||||||
rtabort!("drop of the panic payload panicked");
|
mem::forget(e); // do *not* drop the 2nd payload
|
||||||
},
|
rtabort!("drop of the panic payload panicked");
|
||||||
);
|
});
|
||||||
|
// Return error code for panicking programs.
|
||||||
|
101
|
||||||
|
});
|
||||||
|
let ret_code = ret_code as isize;
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
// Guard against multiple threads calling `libc::exit` concurrently.
|
// Guard against multiple threads calling `libc::exit` concurrently.
|
||||||
// See the documentation for `unique_thread_exit` for more information.
|
// See the documentation for `unique_thread_exit` for more information.
|
||||||
crate::sys::exit_guard::unique_thread_exit();
|
crate::sys::exit_guard::unique_thread_exit();
|
||||||
|
|
||||||
ret_code
|
ret_code
|
||||||
})
|
})
|
||||||
.unwrap_or_else(handle_rt_panic)
|
.unwrap_or_else(handle_rt_panic)
|
||||||
|
@ -199,11 +205,10 @@ fn lang_start<T: crate::process::Termination + 'static>(
|
||||||
argv: *const *const u8,
|
argv: *const *const u8,
|
||||||
sigpipe: u8,
|
sigpipe: u8,
|
||||||
) -> isize {
|
) -> isize {
|
||||||
let Ok(v) = lang_start_internal(
|
lang_start_internal(
|
||||||
&move || crate::sys::backtrace::__rust_begin_short_backtrace(main).report().to_i32(),
|
&move || crate::sys::backtrace::__rust_begin_short_backtrace(main).report().to_i32(),
|
||||||
argc,
|
argc,
|
||||||
argv,
|
argv,
|
||||||
sigpipe,
|
sigpipe,
|
||||||
);
|
)
|
||||||
v
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,13 +15,9 @@ LL | extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
|
||||||
= note: inside `std::panicking::r#try::<i32, &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::r#try::<i32, &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panic::catch_unwind::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at RUSTLIB/std/src/panic.rs:LL:CC
|
= note: inside `std::panic::catch_unwind::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
= note: inside closure at RUSTLIB/std/src/rt.rs:LL:CC
|
= note: inside closure at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
= note: inside `std::panicking::r#try::do_call::<{closure@std::rt::lang_start_internal::{closure#0}::{closure#0}}, isize>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::r#try::do_call::<{closure@std::rt::lang_start_internal::{closure#0}}, isize>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panicking::r#try::<isize, {closure@std::rt::lang_start_internal::{closure#0}::{closure#0}}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
= note: inside `std::panicking::r#try::<isize, {closure@std::rt::lang_start_internal::{closure#0}}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
= note: inside `std::panic::catch_unwind::<{closure@std::rt::lang_start_internal::{closure#0}::{closure#0}}, isize>` at RUSTLIB/std/src/panic.rs:LL:CC
|
= note: inside `std::panic::catch_unwind::<{closure@std::rt::lang_start_internal::{closure#0}}, isize>` at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
= note: inside closure at RUSTLIB/std/src/rt.rs:LL:CC
|
|
||||||
= note: inside `std::panicking::r#try::do_call::<{closure@std::rt::lang_start_internal::{closure#0}}, std::result::Result<isize, !>>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
|
||||||
= note: inside `std::panicking::r#try::<std::result::Result<isize, !>, {closure@std::rt::lang_start_internal::{closure#0}}>` at RUSTLIB/std/src/panicking.rs:LL:CC
|
|
||||||
= note: inside `std::panic::catch_unwind::<{closure@std::rt::lang_start_internal::{closure#0}}, std::result::Result<isize, !>>` at RUSTLIB/std/src/panic.rs:LL:CC
|
|
||||||
= note: inside `std::rt::lang_start_internal` at RUSTLIB/std/src/rt.rs:LL:CC
|
= note: inside `std::rt::lang_start_internal` at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
= note: inside `std::rt::lang_start::<()>` at RUSTLIB/std/src/rt.rs:LL:CC
|
= note: inside `std::rt::lang_start::<()>` at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
|
|
||||||
|
|
|
@ -10,10 +10,6 @@ RUSTLIB/core/src/ops/function.rs:LL:CC (std::ops::function::impls::call_once)
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
||||||
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
||||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal::{closure#0}::{closure#0})
|
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
|
||||||
RUSTLIB/std/src/panic.rs:LL:CC (std::panic::catch_unwind)
|
|
||||||
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal::{closure#0})
|
RUSTLIB/std/src/rt.rs:LL:CC (std::rt::lang_start_internal::{closure#0})
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try::do_call)
|
||||||
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
RUSTLIB/std/src/panicking.rs:LL:CC (std::panicking::r#try)
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
7: std::panic::catch_unwind
|
7: std::panic::catch_unwind
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
8: std::rt::lang_start_internal::{closure#0}::{closure#0}
|
8: std::rt::lang_start_internal::{closure#0}
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
9: std::panicking::r#try::do_call
|
9: std::panicking::r#try::do_call
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
|
@ -22,15 +22,7 @@
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
11: std::panic::catch_unwind
|
11: std::panic::catch_unwind
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
12: std::rt::lang_start_internal::{closure#0}
|
12: std::rt::lang_start_internal
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
13: std::panicking::r#try::do_call
|
13: std::rt::lang_start
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
|
||||||
14: std::panicking::r#try
|
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
|
||||||
15: std::panic::catch_unwind
|
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
|
||||||
16: std::rt::lang_start_internal
|
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
|
||||||
17: std::rt::lang_start
|
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
11: std::panic::catch_unwind
|
11: std::panic::catch_unwind
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
12: std::rt::lang_start_internal::{closure#0}::{closure#0}
|
12: std::rt::lang_start_internal::{closure#0}
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
13: std::panicking::r#try::do_call
|
13: std::panicking::r#try::do_call
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
|
@ -30,15 +30,7 @@
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
at RUSTLIB/std/src/panicking.rs:LL:CC
|
||||||
15: std::panic::catch_unwind
|
15: std::panic::catch_unwind
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
at RUSTLIB/std/src/panic.rs:LL:CC
|
||||||
16: std::rt::lang_start_internal::{closure#0}
|
16: std::rt::lang_start_internal
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
17: std::panicking::r#try::do_call
|
17: std::rt::lang_start
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
|
||||||
18: std::panicking::r#try
|
|
||||||
at RUSTLIB/std/src/panicking.rs:LL:CC
|
|
||||||
19: std::panic::catch_unwind
|
|
||||||
at RUSTLIB/std/src/panic.rs:LL:CC
|
|
||||||
20: std::rt::lang_start_internal
|
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
|
||||||
21: std::rt::lang_start
|
|
||||||
at RUSTLIB/std/src/rt.rs:LL:CC
|
at RUSTLIB/std/src/rt.rs:LL:CC
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue