This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [4/13] .md-file enumerations: unified error tracking


Richard Sandiford <rdsandiford@googlemail.com> writes:
> "Joseph S. Myers" <joseph@codesourcery.com> writes:
>> This looks like a perfect candidate for __attribute__((format (printf, 2, 0)))
>> (maybe there are no calls with constant format string so this wouldn't end 
>> up checking anything, but that attribute should still be correct).
>>
>> (That would be ATTRIBUTE_PRINTF(2, 0) to support non-GNU build compilers.)
>
> Hmm, good point ;-)

OK, here's the patch with that stupidity fixed.  Tested as before.

Richard


gcc/
	* Makefile.in (build/read-md.o): Depend on errors.h.
	* read-md.h (error_with_line): Declare.
	* read-md.c: Include errors.h.
	(message_with_line_1): New function, extracted from...
	(message_with_line): ...here.
	(error_with_line): New function.
	* genattrtab.c: If a call to message_with_line is followed by
	"have_error = 1;", replace both statements with a call to
	error_with_line.
	* genoutput.c: Likewise.
	* genpreds.c: Likewise.
	* genrecog.c: If a call to message_with_line is followed by
	"error_count++;", replace both statements with a call to
	error_with_line.
	(errorcount): Delete.
	(main): Don't check it.
	* gensupport.c: If a call to message_with_line is followed by
	"errors = 1;", replace both statements with a call to error_with_line.
	(errors): Delete.
	(process_define_cond_exec): Check have_error instead of errors.
	(init_md_reader_args_cb): Likewise.  Don't set errors.

Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	2010-05-29 07:52:22.000000000 +0100
+++ gcc/Makefile.in	2010-05-29 07:53:14.000000000 +0100
@@ -3745,7 +3745,7 @@ build/min-insn-modes.o : min-insn-modes.
 build/print-rtl.o: print-rtl.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h	\
   $(GTM_H) $(RTL_BASE_H)
 build/read-md.o: read-md.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h		\
-  $(HASHTAB_H) $(READ_MD_H)
+  $(HASHTAB_H) errors.h $(READ_MD_H)
 build/read-rtl.o: read-rtl.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h	\
   $(GTM_H) $(RTL_BASE_H) $(OBSTACK_H) $(HASHTAB_H) $(READ_MD_H)		\
   gensupport.h
Index: gcc/read-md.h
===================================================================
--- gcc/read-md.h	2010-05-29 07:52:27.000000000 +0100
+++ gcc/read-md.h	2010-05-29 07:52:57.000000000 +0100
@@ -47,6 +47,7 @@ extern void print_md_ptr_loc (const void
 extern const char *join_c_conditions (const char *, const char *);
 extern void print_c_condition (const char *);
 extern void message_with_line (int, const char *, ...) ATTRIBUTE_PRINTF_2;
+extern void error_with_line (int, const char *, ...) ATTRIBUTE_PRINTF_2;
 extern void fatal_with_file_and_line (const char *, ...)
   ATTRIBUTE_PRINTF_1 ATTRIBUTE_NORETURN;
 extern void fatal_expected_char (int, int) ATTRIBUTE_NORETURN;
Index: gcc/read-md.c
===================================================================
--- gcc/read-md.c	2010-05-29 07:52:27.000000000 +0100
+++ gcc/read-md.c	2010-05-29 07:55:26.000000000 +0100
@@ -23,6 +23,7 @@ Software Foundation; either version 3, o
 #include "system.h"
 #include "coretypes.h"
 #include "hashtab.h"
+#include "errors.h"
 #include "read-md.h"
 
 /* Associates PTR (which can be a string, etc.) with the file location
@@ -174,6 +175,17 @@ print_c_condition (const char *cond)
     }
 }
 
+/* A vfprintf-like function for reporting an error against line LINENO
+   of the current MD file.  */
+
+static void ATTRIBUTE_PRINTF(2,0)
+message_with_line_1 (int lineno, const char *msg, va_list ap)
+{
+  fprintf (stderr, "%s:%d: ", read_md_filename, lineno);
+  vfprintf (stderr, msg, ap);
+  fputc ('\n', stderr);
+}
+
 /* A printf-like function for reporting an error against line LINENO
    in the current MD file.  */
 
@@ -183,12 +195,21 @@ message_with_line (int lineno, const cha
   va_list ap;
 
   va_start (ap, msg);
+  message_with_line_1 (lineno, msg, ap);
+  va_end (ap);
+}
 
-  fprintf (stderr, "%s:%d: ", read_md_filename, lineno);
-  vfprintf (stderr, msg, ap);
-  fputc ('\n', stderr);
+/* Like message_with_line, but treat the condition as an error.  */
+
+void
+error_with_line (int lineno, const char *msg, ...)
+{
+  va_list ap;
 
+  va_start (ap, msg);
+  message_with_line_1 (lineno, msg, ap);
   va_end (ap);
+  have_error = 1;
 }
 
 /* A printf-like function for reporting an error against the current
Index: gcc/genattrtab.c
===================================================================
--- gcc/genattrtab.c	2010-05-29 07:52:22.000000000 +0100
+++ gcc/genattrtab.c	2010-05-29 07:52:57.000000000 +0100
@@ -886,19 +886,17 @@ check_attr_value (rtx exp, struct attr_d
     case CONST_INT:
       if (attr && ! attr->is_numeric)
 	{
-	  message_with_line (attr->lineno,
-			     "CONST_INT not valid for non-numeric attribute %s",
-			     attr->name);
-	  have_error = 1;
+	  error_with_line (attr->lineno,
+			   "CONST_INT not valid for non-numeric attribute %s",
+			   attr->name);
 	  break;
 	}
 
       if (INTVAL (exp) < 0)
 	{
-	  message_with_line (attr->lineno,
-			     "negative numeric value specified for attribute %s",
-			     attr->name);
-	  have_error = 1;
+	  error_with_line (attr->lineno,
+			   "negative numeric value specified for attribute %s",
+			   attr->name);
 	  break;
 	}
       break;
@@ -913,10 +911,9 @@ check_attr_value (rtx exp, struct attr_d
 	  for (; *p; p++)
 	    if (! ISDIGIT (*p))
 	      {
-		message_with_line (attr ? attr->lineno : 0,
-				   "non-numeric value for numeric attribute %s",
-				   attr ? attr->name : "internal");
-		have_error = 1;
+		error_with_line (attr ? attr->lineno : 0,
+				 "non-numeric value for numeric attribute %s",
+				 attr ? attr->name : "internal");
 		break;
 	      }
 	  break;
@@ -928,12 +925,9 @@ check_attr_value (rtx exp, struct attr_d
 	  break;
 
       if (av == NULL)
-	{
-	  message_with_line (attr->lineno,
-			     "unknown value `%s' for `%s' attribute",
-			     XSTR (exp, 0), attr ? attr->name : "internal");
-	  have_error = 1;
-	}
+	error_with_line (attr->lineno,
+			 "unknown value `%s' for `%s' attribute",
+			 XSTR (exp, 0), attr ? attr->name : "internal");
       break;
 
     case IF_THEN_ELSE:
@@ -951,10 +945,9 @@ check_attr_value (rtx exp, struct attr_d
     case MOD:
       if (attr && !attr->is_numeric)
 	{
-	  message_with_line (attr->lineno,
-			     "invalid operation `%s' for non-numeric attribute value",
-			     GET_RTX_NAME (GET_CODE (exp)));
-	  have_error = 1;
+	  error_with_line (attr->lineno,
+			   "invalid operation `%s' for non-numeric"
+			   " attribute value", GET_RTX_NAME (GET_CODE (exp)));
 	  break;
 	}
       /* Fall through.  */
@@ -977,9 +970,8 @@ check_attr_value (rtx exp, struct attr_d
     case COND:
       if (XVECLEN (exp, 0) % 2 != 0)
 	{
-	  message_with_line (attr->lineno,
-			     "first operand of COND must have even length");
-	  have_error = 1;
+	  error_with_line (attr->lineno,
+			   "first operand of COND must have even length");
 	  break;
 	}
 
@@ -999,27 +991,18 @@ check_attr_value (rtx exp, struct attr_d
       {
 	struct attr_desc *attr2 = find_attr (&XSTR (exp, 0), 0);
 	if (attr2 == NULL)
-	  {
-	    message_with_line (attr ? attr->lineno : 0,
-			       "unknown attribute `%s' in ATTR",
-			       XSTR (exp, 0));
-	    have_error = 1;
-	  }
+	  error_with_line (attr ? attr->lineno : 0,
+			   "unknown attribute `%s' in ATTR",
+			   XSTR (exp, 0));
 	else if (attr && attr->is_const && ! attr2->is_const)
-	  {
-	    message_with_line (attr->lineno,
-		"non-constant attribute `%s' referenced from `%s'",
-		XSTR (exp, 0), attr->name);
-	    have_error = 1;
-	  }
+	  error_with_line (attr->lineno,
+			   "non-constant attribute `%s' referenced from `%s'",
+			   XSTR (exp, 0), attr->name);
 	else if (attr
 		 && attr->is_numeric != attr2->is_numeric)
-	  {
-	    message_with_line (attr->lineno,
-		"numeric attribute mismatch calling `%s' from `%s'",
-		XSTR (exp, 0), attr->name);
-	    have_error = 1;
-	  }
+	  error_with_line (attr->lineno,
+			   "numeric attribute mismatch calling `%s' from `%s'",
+			   XSTR (exp, 0), attr->name);
       }
       break;
 
@@ -1030,10 +1013,9 @@ check_attr_value (rtx exp, struct attr_d
       return attr_rtx (SYMBOL_REF, XSTR (exp, 0));
 
     default:
-      message_with_line (attr ? attr->lineno : 0,
-			 "invalid operation `%s' for attribute value",
-			 GET_RTX_NAME (GET_CODE (exp)));
-      have_error = 1;
+      error_with_line (attr ? attr->lineno : 0,
+		       "invalid operation `%s' for attribute value",
+		       GET_RTX_NAME (GET_CODE (exp)));
       break;
     }
 
@@ -1052,9 +1034,8 @@ convert_set_attr_alternative (rtx exp, s
 
   if (XVECLEN (exp, 1) != num_alt)
     {
-      message_with_line (id->lineno,
-			 "bad number of entries in SET_ATTR_ALTERNATIVE");
-      have_error = 1;
+      error_with_line (id->lineno,
+		       "bad number of entries in SET_ATTR_ALTERNATIVE");
       return NULL_RTX;
     }
 
@@ -1133,8 +1114,7 @@ check_defs (void)
 	    case SET:
 	      if (GET_CODE (XEXP (value, 0)) != ATTR)
 		{
-		  message_with_line (id->lineno, "bad attribute set");
-		  have_error = 1;
+		  error_with_line (id->lineno, "bad attribute set");
 		  value = NULL_RTX;
 		}
 	      break;
@@ -1148,9 +1128,8 @@ check_defs (void)
 	      break;
 
 	    default:
-	      message_with_line (id->lineno, "invalid attribute code %s",
-				 GET_RTX_NAME (GET_CODE (value)));
-	      have_error = 1;
+	      error_with_line (id->lineno, "invalid attribute code %s",
+			       GET_RTX_NAME (GET_CODE (value)));
 	      value = NULL_RTX;
 	    }
 	  if (value == NULL_RTX)
@@ -1158,9 +1137,8 @@ check_defs (void)
 
 	  if ((attr = find_attr (&XSTR (XEXP (value, 0), 0), 0)) == NULL)
 	    {
-	      message_with_line (id->lineno, "unknown attribute %s",
-				 XSTR (XEXP (value, 0), 0));
-	      have_error = 1;
+	      error_with_line (id->lineno, "unknown attribute %s",
+			       XSTR (XEXP (value, 0), 0));
 	      continue;
 	    }
 
@@ -2937,10 +2915,9 @@ gen_attr (rtx exp, int lineno)
   attr = find_attr (&XSTR (exp, 0), 1);
   if (attr->default_val)
     {
-      message_with_line (lineno, "duplicate definition for attribute %s",
-			 attr->name);
+      error_with_line (lineno, "duplicate definition for attribute %s",
+		       attr->name);
       message_with_line (attr->lineno, "previous definition");
-      have_error = 1;
       return;
     }
   attr->lineno = lineno;
@@ -2966,22 +2943,15 @@ gen_attr (rtx exp, int lineno)
     {
       attr->is_const = 1;
       if (attr->is_numeric)
-	{
-	  message_with_line (lineno,
-			     "constant attributes may not take numeric values");
-	  have_error = 1;
-	}
+	error_with_line (lineno,
+			 "constant attributes may not take numeric values");
 
       /* Get rid of the CONST node.  It is allowed only at top-level.  */
       XEXP (exp, 2) = XEXP (XEXP (exp, 2), 0);
     }
 
   if (! strcmp_check (attr->name, length_str) && ! attr->is_numeric)
-    {
-      message_with_line (lineno,
-			 "`length' attribute must take numeric values");
-      have_error = 1;
-    }
+    error_with_line (lineno, "`length' attribute must take numeric values");
 
   /* Set up the default value.  */
   XEXP (exp, 2) = check_attr_value (XEXP (exp, 2), attr);
@@ -3115,9 +3085,9 @@ gen_delay (rtx def, int lineno)
 
   if (XVECLEN (def, 1) % 3 != 0)
     {
-      message_with_line (lineno,
-			 "number of elements in DEFINE_DELAY must be multiple of three");
-      have_error = 1;
+      error_with_line (lineno,
+		       "number of elements in DEFINE_DELAY must"
+		       " be multiple of three");
       return;
     }
 
Index: gcc/genoutput.c
===================================================================
--- gcc/genoutput.c	2010-05-29 07:52:26.000000000 +0100
+++ gcc/genoutput.c	2010-05-29 07:52:57.000000000 +0100
@@ -446,17 +446,11 @@ scan_operands (struct data *d, rtx part,
 	max_opno = opno;
       if (max_opno >= MAX_MAX_OPERANDS)
 	{
-	  message_with_line (d->lineno,
-			     "maximum number of operands exceeded");
-	  have_error = 1;
+	  error_with_line (d->lineno, "maximum number of operands exceeded");
 	  return;
 	}
       if (d->operand[opno].seen)
-	{
-	  message_with_line (d->lineno,
-			     "repeated operand number %d\n", opno);
-	  have_error = 1;
-	}
+	error_with_line (d->lineno, "repeated operand number %d\n", opno);
 
       d->operand[opno].seen = 1;
       d->operand[opno].mode = GET_MODE (part);
@@ -475,17 +469,11 @@ scan_operands (struct data *d, rtx part,
 	max_opno = opno;
       if (max_opno >= MAX_MAX_OPERANDS)
 	{
-	  message_with_line (d->lineno,
-			     "maximum number of operands exceeded");
-	  have_error = 1;
+	  error_with_line (d->lineno, "maximum number of operands exceeded");
 	  return;
 	}
       if (d->operand[opno].seen)
-	{
-	  message_with_line (d->lineno,
-			     "repeated operand number %d\n", opno);
-	  have_error = 1;
-	}
+	error_with_line (d->lineno, "repeated operand number %d\n", opno);
 
       d->operand[opno].seen = 1;
       d->operand[opno].mode = GET_MODE (part);
@@ -505,17 +493,11 @@ scan_operands (struct data *d, rtx part,
 	max_opno = opno;
       if (max_opno >= MAX_MAX_OPERANDS)
 	{
-	  message_with_line (d->lineno,
-			     "maximum number of operands exceeded");
-	  have_error = 1;
+	  error_with_line (d->lineno, "maximum number of operands exceeded");
 	  return;
 	}
       if (d->operand[opno].seen)
-	{
-	  message_with_line (d->lineno,
-			     "repeated operand number %d\n", opno);
-	  have_error = 1;
-	}
+	error_with_line (d->lineno, "repeated operand number %d\n", opno);
 
       d->operand[opno].seen = 1;
       d->operand[opno].mode = GET_MODE (part);
@@ -717,11 +699,8 @@ process_template (struct data *d, const
 	message_with_line (d->lineno,
 			   "'@' is redundant for output template with single alternative");
       if (i != d->n_alternatives)
-	{
-	  message_with_line (d->lineno,
-			     "wrong number of alternatives in the output template");
-	  have_error = 1;
-	}
+	error_with_line (d->lineno,
+			 "wrong number of alternatives in the output template");
 
       printf ("};\n");
     }
@@ -770,11 +749,11 @@ validate_insn_alternatives (struct data
 
 	    if (len < 1 || (len > 1 && strchr (",#*+=&%!0123456789", c)))
 	      {
-		message_with_line (d->lineno,
-				   "invalid length %d for char '%c' in alternative %d of operand %d",
-				    len, c, which_alternative, start);
+		error_with_line (d->lineno,
+				 "invalid length %d for char '%c' in"
+				 " alternative %d of operand %d",
+				 len, c, which_alternative, start);
 		len = 1;
-		have_error = 1;
 	      }
 #endif
 
@@ -787,30 +766,28 @@ validate_insn_alternatives (struct data
 	    for (i = 1; i < len; i++)
 	      if (p[i] == '\0')
 		{
-		  message_with_line (d->lineno,
-				     "NUL in alternative %d of operand %d",
-				     which_alternative, start);
+		  error_with_line (d->lineno,
+				   "NUL in alternative %d of operand %d",
+				   which_alternative, start);
 		  alternative_count_unsure = 1;
 		  break;
 		}
 	      else if (strchr (",#*", p[i]))
 		{
-		  message_with_line (d->lineno,
-				     "'%c' in alternative %d of operand %d",
-				     p[i], which_alternative, start);
+		  error_with_line (d->lineno,
+				   "'%c' in alternative %d of operand %d",
+				   p[i], which_alternative, start);
 		  alternative_count_unsure = 1;
 		}
 	  }
-	if (alternative_count_unsure)
-	  have_error = 1;
-	else if (n == 0)
-	  n = d->operand[start].n_alternatives;
-	else if (n != d->operand[start].n_alternatives)
+	if (!alternative_count_unsure)
 	  {
-	    message_with_line (d->lineno,
+	    if (n == 0)
+	      n = d->operand[start].n_alternatives;
+	    else if (n != d->operand[start].n_alternatives)
+	      error_with_line (d->lineno,
 			       "wrong number of alternatives in operand %d",
 			       start);
-	    have_error = 1;
 	  }
       }
 
@@ -827,10 +804,7 @@ validate_insn_operands (struct data *d)
 
   for (i = 0; i < d->n_operands; ++i)
     if (d->operand[i].seen == 0)
-      {
-	message_with_line (d->lineno, "missing operand %d", i);
-	have_error = 1;
-      }
+      error_with_line (d->lineno, "missing operand %d", i);
 }
 
 static void
@@ -1148,13 +1122,12 @@ note_constraint (rtx exp, int lineno)
   if (strchr (indep_constraints, name[0]) && name[0] != 'm')
     {
       if (name[1] == '\0')
-	message_with_line (lineno, "constraint letter '%s' cannot be "
-			   "redefined by the machine description", name);
+	error_with_line (lineno, "constraint letter '%s' cannot be "
+			 "redefined by the machine description", name);
       else
-	message_with_line (lineno, "constraint name '%s' cannot be defined by "
-			   "the machine description, as it begins with '%c'",
-			   name, name[0]);
-      have_error = 1;
+	error_with_line (lineno, "constraint name '%s' cannot be defined by "
+			 "the machine description, as it begins with '%c'",
+			 name, name[0]);
       return;
     }
 
@@ -1171,25 +1144,22 @@ note_constraint (rtx exp, int lineno)
 
       if (!strcmp ((*iter)->name, name))
 	{
-	  message_with_line (lineno, "redefinition of constraint '%s'", name);
+	  error_with_line (lineno, "redefinition of constraint '%s'", name);
 	  message_with_line ((*iter)->lineno, "previous definition is here");
-	  have_error = 1;
 	  return;
 	}
       else if (!strncmp ((*iter)->name, name, (*iter)->namelen))
 	{
-	  message_with_line (lineno, "defining constraint '%s' here", name);
+	  error_with_line (lineno, "defining constraint '%s' here", name);
 	  message_with_line ((*iter)->lineno, "renders constraint '%s' "
 			     "(defined here) a prefix", (*iter)->name);
-	  have_error = 1;
 	  return;
 	}
       else if (!strncmp ((*iter)->name, name, namelen))
 	{
-	  message_with_line (lineno, "constraint '%s' is a prefix", name);
+	  error_with_line (lineno, "constraint '%s' is a prefix", name);
 	  message_with_line ((*iter)->lineno, "of constraint '%s' "
 			     "(defined here)", (*iter)->name);
-	  have_error = 1;
 	  return;
 	}
     }
@@ -1217,11 +1187,10 @@ mdep_constraint_len (const char *s, int
       if (!strncmp (s, p->name, p->namelen))
 	return p->namelen;
 
-  message_with_line (lineno,
-		     "error: undefined machine-specific constraint "
-		     "at this point: \"%s\"", s);
+  error_with_line (lineno,
+		   "error: undefined machine-specific constraint "
+		   "at this point: \"%s\"", s);
   message_with_line (lineno, "note:  in operand %d", opno);
-  have_error = 1;
   return 1; /* safe */
 }
 
Index: gcc/genpreds.c
===================================================================
--- gcc/genpreds.c	2010-05-29 07:52:26.000000000 +0100
+++ gcc/genpreds.c	2010-05-29 07:52:57.000000000 +0100
@@ -67,9 +67,8 @@ validate_exp (rtx exp, const char *name,
 	  {
 	    if (!ISDIGIT (*p) && !ISLOWER (*p))
 	      {
-		message_with_line (lineno, "%s: invalid character in path "
-				   "string '%s'", name, XSTR (exp, 1));
-		have_error = 1;
+		error_with_line (lineno, "%s: invalid character in path "
+				 "string '%s'", name, XSTR (exp, 1));
 		return true;
 	      }
 	  }
@@ -82,10 +81,9 @@ validate_exp (rtx exp, const char *name,
       return false;
 
     default:
-      message_with_line (lineno,
-			 "%s: cannot use '%s' in a predicate expression",
-			 name, GET_RTX_NAME (GET_CODE (exp)));
-      have_error = 1;
+      error_with_line (lineno,
+		       "%s: cannot use '%s' in a predicate expression",
+		       name, GET_RTX_NAME (GET_CODE (exp)));
       return true;
     }
 }
@@ -119,10 +117,9 @@ process_define_predicate (rtx defn, int
   return;
 
  bad_name:
-  message_with_line (lineno,
-		     "%s: predicate name must be a valid C function name",
-		     XSTR (defn, 0));
-  have_error = 1;
+  error_with_line (lineno,
+		   "%s: predicate name must be a valid C function name",
+		   XSTR (defn, 0));
   return;
 }
 
@@ -765,12 +762,11 @@ add_constraint (const char *name, const
   if (!ISALPHA (name[0]) && name[0] != '_')
     {
       if (name[1] == '\0')
-	message_with_line (lineno, "constraint name '%s' is not "
-			   "a letter or underscore", name);
+	error_with_line (lineno, "constraint name '%s' is not "
+			 "a letter or underscore", name);
       else
-	message_with_line (lineno, "constraint name '%s' does not begin "
-			   "with a letter or underscore", name);
-      have_error = 1;
+	error_with_line (lineno, "constraint name '%s' does not begin "
+			 "with a letter or underscore", name);
       return;
     }
   for (p = name; *p; p++)
@@ -780,11 +776,10 @@ add_constraint (const char *name, const
 	  need_mangled_name = true;
 	else
 	  {
-	    message_with_line (lineno,
-			       "constraint name '%s' must be composed of "
-			       "letters, digits, underscores, and "
-			       "angle brackets", name);
-	    have_error = 1;
+	    error_with_line (lineno,
+			     "constraint name '%s' must be composed of "
+			     "letters, digits, underscores, and "
+			     "angle brackets", name);
 	    return;
 	  }
       }
@@ -792,13 +787,12 @@ add_constraint (const char *name, const
   if (strchr (generic_constraint_letters, name[0]))
     {
       if (name[1] == '\0')
-	message_with_line (lineno, "constraint letter '%s' cannot be "
-			   "redefined by the machine description", name);
+	error_with_line (lineno, "constraint letter '%s' cannot be "
+			 "redefined by the machine description", name);
       else
-	message_with_line (lineno, "constraint name '%s' cannot be defined by "
-			   "the machine description, as it begins with '%c'",
-			   name, name[0]);
-      have_error = 1;
+	error_with_line (lineno, "constraint name '%s' cannot be defined by "
+			 "the machine description, as it begins with '%c'",
+			 name, name[0]);
       return;
     }
 
@@ -817,25 +811,22 @@ add_constraint (const char *name, const
 
       if (!strcmp ((*iter)->name, name))
 	{
-	  message_with_line (lineno, "redefinition of constraint '%s'", name);
+	  error_with_line (lineno, "redefinition of constraint '%s'", name);
 	  message_with_line ((*iter)->lineno, "previous definition is here");
-	  have_error = 1;
 	  return;
 	}
       else if (!strncmp ((*iter)->name, name, (*iter)->namelen))
 	{
-	  message_with_line (lineno, "defining constraint '%s' here", name);
+	  error_with_line (lineno, "defining constraint '%s' here", name);
 	  message_with_line ((*iter)->lineno, "renders constraint '%s' "
 			     "(defined here) a prefix", (*iter)->name);
-	  have_error = 1;
 	  return;
 	}
       else if (!strncmp ((*iter)->name, name, namelen))
 	{
-	  message_with_line (lineno, "constraint '%s' is a prefix", name);
+	  error_with_line (lineno, "constraint '%s' is a prefix", name);
 	  message_with_line ((*iter)->lineno, "of constraint '%s' "
 			     "(defined here)", (*iter)->name);
-	  have_error = 1;
 	  return;
 	}
     }
@@ -856,43 +847,36 @@ add_constraint (const char *name, const
 		     GET_RTX_NAME (appropriate_code)))
 	{
 	  if (name[1] == '\0')
-	    message_with_line (lineno, "constraint letter '%c' is reserved "
-			       "for %s constraints",
-			       name[0], GET_RTX_NAME (appropriate_code));
+	    error_with_line (lineno, "constraint letter '%c' is reserved "
+			     "for %s constraints",
+			     name[0], GET_RTX_NAME (appropriate_code));
 	  else
-	    message_with_line (lineno, "constraint names beginning with '%c' "
-			       "(%s) are reserved for %s constraints",
-			       name[0], name,
-			       GET_RTX_NAME (appropriate_code));
-
-	  have_error = 1;
+	    error_with_line (lineno, "constraint names beginning with '%c' "
+			     "(%s) are reserved for %s constraints",
+			     name[0], name, GET_RTX_NAME (appropriate_code));
 	  return;
 	}
 
       if (is_memory)
 	{
 	  if (name[1] == '\0')
-	    message_with_line (lineno, "constraint letter '%c' cannot be a "
-			       "memory constraint", name[0]);
+	    error_with_line (lineno, "constraint letter '%c' cannot be a "
+			     "memory constraint", name[0]);
 	  else
-	    message_with_line (lineno, "constraint name '%s' begins with '%c', "
-			       "and therefore cannot be a memory constraint",
-			       name, name[0]);
-
-	  have_error = 1;
+	    error_with_line (lineno, "constraint name '%s' begins with '%c', "
+			     "and therefore cannot be a memory constraint",
+			     name, name[0]);
 	  return;
 	}
       else if (is_address)
 	{
 	  if (name[1] == '\0')
-	    message_with_line (lineno, "constraint letter '%c' cannot be a "
-			       "memory constraint", name[0]);
+	    error_with_line (lineno, "constraint letter '%c' cannot be a "
+			     "memory constraint", name[0]);
 	  else
-	    message_with_line (lineno, "constraint name '%s' begins with '%c', "
-			       "and therefore cannot be a memory constraint",
-			       name, name[0]);
-
-	  have_error = 1;
+	    error_with_line (lineno, "constraint name '%s' begins with '%c', "
+			     "and therefore cannot be a memory constraint",
+			     name, name[0]);
 	  return;
 	}
     }
Index: gcc/genrecog.c
===================================================================
--- gcc/genrecog.c	2010-05-29 07:52:22.000000000 +0100
+++ gcc/genrecog.c	2010-05-29 07:52:57.000000000 +0100
@@ -170,9 +170,6 @@ #define IS_SPLIT(X) ((X) != RECOG)
 
 /* The line number of the start of the pattern currently being processed.  */
 static int pattern_lineno;
-
-/* Count of errors.  */
-static int error_count;
 
 /* Predicate handling.
 
@@ -289,8 +286,7 @@ compute_predicate_codes (rtx exp, char c
 
 	if (*next_code == '\0')
 	  {
-	    message_with_line (pattern_lineno, "empty match_code expression");
-	    error_count++;
+	    error_with_line (pattern_lineno, "empty match_code expression");
 	    break;
 	  }
 
@@ -309,9 +305,9 @@ compute_predicate_codes (rtx exp, char c
 		}
 	    if (!found_it)
 	      {
-		message_with_line (pattern_lineno, "match_code \"%.*s\" matches nothing",
-				   (int) n, code);
-		error_count ++;
+		error_with_line (pattern_lineno,
+				 "match_code \"%.*s\" matches nothing",
+				 (int) n, code);
 		for (i = 0; i < NUM_RTX_CODE; i++)
 		  if (!strncasecmp (code, GET_RTX_NAME (i), n)
 		      && GET_RTX_NAME (i)[n] == '\0'
@@ -333,10 +329,9 @@ compute_predicate_codes (rtx exp, char c
 	struct pred_data *p = lookup_predicate (XSTR (exp, 1));
 	if (!p)
 	  {
-	    message_with_line (pattern_lineno,
-			       "reference to unknown predicate '%s'",
-			       XSTR (exp, 1));
-	    error_count++;
+	    error_with_line (pattern_lineno,
+			     "reference to unknown predicate '%s'",
+			     XSTR (exp, 1));
 	    break;
 	  }
 	for (i = 0; i < NUM_RTX_CODE; i++)
@@ -351,10 +346,9 @@ compute_predicate_codes (rtx exp, char c
       break;
 
     default:
-      message_with_line (pattern_lineno,
-	 "'%s' cannot be used in a define_predicate expression",
-	 GET_RTX_NAME (GET_CODE (exp)));
-      error_count++;
+      error_with_line (pattern_lineno,
+		       "'%s' cannot be used in a define_predicate expression",
+		       GET_RTX_NAME (GET_CODE (exp)));
       memset (codes, I, NUM_RTX_CODE);
       break;
     }
@@ -634,12 +628,9 @@ validate_pattern (rtx pattern, rtx insn,
     case MATCH_OP_DUP:
     case MATCH_PAR_DUP:
       if (find_operand (insn, XINT (pattern, 0), pattern) == pattern)
-	{
-	  message_with_line (pattern_lineno,
-			     "operand %i duplicated before defined",
-			     XINT (pattern, 0));
-          error_count++;
-	}
+	error_with_line (pattern_lineno,
+			 "operand %i duplicated before defined",
+			 XINT (pattern, 0));
       break;
     case MATCH_OPERAND:
     case MATCH_OPERATOR:
@@ -695,20 +686,14 @@ validate_pattern (rtx pattern, rtx insn,
 			     && find_matching_operand (insn, XINT (pattern, 0)))
 		      ;
 		    else
-		      {
-			message_with_line (pattern_lineno,
-					   "operand %d missing in-out reload",
-					   XINT (pattern, 0));
-			error_count++;
-		      }
-		  }
-		else if (constraints0 != '=' && constraints0 != '+')
-		  {
-		    message_with_line (pattern_lineno,
-				       "operand %d missing output reload",
+		      error_with_line (pattern_lineno,
+				       "operand %d missing in-out reload",
 				       XINT (pattern, 0));
-		    error_count++;
 		  }
+		else if (constraints0 != '=' && constraints0 != '+')
+		  error_with_line (pattern_lineno,
+				   "operand %d missing output reload",
+				   XINT (pattern, 0));
 	      }
 	  }
 
@@ -782,12 +767,9 @@ validate_pattern (rtx pattern, rtx insn,
         /* The operands of a SET must have the same mode unless one
 	   is VOIDmode.  */
         else if (dmode != VOIDmode && smode != VOIDmode && dmode != smode)
-	  {
-	    message_with_line (pattern_lineno,
-			       "mode mismatch in set: %smode vs %smode",
-			       GET_MODE_NAME (dmode), GET_MODE_NAME (smode));
-	    error_count++;
-	  }
+	  error_with_line (pattern_lineno,
+			   "mode mismatch in set: %smode vs %smode",
+			   GET_MODE_NAME (dmode), GET_MODE_NAME (smode));
 
 	/* If only one of the operands is VOIDmode, and PC or CC0 is
 	   not involved, it's probably a mistake.  */
@@ -828,12 +810,9 @@ validate_pattern (rtx pattern, rtx insn,
 
     case LABEL_REF:
       if (GET_MODE (XEXP (pattern, 0)) != VOIDmode)
-	{
-	  message_with_line (pattern_lineno,
-			     "operand to label_ref %smode not VOIDmode",
-			     GET_MODE_NAME (GET_MODE (XEXP (pattern, 0))));
-	  error_count++;
-	}
+	error_with_line (pattern_lineno,
+			 "operand to label_ref %smode not VOIDmode",
+			 GET_MODE_NAME (GET_MODE (XEXP (pattern, 0))));
       break;
 
     default:
@@ -1494,12 +1473,11 @@ merge_accept_insn (struct decision *oldd
     }
   else
     {
-      message_with_line (add->u.insn.lineno, "`%s' matches `%s'",
-			 get_insn_name (add->u.insn.code_number),
-			 get_insn_name (old->u.insn.code_number));
+      error_with_line (add->u.insn.lineno, "`%s' matches `%s'",
+		       get_insn_name (add->u.insn.code_number),
+		       get_insn_name (old->u.insn.code_number));
       message_with_line (old->u.insn.lineno, "previous definition of `%s'",
 			 get_insn_name (old->u.insn.code_number));
-      error_count++;
     }
 }
 
@@ -2771,7 +2749,7 @@ main (int argc, char **argv)
 	}
     }
 
-  if (error_count || have_error)
+  if (have_error)
     return FATAL_EXIT_CODE;
 
   puts ("\n\n");
Index: gcc/gensupport.c
===================================================================
--- gcc/gensupport.c	2010-05-29 07:52:27.000000000 +0100
+++ gcc/gensupport.c	2010-05-29 07:52:57.000000000 +0100
@@ -45,7 +45,6 @@ void (*include_callback) (const char *);
 struct obstack *rtl_obstack = &obstack;
 
 static int sequence_num;
-static int errors;
 
 static int predicable_default;
 static const char *predicable_true;
@@ -222,8 +221,7 @@ process_include (rtx desc, int lineno)
   if (input_file == NULL)
     {
       free (pathname);
-      message_with_line (lineno, "include file `%s' not found", filename);
-      errors = 1;
+      error_with_line (lineno, "include file `%s' not found", filename);
       return;
     }
  success:
@@ -369,9 +367,8 @@ is_predicable (struct queue_elem *elem)
 	case SET_ATTR_ALTERNATIVE:
 	  if (strcmp (XSTR (sub, 0), "predicable") == 0)
 	    {
-	      message_with_line (elem->lineno,
-				 "multiple alternatives for `predicable'");
-	      errors = 1;
+	      error_with_line (elem->lineno,
+			       "multiple alternatives for `predicable'");
 	      return 0;
 	    }
 	  break;
@@ -390,9 +387,8 @@ is_predicable (struct queue_elem *elem)
 	  /* ??? It would be possible to handle this if we really tried.
 	     It's not easy though, and I'm not going to bother until it
 	     really proves necessary.  */
-	  message_with_line (elem->lineno,
-			     "non-constant value for `predicable'");
-	  errors = 1;
+	  error_with_line (elem->lineno,
+			   "non-constant value for `predicable'");
 	  return 0;
 
 	default:
@@ -409,9 +405,7 @@ is_predicable (struct queue_elem *elem)
      to do this.  Delay this until we've got the basics solid.  */
   if (strchr (value, ',') != NULL)
     {
-      message_with_line (elem->lineno,
-			 "multiple alternatives for `predicable'");
-      errors = 1;
+      error_with_line (elem->lineno, "multiple alternatives for `predicable'");
       return 0;
     }
 
@@ -421,10 +415,8 @@ is_predicable (struct queue_elem *elem)
   if (strcmp (value, predicable_false) == 0)
     return 0;
 
-  message_with_line (elem->lineno,
-		     "unknown value `%s' for `predicable' attribute",
-		     value);
-  errors = 1;
+  error_with_line (elem->lineno,
+		   "unknown value `%s' for `predicable' attribute", value);
   return 0;
 }
 
@@ -443,9 +435,8 @@ identify_predicable_attribute (void)
     if (strcmp (XSTR (elem->data, 0), "predicable") == 0)
       goto found;
 
-  message_with_line (define_cond_exec_queue->lineno,
-		     "attribute `predicable' not defined");
-  errors = 1;
+  error_with_line (define_cond_exec_queue->lineno,
+		   "attribute `predicable' not defined");
   return;
 
  found:
@@ -454,9 +445,7 @@ identify_predicable_attribute (void)
   p_true = strchr (p_false, ',');
   if (p_true == NULL || strchr (++p_true, ',') != NULL)
     {
-      message_with_line (elem->lineno,
-			 "attribute `predicable' is not a boolean");
-      errors = 1;
+      error_with_line (elem->lineno, "attribute `predicable' is not a boolean");
       if (p_false)
         free (p_false);
       return;
@@ -473,17 +462,14 @@ identify_predicable_attribute (void)
       break;
 
     case CONST:
-      message_with_line (elem->lineno,
-			 "attribute `predicable' cannot be const");
-      errors = 1;
+      error_with_line (elem->lineno, "attribute `predicable' cannot be const");
       if (p_false)
 	free (p_false);
       return;
 
     default:
-      message_with_line (elem->lineno,
-			 "attribute `predicable' must have a constant default");
-      errors = 1;
+      error_with_line (elem->lineno,
+		       "attribute `predicable' must have a constant default");
       if (p_false)
 	free (p_false);
       return;
@@ -495,10 +481,8 @@ identify_predicable_attribute (void)
     predicable_default = 0;
   else
     {
-      message_with_line (elem->lineno,
-			 "unknown value `%s' for `predicable' attribute",
-			 value);
-      errors = 1;
+      error_with_line (elem->lineno,
+		       "unknown value `%s' for `predicable' attribute", value);
       if (p_false)
 	free (p_false);
     }
@@ -592,10 +576,8 @@ alter_predicate_for_insn (rtx pattern, i
 
 	if (n_alternatives (c) != 1)
 	  {
-	    message_with_line (lineno,
-			       "too many alternatives for operand %d",
-			       XINT (pattern, 0));
-	    errors = 1;
+	    error_with_line (lineno, "too many alternatives for operand %d",
+			     XINT (pattern, 0));
 	    return NULL;
 	  }
 
@@ -783,9 +765,7 @@ process_one_cond_exec (struct queue_elem
 
       if (XVECLEN (ce_elem->data, 0) != 1)
 	{
-	  message_with_line (ce_elem->lineno,
-			     "too many patterns in predicate");
-	  errors = 1;
+	  error_with_line (ce_elem->lineno, "too many patterns in predicate");
 	  return;
 	}
 
@@ -882,7 +862,7 @@ process_define_cond_exec (void)
   struct queue_elem *elem;
 
   identify_predicable_attribute ();
-  if (errors)
+  if (have_error)
     return;
 
   for (elem = define_cond_exec_queue; elem ; elem = elem->next)
@@ -972,7 +952,6 @@ init_md_reader_args_cb (int argc, char *
   condition_table = htab_create (500, hash_c_test, cmp_c_test, NULL);
   init_predicate_table ();
   obstack_init (rtl_obstack);
-  errors = 0;
   sequence_num = 0;
   no_more_options = false;
   already_read_stdin = false;
@@ -1052,7 +1031,7 @@ init_md_reader_args_cb (int argc, char *
   if (define_cond_exec_queue != NULL)
     process_define_cond_exec ();
 
-  return errors ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;
+  return have_error ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;
 }
 
 /* Programs that don't have their own options can use this entry point


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]