aboutsummaryrefslogtreecommitdiff
path: root/cortex-m-semihosting/src/macros.rs
diff options
context:
space:
mode:
authorGravatar bors[bot] <26634292+bors[bot]@users.noreply.github.com> 2020-10-13 23:32:15 +0000
committerGravatar GitHub <noreply@github.com> 2020-10-13 23:32:15 +0000
commit432e5f527430394570d1d07454e26cc41d5b2936 (patch)
treed3cde25a18eabfc5f0342dbf2d31ab767f21bab9 /cortex-m-semihosting/src/macros.rs
parentf77d64a2d1505335e4a170d03a40993bb066fd02 (diff)
parentb51178fae6373d8dae95f2fb661e0635359e8bc0 (diff)
downloadcortex-m-432e5f527430394570d1d07454e26cc41d5b2936.tar.gz
cortex-m-432e5f527430394570d1d07454e26cc41d5b2936.tar.zst
cortex-m-432e5f527430394570d1d07454e26cc41d5b2936.zip
263: Import cortex-m-semihosting and panic-semihosting into this repo r=adamgreig a=jonas-schievink Motivation: * Allows writing QEMU tests for `cortex-m`'s functionality that use semihosting to control QEMU. Previously these crates would pull in another cortex-m version, which doesn't work. Now they have a `path` dependency on the root crate. * Lets us share the outline-inline-assembly setup and `cargo-xtask` in general. * Lets us share CI and bot setup between more crates. * 2 fewer repos to triage and keep track of (I'll transfer their issues after this is merged). I also want to import cortex-m-rt, but I'll do that in a later PR. CI was updated to build-test all crates with all or most feature combinations, like it did before. Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
Diffstat (limited to 'cortex-m-semihosting/src/macros.rs')
-rw-r--r--cortex-m-semihosting/src/macros.rs119
1 files changed, 119 insertions, 0 deletions
diff --git a/cortex-m-semihosting/src/macros.rs b/cortex-m-semihosting/src/macros.rs
new file mode 100644
index 0000000..d10cd3f
--- /dev/null
+++ b/cortex-m-semihosting/src/macros.rs
@@ -0,0 +1,119 @@
+/// Variable argument version of `syscall`
+#[macro_export]
+macro_rules! syscall {
+ ($nr:ident) => {
+ $crate::syscall1($crate::nr::$nr, 0)
+ };
+ ($nr:ident, $a1:expr) => {
+ $crate::syscall($crate::nr::$nr, &[$a1 as usize])
+ };
+ ($nr:ident, $a1:expr, $a2:expr) => {
+ $crate::syscall($crate::nr::$nr, &[$a1 as usize, $a2 as usize])
+ };
+ ($nr:ident, $a1:expr, $a2:expr, $a3:expr) => {
+ $crate::syscall($crate::nr::$nr, &[$a1 as usize, $a2 as usize,
+ $a3 as usize])
+ };
+ ($nr:ident, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {
+ $crate::syscall($crate::nr::$nr, &[$a1 as usize, $a2 as usize,
+ $a3 as usize, $a4 as usize])
+ };
+}
+
+/// Macro version of `syscall1`.
+#[macro_export]
+macro_rules! syscall1 {
+ ($nr:ident, $a1:expr) => {
+ $crate::syscall1($crate::nr::$nr, $a1 as usize)
+ };
+}
+
+/// Macro for printing to the HOST standard output.
+///
+/// This is similar to the `print!` macro in the standard library. Both will panic on any failure to
+/// print.
+#[macro_export]
+macro_rules! hprint {
+ ($s:expr) => {
+ $crate::export::hstdout_str($s)
+ };
+ ($($tt:tt)*) => {
+ $crate::export::hstdout_fmt(format_args!($($tt)*))
+ };
+}
+
+/// Macro for printing to the HOST standard output, with a newline.
+///
+/// This is similar to the `println!` macro in the standard library. Both will panic on any failure to
+/// print.
+#[macro_export]
+macro_rules! hprintln {
+ () => {
+ $crate::export::hstdout_str("\n")
+ };
+ ($s:expr) => {
+ $crate::export::hstdout_str(concat!($s, "\n"))
+ };
+ ($s:expr, $($tt:tt)*) => {
+ $crate::export::hstdout_fmt(format_args!(concat!($s, "\n"), $($tt)*))
+ };
+}
+
+/// Macro for printing to the HOST standard error.
+///
+/// This is similar to the `eprint!` macro in the standard library. Both will panic on any failure
+/// to print.
+#[macro_export]
+macro_rules! heprint {
+ ($s:expr) => {
+ $crate::export::hstderr_str($s)
+ };
+ ($($tt:tt)*) => {
+ $crate::export::hstderr_fmt(format_args!($($tt)*))
+ };
+}
+
+/// Macro for printing to the HOST standard error, with a newline.
+///
+/// This is similar to the `eprintln!` macro in the standard library. Both will panic on any failure
+/// to print.
+#[macro_export]
+macro_rules! heprintln {
+ () => {
+ $crate::export::hstderr_str("\n")
+ };
+ ($s:expr) => {
+ $crate::export::hstderr_str(concat!($s, "\n"))
+ };
+ ($s:expr, $($tt:tt)*) => {
+ $crate::export::hstderr_fmt(format_args!(concat!($s, "\n"), $($tt)*))
+ };
+}
+
+/// Macro that prints and returns the value of a given expression for quick and
+/// dirty debugging.
+///
+/// Works exactly like `dbg!` in the standard library, replacing `eprintln!`
+/// with `heprintln!`.
+#[macro_export]
+macro_rules! dbg {
+ () => {
+ $crate::heprintln!("[{}:{}]", file!(), line!());
+ };
+ ($val:expr) => {
+ // Use of `match` here is intentional because it affects the lifetimes
+ // of temporaries - https://stackoverflow.com/a/48732525/1063961
+ match $val {
+ tmp => {
+ $crate::heprintln!("[{}:{}] {} = {:#?}",
+ file!(), line!(), stringify!($val), &tmp);
+ tmp
+ }
+ }
+ };
+ // Trailing comma with single argument is ignored
+ ($val:expr,) => { $crate::dbg!($val) };
+ ($($val:expr),+ $(,)?) => {
+ ($($crate::dbg!($val)),+,)
+ };
+}