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]

[PATCH] Fix arrays in rtx.u + add minor rtx verification


When implementing -fsanitize=bounds I noticed a whole slew of
errors about accessing u.fld[] field in rtx_def.  Turned out this
is indeed a bug, the array should have a size of 8; u.hwint[] array
had similar issue.  Thus fixed, plus I added some verification code
to genpreds.c (can't do it in gengenrtl.c as that doesn't include
rtl.h) so this won't happen again.

Verified that the bootstrap crashes by bootstrapping with changed
RTX_FLD_WIDTH/RTX_HWINT_WIDTH, otherwise the bootstrapp passes.

Ok for trunk?

2014-06-20  Marek Polacek  <polacek@redhat.com>

	* genpreds.c (verify_rtx_codes): New function.
	(main): Call it.
	* rtl.h (RTX_FLD_WIDTH, RTX_HWINT_WIDTH): Define.
	(struct rtx_def): Use them.

diff --git gcc/genpreds.c gcc/genpreds.c
index b14a4ac..3826757 100644
--- gcc/genpreds.c
+++ gcc/genpreds.c
@@ -1471,6 +1471,40 @@ parse_option (const char *opt)
     return 0;
 }
 
+/* Verify RTX codes.  We can't call fatal_error here, so call
+   gcc_unreachable after error to really abort.  */
+
+static void
+verify_rtx_codes (void)
+{
+  unsigned int i, j;
+
+  for (i = 0; i < NUM_RTX_CODE; i++)
+    if (strchr (GET_RTX_FORMAT (i), 'w') == NULL)
+      {
+	if (strlen (GET_RTX_FORMAT (i)) > RTX_FLD_WIDTH)
+	  {
+	    error ("insufficient size of RTX_FLD_WIDTH");
+	    gcc_unreachable ();
+	  }
+      }
+    else
+      {
+	const size_t len = strlen (GET_RTX_FORMAT (i));
+	for (j = 0; j < len; j++)
+	  if (GET_RTX_FORMAT (i)[j] != 'w')
+	    {
+	      error ("rtx format does not contain only hwint entries");
+	      gcc_unreachable ();
+	    }
+	if (len > RTX_HWINT_WIDTH)
+	  {
+	    error ("insufficient size of RTL_MAX_HWINT_WIDTH");
+	    gcc_unreachable ();
+	  }
+      }
+}
+
 /* Master control.  */
 int
 main (int argc, char **argv)
@@ -1518,5 +1552,7 @@ main (int argc, char **argv)
   if (have_error || ferror (stdout) || fflush (stdout) || fclose (stdout))
     return FATAL_EXIT_CODE;
 
+  verify_rtx_codes ();
+
   return SUCCESS_EXIT_CODE;
 }
diff --git gcc/rtl.h gcc/rtl.h
index 6ec91a8..3f2e774 100644
--- gcc/rtl.h
+++ gcc/rtl.h
@@ -264,6 +264,12 @@ struct GTY((variable_size)) hwivec_def {
 #define CWI_PUT_NUM_ELEM(RTX, NUM)					\
   (RTL_FLAG_CHECK1("CWI_PUT_NUM_ELEM", (RTX), CONST_WIDE_INT)->u2.num_elem = (NUM))
 
+/* The maximum number of entries in the FLD array in rtx.  */
+#define RTX_FLD_WIDTH 8
+
+/* The maximum number of entries in the HWINT array in rtx.  */
+#define RTX_HWINT_WIDTH (MAX (REAL_WIDTH, 3))
+
 /* RTL expression ("rtx").  */
 
 struct GTY((chain_next ("RTX_NEXT (&%h)"),
@@ -378,8 +384,8 @@ struct GTY((chain_next ("RTX_NEXT (&%h)"),
      The number of operands and their types are controlled
      by the `code' field, according to rtl.def.  */
   union u {
-    rtunion fld[1];
-    HOST_WIDE_INT hwint[1];
+    rtunion fld[RTX_FLD_WIDTH];
+    HOST_WIDE_INT hwint[RTX_HWINT_WIDTH];
     struct block_symbol block_sym;
     struct real_value rv;
     struct fixed_value fv;

	Marek


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