On Tue, Nov 05, 2019 at 09:27:45AM +0100, Richard Biener wrote:
> > --- 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
> 
> so for error_mark_node we don't diagnose anything?

Yes, we should have diagnosed it already.  The != error_mark_node
I've added only after seeing tons of ICEs in the testsuite with earlier
version of the patch.

> > +     && (TREE_ADDRESSABLE (outtype)
> > +         || !COMPLETE_TYPE_P (outtype)
> > +         || (!tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype))
> > +             && max_int_size_in_bytes (outtype))))
> 
> so max_int_size_in_bytes == 0 is OK?  I suppose we have a testcase
> for this?

Actually, I meant max_int_size_in_bytes (outtype) < 0, i.e. something
on which force_constant_size ICE immediately, sorry for screwing it up in
the end.
All these VLAs with max_int_size_in_bytes >= 0 sizes are specific to Ada
and I have no idea what is and isn't valid there, for C/C++ it should
always return -1.

> Otherwise looks reasonable to me.

So, is the following ok if it passes bootstrap/regtest, or shall
I just go for || !tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype))) ?

2019-11-05  Jakub Jelinek  <ja...@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) < 0)))
        {
          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) < 0)))
        {
          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

Reply via email to