Index: cfe/trunk/docs/ClangCommandLineReference.rst =================================================================== --- cfe/trunk/docs/ClangCommandLineReference.rst +++ cfe/trunk/docs/ClangCommandLineReference.rst @@ -1706,10 +1706,18 @@ Enable C++14 sized global deallocation functions +.. option:: -fdwarf-exceptions + +Use DWARF style exceptions + .. option:: -fsjlj-exceptions Use SjLj style exceptions +.. option:: -fseh-exceptions + +Use SEH style exceptions + .. option:: -fslp-vectorize, -fno-slp-vectorize, -ftree-slp-vectorize Enable the superword-level parallelism vectorization passes Index: cfe/trunk/include/clang/Basic/LangOptions.def =================================================================== --- cfe/trunk/include/clang/Basic/LangOptions.def +++ cfe/trunk/include/clang/Basic/LangOptions.def @@ -124,7 +124,9 @@ LANGOPT(Exceptions , 1, 0, "exception handling") LANGOPT(ObjCExceptions , 1, 0, "Objective-C exceptions") LANGOPT(CXXExceptions , 1, 0, "C++ exceptions") +LANGOPT(DWARFExceptions , 1, 0, "dwarf exception handling") LANGOPT(SjLjExceptions , 1, 0, "setjmp-longjump exception handling") +LANGOPT(SEHExceptions , 1, 0, "SEH .xdata exception handling") LANGOPT(ExternCNoUnwind , 1, 0, "Assume extern C functions don't unwind") LANGOPT(TraditionalCPP , 1, 0, "traditional CPP emulation") LANGOPT(RTTI , 1, 1, "run-time type information") Index: cfe/trunk/include/clang/Driver/Options.td =================================================================== --- cfe/trunk/include/clang/Driver/Options.td +++ cfe/trunk/include/clang/Driver/Options.td @@ -800,8 +800,12 @@ def ferror_limit_EQ : Joined<["-"], "ferror-limit=">, Group, Flags<[CoreOption]>; def fexceptions : Flag<["-"], "fexceptions">, Group, Flags<[CC1Option]>, HelpText<"Enable support for exception handling">; +def fdwarf_exceptions : Flag<["-"], "fdwarf-exceptions">, Group, + Flags<[CC1Option]>, HelpText<"Use DWARF style exceptions">; def fsjlj_exceptions : Flag<["-"], "fsjlj-exceptions">, Group, Flags<[CC1Option]>, HelpText<"Use SjLj style exceptions">; +def fseh_exceptions : Flag<["-"], "fseh-exceptions">, Group, + Flags<[CC1Option]>, HelpText<"Use SEH style exceptions">; def fexcess_precision_EQ : Joined<["-"], "fexcess-precision=">, Group; def : Flag<["-"], "fexpensive-optimizations">, Group; Index: cfe/trunk/include/clang/Driver/ToolChain.h =================================================================== --- cfe/trunk/include/clang/Driver/ToolChain.h +++ cfe/trunk/include/clang/Driver/ToolChain.h @@ -397,10 +397,9 @@ return llvm::DebuggerKind::GDB; } - /// UseSjLjExceptions - Does this tool chain use SjLj exceptions. - virtual bool UseSjLjExceptions(const llvm::opt::ArgList &Args) const { - return false; - } + /// GetExceptionModel - Return the tool chain exception model. + virtual llvm::ExceptionHandling + GetExceptionModel(const llvm::opt::ArgList &Args) const; /// SupportsEmbeddedBitcode - Does this tool chain support embedded bitcode. virtual bool SupportsEmbeddedBitcode() const { Index: cfe/trunk/lib/Basic/Targets/ARM.cpp =================================================================== --- cfe/trunk/lib/Basic/Targets/ARM.cpp +++ cfe/trunk/lib/Basic/Targets/ARM.cpp @@ -1000,7 +1000,6 @@ MacroBuilder &Builder) const { WindowsARMTargetInfo::getTargetDefines(Opts, Builder); Builder.defineMacro("_ARM_"); - Builder.defineMacro("__ARM_DWARF_EH__"); } CygwinARMTargetInfo::CygwinARMTargetInfo(const llvm::Triple &Triple, Index: cfe/trunk/lib/Basic/Targets/OSTargets.h =================================================================== --- cfe/trunk/lib/Basic/Targets/OSTargets.h +++ cfe/trunk/lib/Basic/Targets/OSTargets.h @@ -358,17 +358,6 @@ Builder.defineMacro("__ELF__"); if (Opts.POSIXThreads) Builder.defineMacro("_REENTRANT"); - - switch (Triple.getArch()) { - default: - break; - case llvm::Triple::arm: - case llvm::Triple::armeb: - case llvm::Triple::thumb: - case llvm::Triple::thumbeb: - Builder.defineMacro("__ARM_DWARF_EH__"); - break; - } } public: Index: cfe/trunk/lib/Basic/Targets/OSTargets.cpp =================================================================== --- cfe/trunk/lib/Basic/Targets/OSTargets.cpp +++ cfe/trunk/lib/Basic/Targets/OSTargets.cpp @@ -133,10 +133,6 @@ if (Triple.isOSDarwin()) Builder.defineMacro("__MACH__"); - // The Watch ABI uses Dwarf EH. - if (Triple.isWatchABI()) - Builder.defineMacro("__ARM_DWARF_EH__"); - PlatformMinVersion = VersionTuple(Maj, Min, Rev); } } // namespace targets Index: cfe/trunk/lib/Basic/Targets/X86.h =================================================================== --- cfe/trunk/lib/Basic/Targets/X86.h +++ cfe/trunk/lib/Basic/Targets/X86.h @@ -710,15 +710,6 @@ LongDoubleFormat = &llvm::APFloat::x87DoubleExtended(); HasFloat128 = true; } - - void getTargetDefines(const LangOptions &Opts, - MacroBuilder &Builder) const override { - WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder); - - // GCC defines this macro when it is using __gxx_personality_seh0. - if (!Opts.SjLjExceptions) - Builder.defineMacro("__SEH__"); - } }; // x86-64 Cygwin target @@ -740,10 +731,6 @@ DefineStd(Builder, "unix", Opts); if (Opts.CPlusPlus) Builder.defineMacro("_GNU_SOURCE"); - - // GCC defines this macro when it is using __gxx_personality_seh0. - if (!Opts.SjLjExceptions) - Builder.defineMacro("__SEH__"); } }; Index: cfe/trunk/lib/CodeGen/BackendUtil.cpp =================================================================== --- cfe/trunk/lib/CodeGen/BackendUtil.cpp +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp @@ -424,6 +424,10 @@ if (LangOpts.SjLjExceptions) Options.ExceptionModel = llvm::ExceptionHandling::SjLj; + if (LangOpts.SEHExceptions) + Options.ExceptionModel = llvm::ExceptionHandling::WinEH; + if (LangOpts.DWARFExceptions) + Options.ExceptionModel = llvm::ExceptionHandling::DwarfCFI; Options.NoInfsFPMath = CodeGenOpts.NoInfsFPMath; Options.NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath; Index: cfe/trunk/lib/CodeGen/CGException.cpp =================================================================== --- cfe/trunk/lib/CodeGen/CGException.cpp +++ cfe/trunk/lib/CodeGen/CGException.cpp @@ -112,17 +112,11 @@ 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. -static bool useLibGCCSEHPersonality(const llvm::Triple &T) { - return T.isOSWindows() && T.getArch() == llvm::Triple::x86_64; -} - static const EHPersonality &getCPersonality(const llvm::Triple &T, const LangOptions &L) { if (L.SjLjExceptions) return EHPersonality::GNU_C_SJLJ; - else if (useLibGCCSEHPersonality(T)) + if (L.SEHExceptions) return EHPersonality::GNU_C_SEH; return EHPersonality::GNU_C; } @@ -144,7 +138,7 @@ case ObjCRuntime::ObjFW: if (L.SjLjExceptions) return EHPersonality::GNU_ObjC_SJLJ; - else if (useLibGCCSEHPersonality(T)) + if (L.SEHExceptions) return EHPersonality::GNU_ObjC_SEH; return EHPersonality::GNU_ObjC; } @@ -155,7 +149,7 @@ const LangOptions &L) { if (L.SjLjExceptions) return EHPersonality::GNU_CPlusPlus_SJLJ; - else if (useLibGCCSEHPersonality(T)) + if (L.SEHExceptions) return EHPersonality::GNU_CPlusPlus_SEH; return EHPersonality::GNU_CPlusPlus; } @@ -211,6 +205,10 @@ if (T.isWindowsMSVCEnvironment() && !L.ObjC1) { if (L.SjLjExceptions) return EHPersonality::GNU_CPlusPlus_SJLJ; + if (L.SEHExceptions) + return EHPersonality::GNU_CPlusPlus_SEH; + if (L.DWARFExceptions) + return EHPersonality::GNU_CPlusPlus; else return EHPersonality::MSVC_CxxFrameHandler3; } Index: cfe/trunk/lib/Driver/ToolChain.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChain.cpp +++ cfe/trunk/lib/Driver/ToolChain.cpp @@ -27,6 +27,8 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" +#include "llvm/MC/MCAsmInfo.h" +#include "llvm/MC/MCRegisterInfo.h" #include "llvm/Support/TargetParser.h" #include "llvm/Support/TargetRegistry.h" @@ -449,6 +451,13 @@ VersionTuple()); } +llvm::ExceptionHandling +ToolChain::GetExceptionModel(const llvm::opt::ArgList &Args) const { + if (Triple.isOSWindows()) + return llvm::ExceptionHandling::WinEH; + return llvm::ExceptionHandling::None; +} + bool ToolChain::isThreadModelSupported(const StringRef Model) const { if (Model == "single") { // FIXME: 'single' is only supported on ARM and WebAssembly so far. Index: cfe/trunk/lib/Driver/ToolChains/Clang.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp @@ -4166,9 +4166,33 @@ addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, Runtime, CmdArgs); - if (Args.hasArg(options::OPT_fsjlj_exceptions) || - getToolChain().UseSjLjExceptions(Args)) - CmdArgs.push_back("-fsjlj-exceptions"); + // Handle exception personalities + Arg *A = Args.getLastArg(options::OPT_fsjlj_exceptions, + options::OPT_fseh_exceptions, + options::OPT_fdwarf_exceptions); + if (A) { + const Option &Opt = A->getOption(); + if (Opt.matches(options::OPT_fsjlj_exceptions)) + CmdArgs.push_back("-fsjlj-exceptions"); + if (Opt.matches(options::OPT_fseh_exceptions)) + CmdArgs.push_back("-fseh-exceptions"); + if (Opt.matches(options::OPT_fdwarf_exceptions)) + CmdArgs.push_back("-fdwarf-exceptions"); + } else { + switch(getToolChain().GetExceptionModel(Args)) { + default: + break; + case llvm::ExceptionHandling::DwarfCFI: + CmdArgs.push_back("-fdwarf-exceptions"); + break; + case llvm::ExceptionHandling::SjLj: + CmdArgs.push_back("-fsjlj-exceptions"); + break; + case llvm::ExceptionHandling::WinEH: + CmdArgs.push_back("-fseh-exceptions"); + break; + } + } // C++ "sane" operator new. if (!Args.hasFlag(options::OPT_fassume_sane_operator_new, Index: cfe/trunk/lib/Driver/ToolChains/Darwin.h =================================================================== --- cfe/trunk/lib/Driver/ToolChains/Darwin.h +++ cfe/trunk/lib/Driver/ToolChains/Darwin.h @@ -247,8 +247,9 @@ bool UseDwarfDebugFlags() const override; - bool UseSjLjExceptions(const llvm::opt::ArgList &Args) const override { - return false; + llvm::ExceptionHandling + GetExceptionModel(const llvm::opt::ArgList &Args) const override { + return llvm::ExceptionHandling::None; } /// } @@ -455,7 +456,8 @@ void CheckObjCARC() const override; - bool UseSjLjExceptions(const llvm::opt::ArgList &Args) const override; + llvm::ExceptionHandling GetExceptionModel( + const llvm::opt::ArgList &Args) const override; bool SupportsEmbeddedBitcode() const override; Index: cfe/trunk/lib/Driver/ToolChains/Darwin.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChains/Darwin.cpp +++ cfe/trunk/lib/Driver/ToolChains/Darwin.cpp @@ -1881,7 +1881,7 @@ // Unwind tables are not emitted if -fno-exceptions is supplied (except when // targeting x86_64). return getArch() == llvm::Triple::x86_64 || - (!UseSjLjExceptions(Args) && + (GetExceptionModel(Args) != llvm::ExceptionHandling::SjLj && Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions, true)); } @@ -1892,15 +1892,18 @@ return false; } -bool Darwin::UseSjLjExceptions(const ArgList &Args) const { +llvm::ExceptionHandling Darwin::GetExceptionModel(const ArgList &Args) const { // Darwin uses SjLj exceptions on ARM. if (getTriple().getArch() != llvm::Triple::arm && getTriple().getArch() != llvm::Triple::thumb) - return false; + return llvm::ExceptionHandling::None; // Only watchOS uses the new DWARF/Compact unwinding method. llvm::Triple Triple(ComputeLLVMTriple(Args)); - return !Triple.isWatchABI(); + if(Triple.isWatchABI()) + return llvm::ExceptionHandling::DwarfCFI; + + return llvm::ExceptionHandling::SjLj; } bool Darwin::SupportsEmbeddedBitcode() const { Index: cfe/trunk/lib/Driver/ToolChains/FreeBSD.h =================================================================== --- cfe/trunk/lib/Driver/ToolChains/FreeBSD.h +++ cfe/trunk/lib/Driver/ToolChains/FreeBSD.h @@ -66,7 +66,8 @@ void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; - bool UseSjLjExceptions(const llvm::opt::ArgList &Args) const override; + llvm::ExceptionHandling GetExceptionModel( + const llvm::opt::ArgList &Args) const override; bool isPIEDefault() const override; SanitizerMask getSupportedSanitizers() const override; unsigned GetDefaultDwarfVersion() const override { return 2; } Index: cfe/trunk/lib/Driver/ToolChains/FreeBSD.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChains/FreeBSD.cpp +++ cfe/trunk/lib/Driver/ToolChains/FreeBSD.cpp @@ -359,17 +359,17 @@ Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); } -bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const { +llvm::ExceptionHandling FreeBSD::GetExceptionModel(const ArgList &Args) const { // FreeBSD uses SjLj exceptions on ARM oabi. switch (getTriple().getEnvironment()) { + default: + if (getTriple().getArch() == llvm::Triple::arm || + getTriple().getArch() == llvm::Triple::thumb) + return llvm::ExceptionHandling::SjLj; case llvm::Triple::GNUEABIHF: case llvm::Triple::GNUEABI: case llvm::Triple::EABI: - return false; - - default: - return (getTriple().getArch() == llvm::Triple::arm || - getTriple().getArch() == llvm::Triple::thumb); + return llvm::ExceptionHandling::None; } } Index: cfe/trunk/lib/Driver/ToolChains/MinGW.h =================================================================== --- cfe/trunk/lib/Driver/ToolChains/MinGW.h +++ cfe/trunk/lib/Driver/ToolChains/MinGW.h @@ -64,7 +64,9 @@ bool isPICDefault() const override; bool isPIEDefault() const override; bool isPICDefaultForced() const override; - bool UseSEHExceptions() const; + + llvm::ExceptionHandling GetExceptionModel( + const llvm::opt::ArgList &Args) const override; void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, Index: cfe/trunk/lib/Driver/ToolChains/MinGW.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChains/MinGW.cpp +++ cfe/trunk/lib/Driver/ToolChains/MinGW.cpp @@ -367,8 +367,11 @@ return getArch() == llvm::Triple::x86_64; } -bool toolchains::MinGW::UseSEHExceptions() const { - return getArch() == llvm::Triple::x86_64; +llvm::ExceptionHandling +toolchains::MinGW::GetExceptionModel(const ArgList &Args) const { + if (getArch() == llvm::Triple::x86_64) + return llvm::ExceptionHandling::WinEH; + return llvm::ExceptionHandling::DwarfCFI; } void toolchains::MinGW::AddCudaIncludeArgs(const ArgList &DriverArgs, Index: cfe/trunk/lib/Driver/ToolChains/NetBSD.h =================================================================== --- cfe/trunk/lib/Driver/ToolChains/NetBSD.h +++ cfe/trunk/lib/Driver/ToolChains/NetBSD.h @@ -69,6 +69,9 @@ return true; } + llvm::ExceptionHandling GetExceptionModel( + const llvm::opt::ArgList &Args) const override; + SanitizerMask getSupportedSanitizers() const override; protected: Index: cfe/trunk/lib/Driver/ToolChains/NetBSD.cpp =================================================================== --- cfe/trunk/lib/Driver/ToolChains/NetBSD.cpp +++ cfe/trunk/lib/Driver/ToolChains/NetBSD.cpp @@ -416,6 +416,14 @@ "", DriverArgs, CC1Args); } +llvm::ExceptionHandling NetBSD::GetExceptionModel(const ArgList &Args) const { + // NetBSD uses Dwarf exceptions on ARM. + if (getTriple().getArch() == llvm::Triple::arm || + getTriple().getArch() == llvm::Triple::thumb) + return llvm::ExceptionHandling::DwarfCFI; + return llvm::ExceptionHandling::None; +} + SanitizerMask NetBSD::getSupportedSanitizers() const { const bool IsX86 = getTriple().getArch() == llvm::Triple::x86; const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64; Index: cfe/trunk/lib/Frontend/CompilerInvocation.cpp =================================================================== --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp @@ -2141,7 +2141,18 @@ Opts.Exceptions = Args.hasArg(OPT_fexceptions); Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions); Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions); - Opts.SjLjExceptions = Args.hasArg(OPT_fsjlj_exceptions); + + // Handle exception personalities + Arg *A = Args.getLastArg(options::OPT_fsjlj_exceptions, + options::OPT_fseh_exceptions, + options::OPT_fdwarf_exceptions); + if (A) { + const Option &Opt = A->getOption(); + Opts.SjLjExceptions = Opt.matches(options::OPT_fsjlj_exceptions); + Opts.SEHExceptions = Opt.matches(options::OPT_fseh_exceptions); + Opts.DWARFExceptions = Opt.matches(options::OPT_fdwarf_exceptions); + } + Opts.ExternCNoUnwind = Args.hasArg(OPT_fexternc_nounwind); Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp); Index: cfe/trunk/lib/Frontend/InitPreprocessor.cpp =================================================================== --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp @@ -677,8 +677,14 @@ Builder.defineMacro("__EXCEPTIONS"); if (!LangOpts.MSVCCompat && LangOpts.RTTI) Builder.defineMacro("__GXX_RTTI"); + if (LangOpts.SjLjExceptions) Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__"); + else if (LangOpts.SEHExceptions) + Builder.defineMacro("__SEH__"); + else if (LangOpts.DWARFExceptions && + (TI.getTriple().isThumb() || TI.getTriple().isARM())) + Builder.defineMacro("__ARM_DWARF_EH__"); if (LangOpts.Deprecated) Builder.defineMacro("__DEPRECATED"); Index: cfe/trunk/test/CodeGenCXX/mingw-w64-exceptions.c =================================================================== --- cfe/trunk/test/CodeGenCXX/mingw-w64-exceptions.c +++ cfe/trunk/test/CodeGenCXX/mingw-w64-exceptions.c @@ -0,0 +1,22 @@ +// RUN: %clang -target x86_64-windows-gnu -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-SEH +// RUN: %clang -target i686-windows-gnu -c %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DWARF + +// RUN: %clang -target x86_64-windows-gnu -fsjlj-exceptions -c %s -### 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK-SJLJ + +// RUN: %clang -target x86_64-windows-gnu -fdwarf-exceptions -c %s -### 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK-DWARF + +// RUN: %clang -target x86_64-windows-gnu -fsjlj-exceptions -fseh-exceptions -c %s -### 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK-SEH + +// RUN: %clang -target x86_64-windows-gnu -fseh-exceptions -fsjlj-exceptions -c %s -### 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK-SJLJ + +// RUN: %clang -target x86_64-windows-gnu -fseh-exceptions -fdwarf-exceptions -c %s -### 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK-DWARF + +// CHECK-SEH: "-fseh-exceptions" +// CHECK-SJLJ: "-fsjlj-exceptions" +// CHECK-DWARF-NOT: "-fsjlj-exceptions" +// CHECK-DWARF-NOT: "-fseh-exceptions" Index: cfe/trunk/test/CodeGenCXX/mingw-w64-seh-exceptions.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/mingw-w64-seh-exceptions.cpp +++ cfe/trunk/test/CodeGenCXX/mingw-w64-seh-exceptions.cpp @@ -1,4 +1,5 @@ -// RUN: %clang_cc1 %s -fexceptions -emit-llvm -triple x86_64-w64-windows-gnu -o - | FileCheck %s --check-prefix=X64 +// RUN: %clang_cc1 %s -fexceptions -fseh-exceptions -emit-llvm -triple x86_64-w64-windows-gnu -o - | FileCheck %s --check-prefix=X64 +// RUN: %clang_cc1 %s -fexceptions -fdwarf-exceptions -emit-llvm -triple i686-w64-windows-gnu -o - | FileCheck %s --check-prefix=X86 // RUN: %clang_cc1 %s -fexceptions -emit-llvm -triple i686-w64-windows-gnu -o - | FileCheck %s --check-prefix=X86 extern "C" void foo(); Index: cfe/trunk/test/Preprocessor/arm-target-features.c =================================================================== --- cfe/trunk/test/Preprocessor/arm-target-features.c +++ cfe/trunk/test/Preprocessor/arm-target-features.c @@ -214,6 +214,7 @@ // A5:#define __ARM_ARCH_7A__ 1 // A5-NOT:#define __ARM_ARCH_EXT_IDIV__ // A5:#define __ARM_ARCH_PROFILE 'A' +// A5-NOT:#define __ARM_DWARF_EH__ 1 // A5-NOT: #define __ARM_FEATURE_DIRECTED_ROUNDING // A5:#define __ARM_FEATURE_DSP 1 // A5-NOT: #define __ARM_FEATURE_NUMERIC_MAXMIN @@ -225,6 +226,7 @@ // A7:#define __ARM_ARCH 7 // A7:#define __ARM_ARCH_EXT_IDIV__ 1 // A7:#define __ARM_ARCH_PROFILE 'A' +// A7-NOT:#define __ARM_DWARF_EH__ 1 // A7:#define __ARM_FEATURE_DSP 1 // A7:#define __ARM_FP 0xE Index: cfe/trunk/test/Preprocessor/init.c =================================================================== --- cfe/trunk/test/Preprocessor/init.c +++ cfe/trunk/test/Preprocessor/init.c @@ -1442,6 +1442,7 @@ // // ARM-MSVC: #define _M_ARM_NT 1 // ARM-MSVC: #define _WIN32 1 +// ARM-MSVC-NOT:#define __ARM_DWARF_EH__ 1 // RUN: %clang_cc1 -E -dM -ffreestanding -triple=aarch64-windows-msvc < /dev/null | FileCheck -match-full-lines -check-prefix AARCH64-MSVC %s //