From: David Majnemer Date: Fri, 5 Dec 2014 08:56:55 +0000 (+0000) Subject: Driver: Objective-C should respect -fno-exceptions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=64a12add36a2bd44cb5b571a5c7255797b703568;p=clang Driver: Objective-C should respect -fno-exceptions Clang attempted to replicate a GCC bug: -fobjc-exceptions forces -fexceptions to be enabled. However, this has unintended effects and other awkard side effects that Clang doesn't "correctly" ape (e.g. it's impossible to turn off C++ exceptions in ObjC++ mode). Instead, -f[no]objc-exceptions and -f[no]cxx-exceptions now have an identical relationship with -f[no]exceptions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223455 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 151d87b50d..9924bb8896 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1894,23 +1894,6 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, } } -static bool -shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime, - const llvm::Triple &Triple) { - // We use the zero-cost exception tables for Objective-C if the non-fragile - // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and - // later. - if (runtime.isNonFragile()) - return true; - - if (!Triple.isMacOSX()) - return false; - - return (!Triple.isMacOSXVersionLT(10,5) && - (Triple.getArch() == llvm::Triple::x86_64 || - Triple.getArch() == llvm::Triple::arm)); -} - // exceptionSettings() exists to share the logic between -cc1 and linker // invocations. static bool exceptionSettings(const ArgList &Args, const llvm::Triple &Triple) { @@ -1947,15 +1930,21 @@ static void addExceptionArgs(const ArgList &Args, types::ID InputType, // Gather the exception settings from the command line arguments. bool EH = exceptionSettings(Args, Triple); - // Obj-C exceptions are enabled by default, regardless of -fexceptions. This - // is not necessarily sensible, but follows GCC. - if (types::isObjC(InputType) && - Args.hasFlag(options::OPT_fobjc_exceptions, - options::OPT_fno_objc_exceptions, - true)) { - CmdArgs.push_back("-fobjc-exceptions"); + if (types::isObjC(InputType)) { + bool ObjCExceptionsEnabled = true; + if (Arg *A = Args.getLastArg(options::OPT_fobjc_exceptions, + options::OPT_fno_objc_exceptions, + options::OPT_fexceptions, + options::OPT_fno_exceptions)) + ObjCExceptionsEnabled = + A->getOption().matches(options::OPT_fobjc_exceptions) || + A->getOption().matches(options::OPT_fexceptions); - EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple); + if (ObjCExceptionsEnabled) { + CmdArgs.push_back("-fobjc-exceptions"); + + EH = true; + } } if (types::isCXX(InputType)) { diff --git a/test/Driver/exceptions.m b/test/Driver/exceptions.m deleted file mode 100644 index 9b747bb84d..0000000000 --- a/test/Driver/exceptions.m +++ /dev/null @@ -1,19 +0,0 @@ -// RUN: %clang -target x86_64-apple-darwin9 \ -// RUN: -fsyntax-only -fno-exceptions %s - -void f1() { - @throw @"A"; -} - -void f0() { - @try { - f1(); - } @catch (id x) { - ; - } -} - -int main() { - f0(); - return 0; -} diff --git a/test/Driver/exceptions.mm b/test/Driver/exceptions.mm new file mode 100644 index 0000000000..1d918cf39b --- /dev/null +++ b/test/Driver/exceptions.mm @@ -0,0 +1,6 @@ +// RUN: %clang -target x86_64-apple-darwin11 -fno-exceptions %s -o - -### 2>&1 | \ +// RUN: FileCheck %s + +CHECK-NOT: "-fobjc-exceptions" +CHECK-NOT: "-fcxx-exceptions" +CHECK-NOT: "-fexceptions" diff --git a/test/Driver/rewrite-legacy-objc.m b/test/Driver/rewrite-legacy-objc.m index b0b78d0081..ceb654f946 100644 --- a/test/Driver/rewrite-legacy-objc.m +++ b/test/Driver/rewrite-legacy-objc.m @@ -9,5 +9,5 @@ // RUN: FileCheck -check-prefix=TEST1 %s // RUN: %clang -no-canonical-prefixes -target i386-apple-macosx10.6.0 -rewrite-legacy-objc %s -o - -### 2>&1 | \ // RUN: FileCheck -check-prefix=TEST2 %s -// TEST1: "-fmessage-length" "0" "-stack-protector" "1" "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile" "-fobjc-subscripting-legacy-runtime" "-fencode-extended-block-signature" "-fno-objc-infer-related-result-type" "-fobjc-exceptions" "-fmax-type-align=16" "-fdiagnostics-show-option" -// TEST2: "-fmessage-length" "0" "-stack-protector" "1" "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile" "-fencode-extended-block-signature" "-fno-objc-infer-related-result-type" "-fobjc-exceptions" "-fmax-type-align=16" "-fdiagnostics-show-option" +// TEST1: "-fmessage-length" "0" "-stack-protector" "1" "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile" "-fobjc-subscripting-legacy-runtime" "-fencode-extended-block-signature" "-fno-objc-infer-related-result-type" "-fobjc-exceptions" "-fexceptions" "-fmax-type-align=16" "-fdiagnostics-show-option" +// TEST2: "-fmessage-length" "0" "-stack-protector" "1" "-mstackrealign" "-fblocks" "-fobjc-runtime=macosx-fragile" "-fencode-extended-block-signature" "-fno-objc-infer-related-result-type" "-fobjc-exceptions" "-fexceptions" "-fmax-type-align=16" "-fdiagnostics-show-option"