forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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]: rust-lang#129301 (comment)
- Loading branch information
Showing
1 changed file
with
62 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) }; | ||
} | ||
} | ||
} |