let ret_ebb = fx.get_ebb(dest);
fx.bcx.ins().jump(ret_ebb, &[]);
} else {
- fx.bcx.ins().trap(TrapCode::User(!0));
+ trap_unreachable(&mut fx.bcx);
}
}
} else {
fx.bcx.ins().brz(cond, target, &[]);
};
- fx.bcx.ins().trap(TrapCode::User(!0));
+ trap_panic(&mut fx.bcx);
}
TerminatorKind::SwitchInt {
crate::abi::codegen_terminator_call(fx, func, args, destination);
}
TerminatorKind::Resume | TerminatorKind::Abort | TerminatorKind::Unreachable => {
- fx.bcx.ins().trap(TrapCode::User(!0));
+ trap_unreachable(&mut fx.bcx);
}
TerminatorKind::Yield { .. }
| TerminatorKind::FalseEdges { .. }
let layout = value.layout();
if layout.abi == layout::Abi::Uninhabited {
- fx.bcx.ins().trap(TrapCode::User(!0));
+ trap_unreachable(&mut fx.bcx);
}
match layout.variants {
layout::Variants::Single { index } => {
// Insert non returning intrinsics here
match intrinsic {
"abort" => {
- fx.bcx.ins().trap(TrapCode::User(!0 - 1));
+ trap_panic(&mut fx.bcx);
}
"unreachable" => {
- fx.bcx.ins().trap(TrapCode::User(!0 - 1));
+ trap_unreachable(&mut fx.bcx);
}
_ => unimplemented!("unsupported instrinsic {}", intrinsic),
}
let ret_ebb = fx.get_ebb(dest);
fx.bcx.ins().jump(ret_ebb, &[]);
} else {
- fx.bcx.ins().trap(TrapCode::User(!0));
+ trap_unreachable(&mut fx.bcx);
}
}
mod main_shim;
mod metadata;
mod pretty_clif;
+mod trap;
mod vtable;
mod prelude {
pub use crate::abi::*;
pub use crate::base::{trans_operand, trans_place};
pub use crate::common::*;
+ pub use crate::trap::*;
pub use crate::{Caches, CodegenResults, CrateInfo};
}
--- /dev/null
+use cranelift::prelude::*;
+use cranelift::codegen::ir::TrapCode;
+
+/// Trap code: user0
+pub fn trap_panic(bcx: &mut FunctionBuilder) {
+ bcx.ins().trap(TrapCode::User(0));
+}
+
+/// Trap code: user65535
+pub fn trap_unreachable(bcx: &mut FunctionBuilder) {
+ bcx.ins().trap(TrapCode::User(!0));
+}