Author: Phoebe Wang Date: 2023-04-12T14:44:11+08:00 New Revision: a3f688422c44519b578f9ae728b955aabe6b494e
URL: https://github.com/llvm/llvm-project/commit/a3f688422c44519b578f9ae728b955aabe6b494e DIFF: https://github.com/llvm/llvm-project/commit/a3f688422c44519b578f9ae728b955aabe6b494e.diff LOG: [Windows SEH] Fix ehcleanup crash for Windows -EHa `Builder.GetInsertBlock()` may return null sometimes. https://godbolt.org/z/n1Ph47jP1 Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D147867 Added: Modified: clang/lib/CodeGen/CGCleanup.cpp clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp index 175d91488efd0..0bbab283603d9 100644 --- a/clang/lib/CodeGen/CGCleanup.cpp +++ b/clang/lib/CodeGen/CGCleanup.cpp @@ -782,7 +782,7 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) { if (!RequiresNormalCleanup) { // Mark CPP scope end for passed-by-value Arg temp // per Windows ABI which is "normally" Cleanup in callee - if (IsEHa && getInvokeDest()) { + if (IsEHa && getInvokeDest() && Builder.GetInsertBlock()) { if (Personality.isMSVCXXPersonality()) EmitSehCppScopeEnd(); } @@ -1031,6 +1031,8 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) { if (!Personality.isMSVCPersonality()) { EHStack.pushTerminate(); PushedTerminate = true; + } else if (IsEHa && getInvokeDest()) { + EmitSehCppScopeEnd(); } // We only actually emit the cleanup code if the cleanup is either diff --git a/clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp b/clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp index a65ab39bea3e4..822c629bc207f 100644 --- a/clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp +++ b/clang/test/CodeGen/windows-seh-EHa-CppCatchReturn.cpp @@ -12,3 +12,20 @@ void foo() { return; } } + +__declspec(noreturn) void bar(); +class baz { +public: + ~baz(); +}; + +// CHECK: define dso_local void @"?qux@@YAXXZ +// CHECK: invoke void @llvm.seh.scope.begin() +// CHECK-NOT: llvm.seh.try +// CHECK-NOT: llvm.seh.scope.end + +// We don't need to generate llvm.seh.scope.end for unreachable. +void qux() { + baz a; + bar(); +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits