aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-02-01 21:07:43 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-02-01 21:07:43 +0000
commit609508ce95732e7e7010f79c5207613eced7c9cb (patch)
tree76b330c6fc97c41e306fd1db4a920c566aab5e78
parent2feefe8c195694d134b77503d67f535e04ca2a8b (diff)
Driver/Darwin: Darwin uses -fobjc-legacy-dispatch on ARM.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@95006 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Driver/ToolChain.h5
-rw-r--r--lib/Driver/ToolChains.h5
-rw-r--r--lib/Driver/Tools.cpp2
-rw-r--r--test/Driver/darwin-iphone-defaults.m12
4 files changed, 23 insertions, 1 deletions
diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h
index 501e833202..c4209ac3ba 100644
--- a/include/clang/Driver/ToolChain.h
+++ b/include/clang/Driver/ToolChain.h
@@ -94,6 +94,11 @@ public:
/// -fobjc-nonfragile-abi by default.
virtual bool IsObjCNonFragileABIDefault() const { return false; }
+ /// IsObjCLegacyDispatchDefault - Does this tool chain set
+ /// -fobjc-legacy-dispatch by default (this is only used with the non-fragile
+ /// ABI).
+ virtual bool IsObjCLegacyDispatchDefault() const { return false; }
+
/// GetDefaultStackProtectorLevel - Get the default stack protector level for
/// this tool chain (0=off, 1=on, 2=all).
virtual unsigned GetDefaultStackProtectorLevel() const { return 0; }
diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
index e683c2d484..fbb1136199 100644
--- a/lib/Driver/ToolChains.h
+++ b/lib/Driver/ToolChains.h
@@ -161,6 +161,11 @@ public:
// Non-fragile ABI default to on for iPhoneOS and x86-64.
return isTargetIPhoneOS() || getTriple().getArch() == llvm::Triple::x86_64;
}
+ virtual bool IsObjCLegacyDispatchDefault() const {
+ // This is only used with the non-fragile ABI.
+ return (getTriple().getArch() == llvm::Triple::arm ||
+ getTriple().getArch() == llvm::Triple::thumb);
+ }
virtual bool IsUnwindTablesDefault() const;
virtual unsigned GetDefaultStackProtectorLevel() const {
// Stack protectors default to on for 10.6 and beyond.
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index 88dffa98f9..b0278b8aec 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -1031,7 +1031,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
// defaults to off.
if (Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
options::OPT_fno_objc_legacy_dispatch,
- false))
+ getToolChain().IsObjCLegacyDispatchDefault()))
CmdArgs.push_back("-fobjc-legacy-dispatch");
}
}
diff --git a/test/Driver/darwin-iphone-defaults.m b/test/Driver/darwin-iphone-defaults.m
index 61bc44125a..97ac4a42a5 100644
--- a/test/Driver/darwin-iphone-defaults.m
+++ b/test/Driver/darwin-iphone-defaults.m
@@ -4,6 +4,9 @@
// CHECK-NOT: ssp
// CHECK: ) {
// CHECK: @__f0_block_invoke
+// CHECK: void @f1
+// CHECK-NOT: msgSend_fixup_alloc
+// CHECK: OBJC_SELECTOR_REFERENCES
int f0() {
return ^(){ return 0; }();
@@ -16,3 +19,12 @@ int f0() {
@implementation I0
@synthesize p0 = __sythesized_p0;
@end
+
+@interface I1
++(id) alloc;
+@end
+
+void f1() {
+ [I1 alloc];
+}
+