Rollup merge of #55011 - vi:panic_immediate_abort, r=alexcrichton
Add libstd Cargo feature "panic_immediate_abort" It stop asserts and panics from libstd to automatically include string output and formatting code. Use case: developing static executables smaller than 50 kilobytes, where usual formatting code is excessive while keeping debuggability in debug mode. May resolve #54981.
This commit is contained in:
commit
2584d9216d
4 changed files with 45 additions and 5 deletions
|
@ -47,6 +47,9 @@ backtrace = []
|
|||
panic-unwind = ["panic_unwind"]
|
||||
profiler = ["profiler_builtins"]
|
||||
|
||||
# Make panics and failed asserts immediately abort without formatting any message
|
||||
panic_immediate_abort = ["core/panic_immediate_abort"]
|
||||
|
||||
# An off-by-default feature which enables a linux-syscall-like ABI for libstd to
|
||||
# interoperate with the host environment. Currently not well documented and
|
||||
# requires rebuilding the standard library to use it.
|
||||
|
|
|
@ -334,9 +334,17 @@ pub fn rust_begin_panic(info: &PanicInfo) -> ! {
|
|||
#[unstable(feature = "libstd_sys_internals",
|
||||
reason = "used by the panic! macro",
|
||||
issue = "0")]
|
||||
#[inline(never)] #[cold]
|
||||
#[cold]
|
||||
// If panic_immediate_abort, inline the abort call,
|
||||
// otherwise avoid inlining because of it is cold path.
|
||||
#[cfg_attr(not(feature="panic_immediate_abort"),inline(never))]
|
||||
#[cfg_attr( feature="panic_immediate_abort" ,inline)]
|
||||
pub fn begin_panic_fmt(msg: &fmt::Arguments,
|
||||
file_line_col: &(&'static str, u32, u32)) -> ! {
|
||||
if cfg!(feature = "panic_immediate_abort") {
|
||||
unsafe { intrinsics::abort() }
|
||||
}
|
||||
|
||||
let (file, line, col) = *file_line_col;
|
||||
let info = PanicInfo::internal_constructor(
|
||||
Some(msg),
|
||||
|
@ -398,8 +406,15 @@ fn continue_panic_fmt(info: &PanicInfo) -> ! {
|
|||
reason = "used by the panic! macro",
|
||||
issue = "0")]
|
||||
#[cfg_attr(not(test), lang = "begin_panic")]
|
||||
#[inline(never)] #[cold] // avoid code bloat at the call sites as much as possible
|
||||
// never inline unless panic_immediate_abort to avoid code
|
||||
// bloat at the call sites as much as possible
|
||||
#[cfg_attr(not(feature="panic_immediate_abort"),inline(never))]
|
||||
#[cold]
|
||||
pub fn begin_panic<M: Any + Send>(msg: M, file_line_col: &(&'static str, u32, u32)) -> ! {
|
||||
if cfg!(feature = "panic_immediate_abort") {
|
||||
unsafe { intrinsics::abort() }
|
||||
}
|
||||
|
||||
// Note that this should be the only allocation performed in this code path.
|
||||
// Currently this means that panic!() on OOM will invoke this code path,
|
||||
// but then again we're not really ready for panic on OOM anyway. If
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue