[4.7] Avoid global state in m32r_handle_option

Joseph S. Myers joseph@codesourcery.com
Fri Mar 4 03:43:00 GMT 2011


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 M32R handle_option hook from using global state.  Some
options are converted to using .opt features; in particular, -mmodel=
and -msdata= are converted to use Enum.  (Because variables in the
gcc_options structure get corresponding macro names, the m32r_model
and m32r_sdata variables needed renaming with an _selected suffix to
avoid conflict with the enum names.)

The Code Models and Small Data Areas sections of m32r.h had long
comments tht appear to apply to all the definitions there, so rather
than move just the minimum (the enum definitions) into m32r-opts.h,
away from the comments, I moved those whole sections into m32r-opts.h.

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

2011-03-03  Joseph Myers  <joseph@codesourcery.com>

	* config/m32r/m32r-opts.h: New.
	* config/m32r/m32r.c (m32r_model, m32r_sdata): Remove.
	(m32r_handle_option): Don't assert that global structures are in
	use.  Access target_flags and m32r_cache_flush_func via opts
	pointer.  Don't handle OPT_mmodel_, OPT_msdata_ or
	OPT_mno_flush_trap here.
	* config/m32r/m32r.h (Code Models, Small Data Area): Replace by
	include of m32r-opts.h.
	* config/m32r/m32r.opt (config/m32r/m32r-opts.h): New
	HeaderInclude entry.
	(m32r_model_selected, m32r_sdata_selected): New Variable entries.
	(mmodel=): Use Enum and Var.
	(m32r_model): New Enum and EnumValue entries.
	(mno-flush-trap): Use Var.
	(msdata=): Use Enum and Var.
	(m32r_sdata): New Enum and EnumValue entries.

diff -rupN --exclude=.svn gcc-mainline-1/gcc/config/m32r/m32r-opts.h gcc-mainline/gcc/config/m32r/m32r-opts.h
--- gcc-mainline-1/gcc/config/m32r/m32r-opts.h	1969-12-31 16:00:00.000000000 -0800
+++ gcc-mainline/gcc/config/m32r/m32r-opts.h	2011-03-03 18:02:55.000000000 -0800
@@ -0,0 +1,109 @@
+/* Definitions for option handling for Renesas M32R cpu.
+   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+   2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3, or (at your
+   option) any later version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef M32R_OPTS_H
+#define M32R_OPTS_H
+
+/* Code Models
+
+   Code models are used to select between two choices of two separate
+   possibilities (address space size, call insn to use):
+
+   small: addresses use 24 bits, use bl to make calls
+   medium: addresses use 32 bits, use bl to make calls (*1)
+   large: addresses use 32 bits, use seth/add3/jl to make calls (*2)
+
+   The fourth is "addresses use 24 bits, use seth/add3/jl to make calls" but
+   using this one doesn't make much sense.
+
+   (*1) The linker may eventually be able to relax seth/add3 -> ld24.
+   (*2) The linker may eventually be able to relax seth/add3/jl -> bl.
+
+   Internally these are recorded as TARGET_ADDR{24,32} and
+   TARGET_CALL{26,32}.
+
+   The __model__ attribute can be used to select the code model to use when
+   accessing particular objects.  */
+
+enum m32r_model { M32R_MODEL_SMALL, M32R_MODEL_MEDIUM, M32R_MODEL_LARGE };
+
+#define TARGET_MODEL_SMALL  (m32r_model_selected == M32R_MODEL_SMALL)
+#define TARGET_MODEL_MEDIUM (m32r_model_selected == M32R_MODEL_MEDIUM)
+#define TARGET_MODEL_LARGE  (m32r_model_selected == M32R_MODEL_LARGE)
+#define TARGET_ADDR24       (m32r_model_selected == M32R_MODEL_SMALL)
+#define TARGET_ADDR32       (! TARGET_ADDR24)
+#define TARGET_CALL26       (! TARGET_CALL32)
+#define TARGET_CALL32       (m32r_model_selected == M32R_MODEL_LARGE)
+
+/* The default is the small model.  */
+#ifndef M32R_MODEL_DEFAULT
+#define M32R_MODEL_DEFAULT M32R_MODEL_SMALL
+#endif
+
+/* Small Data Area
+
+   The SDA consists of sections .sdata, .sbss, and .scommon.
+   .scommon isn't a real section, symbols in it have their section index
+   set to SHN_M32R_SCOMMON, though support for it exists in the linker script.
+
+   Two switches control the SDA:
+
+   -G NNN        - specifies the maximum size of variable to go in the SDA
+
+   -msdata=foo   - specifies how such variables are handled
+
+        -msdata=none  - small data area is disabled
+
+        -msdata=sdata - small data goes in the SDA, special code isn't
+                        generated to use it, and special relocs aren't
+                        generated
+
+        -msdata=use   - small data goes in the SDA, special code is generated
+                        to use the SDA and special relocs are generated
+
+   The SDA is not multilib'd, it isn't necessary.
+   MULTILIB_EXTRA_OPTS is set in tmake_file to -msdata=sdata so multilib'd
+   libraries have small data in .sdata/SHN_M32R_SCOMMON so programs that use
+   -msdata=use will successfully link with them (references in header files
+   will cause the compiler to emit code that refers to library objects in
+   .data).  ??? There can be a problem if the user passes a -G value greater
+   than the default and a library object in a header file is that size.
+   The default is 8 so this should be rare - if it occurs the user
+   is required to rebuild the libraries or use a smaller value for -G.  */
+
+/* Maximum size of variables that go in .sdata/.sbss.
+   The -msdata=foo switch also controls how small variables are handled.  */
+#ifndef SDATA_DEFAULT_SIZE
+#define SDATA_DEFAULT_SIZE 8
+#endif
+
+enum m32r_sdata { M32R_SDATA_NONE, M32R_SDATA_SDATA, M32R_SDATA_USE };
+
+#define TARGET_SDATA_NONE  (m32r_sdata_selected == M32R_SDATA_NONE)
+#define TARGET_SDATA_SDATA (m32r_sdata_selected == M32R_SDATA_SDATA)
+#define TARGET_SDATA_USE   (m32r_sdata_selected == M32R_SDATA_USE)
+
+/* Default is to disable the SDA
+   [for upward compatibility with previous toolchains].  */
+#ifndef M32R_SDATA_DEFAULT
+#define M32R_SDATA_DEFAULT M32R_SDATA_NONE
+#endif
+
+#endif
diff -rupN --exclude=.svn gcc-mainline-1/gcc/config/m32r/m32r.c gcc-mainline/gcc/config/m32r/m32r.c
--- gcc-mainline-1/gcc/config/m32r/m32r.c	2011-02-23 17:56:59.000000000 -0800
+++ gcc-mainline/gcc/config/m32r/m32r.c	2011-03-03 17:47:32.000000000 -0800
@@ -47,12 +47,6 @@
 /* Array of valid operand punctuation characters.  */
 static char m32r_punct_chars[256];
 
-/* Selected code model.  */
-enum m32r_model m32r_model = M32R_MODEL_DEFAULT;
-
-/* Selected SDA support.  */
-enum m32r_sdata m32r_sdata = M32R_SDATA_DEFAULT;
-
 /* Machine-specific symbol_ref flags.  */
 #define SYMBOL_FLAG_MODEL_SHIFT		SYMBOL_FLAG_MACH_DEP_SHIFT
 #define SYMBOL_REF_MODEL(X) \
@@ -223,56 +217,27 @@ struct gcc_target targetm = TARGET_INITI
 /* Implement TARGET_HANDLE_OPTION.  */
 
 static bool
-m32r_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
+m32r_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;
   int value = decoded->value;
 
-  gcc_assert (opts == &global_options);
-  gcc_assert (opts_set == &global_options_set);
-
   switch (code)
     {
     case OPT_m32r:
-      target_flags &= ~(MASK_M32R2 | MASK_M32RX);
-      return true;
-
-    case OPT_mmodel_:
-      if (strcmp (arg, "small") == 0)
-	m32r_model = M32R_MODEL_SMALL;
-      else if (strcmp (arg, "medium") == 0)
-	m32r_model = M32R_MODEL_MEDIUM;
-      else if (strcmp (arg, "large") == 0)
-	m32r_model = M32R_MODEL_LARGE;
-      else
-	return false;
-      return true;
-
-    case OPT_msdata_:
-      if (strcmp (arg, "none") == 0)
-	m32r_sdata = M32R_SDATA_NONE;
-      else if (strcmp (arg, "sdata") == 0)
-	m32r_sdata = M32R_SDATA_SDATA;
-      else if (strcmp (arg, "use") == 0)
-	m32r_sdata = M32R_SDATA_USE;
-      else
-	return false;
+      opts->x_target_flags &= ~(MASK_M32R2 | MASK_M32RX);
       return true;
 
     case OPT_mno_flush_func:
-      m32r_cache_flush_func = NULL;
+      opts->x_m32r_cache_flush_func = NULL;
       return true;
 
     case OPT_mflush_trap_:
       return value <= 15;
 
-    case OPT_mno_flush_trap:
-      m32r_cache_flush_trap = -1;
-      return true;
-
     default:
       return true;
     }
diff -rupN --exclude=.svn gcc-mainline-1/gcc/config/m32r/m32r.h gcc-mainline/gcc/config/m32r/m32r.h
--- gcc-mainline-1/gcc/config/m32r/m32r.h	2011-02-19 06:32:05.000000000 -0800
+++ gcc-mainline/gcc/config/m32r/m32r.h	2011-03-03 17:42:33.000000000 -0800
@@ -194,91 +194,8 @@
 #define TARGET_CPU_DEFAULT 0
 #endif
 
-/* Code Models
-
-   Code models are used to select between two choices of two separate
-   possibilities (address space size, call insn to use):
-
-   small: addresses use 24 bits, use bl to make calls
-   medium: addresses use 32 bits, use bl to make calls (*1)
-   large: addresses use 32 bits, use seth/add3/jl to make calls (*2)
-
-   The fourth is "addresses use 24 bits, use seth/add3/jl to make calls" but
-   using this one doesn't make much sense.
-
-   (*1) The linker may eventually be able to relax seth/add3 -> ld24.
-   (*2) The linker may eventually be able to relax seth/add3/jl -> bl.
-
-   Internally these are recorded as TARGET_ADDR{24,32} and
-   TARGET_CALL{26,32}.
-
-   The __model__ attribute can be used to select the code model to use when
-   accessing particular objects.  */
-
-enum m32r_model { M32R_MODEL_SMALL, M32R_MODEL_MEDIUM, M32R_MODEL_LARGE };
-
-extern enum m32r_model m32r_model;
-#define TARGET_MODEL_SMALL  (m32r_model == M32R_MODEL_SMALL)
-#define TARGET_MODEL_MEDIUM (m32r_model == M32R_MODEL_MEDIUM)
-#define TARGET_MODEL_LARGE  (m32r_model == M32R_MODEL_LARGE)
-#define TARGET_ADDR24       (m32r_model == M32R_MODEL_SMALL)
-#define TARGET_ADDR32       (! TARGET_ADDR24)
-#define TARGET_CALL26       (! TARGET_CALL32)
-#define TARGET_CALL32       (m32r_model == M32R_MODEL_LARGE)
-
-/* The default is the small model.  */
-#ifndef M32R_MODEL_DEFAULT
-#define M32R_MODEL_DEFAULT M32R_MODEL_SMALL
-#endif
-
-/* Small Data Area
-
-   The SDA consists of sections .sdata, .sbss, and .scommon.
-   .scommon isn't a real section, symbols in it have their section index
-   set to SHN_M32R_SCOMMON, though support for it exists in the linker script.
-
-   Two switches control the SDA:
-
-   -G NNN        - specifies the maximum size of variable to go in the SDA
-
-   -msdata=foo   - specifies how such variables are handled
-
-        -msdata=none  - small data area is disabled
-
-        -msdata=sdata - small data goes in the SDA, special code isn't
-                        generated to use it, and special relocs aren't
-                        generated
-
-        -msdata=use   - small data goes in the SDA, special code is generated
-                        to use the SDA and special relocs are generated
-
-   The SDA is not multilib'd, it isn't necessary.
-   MULTILIB_EXTRA_OPTS is set in tmake_file to -msdata=sdata so multilib'd
-   libraries have small data in .sdata/SHN_M32R_SCOMMON so programs that use
-   -msdata=use will successfully link with them (references in header files
-   will cause the compiler to emit code that refers to library objects in
-   .data).  ??? There can be a problem if the user passes a -G value greater
-   than the default and a library object in a header file is that size.
-   The default is 8 so this should be rare - if it occurs the user
-   is required to rebuild the libraries or use a smaller value for -G.  */
-
-/* Maximum size of variables that go in .sdata/.sbss.
-   The -msdata=foo switch also controls how small variables are handled.  */
-#ifndef SDATA_DEFAULT_SIZE
-#define SDATA_DEFAULT_SIZE 8
-#endif
-
-enum m32r_sdata { M32R_SDATA_NONE, M32R_SDATA_SDATA, M32R_SDATA_USE };
-
-extern enum m32r_sdata m32r_sdata;
-#define TARGET_SDATA_NONE  (m32r_sdata == M32R_SDATA_NONE)
-#define TARGET_SDATA_SDATA (m32r_sdata == M32R_SDATA_SDATA)
-#define TARGET_SDATA_USE   (m32r_sdata == M32R_SDATA_USE)
-
-/* Default is to disable the SDA
-   [for upward compatibility with previous toolchains].  */
-#ifndef M32R_SDATA_DEFAULT
-#define M32R_SDATA_DEFAULT M32R_SDATA_NONE
+#ifndef M32R_OPTS_H
+#include "config/m32r/m32r-opts.h"
 #endif
 
 /* Define this macro as a C expression for the initializer of an array of
diff -rupN --exclude=.svn gcc-mainline-1/gcc/config/m32r/m32r.opt gcc-mainline/gcc/config/m32r/m32r.opt
--- gcc-mainline-1/gcc/config/m32r/m32r.opt	2009-03-28 00:38:07.000000000 -0700
+++ gcc-mainline/gcc/config/m32r/m32r.opt	2011-03-03 18:02:17.000000000 -0800
@@ -1,6 +1,6 @@
 ; Options for the Renesas M32R 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.
 ;
@@ -18,6 +18,17 @@
 ; along with GCC; see the file COPYING3.  If not see
 ; <http://www.gnu.org/licenses/>.
 
+HeaderInclude
+config/m32r/m32r-opts.h
+
+; Selected code model.
+Variable
+enum m32r_model m32r_model_selected = M32R_MODEL_DEFAULT
+
+; Selected SDA support.
+Variable
+enum m32r_sdata m32r_sdata_selected = M32R_SDATA_DEFAULT
+
 m32rx
 Target Report RejectNegative Mask(M32RX)
 Compile for the m32rx
@@ -63,20 +74,44 @@ Target Report RejectNegative InverseMask
 Allow two instructions to be issued per cycle
 
 mmodel=
-Target RejectNegative Joined
+Target RejectNegative Joined Enum(m32r_model) Var(m32r_model_selected)
 Code size: small, medium or large
 
+Enum
+Name(m32r_model) Type(enum m32r_model)
+
+EnumValue
+Enum(m32r_model) String(small) Value(M32R_MODEL_SMALL)
+
+EnumValue
+Enum(m32r_model) String(medium) Value(M32R_MODEL_MEDIUM)
+
+EnumValue
+Enum(m32r_model) String(large) Value(M32R_MODEL_LARGE)
+
 mno-flush-func
 Target RejectNegative
 Don't call any cache flush functions
 
 mno-flush-trap
-Target RejectNegative
+Target RejectNegative Var(m32r_cache_flush_trap, -1)
 Don't call any cache flush trap
 
 ; mrelax
 ; Target Mask(RELAX)
 
 msdata=
-Target RejectNegative Joined
+Target RejectNegative Joined Enum(m32r_sdata) Var(m32r_sdata_selected)
 Small data area: none, sdata, use
+
+Enum
+Name(m32r_sdata) Type(enum m32r_sdata)
+
+EnumValue
+Enum(m32r_sdata) String(none) Value(M32R_SDATA_NONE)
+
+EnumValue
+Enum(m32r_sdata) String(sdata) Value(M32R_SDATA_SDATA)
+
+EnumValue
+Enum(m32r_sdata) String(use) Value(M32R_SDATA_USE)

-- 
Joseph S. Myers
joseph@codesourcery.com



More information about the Gcc-patches mailing list