r223455 - Driver: Objective-C should respect -fno-exceptions

Nico Weber thakis at chromium.org
Fri Dec 5 11:25:36 PST 2014


On Fri, Dec 5, 2014 at 12:56 AM, David Majnemer <david.majnemer at gmail.com>
wrote:

> Author: majnemer
> Date: Fri Dec  5 02:56:55 2014
> New Revision: 223455
>
> URL: http://llvm.org/viewvc/llvm-project?rev=223455&view=rev
> Log:
> 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


What does "impossible to turn off exceptions" mean here?

$ clang -c test.mm -fno-exceptions
test.mm:2:3: error: cannot use 'try' with exceptions disabled
  try {} catch (...) {}
  ^
1 error generated.

).
>
> Instead, -f[no]objc-exceptions and -f[no]cxx-exceptions now have an
> identical relationship with -f[no]exceptions.
>

Did anyone from Apple review this? I thought the intention was that
-fno-exceptions disables c++ exceptions but keeps objc exceptions enabled,
since a) many people don't want c++ exceptions so they use -fno-exceptions
but b) cocoa uses exceptions so you can't really build without objc
exceptions.

(I'm guessing I'm misunderstanding the patch somehow.)


>
> Added:
>     cfe/trunk/test/Driver/exceptions.mm
> Removed:
>     cfe/trunk/test/Driver/exceptions.m
> Modified:
>     cfe/trunk/lib/Driver/Tools.cpp
>     cfe/trunk/test/Driver/rewrite-legacy-objc.m
>
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=223455&r1=223454&r2=223455&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Fri Dec  5 02:56:55 2014
> @@ -1894,23 +1894,6 @@ static void getTargetFeatures(const Driv
>    }
>  }
>
> -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 ArgLi
>    // 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);
> +
> +    if (ObjCExceptionsEnabled) {
> +      CmdArgs.push_back("-fobjc-exceptions");
>
> -    EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
> +      EH = true;
> +    }
>    }
>
>    if (types::isCXX(InputType)) {
>
> Removed: cfe/trunk/test/Driver/exceptions.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/exceptions.m?rev=223454&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Driver/exceptions.m (original)
> +++ cfe/trunk/test/Driver/exceptions.m (removed)
> @@ -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;
> -}
>
> Added: cfe/trunk/test/Driver/exceptions.mm
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/exceptions.mm?rev=223455&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/Driver/exceptions.mm (added)
> +++ cfe/trunk/test/Driver/exceptions.mm Fri Dec  5 02:56:55 2014
> @@ -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"
>
> Modified: cfe/trunk/test/Driver/rewrite-legacy-objc.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/rewrite-legacy-objc.m?rev=223455&r1=223454&r2=223455&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Driver/rewrite-legacy-objc.m (original)
> +++ cfe/trunk/test/Driver/rewrite-legacy-objc.m Fri Dec  5 02:56:55 2014
> @@ -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"
>
>
> _______________________________________________
> 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/20141205/dd5fba0f/attachment.html>


More information about the cfe-commits mailing list