This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
>>> James E Wilson <wilson@specifixinc.com> 24.05.05 21:15:42 >>> >On Mon, 2005-05-23 at 00:56, Jan Beulich wrote: >> * config/tc-ia64.c (emit_one_bundle): Check all in-use slots for >> first with non-NULL unwind_record. > >This one took a little thought, as you didn't mention what exactly was >wrong. The problem would be that if the next slot has no unwind record, >and some following slot does, then end_ptr is NULL, and we accidentally >initialize all unwind records, instead of those just belonging to the >current instruction. So we have to search for the next insn with unwind >info to set end_ptr. > >This code fragment occurs twice, and the second one is still wrong. >That one is harmless though, since we don't remove unwind records from >the list, and hence we just end up initializing them multiple times. >For consistency, we should either fix this one also, or else add a >comment explaining why it is OK for it to be wrong. The existing >comment is actually wrong here, which adds to the possible confusion. I didn't apply this, yet. Instead, I'd like to apply the following revised patch. However, I didn't change the comment you said was wrong, because I didn't understand what you think is wrong with it. Jan gas/ 2005-05-25 Jan Beulich <jbeulich@novell.com> * config/tc-ia64.c (emit_one_bundle): Restrict scope of ptr, end_ptr, and last_ptr. Check all in-use slots for first one with non-NULL unwind_record. Don't reload end_ptr before second update round. --- /home/jbeulich/src/binutils/mainline/2005-05-18/gas/config/tc-ia64.c 2005-05-09 08:31:38.000000000 +0200 +++ 2005-05-18/gas/config/tc-ia64.c 2005-05-25 09:58:37.662626368 +0200 @@ -6479,7 +6479,6 @@ emit_one_bundle () struct ia64_opcode *idesc; int end_of_insn_group = 0, user_template = -1; int n, i, j, first, curr, last_slot; - unw_rec_list *ptr, *last_ptr, *end_ptr; bfd_vma t0 = 0, t1 = 0; struct label_fix *lfix; struct insn_fix *ifix; @@ -6534,7 +6533,9 @@ emit_one_bundle () for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i) { /* If we have unwind records, we may need to update some now. */ - ptr = md.slot[curr].unwind_record; + unw_rec_list *ptr = md.slot[curr].unwind_record; + unw_rec_list *end_ptr = NULL; + if (ptr) { /* Find the last prologue/body record in the list for the current @@ -6544,9 +6545,11 @@ emit_one_bundle () issued. This matters because there may have been nops emitted meanwhile. Any non-prologue non-body record followed by a prologue/body record must also refer to the current point. */ - last_ptr = NULL; - end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record; - for (; ptr != end_ptr; ptr = ptr->next) + unw_rec_list *last_ptr; + + for (j = 1; end_ptr == NULL && j < md.num_slots_in_use; ++j) + end_ptr = md.slot[(curr + j) % NUM_SLOTS].unwind_record; + for (last_ptr = NULL; ptr != end_ptr; ptr = ptr->next) if (ptr->r.type == prologue || ptr->r.type == prologue_gr || ptr->r.type == body) last_ptr = ptr; @@ -6814,7 +6817,6 @@ emit_one_bundle () /* Set slot numbers for all remaining unwind records belonging to the current insn. There can not be any prologue/body unwind records here. */ - end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record; for (; ptr != end_ptr; ptr = ptr->next) { ptr->slot_number = (unsigned long) f + i;
Attachment:
binutils-mainline-ia64-unwind-assoc.patch
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |