This patch, for 4.7 and relative to a tree with
<http://gcc.gnu.org/ml/gcc-patches/2011-02/msg01709.html> applied,
stops the SCORE handle_option hook from using global state.

The -march= option is converted to use enumerated arguments.  The
existing handling of this option maps arguments to bits in
target_flags, and this is still done after this patch; it would
probably be better to map architectures to values of an actual enum
type (with flags bits used to describe actual subsets of processors
that support some particular instruction if needed), and to make the
options -mscore<version> into aliases for -march= options (documenting
-march= accordingly), but I don't plan to do this cleanup.

Tested building cc1 and xgcc for cross to score-elf.  Will commit to
trunk for 4.7 in the absence of target maintainer objections.

2011-03-09  Joseph Myers  <jos...@codesourcery.com>

        * config/score/score.c (score_handle_option): Don't assert that
        global structures are in use.  Access target_flags via opts
        pointer.  Use value of -march= option to determine target_flags
        settings.
        * config/score/score.opt (march=): Use Enum.
        (score_arch): New Enum and EnumValue entries.

diff -rupN --exclude=.svn gcc-mainline-1/gcc/config/score/score.c 
gcc-mainline/gcc/config/score/score.c
--- gcc-mainline-1/gcc/config/score/score.c     2011-02-24 12:56:51.000000000 
-0800
+++ gcc-mainline/gcc/config/score/score.c       2011-03-09 13:46:47.000000000 
-0800
@@ -309,67 +309,30 @@ score_asm_file_end (void)
 
 /* Implement TARGET_HANDLE_OPTION.  */
 static bool
-score_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
+score_handle_option (struct gcc_options *opts,
+                    struct gcc_options *opts_set ATTRIBUTE_UNUSED,
                     const struct cl_decoded_option *decoded,
                     location_t loc ATTRIBUTE_UNUSED)
 {
   size_t code = decoded->opt_index;
-  const char *arg = decoded->arg;
-
-  gcc_assert (opts == &global_options);
-  gcc_assert (opts_set == &global_options_set);
+  int value = decoded->value;
 
   switch (code)
     {
     case OPT_mscore7d:
-      target_flags &= ~(MASK_ALL_CPU_BITS);
-      target_flags |= MASK_SCORE7 | MASK_SCORE7D;
+      opts->x_target_flags &= ~(MASK_ALL_CPU_BITS);
+      opts->x_target_flags |= MASK_SCORE7 | MASK_SCORE7D;
       return true;
 
     case OPT_mscore3d:
-      target_flags &= ~(MASK_ALL_CPU_BITS);
-      target_flags |= MASK_SCORE3 | MASK_SCORE3D;
+      opts->x_target_flags &= ~(MASK_ALL_CPU_BITS);
+      opts->x_target_flags |= MASK_SCORE3 | MASK_SCORE3D;
       return true;
 
     case OPT_march_:
-      if (strcmp (arg, "score5") == 0)
-        {
-          target_flags &= ~(MASK_ALL_CPU_BITS);
-          target_flags |= MASK_SCORE5;
-          return true;
-        }
-      else if (strcmp (arg, "score5u") == 0)
-        {
-          target_flags &= ~(MASK_ALL_CPU_BITS);
-          target_flags |= MASK_SCORE5U;
-          return true;
-        }
-      else if (strcmp (arg, "score7") == 0)
-        {
-          target_flags &= ~(MASK_ALL_CPU_BITS);
-          target_flags |= MASK_SCORE7;
-          return true;
-        }
-      else if (strcmp (arg, "score7d") == 0)
-        {
-          target_flags &= ~(MASK_ALL_CPU_BITS);
-          target_flags |= MASK_SCORE7 | MASK_SCORE7D;
-          return true;
-        }
-      else if (strcmp (arg, "score3") == 0)
-        {
-          target_flags &= ~(MASK_ALL_CPU_BITS);
-          target_flags |= MASK_SCORE3;
-          return true;
-        }
-      else if (strcmp (arg, "score3d") == 0)
-        {
-          target_flags &= ~(MASK_ALL_CPU_BITS);
-          target_flags |= MASK_SCORE3 | MASK_SCORE3D;
-          return true;
-        }
-      else
-        return false;
+      opts->x_target_flags &= ~(MASK_ALL_CPU_BITS);
+      opts->x_target_flags |= value;
+      return true;
 
     default:
       return true;
diff -rupN --exclude=.svn gcc-mainline-1/gcc/config/score/score.opt 
gcc-mainline/gcc/config/score/score.opt
--- gcc-mainline-1/gcc/config/score/score.opt   2009-03-28 00:38:42.000000000 
-0700
+++ gcc-mainline/gcc/config/score/score.opt     2011-03-09 14:26:06.000000000 
-0800
@@ -1,6 +1,6 @@
 ; Options for the Sunnorth port of the compiler.
 
-; Copyright (C) 2005, 2007 Free Software Foundation, Inc.
+; Copyright (C) 2005, 2007, 2011 Free Software Foundation, Inc.
 ;
 ; This file is part of GCC.
 ;
@@ -59,5 +59,27 @@ Target RejectNegative Report Mask(SCORE3
 Support SCORE 3d ISA
 
 march=
-Target RejectNegative Joined
+Target RejectNegative Joined Enum(score_arch)
 Specify the name of the target architecture
+
+Enum
+Name(score_arch) Type(int)
+Known SCORE architectures (for use with the -march= option):
+
+EnumValue
+Enum(score_arch) String(score5) Value(MASK_SCORE5)
+
+EnumValue
+Enum(score_arch) String(score5u) Value(MASK_SCORE5U)
+
+EnumValue
+Enum(score_arch) String(score7) Value(MASK_SCORE7)
+
+EnumValue
+Enum(score_arch) String(score7d) Value(MASK_SCORE7 | MASK_SCORE7D)
+
+EnumValue
+Enum(score_arch) String(score3) Value(MASK_SCORE3)
+
+EnumValue
+Enum(score_arch) String(score3d) Value(MASK_SCORE3 | MASK_SCORE3D)

-- 
Joseph S. Myers
jos...@codesourcery.com

Reply via email to