diff options
author | Richard Henderson <rth@redhat.com> | 2007-03-07 10:13:29 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2007-03-07 10:13:29 -0800 |
commit | 7476f0866c606870ed338f64269b840da3bcb1e4 (patch) | |
tree | 9966163c9b3bfdf8faa218f12e89e2b2c8b20dd4 | |
parent | 1611915067138d5ab84a3225599281b68943172f (diff) | |
download | gcc-7476f0866c606870ed338f64269b840da3bcb1e4.zip gcc-7476f0866c606870ed338f64269b840da3bcb1e4.tar.gz gcc-7476f0866c606870ed338f64269b840da3bcb1e4.tar.bz2 |
re PR target/30848 (ICE with invalid constraint in asm statement)
PR target/30848
* reg-stack.c (emit_swap_insn): If a malformed asm was seen,
silently fix up the stack in the case of a missing register.
From-SVN: r122669
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/reg-stack.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr30848.c | 6 |
3 files changed, 23 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4f61c94..8712524 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-03-07 Richard Henderson <rth@redhat.com> + + PR target/30848 + * reg-stack.c (emit_swap_insn): If a malformed asm was seen, + silently fix up the stack in the case of a missing register. + 2007-03-07 Paul Brook <paul@codesourcery.com> * config/arm/libunwind.S: Add .arch/.object_arch for armv4 builds. diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index e6802b1..8413ca3 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -815,9 +815,19 @@ emit_swap_insn (rtx insn, stack regstack, rtx reg) hard_regno = get_hard_regnum (regstack, reg); - gcc_assert (hard_regno >= FIRST_STACK_REG); if (hard_regno == FIRST_STACK_REG) return; + if (hard_regno == -1) + { + /* Something failed if the register wasn't on the stack. If we had + malformed asms, we zapped the instruction itself, but that didn't + produce the same pattern of register sets as before. To prevent + further failure, adjust REGSTACK to include REG at TOP. */ + gcc_assert (any_malformed_asm); + regstack->reg[++regstack->top] = REGNO (reg); + return; + } + gcc_assert (hard_regno >= FIRST_STACK_REG); other_reg = regstack->top - (hard_regno - FIRST_STACK_REG); diff --git a/gcc/testsuite/gcc.target/i386/pr30848.c b/gcc/testsuite/gcc.target/i386/pr30848.c new file mode 100644 index 0000000..2a92851 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr30848.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ + +void foo(double d) +{ + __asm__ ("" : "=u" (d)); /* { dg-error "output regs" } */ +} |