diff options
| author | bors <bors@rust-lang.org> | 2025-07-27 23:05:48 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-07-27 23:05:48 +0000 |
| commit | 2b5e239c6b86cde974b0ef0f8e23754fb08ff3c5 (patch) | |
| tree | de89cecf7dc22a8aef5a0e27d1d173a1a5c3cee7 /library/stdarch | |
| parent | f8e355c230c6eb7b78ffce6a92fd81f78c890524 (diff) | |
| parent | 17519aeaef0b4b9c1a6bcb6d558aba4b26d044a8 (diff) | |
| download | rust-2b5e239c6b86cde974b0ef0f8e23754fb08ff3c5.tar.gz rust-2b5e239c6b86cde974b0ef0f8e23754fb08ff3c5.zip | |
Auto merge of #144225 - purplesyringa:unwinding-intrinsics, r=nikic
Don't special-case llvm.* as nounwind Certain LLVM intrinsics, such as `llvm.wasm.throw`, can unwind. Marking them as nounwind causes us to skip cleanup of locals and optimize out `catch_unwind` under inlining or when `llvm.wasm.throw` is used directly by user code. The motivation for forcibly marking llvm.* as nounwind is no longer present: most intrinsics are linked as `extern "C"` or other non-unwinding ABIs, so we won't codegen `invoke` for them anyway. Closes rust-lang/rust#132416. `@rustbot` label +T-compiler +A-panic
Diffstat (limited to 'library/stdarch')
| -rw-r--r-- | library/stdarch/crates/core_arch/src/wasm32/mod.rs | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/library/stdarch/crates/core_arch/src/wasm32/mod.rs b/library/stdarch/crates/core_arch/src/wasm32/mod.rs index 2c4361f1639..60049c73295 100644 --- a/library/stdarch/crates/core_arch/src/wasm32/mod.rs +++ b/library/stdarch/crates/core_arch/src/wasm32/mod.rs @@ -191,6 +191,16 @@ unsafe extern "C-unwind" { // #[cfg_attr(test, assert_instr(throw, TAG = 0, ptr = core::ptr::null_mut()))] #[inline] #[unstable(feature = "wasm_exception_handling_intrinsics", issue = "122465")] +// FIXME: Since this instruction unwinds, `core` built with `-C panic=unwind` +// cannot be linked with `-C panic=abort` programs. But that's not +// entirely supported anyway, because runtimes without EH support won't +// be able to handle `try` blocks in `-C panic=unwind` crates either. +// We ship `-C panic=abort` `core`, so this doesn't affect users +// directly. Resolving this will likely require patching out both `try` +// and `throw` instructions, at which point we can look into whitelisting +// this function in the compiler to allow linking. +// See https://github.com/rust-lang/rust/issues/118168. +#[allow(ffi_unwind_calls)] pub unsafe fn throw<const TAG: i32>(ptr: *mut u8) -> ! { static_assert!(TAG == 0); // LLVM only supports tag 0 == C++ right now. wasm_throw(TAG, ptr) |
