Rollup merge of #127814 - folkertdev:c-cmse-nonsecure-call-error-messages, r=oli-obk
`C-cmse-nonsecure-call`: improved error messages tracking issue: #81391 issue for the error messages (partially implemented by this PR): #81347 related, in that it also deals with CMSE: https://github.com/rust-lang/rust/pull/127766 When using the `C-cmse-nonsecure-call` ABI, both the arguments and return value must be passed via registers. Previously, when violating this constraint, an ugly LLVM error would be shown. Now, the rust compiler itself will print a pretty message and link to more information.
This commit is contained in:
commit
3b20150b48
16 changed files with 569 additions and 55 deletions
39
compiler/rustc_error_codes/src/error_codes/E0798.md
Normal file
39
compiler/rustc_error_codes/src/error_codes/E0798.md
Normal file
|
@ -0,0 +1,39 @@
|
|||
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`).
|
||||
- no generics can be used in the signature
|
||||
|
||||
For more information,
|
||||
see [arm's aapcs32](https://github.com/ARM-software/abi-aa/releases).
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```ignore (only fails on supported targets)
|
||||
#![feature(abi_c_cmse_nonsecure_call)]
|
||||
|
||||
#[no_mangle]
|
||||
pub 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
|
||||
|
||||
```ignore (only fails on supported targets)
|
||||
#![feature(abi_c_cmse_nonsecure_call)]
|
||||
|
||||
#[no_mangle]
|
||||
pub 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