Skip to content

Commit f7453f9

Browse files
committed
Auto merge of #22948 - rprichard:simple-panic-opt, r=alexcrichton
Reduce code size overhead from core::panicking::panic core::panicking::panic currently creates an Arguments structure using format_args!("{}", expr), which formats the expr str using the Display::fmt. Display::fmt pulls in Formatter::pad, which then also pulls in string-related code for truncation and padding. If core::panicking::panic instead creates an Arguments structure with a string piece, it is possible that the Display::fmt function for str can be optimized out of the program. In my testing with a 32-bit x86 bare metal program, the change tended to save between ~100 bytes and ~5500 bytes, depending on what other panic* functions the program invokes and whether the panic_fmt lang item uses the Arguments value.
2 parents 3e4be02 + 9c0057d commit f7453f9

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

src/libcore/panicking.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,14 @@ use fmt;
3535
#[cold] #[inline(never)] // this is the slow path, always
3636
#[lang="panic"]
3737
pub fn panic(expr_file_line: &(&'static str, &'static str, u32)) -> ! {
38+
// Use Arguments::new_v1 instead of format_args!("{}", expr) to potentially
39+
// reduce size overhead. The format_args! macro uses str's Display trait to
40+
// write expr, which calls Formatter::pad, which must accommodate string
41+
// truncation and padding (even though none is used here). Using
42+
// Arguments::new_v1 may allow the compiler to omit Formatter::pad from the
43+
// output binary, saving up to a few kilobytes.
3844
let (expr, file, line) = *expr_file_line;
39-
panic_fmt(format_args!("{}", expr), &(file, line))
45+
panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), &(file, line))
4046
}
4147

4248
#[cold] #[inline(never)]

0 commit comments

Comments
 (0)