]> git.lizzy.rs Git - rust.git/blobdiff - src/libunwind/libunwind.rs
Rollup merge of #65831 - matthewjasper:array-ptr-cast, r=oli-obk
[rust.git] / src / libunwind / libunwind.rs
index 92231e8207b7c2a9ae7180efac63a4d4d17cc4e4..0b39503c0d03453b08da3bf2a5f0420b6433747b 100644 (file)
@@ -1,26 +1,7 @@
 #![allow(nonstandard_style)]
 
-#[cfg(not(target_os = "hermit"))]
 use libc::{c_int, c_void, uintptr_t};
 
-#[cfg(target_os = "hermit")]
-pub type c_int = i32;
-
-#[cfg(target_os = "hermit")]
-pub type uintptr_t = usize;
-
-#[cfg(target_os = "hermit")]
-#[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,
-}
-
 #[repr(C)]
 #[derive(Debug, Copy, Clone, PartialEq)]
 pub enum _Unwind_Reason_Code {
@@ -263,3 +244,30 @@ pub unsafe fn _Unwind_RaiseException(exc: *mut _Unwind_Exception) -> _Unwind_Rea
     }
 }
 } // cfg_if!
+
+cfg_if::cfg_if! {
+if #[cfg(all(windows, target_arch = "x86_64", target_env = "gnu"))] {
+    // We declare these as opaque types. This is fine since you just need to
+    // pass them to _GCC_specific_handler and forget about them.
+    pub enum EXCEPTION_RECORD {}
+    pub type LPVOID = *mut c_void;
+    pub enum CONTEXT {}
+    pub enum DISPATCHER_CONTEXT {}
+    pub type EXCEPTION_DISPOSITION = c_int;
+    type PersonalityFn = unsafe extern "C" fn(version: c_int,
+                                              actions: _Unwind_Action,
+                                              exception_class: _Unwind_Exception_Class,
+                                              exception_object: *mut _Unwind_Exception,
+                                              context: *mut _Unwind_Context)
+                                              -> _Unwind_Reason_Code;
+
+    extern "C" {
+        pub fn _GCC_specific_handler(exceptionRecord: *mut EXCEPTION_RECORD,
+                                establisherFrame: LPVOID,
+                                contextRecord: *mut CONTEXT,
+                                dispatcherContext: *mut DISPATCHER_CONTEXT,
+                                personality: PersonalityFn)
+                                -> EXCEPTION_DISPOSITION;
+    }
+}
+} // cfg_if!