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

David Majnemer david.majnemer at gmail.com
Fri Dec 5 11:41:56 PST 2014


On Fri, Dec 5, 2014 at 11:25 AM, Nico Weber <thakis at chromium.org> wrote:

> 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.
>

You should try that with GCC, not clang :)


>
> ).
>>
>> 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.)
>

The original code was trying to mimic GCC's behavior where
-fobjc-exceptions _ignores_ -fno-exceptions.
In GCC, this means that ObjC++ code cannot _ever_ opt out of C++ exceptions
because they don't have a -fcxx-exceptions, they just have -fexceptions.
Clang has a different dichotomy of exception enabling/disabling flags and
it doesn't make sense to copy GCC's arbitrary behavior.

If you want Objective-C exceptions but not C++ exceptions,
-fobjc-exceptions -fno-cxx-exceptions should do the trick.


>
>>
>> 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
>>
>
>

On Fri, Dec 5, 2014 at 11:25 AM, Nico Weber <thakis at chromium.org> wrote:

> 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/eebaf778/attachment.html>


More information about the cfe-commits mailing list