aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-12-04 23:20:07 +0000
committerChris Lattner <sabre@nondot.org>2008-12-04 23:20:07 +0000
commitae0ee03fd9d36446ee70e502fdaf5ed5acec269f (patch)
treef65a9a7baea6040b42c4428d227c91415b0574df
parent06de37bade11b2d4187a1e4f74d0dcf2a72dda39 (diff)
instead of forcing blocks on by default, make them default to off, but let
specific targets default them to on. Default blocks to on on 10.6 and later. Add a -fblocks option that allows the user to override the target's default. Use -fblocks in the various testcases that use blocks. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60563 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Driver/clang.cpp9
-rw-r--r--include/clang/Basic/LangOptions.h2
-rw-r--r--lib/Basic/Targets.cpp85
-rw-r--r--test/Analysis/misc-ps.m2
-rw-r--r--test/Parser/block-pointer-decl.c2
-rw-r--r--test/Rewriter/block-test.c2
-rw-r--r--test/Sema/block-args.c2
-rw-r--r--test/Sema/block-as-object.m2
-rw-r--r--test/Sema/block-byref-args.c2
-rw-r--r--test/Sema/block-call.c2
-rw-r--r--test/Sema/block-literal.c2
-rw-r--r--test/Sema/block-misc.c2
-rw-r--r--test/Sema/block-return.c2
-rw-r--r--test/Sema/block-storageclass.c2
-rw-r--r--test/SemaCXX/blocks.cpp2
-rw-r--r--test/SemaObjC/block-ivar.m2
-rw-r--r--test/SemaObjC/property-10.m2
17 files changed, 80 insertions, 44 deletions
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index bb838ed846..303bfe757f 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -462,6 +462,9 @@ LaxVectorConversions("flax-vector-conversions",
llvm::cl::desc("Allow implicit conversions between vectors"
" with a different number of elements or "
"different element types"));
+static llvm::cl::opt<bool>
+EnableBlocks("fblocks", llvm::cl::desc("enable the 'blocks' language feature"));
+
// FIXME: This (and all GCC -f options) really come in -f... and
// -fno-... forms, and additionally support automagic behavior when
@@ -494,7 +497,6 @@ Ansi("ansi", llvm::cl::desc("Equivalent to specifying -std=c89."));
// FIXME: add:
// -fdollars-in-identifiers
-// -fpascal-strings
static void InitializeLanguageStandard(LangOptions &Options, LangKind LK,
TargetInfo *Target) {
// Allow the target to set the default the langauge options as it sees fit.
@@ -570,11 +572,14 @@ static void InitializeLanguageStandard(LangOptions &Options, LangKind LK,
Options.Trigraphs = LangStd < lang_gnu_START || Trigraphs ? 1 : 0;
Options.DollarIdents = 1; // FIXME: Really a target property.
- Options.PascalStrings = PascalStrings;
+ if (PascalStrings.getPosition())
+ Options.PascalStrings = PascalStrings;
Options.Microsoft = MSExtensions;
Options.WritableStrings = WritableStrings;
Options.LaxVectorConversions = LaxVectorConversions;
Options.Exceptions = Exceptions;
+ if (EnableBlocks.getPosition())
+ Options.Blocks = EnableBlocks;
// Override the default runtime if the user requested it.
if (NeXTRuntime)
diff --git a/include/clang/Basic/LangOptions.h b/include/clang/Basic/LangOptions.h
index 5cf9fc1b4b..4b5355282e 100644
--- a/include/clang/Basic/LangOptions.h
+++ b/include/clang/Basic/LangOptions.h
@@ -69,7 +69,7 @@ public:
// FIXME: The default should be 1.
ThreadsafeStatics = 0;
- Blocks = 1;
+ Blocks = 0;
}
GCMode getGCMode() const { return (GCMode) GC; }
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
index 6f563a55c3..c1974be376 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -86,40 +86,70 @@ static void getLinuxDefines(std::vector<char> &Defs) {
Define(Defs, "__gnu_linux__");
}
+/// getDarwinNumber - Parse the 'darwin number' out of the specific targe
+/// triple. For example, if we have darwin8.5 return 8,5,4. If any entry is
+/// not defined, return 0's. Return true if we have -darwin in the string or
+/// false otherwise.
+static bool getDarwinNumber(const char *Triple, unsigned &Maj, unsigned &Min) {
+ Maj = Min = 0;
+ const char *Darwin = strstr(Triple, "-darwin");
+ if (Darwin == 0) return false;
+
+ Darwin += strlen("-darwin");
+ if (Darwin[0] < '0' || Darwin[0] > '9')
+ return true;
+
+ Maj = Darwin[0]-'0';
+ ++Darwin;
+
+ // Handle "darwin11".
+ if (Maj == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
+ Maj = 10+Darwin[0]-'0';
+ ++Darwin;
+ }
+
+ // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
+ if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
+ Darwin[2] == '\0')
+ Min = Darwin[1]-'0';
+
+ return true;
+}
+
static void getDarwinDefines(std::vector<char> &Defs, const char *Triple) {
Define(Defs, "__APPLE__");
Define(Defs, "__MACH__");
// Figure out which "darwin number" the target triple is. "darwin9" -> 10.5.
- const char *Darwin = strstr(Triple, "-darwin");
- if (Darwin) {
+ unsigned Maj, Min;
+ if (getDarwinNumber(Triple, Maj, Min)) {
char DarwinStr[] = "1000";
- Darwin += strlen("-darwin");
- if (Darwin[0] >= '0' && Darwin[0] <= '9') {
- unsigned DarwinNo = Darwin[0]-'0';
- ++Darwin;
-
- // Handle "darwin11".
- if (DarwinNo == 1 && Darwin[0] >= '0' && Darwin[0] <= '9') {
- DarwinNo = 10+Darwin[0]-'0';
- ++Darwin;
- }
-
- if (DarwinNo >= 4 && DarwinNo <= 13) { // 10.0-10.9
- // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
- DarwinStr[2] = '0' + DarwinNo-4;
- }
-
- // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
- if (Darwin[0] == '.' && Darwin[1] >= '0' && Darwin[1] <= '9' &&
- Darwin[2] == '\0')
- DarwinStr[3] = Darwin[1];
-
+ if (Maj >= 4 && Maj <= 13) { // 10.0-10.9
+ // darwin7 -> 1030, darwin8 -> 1040, darwin9 -> 1050, etc.
+ DarwinStr[2] = '0' + Maj-4;
}
+
+ // Handle minor version: 10.4.9 -> darwin8.9 -> "1049"
+ DarwinStr[3] = Min+'0';
Define(Defs, "__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", DarwinStr);
}
}
+/// GetDarwinLanguageOptions - Set the default language options for darwin.
+static void GetDarwinLanguageOptions(LangOptions &Opts,
+ const char *Triple) {
+ Opts.NeXTRuntime = true;
+
+ unsigned Maj, Min;
+ if (!getDarwinNumber(Triple, Maj, Min))
+ return;
+
+ // Blocks default to on for 10.6 (darwin10) and beyond.
+ if (Maj > 9)
+ Opts.Blocks = 1;
+}
+
+
//===----------------------------------------------------------------------===//
// Defines specific to certain architectures.
//===----------------------------------------------------------------------===//
@@ -358,6 +388,7 @@ public:
};
} // end anonymous namespace.
+
namespace {
class DarwinPPCTargetInfo : public PPC32TargetInfo {
public:
@@ -371,7 +402,7 @@ public:
/// various language options. These may be overridden by command line
/// options.
virtual void getDefaultLangOptions(LangOptions &Opts) {
- Opts.NeXTRuntime = true;
+ GetDarwinLanguageOptions(Opts, getTargetTriple());
}
};
} // end anonymous namespace.
@@ -389,7 +420,7 @@ public:
/// various language options. These may be overridden by command line
/// options.
virtual void getDefaultLangOptions(LangOptions &Opts) {
- Opts.NeXTRuntime = true;
+ GetDarwinLanguageOptions(Opts, getTargetTriple());
}
};
} // end anonymous namespace.
@@ -541,7 +572,7 @@ public:
/// various language options. These may be overridden by command line
/// options.
virtual void getDefaultLangOptions(LangOptions &Opts) {
- Opts.NeXTRuntime = true;
+ GetDarwinLanguageOptions(Opts, getTargetTriple());
}
};
} // end anonymous namespace
@@ -690,7 +721,7 @@ public:
/// various language options. These may be overridden by command line
/// options.
virtual void getDefaultLangOptions(LangOptions &Opts) {
- Opts.NeXTRuntime = true;
+ GetDarwinLanguageOptions(Opts, getTargetTriple());
}
};
} // end anonymous namespace.
diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m
index 8fb825218d..0069af8943 100644
--- a/test/Analysis/misc-ps.m
+++ b/test/Analysis/misc-ps.m
@@ -1,4 +1,4 @@
-// RUN: clang -checker-cfref --verify %s
+// RUN: clang -checker-cfref --verify -fblocks %s
// Reduced test case from crash in <rdar://problem/6253157>
@class NSObject;
diff --git a/test/Parser/block-pointer-decl.c b/test/Parser/block-pointer-decl.c
index a9da3256a9..9920f5f68b 100644
--- a/test/Parser/block-pointer-decl.c
+++ b/test/Parser/block-pointer-decl.c
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify -parse-noop %s
+// RUN: clang -fsyntax-only -verify -parse-noop -fblocks %s
struct blockStruct {
int (^a)(float, int);
diff --git a/test/Rewriter/block-test.c b/test/Rewriter/block-test.c
index 82b63a09f9..c65815ff9a 100644
--- a/test/Rewriter/block-test.c
+++ b/test/Rewriter/block-test.c
@@ -1,4 +1,4 @@
-// RUN: clang -rewrite-blocks %s -o -
+// RUN: clang -rewrite-blocks %s -fblocks -o -
static int (^block)(const void *, const void *) = (int (^)(const void *, const void *))0;
static int (*func)(int (^block)(void *, void *)) = (int (*)(int (^block)(void *, void *)))0;
diff --git a/test/Sema/block-args.c b/test/Sema/block-args.c
index 42e2859c97..d518fef044 100644
--- a/test/Sema/block-args.c
+++ b/test/Sema/block-args.c
@@ -1,4 +1,4 @@
-// RUN: clang %s -fsyntax-only -verify
+// RUN: clang %s -fsyntax-only -verify -fblocks
void take(void*);
diff --git a/test/Sema/block-as-object.m b/test/Sema/block-as-object.m
index 8afab4c3f7..28f8d775d0 100644
--- a/test/Sema/block-as-object.m
+++ b/test/Sema/block-as-object.m
@@ -1,4 +1,4 @@
-// RUN: clang %s -fsyntax-only -verify
+// RUN: clang %s -fsyntax-only -verify -fblocks
@interface Whatever
- copy;
diff --git a/test/Sema/block-byref-args.c b/test/Sema/block-byref-args.c
index 9b568f0584..29f5a3aeeb 100644
--- a/test/Sema/block-byref-args.c
+++ b/test/Sema/block-byref-args.c
@@ -1,4 +1,4 @@
-// RUN: clang %s -fsyntax-only -verify
+// RUN: clang %s -fsyntax-only -verify -fblocks
#include <stdio.h>
diff --git a/test/Sema/block-call.c b/test/Sema/block-call.c
index 871dbf792b..66bf725922 100644
--- a/test/Sema/block-call.c
+++ b/test/Sema/block-call.c
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
int (*FP)();
int (^IFP) ();
diff --git a/test/Sema/block-literal.c b/test/Sema/block-literal.c
index 6cca26999d..d5d41abb6c 100644
--- a/test/Sema/block-literal.c
+++ b/test/Sema/block-literal.c
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only %s -verify
+// RUN: clang -fsyntax-only %s -verify -fblocks
void I( void (^)(void));
void (^noop)(void);
diff --git a/test/Sema/block-misc.c b/test/Sema/block-misc.c
index c4d0c2dbf8..5509867c30 100644
--- a/test/Sema/block-misc.c
+++ b/test/Sema/block-misc.c
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
void donotwarn();
int (^IFP) ();
diff --git a/test/Sema/block-return.c b/test/Sema/block-return.c
index b88fb9b5be..e835c96317 100644
--- a/test/Sema/block-return.c
+++ b/test/Sema/block-return.c
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only %s -verify
+// RUN: clang -fsyntax-only %s -verify -fblocks
typedef void (^CL)(void);
diff --git a/test/Sema/block-storageclass.c b/test/Sema/block-storageclass.c
index 662bd738c8..0ae723d44c 100644
--- a/test/Sema/block-storageclass.c
+++ b/test/Sema/block-storageclass.c
@@ -1,4 +1,4 @@
-// RUN: clang %s -fsyntax-only -verify
+// RUN: clang %s -fsyntax-only -verify -fblocks
#include <stdio.h>
void _Block_byref_release(void*src){}
diff --git a/test/SemaCXX/blocks.cpp b/test/SemaCXX/blocks.cpp
index c273a1626a..8b4b3aeb88 100644
--- a/test/SemaCXX/blocks.cpp
+++ b/test/SemaCXX/blocks.cpp
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
void tovoid(void*);
diff --git a/test/SemaObjC/block-ivar.m b/test/SemaObjC/block-ivar.m
index d1f56b651d..422018359a 100644
--- a/test/SemaObjC/block-ivar.m
+++ b/test/SemaObjC/block-ivar.m
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
@interface NSObject {
struct objc_object *isa;
diff --git a/test/SemaObjC/property-10.m b/test/SemaObjC/property-10.m
index 2de5205a1f..866fd37490 100644
--- a/test/SemaObjC/property-10.m
+++ b/test/SemaObjC/property-10.m
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
// Check property attribute consistency.