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 binary.
This commit is contained in:
parent
06ef32c862
commit
05783c8ed6
@ -465,6 +465,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_bounds_check"]
|
#[lang = "panic_bounds_check"]
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
fn panic_bounds_check(index: usize, len: usize) -> ! {
|
fn panic_bounds_check(index: usize, len: usize) -> ! {
|
||||||
|
24
src/base.rs
24
src/base.rs
@ -369,8 +369,14 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
let msg_str = msg.description();
|
let location = fx.get_caller_location(source_info).load_scalar(fx);
|
||||||
codegen_panic(fx, msg_str, source_info);
|
|
||||||
|
codegen_panic_inner(
|
||||||
|
fx,
|
||||||
|
msg.panic_function(),
|
||||||
|
&[location],
|
||||||
|
Some(source_info.span),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -954,20 +960,6 @@ pub(crate) fn codegen_operand<'tcx>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn codegen_panic<'tcx>(
|
|
||||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
|
||||||
msg_str: &str,
|
|
||||||
source_info: mir::SourceInfo,
|
|
||||||
) {
|
|
||||||
let location = fx.get_caller_location(source_info).load_scalar(fx);
|
|
||||||
|
|
||||||
let msg_ptr = fx.anonymous_str(msg_str);
|
|
||||||
let msg_len = fx.bcx.ins().iconst(fx.pointer_type, i64::try_from(msg_str.len()).unwrap());
|
|
||||||
let args = [msg_ptr, msg_len, location];
|
|
||||||
|
|
||||||
codegen_panic_inner(fx, rustc_hir::LangItem::Panic, &args, Some(source_info.span));
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn codegen_panic_nounwind<'tcx>(
|
pub(crate) fn codegen_panic_nounwind<'tcx>(
|
||||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
||||||
msg_str: &str,
|
msg_str: &str,
|
||||||
|
Loading…
Reference in New Issue
Block a user