From d219ad63c5075098fc224a57deb4852b9734327d Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Thu, 9 Dec 2021 23:50:37 +0000 Subject: [PATCH] Import the asm! macro from core::arch (#1265) --- .github/workflows/main.yml | 2 ++ ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile | 10 ++++++++++ ci/run.sh | 5 +++++ crates/core_arch/src/aarch64/armclang.rs | 2 +- crates/core_arch/src/arm/armclang.rs | 2 +- crates/core_arch/src/arm_shared/barrier/cp15.rs | 2 ++ crates/core_arch/src/arm_shared/hints.rs | 2 +- crates/core_arch/src/arm_shared/registers/mod.rs | 8 ++++---- crates/core_arch/src/lib.rs | 5 ++++- crates/core_arch/src/riscv/mod.rs | 2 +- crates/core_arch/src/x86/avx512bw.rs | 1 + crates/core_arch/src/x86/avx512f.rs | 1 + crates/core_arch/src/x86/bt.rs | 1 + crates/core_arch/src/x86/cpuid.rs | 1 + crates/core_arch/src/x86/eflags.rs | 2 ++ crates/core_arch/src/x86_64/bt.rs | 1 + 16 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6ea23b4cc1bd3..fd8713ff8a8cf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -168,6 +168,8 @@ jobs: os: ubuntu-latest - target: thumbv7em-none-eabihf os: ubuntu-latest + - target: riscv64gc-unknown-linux-gnu + os: ubuntu-latest steps: - uses: actions/checkout@master diff --git a/ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile b/ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile new file mode 100644 index 0000000000000..1618db22fb559 --- /dev/null +++ b/ci/docker/riscv64gc-unknown-linux-gnu/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:21.10 + +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc libc6-dev qemu-user ca-certificates \ + gcc-riscv64-linux-gnu libc6-dev-riscv64-cross \ + qemu-user + +ENV CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER=riscv64-linux-gnu-gcc \ + CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_RUNNER="qemu-riscv64 -L /usr/riscv64-linux-gnu" \ + OBJDUMP=riscv64-linux-gnu-objdump diff --git a/ci/run.sh b/ci/run.sh index 12c5a865d4939..54145a0e7357c 100755 --- a/ci/run.sh +++ b/ci/run.sh @@ -44,6 +44,11 @@ case ${TARGET} in export RUSTFLAGS="${RUSTFLAGS} -Ctarget-feature=+neon" export TARGET_CFLAGS="-mfpu=vfpv3-d16" ;; + # Some of our test dependencies use the deprecated `gcc` crates which + # doesn't detect RISC-V compilers automatically, so do it manually here. + riscv64*) + export TARGET_CC="riscv64-linux-gnu-gcc" + ;; esac echo "RUSTFLAGS=${RUSTFLAGS}" diff --git a/crates/core_arch/src/aarch64/armclang.rs b/crates/core_arch/src/aarch64/armclang.rs index 54847be7b19b2..7ad6ae50c1c02 100644 --- a/crates/core_arch/src/aarch64/armclang.rs +++ b/crates/core_arch/src/aarch64/armclang.rs @@ -19,5 +19,5 @@ use stdarch_test::assert_instr; #[rustc_legacy_const_generics(0)] pub unsafe fn __breakpoint() { static_assert_imm16!(VAL); - asm!("brk {}", const VAL); + crate::arch::asm!("brk {}", const VAL); } diff --git a/crates/core_arch/src/arm/armclang.rs b/crates/core_arch/src/arm/armclang.rs index 6b332e82c07f5..e68c02d027d58 100644 --- a/crates/core_arch/src/arm/armclang.rs +++ b/crates/core_arch/src/arm/armclang.rs @@ -31,5 +31,5 @@ use stdarch_test::assert_instr; #[rustc_legacy_const_generics(0)] pub unsafe fn __breakpoint() { static_assert_imm8!(VAL); - asm!("bkpt #{}", const VAL); + crate::arch::asm!("bkpt #{}", const VAL); } diff --git a/crates/core_arch/src/arm_shared/barrier/cp15.rs b/crates/core_arch/src/arm_shared/barrier/cp15.rs index 25d4c3c8cb422..6faae0fee0ba0 100644 --- a/crates/core_arch/src/arm_shared/barrier/cp15.rs +++ b/crates/core_arch/src/arm_shared/barrier/cp15.rs @@ -1,6 +1,8 @@ // Reference: ARM11 MPCore Processor Technical Reference Manual (ARM DDI 0360E) Section 3.5 "Summary // of CP15 instructions" +use crate::arch::asm; + /// Full system is the required shareability domain, reads and writes are the /// required access types pub struct SY; diff --git a/crates/core_arch/src/arm_shared/hints.rs b/crates/core_arch/src/arm_shared/hints.rs index 1d6551e5e7b1c..d7e43f5517942 100644 --- a/crates/core_arch/src/arm_shared/hints.rs +++ b/crates/core_arch/src/arm_shared/hints.rs @@ -77,7 +77,7 @@ pub unsafe fn __yield() { /// will increase execution time. #[inline(always)] pub unsafe fn __nop() { - asm!("nop", options(nomem, nostack, preserves_flags)); + crate::arch::asm!("nop", options(nomem, nostack, preserves_flags)); } extern "unadjusted" { diff --git a/crates/core_arch/src/arm_shared/registers/mod.rs b/crates/core_arch/src/arm_shared/registers/mod.rs index 71e94ee5cb511..621efe2f5771f 100644 --- a/crates/core_arch/src/arm_shared/registers/mod.rs +++ b/crates/core_arch/src/arm_shared/registers/mod.rs @@ -4,7 +4,7 @@ macro_rules! rsr { impl super::super::sealed::Rsr for $R { unsafe fn __rsr(&self) -> u32 { let r: u32; - asm!(concat!("mrs {},", stringify!($R)), out(reg) r, options(nomem, nostack)); + crate::arch::asm!(concat!("mrs {},", stringify!($R)), out(reg) r, options(nomem, nostack)); r } } @@ -17,7 +17,7 @@ macro_rules! rsrp { impl super::super::sealed::Rsrp for $R { unsafe fn __rsrp(&self) -> *const u8 { let r: *const u8; - asm!(concat!("mrs {},", stringify!($R)), out(reg) r, options(nomem, nostack)); + crate::arch::asm!(concat!("mrs {},", stringify!($R)), out(reg) r, options(nomem, nostack)); r } } @@ -29,7 +29,7 @@ macro_rules! wsr { ($R:ident) => { impl super::super::sealed::Wsr for $R { unsafe fn __wsr(&self, value: u32) { - asm!(concat!("msr ", stringify!($R), ", {}"), in(reg) value, options(nomem, nostack)); + crate::arch::asm!(concat!("msr ", stringify!($R), ", {}"), in(reg) value, options(nomem, nostack)); } } }; @@ -40,7 +40,7 @@ macro_rules! wsrp { ($R:ident) => { impl super::super::sealed::Wsrp for $R { unsafe fn __wsrp(&self, value: *const u8) { - asm!(concat!("msr ", stringify!($R), ", {}"), in(reg) value, options(nomem, nostack)); + crate::arch::asm!(concat!("msr ", stringify!($R), ", {}"), in(reg) value, options(nomem, nostack)); } } }; diff --git a/crates/core_arch/src/lib.rs b/crates/core_arch/src/lib.rs index d43192b3998e6..cce743a3e89df 100644 --- a/crates/core_arch/src/lib.rs +++ b/crates/core_arch/src/lib.rs @@ -68,7 +68,10 @@ extern crate std_detect; #[path = "mod.rs"] mod core_arch; -pub use self::core_arch::arch; +pub mod arch { + pub use crate::core_arch::arch::*; + pub use core::arch::asm; +} #[allow(unused_imports)] use core::{convert, ffi, hint, intrinsics, marker, mem, ops, ptr, sync}; diff --git a/crates/core_arch/src/riscv/mod.rs b/crates/core_arch/src/riscv/mod.rs index 6d8303a09d464..b93c35fc4fd3c 100644 --- a/crates/core_arch/src/riscv/mod.rs +++ b/crates/core_arch/src/riscv/mod.rs @@ -6,5 +6,5 @@ /// should be temporarily reduced or paused. The duration of its effect must be bounded and may be zero. #[inline] pub fn pause() { - unsafe { asm!(".word 0x0100000F", options(nomem, nostack)) } + unsafe { crate::arch::asm!(".word 0x0100000F", options(nomem, nostack)) } } diff --git a/crates/core_arch/src/x86/avx512bw.rs b/crates/core_arch/src/x86/avx512bw.rs index e878602036c98..47d565ceaa4cc 100644 --- a/crates/core_arch/src/x86/avx512bw.rs +++ b/crates/core_arch/src/x86/avx512bw.rs @@ -1,4 +1,5 @@ use crate::{ + arch::asm, core_arch::{simd::*, simd_llvm::*, x86::*}, mem::{self, transmute}, ptr, diff --git a/crates/core_arch/src/x86/avx512f.rs b/crates/core_arch/src/x86/avx512f.rs index f735559fed2df..11c021f1715ae 100644 --- a/crates/core_arch/src/x86/avx512f.rs +++ b/crates/core_arch/src/x86/avx512f.rs @@ -1,4 +1,5 @@ use crate::{ + arch::asm, core_arch::{simd::*, simd_llvm::*, x86::*}, mem::{self, transmute}, ptr, diff --git a/crates/core_arch/src/x86/bt.rs b/crates/core_arch/src/x86/bt.rs index 37429d3db0b30..338cb97a38c7a 100644 --- a/crates/core_arch/src/x86/bt.rs +++ b/crates/core_arch/src/x86/bt.rs @@ -1,3 +1,4 @@ +use crate::arch::asm; #[cfg(test)] use stdarch_test::assert_instr; diff --git a/crates/core_arch/src/x86/cpuid.rs b/crates/core_arch/src/x86/cpuid.rs index ed383e917d5d7..6b90295ef6288 100644 --- a/crates/core_arch/src/x86/cpuid.rs +++ b/crates/core_arch/src/x86/cpuid.rs @@ -1,6 +1,7 @@ //! `cpuid` intrinsics #![allow(clippy::module_name_repetitions)] +use crate::arch::asm; #[cfg(test)] use stdarch_test::assert_instr; diff --git a/crates/core_arch/src/x86/eflags.rs b/crates/core_arch/src/x86/eflags.rs index 368240378f457..9bd4d6828b64f 100644 --- a/crates/core_arch/src/x86/eflags.rs +++ b/crates/core_arch/src/x86/eflags.rs @@ -1,5 +1,7 @@ //! `i386` intrinsics +use crate::arch::asm; + /// Reads EFLAGS. /// /// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=__readeflags) diff --git a/crates/core_arch/src/x86_64/bt.rs b/crates/core_arch/src/x86_64/bt.rs index f2aa45d8ea153..53da9d02f5e0a 100644 --- a/crates/core_arch/src/x86_64/bt.rs +++ b/crates/core_arch/src/x86_64/bt.rs @@ -1,3 +1,4 @@ +use crate::arch::asm; #[cfg(test)] use stdarch_test::assert_instr;