* Avoid global state in rx_handle_option
@ 2011-04-04 16:48 Joseph S. Myers
2011-04-05 11:22 ` Nick Clifton
2011-04-07 21:48 ` Joseph S. Myers
0 siblings, 2 replies; 3+ messages in thread
From: Joseph S. Myers @ 2011-04-04 16:48 UTC (permalink / raw)
To: gcc-patches; +Cc: nickc
This patch stops the RX handle_option hook from using global state.
The -mcpu= handling is changed to use Enum, while most -mint-register=
handling is deferred to rx_option_override, similarly to how such
options are handled for other targets. Note that the -mcpu= change
has the semantic effect that -mcpu=rx600 actually sets rx_cpu_type to
RX600 (overriding any earlier -mcpu= option), rather than being a
no-op as previously; that overriding seems to me to be the correct
effect. Also, the use of Enum means that unknown -mcpu= arguments are
now errors rather than warnings.
Tested building cc1 and xgcc for cross to rx-elf. Will commit to
trunk in the absence of target maintainer objections.
2011-04-04 Joseph Myers <joseph@codesourcery.com>
* config/rx/rx-opts.h: New.
* config/rx/rx.c (rx_cpu_type): Remove.
(rx_handle_option): Don't assert that global structures are in
use. Access variables via opts pointer. Defer most handling of
OPT_mint_register_. Use error_at.
(rx_option_override): Handle deferred OPT_mint_register_ here.
* config/rx/rx.h (enum rx_cpu_types): Move to rx-opts.h.
* config/rx/rx.opt (config/rx/rx-opts.h: New HeaderInclude.
(mcpu=): Use Enum and specifiy rx_cpu_type with Var.
(rx_cpu_types): New Enum and EnumValue entries.
(mint-register=): Use Defer and use Var accordingly.
Index: gcc/config/rx/rx.h
===================================================================
--- gcc/config/rx/rx.h (revision 171938)
+++ gcc/config/rx/rx.h (working copy)
@@ -52,15 +52,6 @@
} \
while (0)
-enum rx_cpu_types
-{
- RX600,
- RX610,
- RX200
-};
-
-extern enum rx_cpu_types rx_cpu_type;
-
#undef CC1_SPEC
#define CC1_SPEC "\
%{mas100-syntax:%{gdwarf*:%e-mas100-syntax is incompatible with -gdwarf}} \
Index: gcc/config/rx/rx-opts.h
===================================================================
--- gcc/config/rx/rx-opts.h (revision 0)
+++ gcc/config/rx/rx-opts.h (revision 0)
@@ -0,0 +1,30 @@
+/* GCC option-handling definitions for the Renesas RX processor.
+ Copyright (C) 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 RX_OPTS_H
+#define RX_OPTS_H
+
+enum rx_cpu_types
+{
+ RX600,
+ RX610,
+ RX200
+};
+
+#endif
Index: gcc/config/rx/rx.c
===================================================================
--- gcc/config/rx/rx.c (revision 171938)
+++ gcc/config/rx/rx.c (working copy)
@@ -62,8 +62,6 @@ static void rx_print_operand (FILE *, rt
static unsigned int flags_from_mode (enum machine_mode mode);
static unsigned int flags_from_code (enum rtx_code code);
-
-enum rx_cpu_types rx_cpu_type = RX600;
\f
/* Return true if OP is a reference to an object in a small data area. */
@@ -2268,39 +2266,20 @@ const struct attribute_spec rx_attribute
/* Extra processing for target specific command line options. */
static bool
-rx_handle_option (struct gcc_options *opts, struct gcc_options *opts_set,
+rx_handle_option (struct gcc_options *opts,
+ struct gcc_options *opts_set ATTRIBUTE_UNUSED,
const struct cl_decoded_option *decoded,
- location_t loc ATTRIBUTE_UNUSED)
+ location_t loc)
{
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_mint_register_:
- switch (value)
- {
- case 4:
- fixed_regs[10] = call_used_regs [10] = 1;
- /* Fall through. */
- case 3:
- fixed_regs[11] = call_used_regs [11] = 1;
- /* Fall through. */
- case 2:
- fixed_regs[12] = call_used_regs [12] = 1;
- /* Fall through. */
- case 1:
- fixed_regs[13] = call_used_regs [13] = 1;
- /* Fall through. */
- case 0:
- return true;
- default:
- return false;
- }
+ /* Make sure that the -mint-register option is in range. Other
+ handling in rx_option_override. */
+ return value >= 0 && value <= 4;
break;
case OPT_mmax_constant_size_:
@@ -2308,20 +2287,13 @@ rx_handle_option (struct gcc_options *op
return value >= 0 && value <= 4;
case OPT_mcpu_:
- if (strcmp (arg, "rx610") == 0)
- rx_cpu_type = RX610;
- else if (strcmp (arg, "rx200") == 0)
- {
- target_flags |= MASK_NO_USE_FPU;
- rx_cpu_type = RX200;
- }
- else if (strcmp (arg, "rx600") != 0)
- warning (0, "unrecognized argument '%s' to -mcpu= option", arg);
+ if ((enum rx_cpu_types) value == RX200)
+ opts->x_target_flags |= MASK_NO_USE_FPU;
break;
case OPT_fpu:
- if (rx_cpu_type == RX200)
- error ("the RX200 cpu does not have FPU hardware");
+ if (opts->x_rx_cpu_type == RX200)
+ error_at (loc, "the RX200 cpu does not have FPU hardware");
break;
default:
@@ -2361,6 +2333,44 @@ rx_override_options_after_change (void)
static void
rx_option_override (void)
{
+ unsigned int i;
+ cl_deferred_option *opt;
+ VEC(cl_deferred_option,heap) *vec
+ = (VEC(cl_deferred_option,heap) *) rx_deferred_options;
+
+ FOR_EACH_VEC_ELT (cl_deferred_option, vec, i, opt)
+ {
+ switch (opt->opt_index)
+ {
+ case OPT_mint_register_:
+ switch (opt->value)
+ {
+ case 4:
+ fixed_regs[10] = call_used_regs [10] = 1;
+ /* Fall through. */
+ case 3:
+ fixed_regs[11] = call_used_regs [11] = 1;
+ /* Fall through. */
+ case 2:
+ fixed_regs[12] = call_used_regs [12] = 1;
+ /* Fall through. */
+ case 1:
+ fixed_regs[13] = call_used_regs [13] = 1;
+ /* Fall through. */
+ case 0:
+ break;
+ default:
+ /* Error message already given because rx_handle_option
+ returned false. */
+ break;
+ }
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ }
+
/* This target defaults to strict volatile bitfields. */
if (flag_strict_volatile_bitfields < 0)
flag_strict_volatile_bitfields = 1;
Index: gcc/config/rx/rx.opt
===================================================================
--- gcc/config/rx/rx.opt (revision 171938)
+++ gcc/config/rx/rx.opt (working copy)
@@ -19,6 +19,9 @@
; <http://www.gnu.org/licenses/>.
;---------------------------------------------------
+HeaderInclude
+config/rx/rx-opts.h
+
; The default is -fpu -m32bit-doubles.
m64bit-doubles
@@ -43,9 +46,21 @@ Enable the use of RX FPU instructions.
;---------------------------------------------------
mcpu=
-Target RejectNegative Joined Var(rx_cpu_name) Report ToLower
+Target RejectNegative Joined Var(rx_cpu_type) Report ToLower Enum(rx_cpu_types) Init(RX600)
Specify the target RX cpu type.
+Enum
+Name(rx_cpu_types) Type(enum rx_cpu_types)
+
+EnumValue
+Name(rx_cpu_types) String(rx610) Value(RX610)
+
+EnumValue
+Name(rx_cpu_types) String(rx200) Value(RX200)
+
+EnumValue
+Name(rx_cpu_types) String(rx600) Value(RX600)
+
;---------------------------------------------------
mbig-endian-data
@@ -89,7 +104,7 @@ Maximum size in bytes of constant values
;---------------------------------------------------
mint-register=
-Target RejectNegative Joined UInteger Var(rx_interrupt_registers) Init(0)
+Target RejectNegative Joined UInteger Var(rx_deferred_options) Defer
Specifies the number of registers to reserve for interrupt handlers.
;---------------------------------------------------
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Avoid global state in rx_handle_option
2011-04-04 16:48 Avoid global state in rx_handle_option Joseph S. Myers
@ 2011-04-05 11:22 ` Nick Clifton
2011-04-07 21:48 ` Joseph S. Myers
1 sibling, 0 replies; 3+ messages in thread
From: Nick Clifton @ 2011-04-05 11:22 UTC (permalink / raw)
To: Joseph S. Myers; +Cc: gcc-patches
Hi Joseph,
> Tested building cc1 and xgcc for cross to rx-elf. Will commit to
> trunk in the absence of target maintainer objections.
>
> 2011-04-04 Joseph Myers<joseph@codesourcery.com>
>
> * config/rx/rx-opts.h: New.
> * config/rx/rx.c (rx_cpu_type): Remove.
> (rx_handle_option): Don't assert that global structures are in
> use. Access variables via opts pointer. Defer most handling of
> OPT_mint_register_. Use error_at.
> (rx_option_override): Handle deferred OPT_mint_register_ here.
> * config/rx/rx.h (enum rx_cpu_types): Move to rx-opts.h.
> * config/rx/rx.opt (config/rx/rx-opts.h: New HeaderInclude.
> (mcpu=): Use Enum and specifiy rx_cpu_type with Var.
> (rx_cpu_types): New Enum and EnumValue entries.
> (mint-register=): Use Defer and use Var accordingly.
No objections - please apply.
Cheers
Nick
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Avoid global state in rx_handle_option
2011-04-04 16:48 Avoid global state in rx_handle_option Joseph S. Myers
2011-04-05 11:22 ` Nick Clifton
@ 2011-04-07 21:48 ` Joseph S. Myers
1 sibling, 0 replies; 3+ messages in thread
From: Joseph S. Myers @ 2011-04-07 21:48 UTC (permalink / raw)
To: gcc-patches; +Cc: nickc
There was a bug in how the conversion to Enum was done in this patch; I've
applied this followup patch to fix it.
Index: ChangeLog
===================================================================
--- ChangeLog (revision 172137)
+++ ChangeLog (working copy)
@@ -1,5 +1,10 @@
2011-04-07 Joseph Myers <joseph@codesourcery.com>
+ * config/rx/rx.opt (rx610, rx200, rx600): Use Enum not Name on
+ EnumValue lines.
+
+2011-04-07 Joseph Myers <joseph@codesourcery.com>
+
* config/m68k/m68k.c (m68k_handle_option): Don't handle
OPT_m68000, OPT_mc68000, OPT_m68010, OPT_m68020, OPT_mc68020,
OPT_m68030, OPT_m68040, OPT_m68060, OPT_m68302, OPT_m68332 and
Index: config/rx/rx.opt
===================================================================
--- config/rx/rx.opt (revision 172137)
+++ config/rx/rx.opt (working copy)
@@ -53,13 +53,13 @@
Name(rx_cpu_types) Type(enum rx_cpu_types)
EnumValue
-Name(rx_cpu_types) String(rx610) Value(RX610)
+Enum(rx_cpu_types) String(rx610) Value(RX610)
EnumValue
-Name(rx_cpu_types) String(rx200) Value(RX200)
+Enum(rx_cpu_types) String(rx200) Value(RX200)
EnumValue
-Name(rx_cpu_types) String(rx600) Value(RX600)
+Enum(rx_cpu_types) String(rx600) Value(RX600)
;---------------------------------------------------
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2011-04-07 21:48 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-04 16:48 Avoid global state in rx_handle_option Joseph S. Myers
2011-04-05 11:22 ` Nick Clifton
2011-04-07 21:48 ` Joseph S. Myers
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).