aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorJim Wilson <wilson@tuliptree.org>2005-11-23 01:40:55 +0000
committerJim Wilson <wilson@tuliptree.org>2005-11-23 01:40:55 +0000
commit6abae71cc383ccb6b03d472ebaf9f0d22107c382 (patch)
treec2fc4dfd5fa942e75fa9be551b46ee9eb60c42a4 /gas
parent6e572af0134ff5ec2c5d1956cb9d0ea0dcead947 (diff)
downloadgdb-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/ChangeLog5
-rw-r--r--gas/config/tc-ia64.c30
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);