[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
This commit is contained in:
Phoebe Wang
2023-04-12 14:25:18 +08:00
parent dc9833067d
commit a3f688422c
2 changed files with 20 additions and 1 deletions

View File

@@ -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

View File

@@ -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();
}