summary refs log tree commit diff
path: root/src/test/run-make/nvptx-dylib-crate/kernel.rs
blob: 63fd6b063dd8c01e47acd4d1b46b5ae3c08da3c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#![no_std]
#![deny(warnings)]
#![feature(abi_ptx, core_intrinsics)]

extern crate dep;

// Verify the default CUDA arch.
// CHECK: .target sm_30
// CHECK: .address_size 64

// Make sure declarations are there.
// CHECK: .func (.param .b32 func_retval0) wrapping_external_fn
// CHECK: .func (.param .b32 func_retval0) panicking_external_fn
// CHECK: .func [[PANIC_HANDLER:_ZN4core9panicking5panic[a-zA-Z0-9]+]]

// CHECK-LABEL: .visible .entry top_kernel(
#[no_mangle]
pub unsafe extern "ptx-kernel" fn top_kernel(a: *const u32, b: *mut u32) {
    // CHECK:      call.uni (retval0),
    // CHECK-NEXT: wrapping_external_fn
    // CHECK:      ld.param.b32 %[[LHS:r[0-9]+]], [retval0+0];
    let lhs = dep::wrapping_external_fn(*a);

    // CHECK:      call.uni (retval0),
    // CHECK-NEXT: panicking_external_fn
    // CHECK:      ld.param.b32 %[[RHS:r[0-9]+]], [retval0+0];
    let rhs = dep::panicking_external_fn(*a);

    // CHECK: add.s32 %[[RES:r[0-9]+]], %[[RHS]], %[[LHS]];
    // CHECK: st.global.u32 [%{{rd[0-9]+}}], %[[RES]];
    *b = lhs + rhs;
}

// Verify that external function bodies are available.
// CHECK-LABEL: .func (.param .b32 func_retval0) wrapping_external_fn
// CHECK: {
// CHECK:   st.param.b32 [func_retval0+0], %{{r[0-9]+}};
// CHECK: }

// Also verify panic behavior.
// CHECK-LABEL: .func (.param .b32 func_retval0) panicking_external_fn
// CHECK: {
// CHECK:   %{{p[0-9]+}} bra [[PANIC_LABEL:[a-zA-Z0-9_]+]];
// CHECK: [[PANIC_LABEL]]:
// CHECK:   call.uni
// CHECK:   [[PANIC_HANDLER]]
// CHECK: }

// Verify whether out dummy panic formatter has a correct body.
// CHECK: .func [[PANIC_FMT:_ZN4core9panicking9panic_fmt[a-zA-Z0-9]+]]()
// CHECK: {
// CHECK:   trap;
// CHECK: }

#[panic_handler]
unsafe fn breakpoint_panic_handler(_: &::core::panic::PanicInfo) -> ! {
    core::intrinsics::breakpoint();
    core::hint::unreachable_unchecked();
}