I have not seen any MinGW distribution using DWARF exceptions on x64. They all use SEH or SJLJ. SEH should be the default unless -fsjlj-exceptions.
Yaron 2014-09-18 4:08 GMT+03:00 Reid Kleckner <[email protected]>: > On further reflection, I think the nomenclature here is wrong. We need to > try harder to disambiguate two concepts of SEH: the __try / __except > constructs, and the Windows unwind and exception info format on x64, arm, > and probably ppc. In LLVM MC, we currently use the terminology WinCFI and > WinEH to refer to essentially the stuff in .pdata and .xdata respectively. > > -fseh-exceptions and LangOpts.SEHExceptions are poorly named because the > reader might assume that they enable an implementation of __try / __except, > which is incorrect. Can you help me come up with a less confusing name? My > strawmen are: > -fpdata-exceptions / PDataExceptions > -fxdata-exceptions / XDataExceptions > -fwin-eh-exceptions / WinEHExceptions > -fwin-cfi-exceptions / WinCFIExceptions > > These names are meant to stand as alternative to -fsjlj-exceptions and > dwarf cfi, the default. > > Alternatively, is this option even useful? Would you be OK with completely > removing this option in favor of only supporting .pdata exceptions and sjlj > exceptions on mingw64 x64? I noticed that the mingwbuilds installer doesn't > even present dwarf exceptions as an option anymore (did it ever?). > On Mon, Sep 15, 2014 at 11:36 AM, Yaron Keren <[email protected]> wrote: > Great! thanks to everyone. > > 2014-09-15 20:19 GMT+03:00 Reid Kleckner <[email protected]>: > >> Author: rnk >> Date: Mon Sep 15 12:19:16 2014 >> New Revision: 217790 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=217790&view=rev >> Log: >> Add -fseh-exceptions for MinGW-w64 >> >> This adds a flag called -fseh-exceptions that uses the native Windows >> .pdata and .xdata unwind mechanism to throw exceptions. The other EH >> possibilities are DWARF and SJLJ exceptions. >> >> Patch by Martell Malone! >> >> Reviewed By: asl, rnk >> >> Differential Revision: http://reviews.llvm.org/D3419 >> >> Added: >> cfe/trunk/test/CodeGenCXX/mingw-w64-seh-exceptions.cpp >> Modified: >> cfe/trunk/include/clang/Basic/LangOptions.def >> cfe/trunk/include/clang/Driver/CC1Options.td >> cfe/trunk/include/clang/Driver/ToolChain.h >> cfe/trunk/lib/CodeGen/CGException.cpp >> cfe/trunk/lib/Driver/Tools.cpp >> cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> cfe/trunk/lib/Frontend/InitPreprocessor.cpp >> >> Modified: cfe/trunk/include/clang/Basic/LangOptions.def >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=217790&r1=217789&r2=217790&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/LangOptions.def (original) >> +++ cfe/trunk/include/clang/Basic/LangOptions.def Mon Sep 15 12:19:16 2014 >> @@ -82,6 +82,7 @@ LANGOPT(Exceptions , 1, 0, "excep >> LANGOPT(ObjCExceptions , 1, 0, "Objective-C exceptions") >> LANGOPT(CXXExceptions , 1, 0, "C++ exceptions") >> LANGOPT(SjLjExceptions , 1, 0, "setjmp-longjump exception handling") >> +LANGOPT(SEHExceptions , 1, 0, "SEH exception handling") >> LANGOPT(TraditionalCPP , 1, 0, "traditional CPP emulation") >> LANGOPT(RTTI , 1, 1, "run-time type information") >> LANGOPT(RTTIData , 1, 1, "emit run-time type information data") >> >> Modified: cfe/trunk/include/clang/Driver/CC1Options.td >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=217790&r1=217789&r2=217790&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Driver/CC1Options.td (original) >> +++ cfe/trunk/include/clang/Driver/CC1Options.td Mon Sep 15 12:19:16 2014 >> @@ -435,6 +435,8 @@ def fblocks_runtime_optional : Flag<["-" >> HelpText<"Weakly link in the blocks runtime">; >> def fsjlj_exceptions : Flag<["-"], "fsjlj-exceptions">, >> HelpText<"Use SjLj style exceptions">; >> +def fseh_exceptions : Flag<["-"], "fseh-exceptions">, >> + HelpText<"Use SEH style exceptions">; >> def split_dwarf_file : Separate<["-"], "split-dwarf-file">, >> HelpText<"File name to use for split dwarf debug info output">; >> def fno_wchar : Flag<["-"], "fno-wchar">, >> >> Modified: cfe/trunk/include/clang/Driver/ToolChain.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ToolChain.h?rev=217790&r1=217789&r2=217790&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Driver/ToolChain.h (original) >> +++ cfe/trunk/include/clang/Driver/ToolChain.h Mon Sep 15 12:19:16 2014 >> @@ -248,6 +248,9 @@ public: >> /// UseSjLjExceptions - Does this tool chain use SjLj exceptions. >> virtual bool UseSjLjExceptions() const { return false; } >> >> + /// UseSEHExceptions - Does this tool chain use SEH exceptions. >> + virtual bool UseSEHExceptions() const { return false; } >> + >> /// ComputeLLVMTriple - Return the LLVM target triple to use, after >> taking >> /// command line arguments into account. >> virtual std::string >> >> Modified: cfe/trunk/lib/CodeGen/CGException.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=217790&r1=217789&r2=217790&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CGException.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CGException.cpp Mon Sep 15 12:19:16 2014 >> @@ -137,12 +137,14 @@ namespace { >> static const EHPersonality &get(const LangOptions &Lang); >> static const EHPersonality GNU_C; >> static const EHPersonality GNU_C_SJLJ; >> + static const EHPersonality GNU_C_SEH; >> static const EHPersonality GNU_ObjC; >> static const EHPersonality GNUstep_ObjC; >> static const EHPersonality GNU_ObjCXX; >> static const EHPersonality NeXT_ObjC; >> static const EHPersonality GNU_CPlusPlus; >> static const EHPersonality GNU_CPlusPlus_SJLJ; >> + static const EHPersonality GNU_CPlusPlus_SEH; >> }; >> } >> >> @@ -150,12 +152,16 @@ const EHPersonality EHPersonality::GNU_C >> const EHPersonality >> EHPersonality::GNU_C_SJLJ = { "__gcc_personality_sj0", nullptr }; >> const EHPersonality >> +EHPersonality::GNU_C_SEH = { "__gcc_personality_seh0", nullptr }; >> +const EHPersonality >> EHPersonality::NeXT_ObjC = { "__objc_personality_v0", nullptr }; >> const EHPersonality >> EHPersonality::GNU_CPlusPlus = { "__gxx_personality_v0", nullptr }; >> const EHPersonality >> EHPersonality::GNU_CPlusPlus_SJLJ = { "__gxx_personality_sj0", nullptr }; >> const EHPersonality >> +EHPersonality::GNU_CPlusPlus_SEH = { "__gxx_personality_seh0", nullptr }; >> +const EHPersonality >> EHPersonality::GNU_ObjC = {"__gnu_objc_personality_v0", >> "objc_exception_throw"}; >> const EHPersonality >> EHPersonality::GNU_ObjCXX = { "__gnustep_objcxx_personality_v0", nullptr >> }; >> @@ -165,6 +171,8 @@ EHPersonality::GNUstep_ObjC = { "__gnust >> static const EHPersonality &getCPersonality(const LangOptions &L) { >> if (L.SjLjExceptions) >> return EHPersonality::GNU_C_SJLJ; >> + if (L.SEHExceptions) >> + return EHPersonality::GNU_C_SEH; >> return EHPersonality::GNU_C; >> } >> >> @@ -189,6 +197,8 @@ static const EHPersonality &getObjCPerso >> static const EHPersonality &getCXXPersonality(const LangOptions &L) { >> if (L.SjLjExceptions) >> return EHPersonality::GNU_CPlusPlus_SJLJ; >> + else if (L.SEHExceptions) >> + return EHPersonality::GNU_CPlusPlus_SEH; >> else >> return EHPersonality::GNU_CPlusPlus; >> } >> >> Modified: cfe/trunk/lib/Driver/Tools.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=217790&r1=217789&r2=217790&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Driver/Tools.cpp (original) >> +++ cfe/trunk/lib/Driver/Tools.cpp Mon Sep 15 12:19:16 2014 >> @@ -4112,6 +4112,8 @@ void Clang::ConstructJob(Compilation &C, >> >> if (getToolChain().UseSjLjExceptions()) >> CmdArgs.push_back("-fsjlj-exceptions"); >> + else if (getToolChain().UseSEHExceptions()) >> + CmdArgs.push_back("-fseh-exceptions"); >> >> // C++ "sane" operator new. >> if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, >> >> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=217790&r1=217789&r2=217790&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) >> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Sep 15 12:19:16 2014 >> @@ -1431,6 +1431,7 @@ static void ParseLangArgs(LangOptions &O >> Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions); >> Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions); >> Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions); >> + Opts.SEHExceptions = Args.hasArg(OPT_fseh_exceptions); >> Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp); >> >> Opts.RTTI = !Args.hasArg(OPT_fno_rtti); >> >> Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=217790&r1=217789&r2=217790&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original) >> +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Mon Sep 15 12:19:16 2014 >> @@ -556,6 +556,8 @@ static void InitializePredefinedMacros(c >> Builder.defineMacro("__GXX_RTTI"); >> if (LangOpts.SjLjExceptions) >> Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__"); >> + if (LangOpts.SEHExceptions) >> + Builder.defineMacro("__SEH__"); >> >> if (LangOpts.Deprecated) >> Builder.defineMacro("__DEPRECATED"); >> >> Added: cfe/trunk/test/CodeGenCXX/mingw-w64-seh-exceptions.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mingw-w64-seh-exceptions.cpp?rev=217790&view=auto >> >> ============================================================================== >> --- cfe/trunk/test/CodeGenCXX/mingw-w64-seh-exceptions.cpp (added) >> +++ cfe/trunk/test/CodeGenCXX/mingw-w64-seh-exceptions.cpp Mon Sep 15 >> 12:19:16 2014 >> @@ -0,0 +1,19 @@ >> +// RUN: %clang_cc1 %s -fexceptions -fseh-exceptions -emit-llvm -triple >> x86_64-w64-windows-gnu -o - | FileCheck %s >> + >> +extern "C" void foo(); >> +extern "C" void bar(); >> + >> +struct Cleanup { >> + ~Cleanup() { >> + bar(); >> + } >> +}; >> + >> +extern "C" void test() { >> + Cleanup x; >> + foo(); >> +} >> + >> +// CHECK: define void @test() >> +// CHECK: invoke void @foo() >> +// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* >> @__gxx_personality_seh0 to i8*) >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
