From: Jim Wilson Date: Wed, 23 Nov 2005 01:40:55 +0000 (+0000) Subject: Fix PR 1889, infinite loop compiling code with bad user template. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6abae71cc383ccb6b03d472ebaf9f0d22107c382;p=binutils-gdb.git 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index f994538f42e..614dc785245 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2005-11-22 James E Wilson + + * config/tc-ia64.c (emit_one_bundle): Perform last_slot < 0 check + even when manual_bundling isn't set. + 2005-11-18 Jie Zhang * 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 0740f911966..699a64a7e23 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);