]> granicus.if.org Git - clang/commitdiff
instead of forcing blocks on by default, make them default to off, but let
authorChris Lattner <sabre@nondot.org>
Thu, 4 Dec 2008 23:20:07 +0000 (23:20 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 4 Dec 2008 23:20:07 +0000 (23:20 +0000)
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

17 files changed:
Driver/clang.cpp
include/clang/Basic/LangOptions.h
lib/Basic/Targets.cpp
test/Analysis/misc-ps.m
test/Parser/block-pointer-decl.c
test/Rewriter/block-test.c
test/Sema/block-args.c
test/Sema/block-as-object.m
test/Sema/block-byref-args.c
test/Sema/block-call.c
test/Sema/block-literal.c
test/Sema/block-misc.c
test/Sema/block-return.c
test/Sema/block-storageclass.c
test/SemaCXX/blocks.cpp
test/SemaObjC/block-ivar.m
test/SemaObjC/property-10.m

index bb838ed846f58ba422fbd5c98356933fc6c5a37a..303bfe757f5016dcb864a0614d06d0a7a460956e 100644 (file)
@@ -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)
index 5cf9fc1b4bfab23b90324521146837036246fd70..4b5355282ea79b7c3c41a37957ef95edfc6d5061 100644 (file)
@@ -69,7 +69,7 @@ public:
     
     // FIXME: The default should be 1.
     ThreadsafeStatics = 0;
-    Blocks = 1;
+    Blocks = 0;
   }
   
   GCMode getGCMode() const { return (GCMode) GC; }
index 6f563a55c3bd0dd9d27c8713794671fd683fea80..c1974be37623e5613465978bdad61d2c98c27e60 100644 (file)
@@ -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.
index 8fb825218dd9871e182d5a55d3b50ed171345ae8..0069af89433aabc372b75c6e7ee305229a449b2e 100644 (file)
@@ -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;
index a9da3256a94f43f1cbe9ff1634f2dfeec40fa580..9920f5f68b3dfef53a86d74e06e8a0b13cbafc77 100644 (file)
@@ -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);
index 82b63a09f9d1654e1653b091cb8338b0e27f4a64..c65815ff9a5e0c1a9620f6055778862cdface9f5 100644 (file)
@@ -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;
index 42e2859c9753795c8109a8808829766f117dce1f..d518fef0442769bc9d5a298c1b76bb8fc8be587a 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang %s -fsyntax-only -verify
+// RUN: clang %s -fsyntax-only -verify -fblocks
 
 void take(void*);
 
index 8afab4c3f7d09c9fcb61bafe108c5ce8862bcba2..28f8d775d0c8e44bb590b9f5095b045cad78758a 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang %s -fsyntax-only -verify
+// RUN: clang %s -fsyntax-only -verify -fblocks
 
 @interface Whatever
 - copy;
index 9b568f0584208e4c3352eaf81064898175b8a50c..29f5a3aeeb97ebb2d2b141b101b70593b2a6eaca 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang %s -fsyntax-only -verify
+// RUN: clang %s -fsyntax-only -verify -fblocks
 
 #include <stdio.h>
 
index 871dbf792bc049e6a0d959b212d4d5aefc3788f9..66bf725922add1cb1f3a2373fa1fcacf2e32e017 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
 
 int (*FP)();
 int (^IFP) ();
index 6cca26999de4fab610949c9d4e32255ab5528626..d5d41abb6cb15d62bd74a2a55a8f091f2ffd3f6b 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only %s -verify
+// RUN: clang -fsyntax-only %s -verify -fblocks
 
 void I( void (^)(void));
 void (^noop)(void);
index c4d0c2dbf8476c2f22f32531abe71d11d532089d..5509867c30afe17ee2fd029143bcff89b60ba112 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
 void donotwarn();
 
 int (^IFP) ();
index b88fb9b5be06d91a0deb34c485ed29b112120e0a..e835c9631726b7f8681ea3793a56c03656872d59 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only %s -verify
+// RUN: clang -fsyntax-only %s -verify -fblocks
 
 typedef void (^CL)(void);
 
index 662bd738c839eaf6fca24a306c211d0f5e43729b..0ae723d44cfe272a917dbb1219874bdd5eb43676 100644 (file)
@@ -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){}
index c273a1626ad0fd0e6db041d8adc8c5d0e7f3a881..8b4b3aeb88c920e3cf03d237d28b41c780c53210 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
 
 void tovoid(void*);
 
index d1f56b651d36040bd7c602d0df282fc4e60306a7..422018359a888b719b3957efc2611ab7fb33edeb 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s -fblocks
 
 @interface NSObject {
   struct objc_object *isa;
index 2de5205a1fd0189d99c2889c97d3c14fec89aff6..866fd37490eb6ec5dd43bda816cdbfd12c31a925 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: clang -fsyntax-only -verify %s
+// RUN: clang -fsyntax-only -verify %s  -fblocks
 
 // Check property attribute consistency.