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
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index bb838ed..303bfe7 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -462,6 +462,9 @@
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 @@
// 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 @@
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 5cf9fc1..4b53552 100644
--- a/include/clang/Basic/LangOptions.h
+++ b/include/clang/Basic/LangOptions.h
@@ -69,7 +69,7 @@
// 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 6f563a5..c1974be 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -86,40 +86,70 @@
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 @@
};
} // end anonymous namespace.
+
namespace {
class DarwinPPCTargetInfo : public PPC32TargetInfo {
public:
@@ -371,7 +402,7 @@
/// 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 @@
/// 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 @@
/// 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 @@
/// 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 8fb8252..0069af8 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 a9da325..9920f5f 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 82b63a0..c65815f 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 42e2859..d518fef 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 8afab4c..28f8d77 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 9b568f0..29f5a3a 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 871dbf7..66bf725 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 6cca269..d5d41ab 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 c4d0c2d..5509867 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 b88fb9b..e835c96 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 662bd73..0ae723d 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 c273a16..8b4b3ae 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 d1f56b6..4220183 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 2de5205..866fd37 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.