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 llvm-svn: 217790
This commit is contained in:
parent
49dd4283ed
commit
8f45c9cc62
|
@ -82,6 +82,7 @@ LANGOPT(Exceptions , 1, 0, "exception handling")
|
|||
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")
|
||||
|
|
|
@ -435,6 +435,8 @@ def fblocks_runtime_optional : Flag<["-"], "fblocks-runtime-optional">,
|
|||
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">,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = { "__gcc_personality_v0", nullptr };
|
|||
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 = { "__gnustep_objc_personality_v0", nullptr };
|
|||
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 &getObjCPersonality(const LangOptions &L) {
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -4112,6 +4112,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
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,
|
||||
|
|
|
@ -1431,6 +1431,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
|
|||
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);
|
||||
|
|
|
@ -556,6 +556,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
|
|||
Builder.defineMacro("__GXX_RTTI");
|
||||
if (LangOpts.SjLjExceptions)
|
||||
Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__");
|
||||
if (LangOpts.SEHExceptions)
|
||||
Builder.defineMacro("__SEH__");
|
||||
|
||||
if (LangOpts.Deprecated)
|
||||
Builder.defineMacro("__DEPRECATED");
|
||||
|
|
|
@ -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*)
|
Loading…
Reference in New Issue