diff options
-rw-r--r-- | clang/Driver/clang.cpp | 9 | ||||
-rw-r--r-- | clang/include/clang/Basic/LangOptions.h | 2 | ||||
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 85 | ||||
-rw-r--r-- | clang/test/Analysis/misc-ps.m | 2 | ||||
-rw-r--r-- | clang/test/Parser/block-pointer-decl.c | 2 | ||||
-rw-r--r-- | clang/test/Rewriter/block-test.c | 2 | ||||
-rw-r--r-- | clang/test/Sema/block-args.c | 2 | ||||
-rw-r--r-- | clang/test/Sema/block-as-object.m | 2 | ||||
-rw-r--r-- | clang/test/Sema/block-byref-args.c | 2 | ||||
-rw-r--r-- | clang/test/Sema/block-call.c | 2 | ||||
-rw-r--r-- | clang/test/Sema/block-literal.c | 2 | ||||
-rw-r--r-- | clang/test/Sema/block-misc.c | 2 | ||||
-rw-r--r-- | clang/test/Sema/block-return.c | 2 | ||||
-rw-r--r-- | clang/test/Sema/block-storageclass.c | 2 | ||||
-rw-r--r-- | clang/test/SemaCXX/blocks.cpp | 2 | ||||
-rw-r--r-- | clang/test/SemaObjC/block-ivar.m | 2 | ||||
-rw-r--r-- | clang/test/SemaObjC/property-10.m | 2 |
17 files changed, 80 insertions, 44 deletions
diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp index bb838ed846f..303bfe757f5 100644 --- a/clang/Driver/clang.cpp +++ b/clang/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/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 5cf9fc1b4bf..4b5355282ea 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/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/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 6f563a55c3b..c1974be3762 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/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/clang/test/Analysis/misc-ps.m b/clang/test/Analysis/misc-ps.m index 8fb825218dd..0069af89433 100644 --- a/clang/test/Analysis/misc-ps.m +++ b/clang/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/clang/test/Parser/block-pointer-decl.c b/clang/test/Parser/block-pointer-decl.c index a9da3256a94..9920f5f68b3 100644 --- a/clang/test/Parser/block-pointer-decl.c +++ b/clang/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/clang/test/Rewriter/block-test.c b/clang/test/Rewriter/block-test.c index 82b63a09f9d..c65815ff9a5 100644 --- a/clang/test/Rewriter/block-test.c +++ b/clang/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/clang/test/Sema/block-args.c b/clang/test/Sema/block-args.c index 42e2859c975..d518fef0442 100644 --- a/clang/test/Sema/block-args.c +++ b/clang/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/clang/test/Sema/block-as-object.m b/clang/test/Sema/block-as-object.m index 8afab4c3f7d..28f8d775d0c 100644 --- a/clang/test/Sema/block-as-object.m +++ b/clang/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/clang/test/Sema/block-byref-args.c b/clang/test/Sema/block-byref-args.c index 9b568f05842..29f5a3aeeb9 100644 --- a/clang/test/Sema/block-byref-args.c +++ b/clang/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/clang/test/Sema/block-call.c b/clang/test/Sema/block-call.c index 871dbf792bc..66bf725922a 100644 --- a/clang/test/Sema/block-call.c +++ b/clang/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/clang/test/Sema/block-literal.c b/clang/test/Sema/block-literal.c index 6cca26999de..d5d41abb6cb 100644 --- a/clang/test/Sema/block-literal.c +++ b/clang/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/clang/test/Sema/block-misc.c b/clang/test/Sema/block-misc.c index c4d0c2dbf84..5509867c30a 100644 --- a/clang/test/Sema/block-misc.c +++ b/clang/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/clang/test/Sema/block-return.c b/clang/test/Sema/block-return.c index b88fb9b5be0..e835c963172 100644 --- a/clang/test/Sema/block-return.c +++ b/clang/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/clang/test/Sema/block-storageclass.c b/clang/test/Sema/block-storageclass.c index 662bd738c83..0ae723d44cf 100644 --- a/clang/test/Sema/block-storageclass.c +++ b/clang/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/clang/test/SemaCXX/blocks.cpp b/clang/test/SemaCXX/blocks.cpp index c273a1626ad..8b4b3aeb88c 100644 --- a/clang/test/SemaCXX/blocks.cpp +++ b/clang/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/clang/test/SemaObjC/block-ivar.m b/clang/test/SemaObjC/block-ivar.m index d1f56b651d3..422018359a8 100644 --- a/clang/test/SemaObjC/block-ivar.m +++ b/clang/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/clang/test/SemaObjC/property-10.m b/clang/test/SemaObjC/property-10.m index 2de5205a1fd..866fd37490e 100644 --- a/clang/test/SemaObjC/property-10.m +++ b/clang/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. |