Author: Jennifer Yu Date: 2023-08-10T21:54:32-07:00 New Revision: 33e3b2c46084bc47ef4067ed487b24b58934d044
URL: https://github.com/llvm/llvm-project/commit/33e3b2c46084bc47ef4067ed487b24b58934d044 DIFF: https://github.com/llvm/llvm-project/commit/33e3b2c46084bc47ef4067ed487b24b58934d044.diff LOG: Fix assertion when -fasy-exception is used. The assertion only happens with use of -fasy-exception without -fexcessions. The assertion appen during the call to generate SehScopeBegin(), where assert with: assert(CGF.Builder.GetInsertBlock() && InvokeDest); InvokeDest is null. Because exceptions are disabled, and SEH is not in use. The fix is before call EmitSehCppScopeBegin check getInvokeDest(), to avoid assert during the emit llvm.seh.scope.begin() Differential Revision: https://reviews.llvm.org/D157566 Added: clang/test/CodeGen/windows-seh-async-exceptions.cpp Modified: clang/lib/CodeGen/CGCleanup.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp index 0bbab283603d98..cd51024a2b32d9 100644 --- a/clang/lib/CodeGen/CGCleanup.cpp +++ b/clang/lib/CodeGen/CGCleanup.cpp @@ -207,8 +207,13 @@ void *EHScopeStack::pushCleanup(CleanupKind Kind, size_t Size) { Scope->setLifetimeMarker(); // With Windows -EHa, Invoke llvm.seh.scope.begin() for EHCleanup + // If exceptions are disabled/ignored and SEH is not in use, then there is no + // invoke destination. SEH "works" even if exceptions are off. In practice, + // this means that C++ destructors and other EH cleanups don't run, which is + // consistent with MSVC's behavior, except in the presence of -EHa. + // Check getInvokeDest() to generate llvm.seh.scope.begin() as needed. if (CGF->getLangOpts().EHAsynch && IsEHCleanup && !IsLifetimeMarker && - CGF->getTarget().getCXXABI().isMicrosoft()) + CGF->getTarget().getCXXABI().isMicrosoft() && CGF->getInvokeDest()) CGF->EmitSehCppScopeBegin(); return Scope->getCleanupBuffer(); diff --git a/clang/test/CodeGen/windows-seh-async-exceptions.cpp b/clang/test/CodeGen/windows-seh-async-exceptions.cpp new file mode 100644 index 00000000000000..8d78373151a00b --- /dev/null +++ b/clang/test/CodeGen/windows-seh-async-exceptions.cpp @@ -0,0 +1,22 @@ +// RUN: %clang_cc1 -triple x86_64-windows -fasync-exceptions -x c++ \ +// RUN: -emit-llvm %s -o -| FileCheck %s + +extern "C" int printf(const char*,...); +class PrintfArg +{ +public: + PrintfArg(); + PrintfArg(const char* s); + + // compiler crash fixed if this destructor removed + ~PrintfArg() {int x; printf("ddd\n"); } +}; + +void devif_Warning(const char* fmt, PrintfArg arg1 = PrintfArg()); +// CHECK-NOT: invoke void @llvm.seh.scope.begin() +// CHECK-NOT: invoke void @llvm.seh.scope.end() +unsigned myfunc(unsigned index) +{ + devif_Warning(""); + return 0; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits