[PATCH] Reject VLAs in inline asm operands that require registers (PR inline-asm/92352)

Jakub Jelinek jakub@redhat.com
Tue Nov 5 07:39:00 GMT 2019


Hi!

On VLAs with register only constraints we ICE, because during gimplification
we try to create temporaries for them and force_constant_size aborts in that
case.

The following patch diagnoses those early, like we diagnose already C++
non-PODs.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2019-11-05  Jakub Jelinek  <jakub@redhat.com>

	PR inline-asm/92352
	* gimplify.c (gimplify_asm_expr): Reject VLA in output or input
	operands with non-memory constraints.

	* c-c++-common/pr92352.c: New test.

--- gcc/gimplify.c.jj	2019-11-02 10:00:59.595253274 +0100
+++ gcc/gimplify.c	2019-11-05 00:21:01.585958514 +0100
@@ -6235,8 +6235,14 @@ gimplify_asm_expr (tree *expr_p, gimple_
 	  is_inout = false;
 	}
 
-      /* If we can't make copies, we can only accept memory.  */
-      if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
+      /* If we can't make copies, we can only accept memory.
+	 Similarly for VLAs.  */
+      tree outtype = TREE_TYPE (TREE_VALUE (link));
+      if (outtype != error_mark_node
+	  && (TREE_ADDRESSABLE (outtype)
+	      || !COMPLETE_TYPE_P (outtype)
+	      || (!tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype))
+		  && max_int_size_in_bytes (outtype))))
 	{
 	  if (allows_mem)
 	    allows_reg = 0;
@@ -6392,7 +6398,12 @@ gimplify_asm_expr (tree *expr_p, gimple_
 			      oconstraints, &allows_mem, &allows_reg);
 
       /* If we can't make copies, we can only accept memory.  */
-      if (TREE_ADDRESSABLE (TREE_TYPE (TREE_VALUE (link))))
+      tree intype = TREE_TYPE (TREE_VALUE (link));
+      if (intype != error_mark_node
+	  && (TREE_ADDRESSABLE (intype)
+	      || !COMPLETE_TYPE_P (intype)
+	      || (!tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (intype))
+		  && max_int_size_in_bytes (intype))))
 	{
 	  if (allows_mem)
 	    allows_reg = 0;
--- gcc/testsuite/c-c++-common/pr92352.c.jj	2019-11-04 14:03:18.725275255 +0100
+++ gcc/testsuite/c-c++-common/pr92352.c	2019-11-04 14:02:55.211629675 +0100
@@ -0,0 +1,15 @@
+/* PR inline-asm/92352 */
+
+void
+foo (int x)
+{
+  int var[x];
+  asm volatile ("" : "+r" (var));	/* { dg-error "impossible constraint in 'asm'" } */
+}					/* { dg-error "non-memory output 0 must stay in memory" "" { target *-*-* } .-1 } */
+
+void
+bar (int x)
+{
+  int var[x];
+  asm volatile ("" : "+m" (var));
+}

	Jakub



More information about the Gcc-patches mailing list