rust/tests
Matthias Krüger 6c9e922685
Rollup merge of #131323 - jfrimmel:avr-inline-asm-clobber-abi, r=Amanieu
Support `clobber_abi` in AVR inline assembly

This PR implements the `clobber_abi` part necessary to eventually stabilize the inline assembly for AVR. This is tracked in #93335.
This is heavily inspired by the sibling-PR #131310 for the MSP430. I've explained my reasoning in the first commit message in detail, which is reproduced below for easier reviewing:

This follows the [ABI documentation] of AVR-GCC:

> The [...] call-clobbered general purpose registers (GPRs) are registers that might be destroyed (clobbered) by a function call.
>
> - **R18–R27, R30, R31**
>
>   These GPRs are call clobbered. An ordinary function may use them without restoring the contents. [...]
>
> - **R0, T-Flag**
>
>   The temporary register and the T-flag in SREG are also call-clobbered, but this knowledge is not exposed explicitly to the compiler (R0 is a fixed register).

Therefore this commit lists the aforementioned registers `r18–r27`, `r30` and `r31` as clobbered registers. Since the `r0` register (listed above as well) is not available in inline assembly at all (potentially because the AVR-GCC considers it a fixed register causing the register to never be used in register allocation and LLVM adopting this), there is no need to list it in the clobber list (the `r0`-variant is not even available). A comment was added to ensure, that the `r0` gets added to the clobber-list once the register gets usable in inline ASM.
Since the SREG is normally considered clobbered anyways (unless the user supplies the `preserve_flags`-option), there is no need to explicitly list a bit in this register (which is not possible to list anyways).

Note, that this commit completely ignores the case of interrupts (that are described in the ABI-specification), since every register touched in an ISR need to be saved anyways.

[ABI documentation]: https://gcc.gnu.org/wiki/avr-gcc#Call-Used_Registers

r? ``@Amanieu``

``@rustbot`` label +O-AVR
2024-11-29 16:02:20 +01:00
..
assembly Make s390x non-clobber-only vector register support unstable 2024-11-24 21:42:22 +09:00
auxiliary Support input/output in vector registers of s390x inline assembly 2024-11-22 04:18:14 +09:00
codegen Rollup merge of #131323 - jfrimmel:avr-inline-asm-clobber-abi, r=Amanieu 2024-11-29 16:02:20 +01:00
codegen-units Share inline(never) generics across crates 2024-11-28 13:43:05 -05:00
coverage Auto merge of #133474 - RalfJung:gvn-miscompile, r=compiler-errors 2024-11-27 15:43:56 +00:00
coverage-run-rustdoc coverage: Restrict empty-span expansion to only cover { and } 2024-11-08 20:43:08 +11:00
crashes Rollup merge of #133368 - compiler-errors:codegen-select-unconstrained-params, r=lcnr 2024-11-28 03:14:46 +01:00
debuginfo Mark numeric-types.rs as 64-bit only for now 2024-11-17 04:16:59 +08:00
incremental Update tests to use new proc-macro header 2024-11-27 07:18:25 -08:00
mir-opt Revert "Rollup merge of #133418 - Zalathar:spans, r=jieyouxu" 2024-11-29 14:57:01 +11:00
pretty Update tests to use new proc-macro header 2024-11-27 07:18:25 -08:00
run-make Share inline(never) generics across crates 2024-11-28 13:43:05 -05:00
rustdoc Add regression test for prelude types 2024-11-25 17:25:25 +01:00
rustdoc-gui rustdoc-search: simplify rules for generics and type params 2024-10-30 12:27:48 -07:00
rustdoc-js rustdoc-search: add standalone trailing :: test 2024-11-17 08:07:16 -07:00
rustdoc-js-std rustdoc search: allow queries to end in an empty path segment 2024-11-15 16:32:40 -06:00
rustdoc-json Rename Receiver -> LegacyReceiver 2024-10-22 12:55:16 +00:00
rustdoc-ui Remove last vestiges of HybridBitSet. 2024-11-29 17:23:34 +11:00
ui Rollup merge of #133590 - nnethercote:rename-parse-only, r=estebank 2024-11-29 10:19:00 +01:00
ui-fulldeps Rollup merge of #132410 - bjorn3:yet_another_driver_refactor_round, r=cjgillot 2024-11-27 22:23:24 +01:00
COMPILER_TESTS.md