On Fri, Dec 5, 2014 at 11:55 AM, David Majnemer <[email protected]> wrote:
> > > On Fri, Dec 5, 2014 at 11:47 AM, Nico Weber <[email protected]> wrote: > >> On Fri, Dec 5, 2014 at 11:41 AM, David Majnemer <[email protected] >> > wrote: >> >>> >>> >>> On Fri, Dec 5, 2014 at 11:25 AM, Nico Weber <[email protected]> wrote: >>> >>>> On Fri, Dec 5, 2014 at 12:56 AM, David Majnemer < >>>> [email protected]> 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. > What gcc does for Objective-C nowadays doesn't matter much, almost everyone building Objective-C code uses clang. The gcc behavior is nonsensical, clang's previous behavior wasn't. This commit changes behavior fairly severely, without much of a motivation from what I understand. I think clang's previous behavior makes a lot of sense: You have -fno-exceptions in all your build files, and you want that to disable c++ exceptions on linux. You want the same flag mean the same thing on OS X in .mm files. If you're writing regular mac apps, you can't realistically disable objc exceptions as some framework apis use them. Having said that, from what I can tell this commit doesn't help with what I think it was supposed to help with: $ ~/src/llvm-build/bin/clang -fno-exceptions -fobjc-exceptions -fno-cxx-exceptions -E -dM -x objective-c++ /dev/null | grep EXCEP #define OBJC_ZEROCOST_EXCEPTIONS 1 #define __EXCEPTIONS 1 > >> >> >>> >>> >>>> >>>>> >>>>> 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 >>>>> [email protected] >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>>>> >>>> >>>> >>> >>> On Fri, Dec 5, 2014 at 11:25 AM, Nico Weber <[email protected]> wrote: >>> >>>> On Fri, Dec 5, 2014 at 12:56 AM, David Majnemer < >>>> [email protected]> 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 >>>>> [email protected] >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >>>>> >>>> >>>> >>> >> >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
