65 lines
1.5 KiB
Rust
65 lines
1.5 KiB
Rust
#![no_std]
|
|
|
|
#[unsafe(no_mangle)]
|
|
pub fn panic_noarg() {
|
|
// CHECK-LABEL: @panic_noarg(
|
|
// CHECK-NEXT: start:
|
|
// CHECK-NEXT: tail call void @llvm.trap()
|
|
panic!();
|
|
}
|
|
|
|
#[unsafe(no_mangle)]
|
|
pub fn panic_str() {
|
|
// CHECK-LABEL: @panic_str(
|
|
// CHECK-NEXT: start:
|
|
// CHECK-NEXT: tail call void @llvm.trap()
|
|
panic!("ouch");
|
|
}
|
|
|
|
#[unsafe(no_mangle)]
|
|
pub fn bounds_check(x: &[u8], idx: usize) -> &u8 {
|
|
// CHECK-LABEL: @bounds_check(
|
|
// CHECK-NEXT: start:
|
|
// CHECK-NEXT: icmp ult
|
|
// CHECK-NEXT: br i1
|
|
// CHECK: bb1:
|
|
// CHECK-NEXT: getelementptr inbounds nuw i8
|
|
// CHECK-NEXT: ret ptr
|
|
// CHECK: panic:
|
|
// CHECK-NEXT: tail call void @llvm.trap()
|
|
&x[idx]
|
|
}
|
|
|
|
#[unsafe(no_mangle)]
|
|
pub fn str_bounds_check(x: &str, idx: usize) -> &str {
|
|
// CHECK-LABEL: @str_bounds_check(
|
|
// CHECK-NOT: call
|
|
// CHECK: tail call void @llvm.trap()
|
|
// CHECK-NOT: call
|
|
&x[idx..]
|
|
}
|
|
|
|
#[unsafe(no_mangle)]
|
|
pub fn unsigned_integer_div(x: u16, y: u16) -> u16 {
|
|
// CHECK-LABEL: @unsigned_integer_div(
|
|
// CHECK-NEXT: start:
|
|
// CHECK-NEXT: icmp eq i16
|
|
// CHECK-NEXT: br i1
|
|
// CHECK: bb1:
|
|
// CHECK-NEXT: udiv i16
|
|
// CHECK-NEXT: ret i16
|
|
// CHECK: panic:
|
|
// CHECK-NEXT: tail call void @llvm.trap()
|
|
x / y
|
|
}
|
|
|
|
#[unsafe(no_mangle)]
|
|
pub fn refcell_already_borrowed() {
|
|
// CHECK-LABEL: @refcell_already_borrowed(
|
|
// CHECK-NOT: call
|
|
// CHECK: tail call void @llvm.trap()
|
|
// CHECK-NOT: call
|
|
let r = core::cell::RefCell::new(0u8);
|
|
let _guard = r.borrow_mut();
|
|
r.borrow_mut();
|
|
}
|