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 /tests/codegen-llvm/wasm_exceptions.rs | |
| 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 'tests/codegen-llvm/wasm_exceptions.rs')
| -rw-r--r-- | tests/codegen-llvm/wasm_exceptions.rs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/tests/codegen-llvm/wasm_exceptions.rs b/tests/codegen-llvm/wasm_exceptions.rs index 07b8ae6e9d7..796b69b722b 100644 --- a/tests/codegen-llvm/wasm_exceptions.rs +++ b/tests/codegen-llvm/wasm_exceptions.rs @@ -2,7 +2,7 @@ //@ compile-flags: -C panic=unwind -Z emscripten-wasm-eh #![crate_type = "lib"] -#![feature(core_intrinsics)] +#![feature(core_intrinsics, wasm_exception_handling_intrinsics)] extern "C-unwind" { fn may_panic(); @@ -57,3 +57,17 @@ pub fn test_rtry() { // CHECK: {{.*}} = catchpad within {{.*}} [ptr null] // CHECK: catchret } + +// Make sure the intrinsic is not inferred as nounwind. This is a regression test for #132416. +// CHECK-LABEL: @test_intrinsic() {{.*}} @__gxx_wasm_personality_v0 +#[no_mangle] +pub fn test_intrinsic() { + let _log_on_drop = LogOnDrop; + unsafe { + core::arch::wasm32::throw::<0>(core::ptr::null_mut()); + } + + // CHECK-NOT: call + // CHECK: invoke void @llvm.wasm.throw(i32 noundef 0, ptr noundef null) + // CHECK: %cleanuppad = cleanuppad within none [] +} |
