r228329 - Re-land r228258 and make clang-cl's /EHs- disable -fexceptions again

Timur Iskhodzhanov timurrrr at google.com
Fri Feb 6 11:10:34 PST 2015


Interesting.  Any idea why?  The -O0 flag is explicitly passed, isn't it?

пт, 6 февр. 2015, 21:50, Reid Kleckner <rnk at google.com>:

> It passes for me locally in debug but not release.
>
> On Thu, Feb 5, 2015 at 9:04 PM, Nico Weber <thakis at chromium.org> wrote:
>
>> WrappedWindowProc.CatchesExceptions started failing again on all 64-bit
>> chromium bots, with a regression range of r228301:228332. Probably this
>> change again?
>>
>> On Thu, Feb 5, 2015 at 10:56 AM, Reid Kleckner <reid at kleckner.net> wrote:
>>
>>> Author: rnk
>>> Date: Thu Feb  5 12:56:03 2015
>>> New Revision: 228329
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=228329&view=rev
>>> Log:
>>> Re-land r228258 and make clang-cl's /EHs- disable -fexceptions again
>>>
>>> After r228258, Clang started emitting C++ EH IR that LLVM wasn't ready
>>> to deal with, even when exceptions were disabled with /EHs-. This time,
>>> make /EHs- turn off -fexceptions while still emitting exceptional
>>> constructs in functions using __try.  Since Sema rejects C++ exception
>>> handling constructs before CodeGen, landingpads should only appear in
>>> such functions as the result of a __try.
>>>
>>> Added:
>>>     cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp
>>> Modified:
>>>     cfe/trunk/include/clang/AST/Decl.h
>>>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>>     cfe/trunk/lib/CodeGen/CGException.cpp
>>>     cfe/trunk/lib/Driver/Tools.cpp
>>>     cfe/trunk/lib/Sema/SemaStmt.cpp
>>>     cfe/trunk/test/CodeGen/exceptions-seh-finally.c
>>>     cfe/trunk/test/CodeGen/exceptions-seh-leave.c
>>>     cfe/trunk/test/CodeGen/exceptions-seh.c
>>>     cfe/trunk/test/Driver/cl-eh.cpp
>>>     cfe/trunk/test/SemaCXX/exceptions-seh.cpp
>>>
>>> Modified: cfe/trunk/include/clang/AST/Decl.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/AST/Decl.h (original)
>>> +++ cfe/trunk/include/clang/AST/Decl.h Thu Feb  5 12:56:03 2015
>>> @@ -1482,6 +1482,9 @@ private:
>>>    bool IsLateTemplateParsed : 1;
>>>    bool IsConstexpr : 1;
>>>
>>> +  /// \brief Indicates if the function uses __try.
>>> +  bool UsesSEHTry : 1;
>>> +
>>>    /// \brief Indicates if the function was a definition but its body was
>>>    /// skipped.
>>>    unsigned HasSkippedBody : 1;
>>> @@ -1570,8 +1573,8 @@ protected:
>>>        HasWrittenPrototype(true), IsDeleted(false), IsTrivial(false),
>>>        IsDefaulted(false), IsExplicitlyDefaulted(false),
>>>        HasImplicitReturnZero(false), IsLateTemplateParsed(false),
>>> -      IsConstexpr(isConstexprSpecified), HasSkippedBody(false),
>>> -      EndRangeLoc(NameInfo.getEndLoc()),
>>> +      IsConstexpr(isConstexprSpecified), UsesSEHTry(false),
>>> +      HasSkippedBody(false), EndRangeLoc(NameInfo.getEndLoc()),
>>>        TemplateOrSpecialization(),
>>>        DNLoc(NameInfo.getInfo()) {}
>>>
>>> @@ -1751,6 +1754,10 @@ public:
>>>    bool isConstexpr() const { return IsConstexpr; }
>>>    void setConstexpr(bool IC) { IsConstexpr = IC; }
>>>
>>> +  /// Whether this is a (C++11) constexpr function or constexpr
>>> constructor.
>>> +  bool usesSEHTry() const { return UsesSEHTry; }
>>> +  void setUsesSEHTry(bool UST) { UsesSEHTry = UST; }
>>> +
>>>    /// \brief Whether this function has been deleted.
>>>    ///
>>>    /// A function that is "deleted" (via the C++0x "= delete" syntax)
>>>
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Feb  5
>>> 12:56:03 2015
>>> @@ -5466,6 +5466,8 @@ def err_exceptions_disabled : Error<
>>>    "cannot use '%0' with exceptions disabled">;
>>>  def err_objc_exceptions_disabled : Error<
>>>    "cannot use '%0' with Objective-C exceptions disabled">;
>>> +def err_seh_try_outside_functions : Error<
>>> +  "cannot use SEH '__try' in blocks, captured regions, or Obj-C method
>>> decls">;
>>>  def err_mixing_cxx_try_seh_try : Error<
>>>    "cannot use C++ 'try' in the same function as SEH '__try'">;
>>>  def note_conflicting_try_here : Note<
>>>
>>> Modified: cfe/trunk/lib/CodeGen/CGException.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/CodeGen/CGException.cpp (original)
>>> +++ cfe/trunk/lib/CodeGen/CGException.cpp Thu Feb  5 12:56:03 2015
>>> @@ -128,7 +128,12 @@ namespace {
>>>      // This function must have prototype void(void*).
>>>      const char *CatchallRethrowFn;
>>>
>>> -    static const EHPersonality &get(CodeGenModule &CGM);
>>> +    static const EHPersonality &get(CodeGenModule &CGM,
>>> +                                    const FunctionDecl *FD);
>>> +    static const EHPersonality &get(CodeGenFunction &CGF) {
>>> +      return get(CGF.CGM,
>>> dyn_cast_or_null<FunctionDecl>(CGF.CurCodeDecl));
>>> +    }
>>> +
>>>      static const EHPersonality GNU_C;
>>>      static const EHPersonality GNU_C_SJLJ;
>>>      static const EHPersonality GNU_C_SEH;
>>> @@ -141,6 +146,7 @@ namespace {
>>>      static const EHPersonality GNU_CPlusPlus_SEH;
>>>      static const EHPersonality MSVC_except_handler;
>>>      static const EHPersonality MSVC_C_specific_handler;
>>> +    static const EHPersonality MSVC_CxxFrameHandler3;
>>>    };
>>>  }
>>>
>>> @@ -167,6 +173,8 @@ const EHPersonality
>>>  EHPersonality::MSVC_except_handler = { "_except_handler3", nullptr };
>>>  const EHPersonality
>>>  EHPersonality::MSVC_C_specific_handler = { "__C_specific_handler",
>>> nullptr };
>>> +const EHPersonality
>>> +EHPersonality::MSVC_CxxFrameHandler3 = { "__CxxFrameHandler3", nullptr
>>> };
>>>
>>>  /// On Win64, use libgcc's SEH personality function. We fall back to
>>> dwarf on
>>>  /// other platforms, unless the user asked for SjLj exceptions.
>>> @@ -239,35 +247,27 @@ static const EHPersonality &getObjCXXPer
>>>    llvm_unreachable("bad runtime kind");
>>>  }
>>>
>>> -static const EHPersonality &getCPersonalityMSVC(const llvm::Triple &T,
>>> -                                                const LangOptions &L) {
>>> -  if (L.SjLjExceptions)
>>> -    return EHPersonality::GNU_C_SJLJ;
>>> -
>>> +static const EHPersonality &getSEHPersonalityMSVC(const llvm::Triple
>>> &T) {
>>>    if (T.getArch() == llvm::Triple::x86)
>>>      return EHPersonality::MSVC_except_handler;
>>>    return EHPersonality::MSVC_C_specific_handler;
>>>  }
>>>
>>> -static const EHPersonality &getCXXPersonalityMSVC(const llvm::Triple &T,
>>> -                                                  const LangOptions &L)
>>> {
>>> -  if (L.SjLjExceptions)
>>> -    return EHPersonality::GNU_CPlusPlus_SJLJ;
>>> -  // FIXME: Implement C++ exceptions.
>>> -  return getCPersonalityMSVC(T, L);
>>> -}
>>> -
>>> -const EHPersonality &EHPersonality::get(CodeGenModule &CGM) {
>>> +const EHPersonality &EHPersonality::get(CodeGenModule &CGM,
>>> +                                        const FunctionDecl *FD) {
>>>    const llvm::Triple &T = CGM.getTarget().getTriple();
>>>    const LangOptions &L = CGM.getLangOpts();
>>> +
>>>    // Try to pick a personality function that is compatible with MSVC if
>>> we're
>>>    // not compiling Obj-C. Obj-C users better have an Obj-C runtime that
>>> supports
>>>    // the GCC-style personality function.
>>>    if (T.isWindowsMSVCEnvironment() && !L.ObjC1) {
>>> -    if (L.CPlusPlus)
>>> -      return getCXXPersonalityMSVC(T, L);
>>> +    if (L.SjLjExceptions)
>>> +      return EHPersonality::GNU_CPlusPlus_SJLJ;
>>> +    else if (FD && FD->usesSEHTry())
>>> +      return getSEHPersonalityMSVC(T);
>>>      else
>>> -      return getCPersonalityMSVC(T, L);
>>> +      return EHPersonality::MSVC_CxxFrameHandler3;
>>>    }
>>>
>>>    if (L.CPlusPlus && L.ObjC1)
>>> @@ -354,7 +354,7 @@ void CodeGenModule::SimplifyPersonality(
>>>    if (!LangOpts.ObjCRuntime.isNeXTFamily())
>>>      return;
>>>
>>> -  const EHPersonality &ObjCXX = EHPersonality::get(*this);
>>> +  const EHPersonality &ObjCXX = EHPersonality::get(*this,
>>> /*FD=*/nullptr);
>>>    const EHPersonality &CXX =
>>>        getCXXPersonality(getTarget().getTriple(), LangOpts);
>>>    if (&ObjCXX == &CXX)
>>> @@ -737,8 +737,16 @@ llvm::BasicBlock *CodeGenFunction::getIn
>>>    assert(EHStack.requiresLandingPad());
>>>    assert(!EHStack.empty());
>>>
>>> -  if (!CGM.getLangOpts().Exceptions)
>>> -    return nullptr;
>>> +  // If exceptions are disabled, there are usually no landingpads.
>>> However, when
>>> +  // SEH is enabled, functions using SEH still get landingpads.
>>> +  const LangOptions &LO = CGM.getLangOpts();
>>> +  if (!LO.Exceptions) {
>>> +    if (!LO.Borland && !LO.MicrosoftExt)
>>> +      return nullptr;
>>> +    const auto *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
>>> +    if (!FD || !FD->usesSEHTry())
>>> +      return nullptr;
>>> +  }
>>>
>>>    // Check the innermost scope for a cached landing pad.  If this is
>>>    // a non-EH cleanup, we'll check enclosing scopes in EmitLandingPad.
>>> @@ -778,7 +786,7 @@ llvm::BasicBlock *CodeGenFunction::EmitL
>>>    CGBuilderTy::InsertPoint savedIP = Builder.saveAndClearIP();
>>>    auto DL = ApplyDebugLocation::CreateDefaultArtificial(*this,
>>> CurEHLocation);
>>>
>>> -  const EHPersonality &personality = EHPersonality::get(CGM);
>>> +  const EHPersonality &personality = EHPersonality::get(*this);
>>>
>>>    // Create and configure the landing pad.
>>>    llvm::BasicBlock *lpad = createBasicBlock("lpad");
>>> @@ -1595,7 +1603,7 @@ llvm::BasicBlock *CodeGenFunction::getTe
>>>    Builder.SetInsertPoint(TerminateLandingPad);
>>>
>>>    // Tell the backend that this is a landing pad.
>>> -  const EHPersonality &Personality = EHPersonality::get(CGM);
>>> +  const EHPersonality &Personality = EHPersonality::get(*this);
>>>    llvm::LandingPadInst *LPadInst =
>>>      Builder.CreateLandingPad(llvm::StructType::get(Int8PtrTy, Int32Ty,
>>> nullptr),
>>>                               getOpaquePersonalityFn(CGM, Personality),
>>> 0);
>>> @@ -1654,7 +1662,7 @@ llvm::BasicBlock *CodeGenFunction::getEH
>>>    EHResumeBlock = createBasicBlock("eh.resume");
>>>    Builder.SetInsertPoint(EHResumeBlock);
>>>
>>> -  const EHPersonality &Personality = EHPersonality::get(CGM);
>>> +  const EHPersonality &Personality = EHPersonality::get(*this);
>>>
>>>    // This can always be a call because we necessarily didn't find
>>>    // anything on the EH stack which needs our help.
>>>
>>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>>> +++ cfe/trunk/lib/Driver/Tools.cpp Thu Feb  5 12:56:03 2015
>>> @@ -4877,10 +4877,10 @@ void Clang::AddClangCLArgs(const ArgList
>>>    const Driver &D = getToolChain().getDriver();
>>>    EHFlags EH = parseClangCLEHFlags(D, Args);
>>>    // FIXME: Do something with NoExceptC.
>>> -  if (EH.Synch || EH.Asynch)
>>> +  if (EH.Synch || EH.Asynch) {
>>>      CmdArgs.push_back("-fcxx-exceptions");
>>> -  // Always add -fexceptions to allow SEH __try.
>>> -  CmdArgs.push_back("-fexceptions");
>>> +    CmdArgs.push_back("-fexceptions");
>>> +  }
>>>
>>>    // /EP should expand to -E -P.
>>>    if (Args.hasArg(options::OPT__SLASH_EP)) {
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Thu Feb  5 12:56:03 2015
>>> @@ -3303,11 +3303,12 @@ StmtResult Sema::ActOnCXXTryBlock(Source
>>>    if (getCurScope() && getCurScope()->isOpenMPSimdDirectiveScope())
>>>      Diag(TryLoc, diag::err_omp_simd_region_cannot_use_stmt) << "try";
>>>
>>> +  sema::FunctionScopeInfo *FSI = getCurFunction();
>>> +
>>>    // C++ try is incompatible with SEH __try.
>>> -  if (!getLangOpts().Borland &&
>>> getCurFunction()->FirstSEHTryLoc.isValid()) {
>>> +  if (!getLangOpts().Borland && FSI->FirstSEHTryLoc.isValid()) {
>>>      Diag(TryLoc, diag::err_mixing_cxx_try_seh_try);
>>> -    Diag(getCurFunction()->FirstSEHTryLoc,
>>> diag::note_conflicting_try_here)
>>> -        << "'__try'";
>>> +    Diag(FSI->FirstSEHTryLoc, diag::note_conflicting_try_here) <<
>>> "'__try'";
>>>    }
>>>
>>>    const unsigned NumHandlers = Handlers.size();
>>> @@ -3352,7 +3353,7 @@ StmtResult Sema::ActOnCXXTryBlock(Source
>>>      }
>>>    }
>>>
>>> -  getCurFunction()->setHasCXXTry(TryLoc);
>>> +  FSI->setHasCXXTry(TryLoc);
>>>
>>>    // FIXME: We should detect handlers that cannot catch anything
>>> because an
>>>    // earlier handler catches a superclass. Need to find a method that
>>> is not
>>> @@ -3367,15 +3368,29 @@ StmtResult Sema::ActOnSEHTryBlock(bool I
>>>                                    Stmt *TryBlock, Stmt *Handler) {
>>>    assert(TryBlock && Handler);
>>>
>>> +  sema::FunctionScopeInfo *FSI = getCurFunction();
>>> +
>>>    // SEH __try is incompatible with C++ try. Borland appears to support
>>> this,
>>>    // however.
>>> -  if (!getLangOpts().Borland &&
>>> getCurFunction()->FirstCXXTryLoc.isValid()) {
>>> -    Diag(TryLoc, diag::err_mixing_cxx_try_seh_try);
>>> -    Diag(getCurFunction()->FirstCXXTryLoc,
>>> diag::note_conflicting_try_here)
>>> -        << "'try'";
>>> +  if (!getLangOpts().Borland) {
>>> +    if (FSI->FirstCXXTryLoc.isValid()) {
>>> +      Diag(TryLoc, diag::err_mixing_cxx_try_seh_try);
>>> +      Diag(FSI->FirstCXXTryLoc, diag::note_conflicting_try_here) <<
>>> "'try'";
>>> +    }
>>>    }
>>>
>>> -  getCurFunction()->setHasSEHTry(TryLoc);
>>> +  FSI->setHasSEHTry(TryLoc);
>>> +
>>> +  // Reject __try in Obj-C methods, blocks, and captured decls, since
>>> we don't
>>> +  // track if they use SEH.
>>> +  DeclContext *DC = CurContext;
>>> +  while (DC && !DC->isFunctionOrMethod())
>>> +    DC = DC->getParent();
>>> +  FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(DC);
>>> +  if (FD)
>>> +    FD->setUsesSEHTry(true);
>>> +  else
>>> +    Diag(TryLoc, diag::err_seh_try_outside_functions);
>>>
>>>    return SEHTryStmt::Create(Context, IsCXXTry, TryLoc, TryBlock,
>>> Handler);
>>>  }
>>>
>>> Modified: cfe/trunk/test/CodeGen/exceptions-seh-finally.c
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/exceptions-seh-finally.c?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/CodeGen/exceptions-seh-finally.c (original)
>>> +++ cfe/trunk/test/CodeGen/exceptions-seh-finally.c Thu Feb  5 12:56:03
>>> 2015
>>> @@ -1,4 +1,4 @@
>>> -// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fexceptions
>>> -fms-extensions -emit-llvm -o - | FileCheck %s
>>> +// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions
>>> -emit-llvm -o - | FileCheck %s
>>>
>>>  void abort(void) __attribute__((noreturn));
>>>  void might_crash(void);
>>>
>>> Modified: cfe/trunk/test/CodeGen/exceptions-seh-leave.c
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/exceptions-seh-leave.c?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/CodeGen/exceptions-seh-leave.c (original)
>>> +++ cfe/trunk/test/CodeGen/exceptions-seh-leave.c Thu Feb  5 12:56:03
>>> 2015
>>> @@ -1,4 +1,4 @@
>>> -// RUN: not %clang_cc1 -triple x86_64-pc-win32 -fexceptions
>>> -fms-extensions -emit-llvm -o - %s 2>&1 | FileCheck %s
>>> +// RUN: not %clang_cc1 -triple x86_64-pc-win32 -fms-extensions
>>> -emit-llvm -o - %s 2>&1 | FileCheck %s
>>>
>>>  // This is a codegen test because we only emit the diagnostic when we
>>> start
>>>  // generating code.
>>>
>>> Modified: cfe/trunk/test/CodeGen/exceptions-seh.c
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/exceptions-seh.c?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/CodeGen/exceptions-seh.c (original)
>>> +++ cfe/trunk/test/CodeGen/exceptions-seh.c Thu Feb  5 12:56:03 2015
>>> @@ -1,4 +1,4 @@
>>> -// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fexceptions
>>> -fms-extensions -emit-llvm -o - | FileCheck %s
>>> +// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions
>>> -emit-llvm -o - | FileCheck %s
>>>
>>>  // FIXME: Perform this outlining automatically CodeGen.
>>>  void try_body(int numerator, int denominator, int *myres) {
>>>
>>> Added: cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp?rev=228329&view=auto
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp (added)
>>> +++ cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp Thu Feb  5 12:56:03 2015
>>> @@ -0,0 +1,95 @@
>>> +// RUN: %clang_cc1 -std=c++11 -fblocks -fms-extensions %s
>>> -triple=x86_64-windows-msvc -emit-llvm \
>>> +// RUN:         -o - -mconstructor-aliases -fcxx-exceptions
>>> -fexceptions | \
>>> +// RUN:         FileCheck %s --check-prefix=CHECK --check-prefix=CXXEH
>>> +// RUN: %clang_cc1 -std=c++11 -fblocks -fms-extensions %s
>>> -triple=x86_64-windows-msvc -emit-llvm \
>>> +// RUN:         -o - -mconstructor-aliases | \
>>> +// RUN:         FileCheck %s --check-prefix=CHECK --check-prefix=NOCXX
>>> +
>>> +extern "C" void might_throw();
>>> +
>>> +struct HasCleanup {
>>> +  HasCleanup();
>>> +  ~HasCleanup();
>>> +  int padding;
>>> +};
>>> +
>>> +extern "C" void use_cxx() {
>>> +  HasCleanup x;
>>> +  might_throw();
>>> +}
>>> +
>>> +// Make sure we use __CxxFrameHandler3 for C++ EH.
>>> +
>>> +// CXXEH-LABEL: define void @use_cxx()
>>> +// CXXEH: call %struct.HasCleanup* @"\01??0HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>>> %{{.*}})
>>> +// CXXEH: invoke void @might_throw()
>>> +// CXXEH:       to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]]
>>> +//
>>> +// CXXEH: [[cont]]
>>> +// CXXEH: call void @"\01??1HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>>> %{{.*}})
>>> +// CXXEH: ret void
>>> +//
>>> +// CXXEH: [[lpad]]
>>> +// CXXEH: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>>> @__CxxFrameHandler3 to i8*)
>>> +// CXXEH-NEXT: cleanup
>>> +// CXXEH: call void @"\01??1HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>>> %{{.*}})
>>> +// CXXEH: br label %[[resume:[^ ]*]]
>>> +//
>>> +// CXXEH: [[resume]]
>>> +// CXXEH: resume
>>> +
>>> +// NOCXX-LABEL: define void @use_cxx()
>>> +// NOCXX-NOT: invoke
>>> +// NOCXX: call %struct.HasCleanup* @"\01??0HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>>> %{{.*}})
>>> +// NOCXX-NOT: invoke
>>> +// NOCXX: call void @might_throw()
>>> +// NOCXX-NOT: invoke
>>> +// NOCXX: call void @"\01??1HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>>> %{{.*}})
>>> +// NOCXX-NOT: invoke
>>> +// NOCXX: ret void
>>> +
>>> +extern "C" void use_seh() {
>>> +  __try {
>>> +    might_throw();
>>> +  } __except(1) {
>>> +  }
>>> +}
>>> +
>>> +// Make sure we use __C_specific_handler for SEH.
>>> +
>>> +// CHECK-LABEL: define void @use_seh()
>>> +// CHECK: invoke void @might_throw()
>>> +// CHECK:       to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]]
>>> +//
>>> +// CHECK: [[cont]]
>>> +// CHECK: br label %[[ret:[^ ]*]]
>>> +//
>>> +// CHECK: [[lpad]]
>>> +// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>>> @__C_specific_handler to i8*)
>>> +// CHECK-NEXT: catch i8*
>>> +//
>>> +// CHECK: br label %[[ret]]
>>> +//
>>> +// CHECK: [[ret]]
>>> +// CHECK: ret void
>>> +
>>> +void use_seh_in_lambda() {
>>> +  ([]() {
>>> +    __try {
>>> +      might_throw();
>>> +    } __except(1) {
>>> +    }
>>> +  })();
>>> +  HasCleanup x;
>>> +  might_throw();
>>> +}
>>> +
>>> +// CXXEH-LABEL: define void @"\01?use_seh_in_lambda@@YAXXZ"()
>>> +// CXXEH: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>>> @__CxxFrameHandler3 to i8*)
>>> +
>>> +// NOCXX-LABEL: define void @"\01?use_seh_in_lambda@@YAXXZ"()
>>> +// NOCXX-NOT: invoke
>>> +// NOCXX: ret void
>>> +
>>> +// CHECK-LABEL: define internal void
>>> @"\01??R<lambda_0>@?use_seh_in_lambda@@YAXXZ at QEBAXXZ"(%class.anon*
>>> %this)
>>> +// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>>> @__C_specific_handler to i8*)
>>>
>>> Modified: cfe/trunk/test/Driver/cl-eh.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-eh.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/Driver/cl-eh.cpp (original)
>>> +++ cfe/trunk/test/Driver/cl-eh.cpp Thu Feb  5 12:56:03 2015
>>> @@ -10,11 +10,11 @@
>>>
>>>  // RUN: %clang_cl /c /EHs-c- -### -- %s 2>&1 | FileCheck
>>> -check-prefix=EHs_c_ %s
>>>  // EHs_c_-NOT: "-fcxx-exceptions"
>>> -// EHs_c_: "-fexceptions"
>>> +// EHs_c_-NOT: "-fexceptions"
>>>
>>>  // RUN: %clang_cl /c /EHs- /EHc- -### -- %s 2>&1 | FileCheck
>>> -check-prefix=EHs_EHc_ %s
>>>  // EHs_EHc_-NOT: "-fcxx-exceptions"
>>> -// EHs_EHc_: "-fexceptions"
>>> +// EHs_EHc_-NOT: "-fexceptions"
>>>
>>>  // RUN: %clang_cl /c /EHs- /EHs -### -- %s 2>&1 | FileCheck
>>> -check-prefix=EHs_EHs %s
>>>  // EHs_EHs: "-fcxx-exceptions"
>>>
>>> Modified: cfe/trunk/test/SemaCXX/exceptions-seh.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/exceptions-seh.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/SemaCXX/exceptions-seh.cpp (original)
>>> +++ cfe/trunk/test/SemaCXX/exceptions-seh.cpp Thu Feb  5 12:56:03 2015
>>> @@ -1,4 +1,5 @@
>>> -// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions
>>> -fsyntax-only -fexceptions -fcxx-exceptions -verify %s
>>> +// RUN: %clang_cc1 -std=c++03 -fblocks -triple x86_64-windows-msvc
>>> -fms-extensions -fsyntax-only -fexceptions -fcxx-exceptions -verify %s
>>> +// RUN: %clang_cc1 -std=c++11 -fblocks -triple x86_64-windows-msvc
>>> -fms-extensions -fsyntax-only -fexceptions -fcxx-exceptions -verify %s
>>>
>>>  // Basic usage should work.
>>>  int safe_div(int n, int d) {
>>> @@ -37,6 +38,7 @@ void instantiate_bad_scope_tmpl() {
>>>    bad_builtin_scope_template<might_crash>();
>>>  }
>>>
>>> +#if __cplusplus < 201103L
>>>  // FIXME: Diagnose this case. For now we produce undef in codegen.
>>>  template <typename T, T FN()>
>>>  T func_template() {
>>> @@ -46,6 +48,7 @@ void inject_builtins() {
>>>    func_template<void *, __exception_info>();
>>>    func_template<unsigned long, __exception_code>();
>>>  }
>>> +#endif
>>>
>>>  void use_seh_after_cxx() {
>>>    try { // expected-note {{conflicting 'try' here}}
>>> @@ -68,3 +71,45 @@ void use_cxx_after_seh() {
>>>    } catch (int) {
>>>    }
>>>  }
>>> +
>>> +#if __cplusplus >= 201103L
>>> +void use_seh_in_lambda() {
>>> +  ([]() {
>>> +    __try {
>>> +      might_crash();
>>> +    } __except(1) {
>>> +    }
>>> +  })();
>>> +  try {
>>> +    might_crash();
>>> +  } catch (int) {
>>> +  }
>>> +}
>>> +#endif
>>> +
>>> +void use_seh_in_block() {
>>> +  void (^b)() = ^{
>>> +    __try { // expected-error {{cannot use SEH '__try' in blocks,
>>> captured regions, or Obj-C method decls}}
>>> +      might_crash();
>>> +    } __except(1) {
>>> +    }
>>> +  };
>>> +  try {
>>> +    b();
>>> +  } catch (int) {
>>> +  }
>>> +}
>>> +
>>> +void (^use_seh_in_global_block)() = ^{
>>> +  __try { // expected-error {{cannot use SEH '__try' in blocks,
>>> captured regions, or Obj-C method decls}}
>>> +    might_crash();
>>> +  } __except(1) {
>>> +  }
>>> +};
>>> +
>>> +void (^use_cxx_in_global_block)() = ^{
>>> +  try {
>>> +    might_crash();
>>> +  } catch(int) {
>>> +  }
>>> +};
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150206/236ac471/attachment.html>


More information about the cfe-commits mailing list