Add intrinsics::unreachable

This commit is contained in:
Keegan McAllister 2014-09-03 12:00:08 -07:00
parent 1f3cda8bd8
commit 401aeaf6d3
3 changed files with 12 additions and 0 deletions

View File

@ -250,6 +250,13 @@ extern "rust-intrinsic" {
/// Abort the execution of the process.
pub fn abort() -> !;
/// Tell LLVM that this point in the code is not reachable,
/// enabling further optimizations.
///
/// NB: This is very different from the `unreachable!()` macro!
#[cfg(not(stage0))]
pub fn unreachable() -> !;
/// Execute a breakpoint trap, for inspection by a debugger.
pub fn breakpoint();

View File

@ -228,6 +228,10 @@ pub fn trans_intrinsic_call<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>, node: ast::N
Unreachable(bcx);
v
}
(_, "unreachable") => {
Unreachable(bcx);
C_nil(ccx)
}
(_, "breakpoint") => {
let llfn = ccx.get_intrinsic(&("llvm.debugtrap"));
Call(bcx, llfn, [], None)

View File

@ -5589,6 +5589,7 @@ pub fn check_intrinsic_type(ccx: &CrateCtxt, it: &ast::ForeignItem) {
} else {
match name.get() {
"abort" => (0, Vec::new(), ty::mk_bot()),
"unreachable" => (0, Vec::new(), ty::mk_bot()),
"breakpoint" => (0, Vec::new(), ty::mk_nil()),
"size_of" |
"pref_align_of" | "min_align_of" => (1u, Vec::new(), ty::mk_uint()),