diff --git a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp index 568335f7dcb51..effd29d79d7ad 100644 --- a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp @@ -347,7 +347,13 @@ extern "C" LLVMTargetMachineRef LLVMRustCreateTargetMachine( // option causes bugs in the LLVM WebAssembly backend. You should be able to // remove this check when Rust's minimum supported LLVM version is >= 18 // https://github.com/llvm/llvm-project/pull/65876 - if (!Trip.isWasm()) { + // + // Also keep traps after noreturn calls on Windows, because the trap is + // needed to keep the return address within the calling function's + // .pdata range. Without it, RtlLookupFunctionEntry resolves the wrong + // function and SEH unwinding (used for backtraces) terminates early. + // See https://github.com/rust-lang/rust/issues/140489 + if (!Trip.isWasm() && !Trip.isOSWindows()) { Options.NoTrapAfterNoreturn = true; } } diff --git a/tests/ui/runtime/backtrace-debuginfo.rs b/tests/ui/runtime/backtrace-debuginfo.rs index d3b4d057e6d0f..cc6132495f4ce 100644 --- a/tests/ui/runtime/backtrace-debuginfo.rs +++ b/tests/ui/runtime/backtrace-debuginfo.rs @@ -47,14 +47,9 @@ macro_rules! dump_and_die { // there, even on i686-pc-windows-msvc. We do the best we can in // rust-lang/rust to test it as well, but sometimes we just gotta keep // landing PRs. - // - // aarch64-msvc/arm64ec-msvc is broken as its backtraces are truncated. - // See https://github.com/rust-lang/rust/issues/140489 if cfg!(any(target_os = "android", all(target_os = "linux", target_arch = "arm"), all(target_env = "msvc", target_arch = "x86"), - all(target_env = "msvc", target_arch = "aarch64"), - all(target_env = "msvc", target_arch = "arm64ec"), target_os = "freebsd", target_os = "dragonfly", target_os = "openbsd")) {