https://github.com/GkvJwa updated https://github.com/llvm/llvm-project/pull/172287
>From 9e6e80497273ae24fb20100064d6fc45311c1e2d Mon Sep 17 00:00:00 2001 From: GkvJwa <[email protected]> Date: Mon, 15 Dec 2025 19:51:18 +0800 Subject: [PATCH 1/2] [WinEH] Fix crash, object unwinding in the except block --- llvm/lib/CodeGen/WinEHPrepare.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/llvm/lib/CodeGen/WinEHPrepare.cpp b/llvm/lib/CodeGen/WinEHPrepare.cpp index 372fc50eb546e..94a08fb3a5f57 100644 --- a/llvm/lib/CodeGen/WinEHPrepare.cpp +++ b/llvm/lib/CodeGen/WinEHPrepare.cpp @@ -274,7 +274,8 @@ void llvm::calculateCXXStateForAsynchEH(const BasicBlock *BB, int State, State = EHInfo.InvokeStateMap[cast<InvokeInst>(TI)]; else if (Fn && Fn->isIntrinsic() && (Fn->getIntrinsicID() == Intrinsic::seh_scope_end || - Fn->getIntrinsicID() == Intrinsic::seh_try_end)) { + Fn->getIntrinsicID() == Intrinsic::seh_try_end) && + State > 0) { // In case of conditional ctor, let's retrieve State from Invoke State = EHInfo.InvokeStateMap[cast<InvokeInst>(TI)]; // end of current state, retrive new state from UnwindMap @@ -327,7 +328,8 @@ void llvm::calculateSEHStateForAsynchEH(const BasicBlock *BB, int State, const Constant *FilterOrNull = cast<Constant>( cast<CatchPadInst>(It)->getArgOperand(0)->stripPointerCasts()); const Function *Filter = dyn_cast<Function>(FilterOrNull); - if (!Filter || !Filter->getName().starts_with("__IsLocalUnwind")) + if ((!Filter || !Filter->getName().starts_with("__IsLocalUnwind")) && + State > 0) State = EHInfo.SEHUnwindMap[State].ToState; // Retrive next State } else if ((isa<CleanupReturnInst>(TI) || isa<CatchReturnInst>(TI)) && State > 0) { @@ -341,7 +343,7 @@ void llvm::calculateSEHStateForAsynchEH(const BasicBlock *BB, int State, // Retrive the new State from seh_try_begin State = EHInfo.InvokeStateMap[cast<InvokeInst>(TI)]; else if (Fn && Fn->isIntrinsic() && - Fn->getIntrinsicID() == Intrinsic::seh_try_end) + Fn->getIntrinsicID() == Intrinsic::seh_try_end && State > 0) // end of current state, retrive new state from UnwindMap State = EHInfo.SEHUnwindMap[State].ToState; } >From c765173b18d52cb139f43ab768b078dc0c2709d7 Mon Sep 17 00:00:00 2001 From: GkvJwa <[email protected]> Date: Tue, 16 Dec 2025 00:16:26 +0800 Subject: [PATCH 2/2] Add test --- .../windows-seh-EHa-CppExceptUnwind.cpp | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp diff --git a/clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp b/clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp new file mode 100644 index 0000000000000..12869504c949e --- /dev/null +++ b/clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -triple x86_64-windows -fasync-exceptions -fcxx-exceptions -fexceptions -fms-extensions \ +// RUN: -x c++ -Wno-unused-but-set-variable -emit-obj %s -o - 2>&1 | FileCheck %s + + +class aa { + public: + static aa bb(); + + ~aa(); +}; + +void Foo(const int* p) { + int d = 0; + __try { + d = *p; + } __except (1) { + ::aa::bb(); + } +} + +// CHECK-NOT: Stack dump: +// CHECK-NOT: Exception Code: \ No newline at end of file _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
