add rust error message for CMSE stack spill
when the `C-cmse-nonsecure-call` ABI is used, arguments and return values must be passed via registers. Failing to do so (i.e. spilling to the stack) causes an LLVM error down the line, but now rustc will properly emit an error a bit earlier in the chain
This commit is contained in:
parent
d3dd34a1d4
commit
50ba821e12
7 changed files with 143 additions and 11 deletions
36
compiler/rustc_error_codes/src/error_codes/E0798.md
Normal file
36
compiler/rustc_error_codes/src/error_codes/E0798.md
Normal file
|
@ -0,0 +1,36 @@
|
|||
Functions marked as `C-cmse-nonsecure-call` place restrictions on their
|
||||
inputs and outputs.
|
||||
|
||||
- inputs must fit in the 4 available 32-bit argument registers. Alignment
|
||||
is relevant.
|
||||
- outputs must either fit in 4 bytes, or be a foundational type of
|
||||
size 8 (`i64`, `u64`, `f64`).
|
||||
|
||||
For more information,
|
||||
see [arm's aapcs32](https://github.com/ARM-software/abi-aa/releases).
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0798
|
||||
#![feature(abi_c_cmse_nonsecure_call)]
|
||||
|
||||
fn test(
|
||||
f: extern "C-cmse-nonsecure-call" fn(u32, u32, u32, u32, u32) -> u32,
|
||||
) -> u32 {
|
||||
f(1, 2, 3, 4, 5)
|
||||
}
|
||||
```
|
||||
|
||||
Arguments' alignment is respected. In the example below, padding is inserted
|
||||
so that the `u64` argument is passed in registers r2 and r3. There is then no
|
||||
room left for the final `f32` argument
|
||||
|
||||
```compile_fail,E0798
|
||||
#![feature(abi_c_cmse_nonsecure_call)]
|
||||
|
||||
fn test(
|
||||
f: extern "C-cmse-nonsecure-call" fn(u32, u64, f32) -> u32,
|
||||
) -> u32 {
|
||||
f(1, 2, 3.0)
|
||||
}
|
||||
```
|
|
@ -536,6 +536,7 @@ E0794: 0794,
|
|||
E0795: 0795,
|
||||
E0796: 0796,
|
||||
E0797: 0797,
|
||||
E0798: 0798,
|
||||
);
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue