Skip to content

Commit

Permalink
Start test case for rjmp regression test
Browse files Browse the repository at this point in the history
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]: rust-lang#129301 (comment)
  • Loading branch information
jfrimmel committed Oct 15, 2024
1 parent 17a19e6 commit da44e3f
Showing 1 changed file with 62 additions and 0 deletions.
62 changes: 62 additions & 0 deletions tests/assembly/avr-rjmp-offsets.rs
Original file line number Diff line number Diff line change
@@ -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<T: ?Sized> Copy for *mut T {}

pub mod ptr {
#[inline]
#[rustc_diagnostic_item = "ptr_write_volatile"]
pub unsafe fn write_volatile<T>(dst: *mut T, src: T) {
extern "rust-intrinsic" {
#[rustc_nounwind]
pub fn volatile_store<T>(dst: *mut T, val: T);
}
unsafe { volatile_store(dst, src) };
}
}
}

0 comments on commit da44e3f

Please sign in to comment.