From 952bf100bdf147c4c6045512dc43fea5ae64819e Mon Sep 17 00:00:00 2001 From: Dan Robertson Date: Tue, 6 Mar 2018 04:08:20 +0000 Subject: [PATCH] Support aarch64 Add support for Aarch64. --- src/impl-aarch64-elf.rs | 76 +++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 5 +++ 2 files changed, 81 insertions(+) create mode 100644 src/impl-aarch64-elf.rs diff --git a/src/impl-aarch64-elf.rs b/src/impl-aarch64-elf.rs new file mode 100644 index 0000000..4764da6 --- /dev/null +++ b/src/impl-aarch64-elf.rs @@ -0,0 +1,76 @@ +use std::{mem, ptr}; +use super::VaPrimitive; + +pub struct VaList(*mut VaListInner); + +#[repr(C)] +#[derive(Debug)] +#[doc(hidden)] +pub struct VaListInner { + stack: *const (), + gr_top: *const (), + vr_top: *const (), + gr_offs: i32, + vr_offs: i32, +} + +impl VaList { + fn inner(&mut self) -> &mut VaListInner { + // This pointer should be valid + unsafe { &mut *self.0 } + } +} + +impl VaListInner { + pub unsafe fn get_gr(&mut self) -> T { + assert!(!self.gr_top.is_null()); + let rv = ptr::read((self.gr_top as usize - self.gr_offs.abs() as usize) as *const _); + self.gr_offs += 8; + rv + } + + pub unsafe fn get_vr(&mut self) -> T { + assert!(!self.vr_top.is_null()); + let rv = ptr::read((self.vr_top as usize - self.vr_offs.abs() as usize) as *const _); + self.vr_offs += 16; + rv + } +} + +impl VaPrimitive for *const T { + unsafe fn get(list: &mut VaList) -> Self { + ::get(list) as *const T + } +} + +macro_rules! impl_va_prim_gr { + ($u: ty, $s: ty) => { + impl VaPrimitive for $u { + unsafe fn get(list: &mut VaList) -> Self { + list.inner().get_gr() + } + } + impl VaPrimitive for $s { + unsafe fn get(list: &mut VaList) -> Self { + mem::transmute(<$u>::get(list)) + } + } + }; +} + +macro_rules! impl_va_prim_vr { + ($($t:ty),+) => { + $( + impl VaPrimitive for $t { + unsafe fn get(list: &mut VaList) -> Self { + list.inner().get_vr() + } + } + )+ + }; +} + +impl_va_prim_gr!{ usize, isize } +impl_va_prim_gr!{ u64, i64 } +impl_va_prim_gr!{ u32, i32 } +impl_va_prim_vr!{ f64, f32 } diff --git a/src/lib.rs b/src/lib.rs index bbba81f..84a709f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -59,6 +59,11 @@ mod imp; #[path = "impl-x86-sysv.rs"] mod imp; +// aarch64 +#[cfg(all(target_arch = "aarch64", any(target_family = "unix", target_os = "redox")))] +#[path = "impl-aarch64-elf.rs"] +mod imp; + // arm+unix = cdecl #[cfg(all(target_arch = "arm", target_family = "unix"))] #[path = "impl-arm-sysv.rs"] -- GitLab