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

David Majnemer david.majnemer at gmail.com
Fri Dec 5 11:55:53 PST 2014


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

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

http://llvm.org/klaus/clang/commit/d47ea693706f7b0ffa68e879b73a71609a337786/

"Be compatible with GCC behavior in that -fno-exceptions *does not* disable
Obj-C exceptions."
"This is not necessarily sensible, but follows GCC."


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

Sure, but that's not what -fno-exceptions does in GCC.

In C, it disables -fexceptions; this will ensure that calls to
__gcc_personality_v0 will not occur.  It also changes the behavior of
__attribute__((cleanup)).
In Objective C, it does nothing.
In C++, it disables -fexceptions; this will ensure that calls to
__gxx_personality_v0 will not occur. It makes it illegal to mention 'try'
and 'catch'.
In Objective C++, it does nothing.


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


More information about the cfe-commits mailing list