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 PR67306


The following fixes ICEs due to the genmatch generated code for
GENERIC not verifying if builtin_decl_implicit returns non-NULL.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2015-08-25  Richard Biener  <rguenther@suse.de>

	PR middle-end/67306
	* genmatch.c (expr::gen_transform): Verify the result of
	builtin_decl_implicit.
	(dt_simplify::gen_1): Likewise.

Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c	(revision 227058)
+++ gcc/genmatch.c	(working copy)
@@ -2177,11 +2216,19 @@ expr::gen_transform (FILE *f, int indent
 	fprintf_indent (f, indent, "res = fold_build%d_loc (loc, %s, %s",
 			ops.length(), opr_name, type);
       else
-	fprintf_indent (f, indent, "res = build_call_expr_loc (loc, "
-			"builtin_decl_implicit (%s), %d", opr_name, ops.length());
+	{
+	  fprintf_indent (f, indent, "{\n");
+	  fprintf_indent (f, indent, "  tree decl = builtin_decl_implicit (%s);\n",
+			  opr_name);
+	  fprintf_indent (f, indent, "  if (!decl) return NULL_TREE;\n");
+	  fprintf_indent (f, indent, "  res = build_call_expr_loc (loc, "
+			  "decl, %d", ops.length());
+	}
       for (unsigned i = 0; i < ops.length (); ++i)
 	fprintf (f, ", ops%d[%u]", depth, i);
       fprintf (f, ");\n");
+      if (opr->kind != id_base::CODE)
+	fprintf_indent (f, indent, "}\n");
       if (*opr == CONVERT_EXPR)
 	{
 	  indent -= 2;
@@ -3069,13 +3147,24 @@ dt_simplify::gen_1 (FILE *f, int indent,
 				    *e->operation == CONVERT_EXPR
 				    ? "NOP_EXPR" : e->operation->id);
 		  else
-		    fprintf_indent (f, indent,
-				    "res = build_call_expr_loc "
-				    "(loc, builtin_decl_implicit (%s), %d",
-				    e->operation->id, e->ops.length());
+		    {
+		      fprintf_indent (f, indent,
+				      "{\n");
+		      fprintf_indent (f, indent,
+				      "  tree decl = builtin_decl_implicit (%s);\n",
+				      e->operation->id);
+		      fprintf_indent (f, indent,
+				      "  if (!decl) return NULL_TREE;\n");
+		      fprintf_indent (f, indent,
+				      "  res = build_call_expr_loc "
+				      "(loc, decl, %d",
+				      e->ops.length());
+		    }
 		  for (unsigned j = 0; j < e->ops.length (); ++j)
 		    fprintf (f, ", res_op%d", j);
 		  fprintf (f, ");\n");
+		  if (!is_a <operator_id *> (opr))
+		    fprintf_indent (f, indent, "}\n");
 		}
 	    }
 	}


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