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/3] [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/3] 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

>From 10c244b7a3dba062893cc50fcb3c6dfe255ddead Mon Sep 17 00:00:00 2001
From: GkvJwa <[email protected]>
Date: Tue, 16 Dec 2025 00:22:03 +0800
Subject: [PATCH 3/3] Add space

---
 clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp 
b/clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp
index 12869504c949e..7751abc2741ec 100644
--- a/clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp
+++ b/clang/test/CodeGen/windows-seh-EHa-CppExceptUnwind.cpp
@@ -19,4 +19,4 @@ void Foo(const int* p) {
 }
 
 // CHECK-NOT: Stack dump:
-// CHECK-NOT: Exception Code:
\ No newline at end of file
+// CHECK-NOT: Exception Code:

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to