From 92b24f5f632b16aec24a62944b33fc384afbc584 Mon Sep 17 00:00:00 2001
From: Stefan Lankes <slankes@eonerc.rwth-aachen.de>
Date: Sat, 2 Mar 2019 13:29:16 +0100
Subject: [PATCH] add HermitCore support even if it doesn't have a UNIX
 interface

---
 src/hermit/aarch64.rs |  2 +
 src/hermit/mod.rs     | 85 +++++++++++++++++++++++++++++++++++++++++++
 src/hermit/x86_64.rs  |  2 +
 src/lib.rs            |  3 ++
 4 files changed, 92 insertions(+)
 create mode 100644 src/hermit/aarch64.rs
 create mode 100644 src/hermit/mod.rs
 create mode 100644 src/hermit/x86_64.rs

diff --git a/src/hermit/aarch64.rs b/src/hermit/aarch64.rs
new file mode 100644
index 00000000..1a92e3b4
--- /dev/null
+++ b/src/hermit/aarch64.rs
@@ -0,0 +1,2 @@
+pub type c_char = u8;
+pub type wchar_t = u32;
diff --git a/src/hermit/mod.rs b/src/hermit/mod.rs
new file mode 100644
index 00000000..3e28ef50
--- /dev/null
+++ b/src/hermit/mod.rs
@@ -0,0 +1,85 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// libc port for HermitCore (https://hermitcore.org)
+//
+// Ported by Colin Fink <colin.finck@rwth-aachen.de>
+//       and Stefan Lankes <slankes@eonerc.rwth-aachen.de>
+
+pub type int8_t = i8;
+pub type int16_t = i16;
+pub type int32_t = i32;
+pub type int64_t = i64;
+pub type uint8_t = u8;
+pub type uint16_t = u16;
+pub type uint32_t = u32;
+pub type uint64_t = u64;
+
+pub type c_schar = i8;
+pub type c_uchar = u8;
+pub type c_short = i16;
+pub type c_ushort = u16;
+pub type c_int = i32;
+pub type c_uint = u32;
+pub type c_float = f32;
+pub type c_double = f64;
+pub type c_longlong = i64;
+pub type c_ulonglong = u64;
+pub type intmax_t = i64;
+pub type uintmax_t = u64;
+
+pub type size_t = usize;
+pub type ptrdiff_t = isize;
+pub type intptr_t = isize;
+pub type uintptr_t = usize;
+pub type ssize_t = isize;
+
+pub type c_char = i8;
+pub type c_long = i64;
+pub type c_ulong = u64;
+
+pub type wchar_t = i32;
+pub type wint_t = u32;
+pub type wctype_t = i64;
+
+pub type regoff_t = size_t;
+pub type off_t = c_long;
+
+cfg_if! {
+    if #[cfg(target_arch = "aarch64")] {
+        mod aarch64;
+        pub use self::aarch64::*;
+    } else if #[cfg(target_arch = "x86_64")] {
+        mod x86_64;
+        pub use self::x86_64::*;
+    } else {
+        // Unknown target_arch
+    }
+}
+
+cfg_if! {
+    if #[cfg(libc_core_cvoid)] {
+        pub use ::ffi::c_void;
+    } else {
+        // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help
+        // enable more optimization opportunities around it recognizing things
+        // like malloc/free.
+        #[repr(u8)]
+        #[allow(missing_copy_implementations)]
+        #[allow(missing_debug_implementations)]
+        pub enum c_void {
+            // Two dummy variants so the #[repr] attribute can be used.
+            #[doc(hidden)]
+            __variant1,
+            #[doc(hidden)]
+            __variant2,
+        }
+    }
+}
diff --git a/src/hermit/x86_64.rs b/src/hermit/x86_64.rs
new file mode 100644
index 00000000..76ec3ce8
--- /dev/null
+++ b/src/hermit/x86_64.rs
@@ -0,0 +1,2 @@
+pub type c_char = i8;
+pub type wchar_t = i32;
diff --git a/src/lib.rs b/src/lib.rs
index 72e93aaf..b2e8eb0d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -232,6 +232,9 @@ cfg_if! {
     } else if #[cfg(unix)] {
         mod unix;
         pub use unix::*;
+    } else if #[cfg(target_os = "hermit")] {
+        mod redox;
+        pub use hermit::*;
     } else if #[cfg(target_env = "sgx")] {
         mod sgx;
         pub use sgx::*;
-- 
GitLab