r223723 - Revert "Driver: Objective-C should respect -fno-exceptions"

David Majnemer david.majnemer at gmail.com
Mon Dec 8 16:12:30 PST 2014


Author: majnemer
Date: Mon Dec  8 18:12:30 2014
New Revision: 223723

URL: http://llvm.org/viewvc/llvm-project?rev=223723&view=rev
Log:
Revert "Driver: Objective-C should respect -fno-exceptions"

This reverts commit r223455.  It's been succesfully argued that
-fexceptions (at the driver level) is a misnomer and has little to do
with -fobjc-exceptions.

Added:
    cfe/trunk/test/Driver/exceptions.m
Removed:
    cfe/trunk/test/Driver/exceptions.mm
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=223723&r1=223722&r2=223723&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Tools.cpp (original)
+++ cfe/trunk/lib/Driver/Tools.cpp Mon Dec  8 18:12:30 2014
@@ -1894,6 +1894,23 @@ 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) {
@@ -1930,21 +1947,15 @@ static void addExceptionArgs(const ArgLi
   // Gather the exception settings from the command line arguments.
   bool EH = exceptionSettings(Args, Triple);
 
-  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");
+  // 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");
 
-      EH = true;
-    }
+    EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
   }
 
   if (types::isCXX(InputType)) {

Added: cfe/trunk/test/Driver/exceptions.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/exceptions.m?rev=223723&view=auto
==============================================================================
--- cfe/trunk/test/Driver/exceptions.m (added)
+++ cfe/trunk/test/Driver/exceptions.m Mon Dec  8 18:12:30 2014
@@ -0,0 +1,19 @@
+// 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;
+}

Removed: cfe/trunk/test/Driver/exceptions.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/exceptions.mm?rev=223722&view=auto
==============================================================================
--- cfe/trunk/test/Driver/exceptions.mm (original)
+++ cfe/trunk/test/Driver/exceptions.mm (removed)
@@ -1,6 +0,0 @@
-// 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=223723&r1=223722&r2=223723&view=diff
==============================================================================
--- cfe/trunk/test/Driver/rewrite-legacy-objc.m (original)
+++ cfe/trunk/test/Driver/rewrite-legacy-objc.m Mon Dec  8 18:12:30 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" "-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"
+// 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"





More information about the cfe-commits mailing list