]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Bail out early during gimplify_asm_expr [PR121391]
authorStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Mon, 15 Sep 2025 07:10:53 +0000 (09:10 +0200)
committerStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Mon, 15 Sep 2025 07:10:53 +0000 (09:10 +0200)
In case an asm operand is an error node, constraints etc. are still
validated.  Furthermore, all other operands are gimplified, although an
error is returned in the end anyway.  For hard register constraints an
operand is required in order to determine the mode from which the number
of registers follows.  Therefore, instead of adding extra guards, bail
out early.

gcc/ChangeLog:

PR middle-end/121391
* gimplify.cc (gimplify_asm_expr): In case an asm operand is an
error node, bail out early.

gcc/testsuite/ChangeLog:

* gcc.dg/pr121391-1.c: New test.
* gcc.dg/pr121391-2.c: New test.

gcc/gimplify.cc
gcc/testsuite/gcc.dg/pr121391-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr121391-2.c [new file with mode: 0644]

index ca1fa2189cb90b9428fa1e2bca2a03cc1e292e96..90096835665186e162e8dd928c764259a0762ddc 100644 (file)
@@ -7930,6 +7930,8 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
       bool ok;
       size_t constraint_len;
 
+      if (error_operand_p (TREE_VALUE (link)))
+       return GS_ERROR;
       link_next = TREE_CHAIN (link);
 
       oconstraints[i]
@@ -7951,10 +7953,9 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
       /* 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))))
+      if (TREE_ADDRESSABLE (outtype)
+         || !COMPLETE_TYPE_P (outtype)
+         || !tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (outtype)))
        {
          if (allows_mem)
            allows_reg = 0;
@@ -8155,6 +8156,8 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
   int input_num = 0;
   for (link = ASM_INPUTS (expr); link; ++input_num, ++i, link = link_next)
     {
+      if (error_operand_p (TREE_VALUE (link)))
+       return GS_ERROR;
       link_next = TREE_CHAIN (link);
       constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
       reg_info.operand = TREE_VALUE (link);
@@ -8169,10 +8172,9 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
 
       /* If we can't make copies, we can only accept memory.  */
       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))))
+      if (TREE_ADDRESSABLE (intype)
+         || !COMPLETE_TYPE_P (intype)
+         || !tree_fits_poly_uint64_p (TYPE_SIZE_UNIT (intype)))
        {
          if (allows_mem)
            allows_reg = 0;
diff --git a/gcc/testsuite/gcc.dg/pr121391-1.c b/gcc/testsuite/gcc.dg/pr121391-1.c
new file mode 100644 (file)
index 0000000..6a01521
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile { target aarch64*-*-* arm*-*-* powerpc*-*-* s390*-*-* x86_64-*-* } } */
+
+/* For the non existing variable we are faced with an error mark node during
+   gimplify_asm_expr().  */
+
+void test (void)
+{
+  __asm__ __volatile__ ("" : "={2}" (non_existing_var)); /* { dg-error {'non_existing_var' undeclared} } */
+}
diff --git a/gcc/testsuite/gcc.dg/pr121391-2.c b/gcc/testsuite/gcc.dg/pr121391-2.c
new file mode 100644 (file)
index 0000000..c03f0ab
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile { target aarch64*-*-* arm*-*-* powerpc*-*-* s390*-*-* x86_64-*-* } } */
+
+/* For the non existing variable we are faced with an error mark node during
+   gimplify_asm_expr().  */
+
+void test (void)
+{
+  __asm__ __volatile__ ("" :: "{2}" (non_existing_var)); /* { dg-error {'non_existing_var' undeclared} } */
+}