OSDN Git Service

2009-04-08 Paolo Bonzini <bonzini@gnu.org>
authorbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Apr 2009 15:00:34 +0000 (15:00 +0000)
committerbonzini <bonzini@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Apr 2009 15:00:34 +0000 (15:00 +0000)
* genoutput.c (validate_optab_operands): New.
(gen_insn, gen_expand): Call it.

* genflags.c (gen_insn): Detect misused iterators.
(main): Pass line_no to gen_insn, exit with status 1 on error.

* genextract.c (line_no): Make global.
(VEC_safe_set_locstr): Change assertion to error message.
(main): Exit with status 1 on error.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@145746 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/genextract.c
gcc/genflags.c
gcc/genoutput.c

index c78d212..4f3d18d 100644 (file)
@@ -1,3 +1,15 @@
+2009-04-08  Paolo Bonzini  <bonzini@gnu.org>
+
+       * genoutput.c (validate_optab_operands): New.
+       (gen_insn, gen_expand): Call it.
+
+       * genflags.c (gen_insn): Detect misused iterators.
+       (main): Pass line_no to gen_insn, exit with status 1 on error.
+
+       * genextract.c (line_no): Make global.
+       (VEC_safe_set_locstr): Change assertion to error message.
+       (main): Exit with status 1 on error.
+
 2009-04-08  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/39614
index c983110..c414891 100644 (file)
@@ -80,6 +80,8 @@ struct accum_extract
   VEC(char,heap)   *pathstr;
 };
 
+int line_no;
+
 /* Forward declarations.  */
 static void walk_rtx (rtx, struct accum_extract *);
 
@@ -187,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
     {
@@ -399,7 +406,6 @@ main (int argc, char **argv)
   struct code_ptr *link;
   const char *name;
   int insn_code_number;
-  int line_no;
 
   progname = "genextract";
 
@@ -423,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
index b2c878d..5364101 100644 (file)
@@ -43,7 +43,7 @@ static void max_operand_1 (rtx);
 static int num_operands (rtx);
 static void gen_proto (rtx);
 static void gen_macro (const char *, int, int);
-static void gen_insn (rtx);
+static void gen_insn (int, rtx);
 
 /* Count the number of match_operand's found.  */
 
@@ -187,13 +187,32 @@ gen_proto (rtx insn)
 }
 
 static void
-gen_insn (rtx insn)
+gen_insn (int line_no, rtx insn)
 {
   const char *name = XSTR (insn, 0);
   const char *p;
+  const char *lt, *gt;
   int len;
   int truth = maybe_eval_c_test (XSTR (insn, 2));
 
+  lt = strchr (name, '<'); 
+  if (lt && strchr (lt + 1, '>'))
+    {
+      message_with_line (line_no, "unresolved iterator");
+      have_error = 1;
+      return;
+    }
+
+  gt = strchr (name, '>'); 
+  if (lt || gt)
+    {
+      message_with_line (line_no,
+                        "unmatched angle brackets, likely "
+                        "an error in iterator syntax");
+      have_error = 1;
+      return;
+    }
+
   /* Don't mention instructions whose names are the null string
      or begin with '*'.  They are in the machine description just
      to be recognized.  */
@@ -260,7 +279,7 @@ main (int argc, char **argv)
       if (desc == NULL)
        break;
       if (GET_CODE (desc) == DEFINE_INSN || GET_CODE (desc) == DEFINE_EXPAND)
-       gen_insn (desc);
+       gen_insn (line_no, desc);
     }
 
   /* Print out the prototypes now.  */
@@ -273,7 +292,7 @@ main (int argc, char **argv)
 
   puts("\n#endif /* GCC_INSN_FLAGS_H */");
 
-  if (ferror (stdout) || fflush (stdout) || fclose (stdout))
+  if (have_error || ferror (stdout) || fflush (stdout) || fclose (stdout))
     return FATAL_EXIT_CODE;
 
   return SUCCESS_EXIT_CODE;
index 39fc590..e651cb4 100644 (file)
@@ -830,6 +830,22 @@ validate_insn_operands (struct data *d)
        have_error = 1;
       }
 }
+
+static void
+validate_optab_operands (struct data *d)
+{
+  if (!d->name || d->name[0] == '\0' || d->name[0] == '*')
+    return;
+
+  /* Miscellaneous tests.  */
+  if (strncmp (d->name, "cstore", 6) == 0
+      && d->name[strlen (d->name) - 1] == '4'
+      && d->operand[0].mode == VOIDmode)
+    {
+      message_with_line (d->lineno, "missing mode for operand 0 of cstore");
+      have_error = 1;
+    }
+}
 \f
 /* Look at a define_insn just read.  Assign its code number.  Record
    on idata the template and the number of arguments.  If the insn has
@@ -871,6 +887,7 @@ gen_insn (rtx insn, int lineno)
 #endif
   validate_insn_operands (d);
   validate_insn_alternatives (d);
+  validate_optab_operands (d);
   place_operands (d);
   process_template (d, XTMPL (insn, 3));
 }
@@ -956,6 +973,7 @@ gen_expand (rtx insn, int lineno)
   d->output_format = INSN_OUTPUT_FORMAT_NONE;
 
   validate_insn_alternatives (d);
+  validate_optab_operands (d);
   place_operands (d);
 }
 \f