diff options
| author | bors <bors@rust-lang.org> | 2015-03-14 01:04:37 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-03-14 01:04:37 +0000 |
| commit | f7453f940b6cbc2b07a2c0d7612a11fa435aad95 (patch) | |
| tree | d5ecadd4a52db48d83a6dbdf4f85d1de8a6c08bb | |
| parent | 3e4be02b80a3dd27bce20870958fe0aef7e7336d (diff) | |
| parent | 9c0057df58fbc4c79720f9a0104dda46d4d7074e (diff) | |
| download | rust-f7453f940b6cbc2b07a2c0d7612a11fa435aad95.tar.gz rust-f7453f940b6cbc2b07a2c0d7612a11fa435aad95.zip | |
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.
| -rw-r--r-- | src/libcore/panicking.rs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/src/libcore/panicking.rs b/src/libcore/panicking.rs index c1c8ac9cc1f..377b5b57ae1 100644 --- a/src/libcore/panicking.rs +++ b/src/libcore/panicking.rs @@ -35,8 +35,14 @@ use fmt; #[cold] #[inline(never)] // this is the slow path, always #[lang="panic"] pub fn panic(expr_file_line: &(&'static str, &'static str, u32)) -> ! { + // Use Arguments::new_v1 instead of format_args!("{}", expr) to potentially + // reduce size overhead. The format_args! macro uses str's Display trait to + // write expr, which calls Formatter::pad, which must accommodate string + // truncation and padding (even though none is used here). Using + // Arguments::new_v1 may allow the compiler to omit Formatter::pad from the + // output binary, saving up to a few kilobytes. let (expr, file, line) = *expr_file_line; - panic_fmt(format_args!("{}", expr), &(file, line)) + panic_fmt(fmt::Arguments::new_v1(&[expr], &[]), &(file, line)) } #[cold] #[inline(never)] |
