diff options
author | Richard Henderson <rth@redhat.com> | 2002-02-06 17:38:40 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-02-06 17:38:40 -0800 |
commit | edd1967d0c957ab48836fe0cc0128d012c6b6c6c (patch) | |
tree | 0dff9e44d22a2396c142a7018e5bd673b236bb05 | |
parent | 448f456d7a9043f135f13ea300f8ac124906adfe (diff) | |
download | gcc-edd1967d0c957ab48836fe0cc0128d012c6b6c6c.zip gcc-edd1967d0c957ab48836fe0cc0128d012c6b6c6c.tar.gz gcc-edd1967d0c957ab48836fe0cc0128d012c6b6c6c.tar.bz2 |
re PR c/5609 (ICE on named operands in inline assembler)
PR c/5609
* stmt.c (resolve_operand_name_1): Take more care with mixed
named and unnamed operands.
* gcc.dg/asm-4.c: Add case with an unnamed operand in the middle.
From-SVN: r49560
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/stmt.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/asm-4.c | 1 |
4 files changed, 25 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6b413d6..7560a0b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-02-06 Richard Henderson <rth@redhat.com> + + PR c/5609 + * stmt.c (resolve_operand_name_1): Take more care with mixed + named and unnamed operands. + 2002-02-06 Janis Johnson <janis187@us.ibm.com> Jan Hubicka <jh@suse.cz> @@ -2149,15 +2149,23 @@ resolve_operand_name_1 (p, outputs, inputs) /* Resolve the name to a number. */ for (op = 0, t = outputs; t ; t = TREE_CHAIN (t), op++) { - const char *c = IDENTIFIER_POINTER (TREE_PURPOSE (TREE_PURPOSE (t))); - if (strncmp (c, p + 1, len) == 0 && c[len] == '\0') - goto found; + tree id = TREE_PURPOSE (TREE_PURPOSE (t)); + if (id) + { + const char *c = IDENTIFIER_POINTER (id); + if (strncmp (c, p + 1, len) == 0 && c[len] == '\0') + goto found; + } } for (t = inputs; t ; t = TREE_CHAIN (t), op++) { - const char *c = IDENTIFIER_POINTER (TREE_PURPOSE (TREE_PURPOSE (t))); - if (strncmp (c, p + 1, len) == 0 && c[len] == '\0') - goto found; + tree id = TREE_PURPOSE (TREE_PURPOSE (t)); + if (id) + { + const char *c = IDENTIFIER_POINTER (id); + if (strncmp (c, p + 1, len) == 0 && c[len] == '\0') + goto found; + } } *q = '\0'; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 759f06c..a32e28e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-02-06 Richard Henderson <rth@redhat.com> + + * gcc.dg/asm-4.c: Add case with an unnamed operand in the middle. + 2002-02-06 Janis Johnson <janis187@us.ibm.com> * gcc.dg/20020206-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/asm-4.c b/gcc/testsuite/gcc.dg/asm-4.c index 862888a..0067598 100644 --- a/gcc/testsuite/gcc.dg/asm-4.c +++ b/gcc/testsuite/gcc.dg/asm-4.c @@ -8,6 +8,7 @@ int main() asm volatile ("test0 X%0Y%[arg]Z" : [arg] "=g" (x)); asm volatile ("test1 X%[out]Y%[in]Z" : [out] "=g" (y) : [in] "0"(y)); asm volatile ("test2 X%a0Y%a[arg]Z" : : [arg] "p" (&z)); + asm volatile ("test3 %[in]" : [inout] "=g"(x) : "[inout]" (x), [in] "g" (y)); } /* ??? Someone explain why the back reference dosn't work. */ |