Auto merge of #122671 - Mark-Simulacrum:const-panic-msg, r=Nilstrieb
Codegen const panic messages as function calls This skips emitting extra arguments at every callsite (of which there can be many). For a librustc_driver build with overflow checks enabled, this cuts 0.7MB from the resulting shared library (see [perf]). A sample improvement from nightly: ``` leaq str.0(%rip), %rdi leaq .Lalloc_d6aeb8e2aa19de39a7f0e861c998af13(%rip), %rdx movl $25, %esi callq *_ZN4core9panicking5panic17h17cabb89c5bcc999E@GOTPCREL(%rip) ``` to this PR: ``` leaq .Lalloc_d6aeb8e2aa19de39a7f0e861c998af13(%rip), %rdi callq *_RNvNtNtCsduqIKoij8JB_4core9panicking11panic_const23panic_const_div_by_zero@GOTPCREL(%rip) ``` [perf]: https://perf.rust-lang.org/compare.html?start=a7e4de13c1785819f4d61da41f6704ed69d5f203&end=64fbb4f0b2d621ff46d559d1e9f5ad89a8d7789b&stat=instructions:u
This commit is contained in:
commit
211b585c60
@ -418,6 +418,36 @@ pub fn panic(_msg: &'static str) -> ! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! panic_const {
|
||||||
|
($($lang:ident = $message:expr,)+) => {
|
||||||
|
#[cfg(not(bootstrap))]
|
||||||
|
pub mod panic_const {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
$(
|
||||||
|
#[track_caller]
|
||||||
|
#[lang = stringify!($lang)]
|
||||||
|
pub fn $lang() -> ! {
|
||||||
|
panic($message);
|
||||||
|
}
|
||||||
|
)+
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
panic_const! {
|
||||||
|
panic_const_add_overflow = "attempt to add with overflow",
|
||||||
|
panic_const_sub_overflow = "attempt to subtract with overflow",
|
||||||
|
panic_const_mul_overflow = "attempt to multiply with overflow",
|
||||||
|
panic_const_div_overflow = "attempt to divide with overflow",
|
||||||
|
panic_const_rem_overflow = "attempt to calculate the remainder with overflow",
|
||||||
|
panic_const_neg_overflow = "attempt to negate with overflow",
|
||||||
|
panic_const_shr_overflow = "attempt to shift right with overflow",
|
||||||
|
panic_const_shl_overflow = "attempt to shift left with overflow",
|
||||||
|
panic_const_div_by_zero = "attempt to divide by zero",
|
||||||
|
panic_const_rem_by_zero = "attempt to calculate the remainder with a divisor of zero",
|
||||||
|
}
|
||||||
|
|
||||||
#[lang = "panic_cannot_unwind"]
|
#[lang = "panic_cannot_unwind"]
|
||||||
fn panic_cannot_unwind() -> ! {
|
fn panic_cannot_unwind() -> ! {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
Loading…
Reference in New Issue
Block a user