From da44e3fdceb46b8d53b2a6e93bca3b80d4243a17 Mon Sep 17 00:00:00 2001 From: Julian Frimmel Date: Mon, 14 Oct 2024 23:06:32 +0200 Subject: [PATCH] Start test case for `rjmp` regression test This commit introduces a minimal `![no_core]`-test case running on AVR, that contains the MCWE mentioned in [129301]. The test case itself does not have any assertions yet, but it shows the minimal set an language items necessary within the test case. [129301]: https://github.com/rust-lang/rust/issues/129301#issuecomment-2301399472 --- tests/assembly/avr-rjmp-offsets.rs | 62 ++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 tests/assembly/avr-rjmp-offsets.rs diff --git a/tests/assembly/avr-rjmp-offsets.rs b/tests/assembly/avr-rjmp-offsets.rs new file mode 100644 index 0000000000000..fafa2b43138da --- /dev/null +++ b/tests/assembly/avr-rjmp-offsets.rs @@ -0,0 +1,62 @@ +//@ compile-flags: -Copt-level=s --target=avr-unknown-gnu-atmega328 -C panic=abort +//@ needs-llvm-components: avr +//@ assembly-output: emit-asm + +#![feature( + no_core, + lang_items, + intrinsics, + rustc_attrs, + arbitrary_self_types, + asm_experimental_arch +)] +#![crate_type = "rlib"] +#![no_core] + +#[rustc_builtin_macro] +macro_rules! asm { + () => {}; +} + +use minicore::ptr; + +// CHECK-LABEL: pin_toggling +#[no_mangle] +pub fn pin_toggling() { + let port_b = 0x25 as *mut u8; // the I/O-address of PORTB + loop { + unsafe { ptr::write_volatile(port_b, 1) }; + delay(500_0000); + unsafe { ptr::write_volatile(port_b, 2) }; + delay(500_0000); + } +} + +#[inline(never)] +fn delay(_: u32) { + unsafe { asm!("nop") }; +} + +// FIXME: replace with proper minicore once available (#130693) +mod minicore { + #[lang = "sized"] + pub trait Sized {} + + #[lang = "copy"] + pub trait Copy {} + impl Copy for u32 {} + impl Copy for &u32 {} + impl Copy for *mut T {} + + pub mod ptr { + #[inline] + #[rustc_diagnostic_item = "ptr_write_volatile"] + pub unsafe fn write_volatile(dst: *mut T, src: T) { + extern "rust-intrinsic" { + #[rustc_nounwind] + pub fn volatile_store(dst: *mut T, val: T); + } + unsafe { volatile_store(dst, src) }; + } + } +}