mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 10:55:58 +08:00
[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:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user