summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Driver/Tools.cpp39
-rw-r--r--clang/test/Driver/exceptions.m19
-rw-r--r--clang/test/Driver/exceptions.mm6
-rw-r--r--clang/test/Driver/rewrite-legacy-objc.m4
4 files changed, 22 insertions, 46 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp
index 151d87b50de..9924bb8896d 100644
--- a/clang/lib/Driver/Tools.cpp
+++ b/clang/lib/Driver/Tools.cpp
@@ -1894,23 +1894,6 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
}
}
-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 ArgList &Args, types::ID InputType,
// 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);
- EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
+ if (ObjCExceptionsEnabled) {
+ CmdArgs.push_back("-fobjc-exceptions");
+
+ EH = true;
+ }
}
if (types::isCXX(InputType)) {
diff --git a/clang/test/Driver/exceptions.m b/clang/test/Driver/exceptions.m
deleted file mode 100644
index 9b747bb84d1..00000000000
--- a/clang/test/Driver/exceptions.m
+++ /dev/null
@@ -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;
-}
diff --git a/clang/test/Driver/exceptions.mm b/clang/test/Driver/exceptions.mm
new file mode 100644
index 00000000000..1d918cf39bf
--- /dev/null
+++ b/clang/test/Driver/exceptions.mm
@@ -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"
diff --git a/clang/test/Driver/rewrite-legacy-objc.m b/clang/test/Driver/rewrite-legacy-objc.m
index b0b78d00817..ceb654f946d 100644
--- a/clang/test/Driver/rewrite-legacy-objc.m
+++ b/clang/test/Driver/rewrite-legacy-objc.m
@@ -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"
OpenPOWER on IntegriCloud