Bootstrapped and regtested on x86_64 and s390. Ok for mainline? -- >8 --
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 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 | 4 ++++ gcc/testsuite/gcc.dg/pr121391-1.c | 9 +++++++++ gcc/testsuite/gcc.dg/pr121391-2.c | 9 +++++++++ 3 files changed, 22 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr121391-1.c create mode 100644 gcc/testsuite/gcc.dg/pr121391-2.c diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index ca1fa2189cb..2b790923fa1 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -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 (TREE_VALUE (link) == error_mark_node) + return GS_ERROR; link_next = TREE_CHAIN (link); oconstraints[i] @@ -8155,6 +8157,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 (TREE_VALUE (link) == error_mark_node) + return GS_ERROR; link_next = TREE_CHAIN (link); constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link))); reg_info.operand = TREE_VALUE (link); diff --git a/gcc/testsuite/gcc.dg/pr121391-1.c b/gcc/testsuite/gcc.dg/pr121391-1.c new file mode 100644 index 00000000000..6a015210ef9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr121391-1.c @@ -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 index 00000000000..c03f0ab283b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr121391-2.c @@ -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} } */ +} -- 2.49.0