forked from OSchip/llvm-project
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). Instead, -f[no]objc-exceptions and -f[no]cxx-exceptions now have an identical relationship with -f[no]exceptions. llvm-svn: 223455
This commit is contained in:
parent
c96e95c157
commit
153c3948f1
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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"
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue