OSDN Git Service

* ira-color.c (allocno_reload_assign): Avoid accumulating
[pf3gnuchains/gcc-fork.git] / gcc / genextract.c
index 591a697..c414891 100644 (file)
@@ -1,13 +1,13 @@
 /* Generate code from machine description to extract operands from insn as rtl.
    Copyright (C) 1987, 1991, 1992, 1993, 1997, 1998, 1999, 2000, 2003,
-   2004, 2005
+   2004, 2005, 2007, 2008
    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 2, or (at your option) any later
+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
@@ -16,9 +16,8 @@ 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 COPYING.  If not, write to the Free
-Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
-02110-1301, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 
 #include "bconfig.h"
@@ -81,6 +80,8 @@ struct accum_extract
   VEC(char,heap)   *pathstr;
 };
 
+int line_no;
+
 /* Forward declarations.  */
 static void walk_rtx (rtx, struct accum_extract *);
 
@@ -153,7 +154,7 @@ gen_insn (rtx insn, int insn_code_number)
   /* Otherwise, make a new extraction method.  We stash the arrays
      after the extraction structure in memory.  */
 
-  p = xmalloc (sizeof (struct extraction)
+  p = XNEWVAR (struct extraction, sizeof (struct extraction)
               + op_count*sizeof (char *)
               + dup_count*sizeof (char *)
               + dup_count*sizeof (int));
@@ -188,8 +189,13 @@ VEC_safe_set_locstr (VEC(locstr,heap) **vp, unsigned int ix, char *str)
 {
   if (ix < VEC_length (locstr, *vp))
     {
-      gcc_assert (VEC_index (locstr, *vp, ix) == 0);
-      VEC_replace (locstr, *vp, ix, str);
+      if (VEC_index (locstr, *vp, ix))
+       {
+         message_with_line (line_no, "repeated operand number %d", ix);
+         have_error = 1;
+       }
+      else
+        VEC_replace (locstr, *vp, ix, str);
     }
   else
     {
@@ -400,7 +406,6 @@ main (int argc, char **argv)
   struct code_ptr *link;
   const char *name;
   int insn_code_number;
-  int line_no;
 
   progname = "genextract";
 
@@ -424,6 +429,9 @@ main (int argc, char **argv)
        }
     }
 
+  if (have_error)
+    return FATAL_EXIT_CODE;
+
   print_header ();
 
   /* Write out code to handle peepholes and the insn_codes that it should