diff options
author | Dylan DPC <dylan.dpc@gmail.com> | 2020-08-30 01:43:54 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-30 01:43:54 +0200 |
commit | 96e0bc7b6baa6199ea53f95d54e200556edcedad (patch) | |
tree | 5188bf128dbba461f6ba8de637c5aca2ec470bbe /library/panic_abort | |
parent | 3b9ca2cb5208526275f79e41a87f7dde22cb1a8b (diff) | |
parent | d931e974029a3475bd6712ca8d3bc9cb9dfe558f (diff) |
Rollup merge of #75990 - rylev:arm-fastfail, r=alexcrichton
Add __fastfail for Windows on arm/aarch64
Fixes #73215
Diffstat (limited to 'library/panic_abort')
-rw-r--r-- | library/panic_abort/src/lib.rs | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/library/panic_abort/src/lib.rs b/library/panic_abort/src/lib.rs index 8ca25da54a6..3b08a64b22d 100644 --- a/library/panic_abort/src/lib.rs +++ b/library/panic_abort/src/lib.rs @@ -17,7 +17,7 @@ #![feature(panic_runtime)] #![feature(staged_api)] #![feature(rustc_attrs)] -#![feature(llvm_asm)] +#![feature(asm)] use core::any::Any; @@ -47,7 +47,7 @@ pub unsafe extern "C" fn __rust_start_panic(_payload: usize) -> u32 { } __rust_abort(); } - } else if #[cfg(all(windows, any(target_arch = "x86", target_arch = "x86_64")))] { + } else if #[cfg(windows)] { // On Windows, use the processor-specific __fastfail mechanism. In Windows 8 // and later, this will terminate the process immediately without running any // in-process exception handlers. In earlier versions of Windows, this @@ -59,7 +59,18 @@ pub unsafe extern "C" fn __rust_start_panic(_payload: usize) -> u32 { // // Note: this is the same implementation as in libstd's `abort_internal` unsafe fn abort() -> ! { - llvm_asm!("int $$0x29" :: "{ecx}"(7) ::: volatile); // 7 is FAST_FAIL_FATAL_APP_EXIT + const FAST_FAIL_FATAL_APP_EXIT: usize = 7; + cfg_if::cfg_if! { + if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] { + asm!("int $$0x29", in("ecx") FAST_FAIL_FATAL_APP_EXIT); + } else if #[cfg(all(target_arch = "arm", target_feature = "thumb-mode"))] { + asm!(".inst 0xDEFB", in("r0") FAST_FAIL_FATAL_APP_EXIT); + } else if #[cfg(target_arch = "aarch64")] { + asm!("brk 0xF003", in("x0") FAST_FAIL_FATAL_APP_EXIT); + } else { + core::intrinsics::abort(); + } + } core::intrinsics::unreachable(); } } else { |