| 
 | 1 | +/*! Tests interrupt ABIs have a constricted signature  | 
 | 2 | +
  | 
 | 3 | +Most interrupt ABIs share a similar restriction in terms of not allowing most signatures.  | 
 | 4 | +Specifically, they generally cannot have arguments or return types.  | 
 | 5 | +So we test that they error in essentially all of the same places.  | 
 | 6 | +A notable and interesting exception is x86.  | 
 | 7 | +
  | 
 | 8 | +This test uses `cfg` because it is not testing whether these ABIs work on the platform.  | 
 | 9 | +*/  | 
 | 10 | +//@ add-core-stubs  | 
 | 11 | +//@ revisions: x64 i686 riscv32 riscv64 avr msp430  | 
 | 12 | +//  | 
 | 13 | +//@ [x64] needs-llvm-components: x86  | 
 | 14 | +//@ [x64] compile-flags: --target=x86_64-unknown-linux-gnu --crate-type=rlib  | 
 | 15 | +//@ [i686] needs-llvm-components: x86  | 
 | 16 | +//@ [i686] compile-flags: --target=i686-unknown-linux-gnu --crate-type=rlib  | 
 | 17 | +//@ [riscv32] needs-llvm-components: riscv  | 
 | 18 | +//@ [riscv32] compile-flags: --target=riscv32i-unknown-none-elf --crate-type=rlib  | 
 | 19 | +//@ [riscv64] needs-llvm-components: riscv  | 
 | 20 | +//@ [riscv64] compile-flags: --target=riscv64gc-unknown-none-elf --crate-type=rlib  | 
 | 21 | +//@ [avr] needs-llvm-components: avr  | 
 | 22 | +//@ [avr] compile-flags: --target=avr-none -C target-cpu=atmega328p --crate-type=rlib  | 
 | 23 | +//@ [msp430] needs-llvm-components: msp430  | 
 | 24 | +//@ [msp430] compile-flags: --target=msp430-none-elf --crate-type=rlib  | 
 | 25 | +#![no_core]  | 
 | 26 | +#![feature(  | 
 | 27 | +    no_core,  | 
 | 28 | +    abi_msp430_interrupt,  | 
 | 29 | +    abi_avr_interrupt,  | 
 | 30 | +    abi_x86_interrupt,  | 
 | 31 | +    abi_riscv_interrupt  | 
 | 32 | +)]  | 
 | 33 | + | 
 | 34 | +extern crate minicore;  | 
 | 35 | +use minicore::*;  | 
 | 36 | + | 
 | 37 | +/* most extern "interrupt" definitions should not accept args */  | 
 | 38 | + | 
 | 39 | +#[cfg(msp430)]  | 
 | 40 | +extern "msp430-interrupt" fn msp430_arg(_byte: u8) {}  | 
 | 41 | +//[msp430]~^ ERROR invalid signature  | 
 | 42 | + | 
 | 43 | +#[cfg(avr)]  | 
 | 44 | +extern "avr-interrupt" fn avr_arg(_byte: u8) {}  | 
 | 45 | +//[avr]~^ ERROR invalid signature  | 
 | 46 | + | 
 | 47 | +#[cfg(any(riscv32,riscv64))]  | 
 | 48 | +extern "riscv-interrupt-m" fn riscv_m_arg(_byte: u8) {}  | 
 | 49 | +//[riscv32,riscv64]~^ ERROR invalid signature  | 
 | 50 | + | 
 | 51 | +#[cfg(any(riscv32,riscv64))]  | 
 | 52 | +extern "riscv-interrupt-s" fn riscv_s_arg(_byte: u8) {}  | 
 | 53 | +//[riscv32,riscv64]~^ ERROR invalid signature  | 
 | 54 | + | 
 | 55 | + | 
 | 56 | +/* all extern "interrupt" definitions should not return non-1ZST values */  | 
 | 57 | + | 
 | 58 | +#[cfg(avr)]  | 
 | 59 | +extern "avr-interrupt" fn avr_ret() -> u8 {  | 
 | 60 | +    //[avr]~^ ERROR invalid signature  | 
 | 61 | +    1  | 
 | 62 | +}  | 
 | 63 | + | 
 | 64 | +#[cfg(msp430)]  | 
 | 65 | +extern "msp430-interrupt" fn msp430_ret() -> u8 {  | 
 | 66 | +    //[msp430]~^ ERROR invalid signature  | 
 | 67 | +    1  | 
 | 68 | +}  | 
 | 69 | + | 
 | 70 | +#[cfg(any(riscv32,riscv64))]  | 
 | 71 | +extern "riscv-interrupt-m" fn riscv_m_ret() -> u8 {  | 
 | 72 | +    //[riscv32,riscv64]~^ ERROR invalid signature  | 
 | 73 | +    1  | 
 | 74 | +}  | 
 | 75 | + | 
 | 76 | +#[cfg(any(riscv32,riscv64))]  | 
 | 77 | +extern "riscv-interrupt-s" fn riscv_s_ret() -> u8 {  | 
 | 78 | +    //[riscv32,riscv64]~^ ERROR invalid signature  | 
 | 79 | +    1  | 
 | 80 | +}  | 
 | 81 | + | 
 | 82 | +#[cfg(any(x64,i686))]  | 
 | 83 | +extern "x86-interrupt" fn x86_ret() -> u8 {  | 
 | 84 | +    //[x64,i686]~^ ERROR invalid signature  | 
 | 85 | +    1  | 
 | 86 | +}  | 
 | 87 | + | 
 | 88 | + | 
 | 89 | + | 
 | 90 | +/* extern "interrupt" fnptrs with invalid signatures */  | 
 | 91 | + | 
 | 92 | +#[cfg(avr)]  | 
 | 93 | +fn avr_ptr(_f: extern "avr-interrupt" fn(u8) -> u8) {  | 
 | 94 | +}  | 
 | 95 | + | 
 | 96 | +#[cfg(msp430)]  | 
 | 97 | +fn msp430_ptr(_f: extern "msp430-interrupt" fn(u8) -> u8) {  | 
 | 98 | +}  | 
 | 99 | + | 
 | 100 | +#[cfg(any(riscv32,riscv64))]  | 
 | 101 | +fn riscv_m_ptr(_f: extern "riscv-interrupt-m" fn(u8) -> u8) {  | 
 | 102 | +}  | 
 | 103 | + | 
 | 104 | +#[cfg(any(riscv32,riscv64))]  | 
 | 105 | +fn riscv_s_ptr(_f: extern "riscv-interrupt-s" fn(u8) -> u8) {  | 
 | 106 | +}  | 
 | 107 | + | 
 | 108 | +#[cfg(any(x64,i686))]  | 
 | 109 | +fn x86_ptr(_f: extern "x86-interrupt" fn() -> u8) {  | 
 | 110 | +}  | 
0 commit comments