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

Nico Weber thakis at chromium.org
Fri Dec 5 11:47:22 PST 2014


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

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

I'm somewhat sure that when these flags got added they were explicitly put
in a state where -fno-exceptions disables c++ exceptions but not objc
exceptions, for the reason I mentioned above. I don't remember anything
about gcc compatibility.

Most software doesn't use Objective-C, and when folks say -fno-exceptions
they mean "no c++ exceptions".


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


More information about the cfe-commits mailing list