From abd016e64f327ea97cc86f0aa594d46da4ca40aa Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 5 Apr 2011 13:28:41 +0100 Subject: [PATCH] rx-opts.h: New. * 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. From-SVN: r171984 --- gcc/ChangeLog | 14 +++++++ gcc/config/rx/rx-opts.h | 30 ++++++++++++++ gcc/config/rx/rx.c | 86 +++++++++++++++++++++++------------------ gcc/config/rx/rx.h | 9 ----- gcc/config/rx/rx.opt | 19 ++++++++- 5 files changed, 109 insertions(+), 49 deletions(-) create mode 100644 gcc/config/rx/rx-opts.h diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f309bcc876d..a0fea0d551c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2011-04-05 Joseph Myers + + * 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. + 2011-04-05 Nathan Froyd * debug.h (debug_flush_symbol_queue, debug_queue_symbol): Delete. diff --git a/gcc/config/rx/rx-opts.h b/gcc/config/rx/rx-opts.h new file mode 100644 index 00000000000..a1d071be242 --- /dev/null +++ b/gcc/config/rx/rx-opts.h @@ -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 + . */ + +#ifndef RX_OPTS_H +#define RX_OPTS_H + +enum rx_cpu_types +{ + RX600, + RX610, + RX200 +}; + +#endif diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c index f0a97abd500..4d16cc3cab0 100644 --- a/gcc/config/rx/rx.c +++ b/gcc/config/rx/rx.c @@ -62,8 +62,6 @@ static void rx_print_operand (FILE *, rtx, int); 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; /* 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_table[] = /* 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 *opts, struct gcc_options *opts_set, 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; diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h index 14b13d95559..c4436d70e4a 100644 --- a/gcc/config/rx/rx.h +++ b/gcc/config/rx/rx.h @@ -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}} \ diff --git a/gcc/config/rx/rx.opt b/gcc/config/rx/rx.opt index 99f262c0773..b51ca3f677c 100644 --- a/gcc/config/rx/rx.opt +++ b/gcc/config/rx/rx.opt @@ -19,6 +19,9 @@ ; . ;--------------------------------------------------- +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. This is the default. ;--------------------------------------------------- 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 allowed as operands. ;--------------------------------------------------- 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. ;--------------------------------------------------- -- 2.30.2