From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17759 invoked by alias); 4 Apr 2011 16:48:10 -0000 Received: (qmail 17747 invoked by uid 22791); 4 Apr 2011 16:48:08 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL,BAYES_00,TW_XG,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 04 Apr 2011 16:48:03 +0000 Received: (qmail 29523 invoked from network); 4 Apr 2011 16:48:02 -0000 Received: from unknown (HELO digraph.polyomino.org.uk) (joseph@127.0.0.2) by mail.codesourcery.com with ESMTPA; 4 Apr 2011 16:48:02 -0000 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.72) (envelope-from ) id 1Q6mwa-0008El-LG; Mon, 04 Apr 2011 16:48:00 +0000 Date: Mon, 04 Apr 2011 16:48:00 -0000 From: "Joseph S. Myers" To: gcc-patches@gcc.gnu.org cc: nickc@redhat.com Subject: Avoid global state in rx_handle_option Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-04/txt/msg00230.txt.bz2 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 * 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 + . */ + +#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; /* 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 @@ ; . ;--------------------------------------------------- +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