Flag failure functions as inline(never)

The failure functions are generic, meaning they're candidates for getting
inlined across crates. This has been happening, leading to monstrosities like
that found in #11549. I have verified that the codegen is *much* better now that
we're not inlining the failure path (the slow path).
This commit is contained in:
Alex Crichton 2014-01-14 18:02:19 -08:00
parent dd8b011319
commit 86c60b68f9

View File

@ -364,6 +364,7 @@ pub extern "C" fn rust_eh_personality_catch(
/// This is the entry point of unwinding for things like lang items and such.
/// The arguments are normally generated by the compiler, and need to
/// have static lifetimes.
#[inline(never)] #[cold] // this is the slow path, please never inline this
pub fn begin_unwind_raw(msg: *c_char, file: *c_char, line: size_t) -> ! {
#[inline]
fn static_char_ptr(p: *c_char) -> &'static str {
@ -381,6 +382,7 @@ fn static_char_ptr(p: *c_char) -> &'static str {
}
/// This is the entry point of unwinding for fail!() and assert!().
#[inline(never)] #[cold] // this is the slow path, please never inline this
pub fn begin_unwind<M: Any + Send>(msg: M, file: &'static str, line: uint) -> ! {
// Note that this should be the only allocation performed in this block.
// Currently this means that fail!() on OOM will invoke this code path,