Skip to content

Commit

Permalink
Rename begin_unwind lang item to fail_fmt, refs #16114
Browse files Browse the repository at this point in the history
  • Loading branch information
fhahn committed Sep 24, 2014
1 parent e0bd16c commit 9a01da9
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 7 deletions.
8 changes: 4 additions & 4 deletions src/doc/guide-unsafe.md
Original file line number Diff line number Diff line change
Expand Up @@ -573,8 +573,8 @@ pub extern fn dot_product(a: *const u32, a_len: u32,
return ret;
}
#[lang = "begin_unwind"]
extern fn begin_unwind(args: &core::fmt::Arguments,
#[lang = "fail_fmt"]
extern fn fail_fmt(args: &core::fmt::Arguments,
file: &str,
line: uint) -> ! {
loop {}
Expand All @@ -587,8 +587,8 @@ extern fn begin_unwind(args: &core::fmt::Arguments,
```

Note that there is one extra lang item here which differs from the examples
above, `begin_unwind`. This must be defined by consumers of libcore because the
core library declares failure, but it does not define it. The `begin_unwind`
above, `fail_fmt`. This must be defined by consumers of libcore because the
core library declares failure, but it does not define it. The `fail_fmt`
lang item is this crate's definition of failure, and it must be guaranteed to
never return.

Expand Down
8 changes: 8 additions & 0 deletions src/libcore/failure.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,17 @@ pub fn begin_unwind_string(msg: &str, file: &(&'static str, uint)) -> ! {
pub fn begin_unwind(fmt: &fmt::Arguments, file_line: &(&'static str, uint)) -> ! {
#[allow(ctypes)]
extern {

#[cfg(stage0)]
#[lang = "begin_unwind"]
fn begin_unwind(fmt: &fmt::Arguments, file: &'static str,
line: uint) -> !;

#[cfg(not(stage0))]
#[lang = "fail_fmt"]
fn begin_unwind(fmt: &fmt::Arguments, file: &'static str,
line: uint) -> !;

}
let (file, line) = *file_line;
unsafe { begin_unwind(fmt, file, line) }
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/lang_items.rs
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ lets_do_this! {
// lang item, but do not have it defined.
FailFnLangItem, "fail_", fail_fn;
FailBoundsCheckFnLangItem, "fail_bounds_check", fail_bounds_check_fn;
BeginUnwindLangItem, "begin_unwind", begin_unwind;
FailFmtLangItem, "fail_fmt", fail_fmt;

ExchangeMallocFnLangItem, "exchange_malloc", exchange_malloc_fn;
ExchangeFreeFnLangItem, "exchange_free", exchange_free_fn;
Expand Down
2 changes: 1 addition & 1 deletion src/librustc/middle/weak_lang_items.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ impl<'a, 'v> Visitor<'v> for Context<'a> {
) )

weak_lang_items!(
begin_unwind, BeginUnwindLangItem, rust_begin_unwind;
fail_fmt, FailFmtLangItem, rust_begin_unwind;
stack_exhausted, StackExhaustedLangItem, rust_stack_exhausted;
eh_personality, EhPersonalityLangItem, rust_eh_personality;
)
11 changes: 11 additions & 0 deletions src/librustrt/unwind.rs
Original file line number Diff line number Diff line change
Expand Up @@ -489,12 +489,23 @@ pub mod eabi {

// Entry point of failure from the libcore crate
#[cfg(not(test))]
#[cfg(not(stage0))]
#[lang = "fail_fmt"]
pub extern fn rust_begin_unwind1(msg: &fmt::Arguments,
file: &'static str, line: uint) -> ! {
begin_unwind_fmt(msg, &(file, line))
}
//
// Entry point of failure from the libcore crate
#[cfg(not(test))]
#[cfg(stage0)]
#[lang = "begin_unwind"]
pub extern fn rust_begin_unwind(msg: &fmt::Arguments,
file: &'static str, line: uint) -> ! {
begin_unwind_fmt(msg, &(file, line))
}


/// The entry point for unwinding with a formatted message.
///
/// This is designed to reduce the amount of code required at the call
Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/weak-lang-item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
// except according to those terms.

// aux-build:weak-lang-items.rs
// error-pattern: language item required, but not found: `begin_unwind`
// error-pattern: language item required, but not found: `fail_fmt`
// error-pattern: language item required, but not found: `stack_exhausted`
// error-pattern: language item required, but not found: `eh_personality`

Expand Down

0 comments on commit 9a01da9

Please sign in to comment.