diff options
author | Jim Wilson <wilson@tuliptree.org> | 2005-11-23 01:40:55 +0000 |
---|---|---|
committer | Jim Wilson <wilson@tuliptree.org> | 2005-11-23 01:40:55 +0000 |
commit | 6abae71cc383ccb6b03d472ebaf9f0d22107c382 (patch) | |
tree | c2fc4dfd5fa942e75fa9be551b46ee9eb60c42a4 /gas | |
parent | 6e572af0134ff5ec2c5d1956cb9d0ea0dcead947 (diff) | |
download | gdb-6abae71cc383ccb6b03d472ebaf9f0d22107c382.zip gdb-6abae71cc383ccb6b03d472ebaf9f0d22107c382.tar.gz gdb-6abae71cc383ccb6b03d472ebaf9f0d22107c382.tar.bz2 |
Fix PR 1889, infinite loop compiling code with bad user template.
* config/tc-ia64.c (emit_one_bundle): Perform last_slot < 0 check
even when manual_bundling isn't set.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-ia64.c | 30 |
2 files changed, 22 insertions, 13 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index f994538..614dc78 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2005-11-22 James E Wilson <wilson@specifix.com> + + * config/tc-ia64.c (emit_one_bundle): Perform last_slot < 0 check + even when manual_bundling isn't set. + 2005-11-18 Jie Zhang <jie.zhang@analog.com> * config/bfin-defs.h (IS_BREG, IS_LREG): New macros. diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index 0740f91..699a64a 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -7084,25 +7084,28 @@ emit_one_bundle () curr = (curr + 1) % NUM_SLOTS; idesc = md.slot[curr].idesc; } - if (manual_bundling > 0) + + /* A user template was specified, but the first following instruction did + not fit. This can happen with or without manual bundling. */ + if (md.num_slots_in_use > 0 && last_slot < 0) + { + as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line, + "`%s' does not fit into %s template", + idesc->name, ia64_templ_desc[template].name); + /* Drop first insn so we don't livelock. */ + --md.num_slots_in_use; + know (curr == first); + ia64_free_opcode (md.slot[curr].idesc); + memset (md.slot + curr, 0, sizeof (md.slot[curr])); + md.slot[curr].user_template = -1; + } + else if (manual_bundling > 0) { if (md.num_slots_in_use > 0) { if (last_slot >= 2) as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line, "`%s' does not fit into bundle", idesc->name); - else if (last_slot < 0) - { - as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line, - "`%s' does not fit into %s template", - idesc->name, ia64_templ_desc[template].name); - /* Drop first insn so we don't livelock. */ - --md.num_slots_in_use; - know (curr == first); - ia64_free_opcode (md.slot[curr].idesc); - memset (md.slot + curr, 0, sizeof (md.slot[curr])); - md.slot[curr].user_template = -1; - } else { const char *where; @@ -7122,6 +7125,7 @@ emit_one_bundle () as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line, "Missing '}' at end of file"); } + know (md.num_slots_in_use < NUM_SLOTS); t0 = end_of_insn_group | (template << 1) | (insn[0] << 5) | (insn[1] << 46); |