diff options
| author | Chris Lattner <sabre@nondot.org> | 2008-12-04 23:20:07 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2008-12-04 23:20:07 +0000 | 
| commit | 2ca529ce61f63caed2484b7ee19018df63d7cd12 (patch) | |
| tree | 9979512e22c3b08da68d5390316ce7c591fdda91 /clang | |
| parent | 5271058c758dac21ef82ee717476227874049449 (diff) | |
| download | bcm5719-llvm-2ca529ce61f63caed2484b7ee19018df63d7cd12.tar.gz bcm5719-llvm-2ca529ce61f63caed2484b7ee19018df63d7cd12.zip  | |
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.
llvm-svn: 60563
Diffstat (limited to 'clang')
| -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.  | 

