From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13991 invoked by alias); 3 May 2005 16:45:17 -0000 Mailing-List: contact binutils-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sources.redhat.com Received: (qmail 12401 invoked from network); 3 May 2005 16:43:55 -0000 Received: from unknown (HELO gizmo07ps.bigpond.com) (144.140.71.42) by sourceware.org with SMTP; 3 May 2005 16:43:55 -0000 Received: (qmail 3218 invoked from network); 3 May 2005 16:43:52 -0000 Received: from unknown (HELO psmam12.bigpond.com) (144.135.25.103) by gizmo07ps.bigpond.com with SMTP; 3 May 2005 16:43:52 -0000 Received: from cpe-144-136-221-26.sa.bigpond.net.au ([144.136.221.26]) by psmam12.bigpond.com(MAM REL_3_4_2a 234/28903043) with SMTP id 28903043; Wed, 04 May 2005 02:43:52 +1000 Received: by bubble.grove.modra.org (Postfix, from userid 500) id 6AC051A928D; Wed, 4 May 2005 02:13:52 +0930 Date: Tue, 03 May 2005 17:07:00 -0000 From: Alan Modra To: Nick Clifton , binutils@sources.redhat.com Subject: Re: Fixup references to bfd_section_list... macros Message-ID: <20050503164352.GS9133@bubble.grove.modra.org> Mail-Followup-To: Nick Clifton , binutils@sources.redhat.com References: <20050503124443.GQ9133@bubble.grove.modra.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20050503124443.GQ9133@bubble.grove.modra.org> User-Agent: Mutt/1.4i X-SW-Source: 2005-05/txt/msg00071.txt.bz2 This fixes all the problems I found. Not clearing s->next in bfd_section_list_remove makes list traversal nicer, and fixes a bug introduced to _bfd_mips_elf_final_link and _bfd_xcoff_bfd_final_link. bfd_section_list_prepend is needed because calling bfd_section_list_insert_before (abfd, abfd->sections, s) doesn't work when abfd->sections is NULL, which may well happen in obj-ecoff.c. bfd/ * section.c (bfd_section_list_remove): Don't clear s->next. (bfd_section_list_append): Always init s->prev. (bfd_section_list_prepend): Define. (bfd_section_list_insert_after): Minor optimization. (bfd_section_removed_from_list): Rewrite. * elf.c (assign_section_numbers): Simplify list traversal now that bfd_section_list_remove doesn't destroy removed section next ptr. * sunos.c (sunos_add_dynamic_symbols): Likewise. * elfxx-ia64.c (elfNN_ia64_object_p): Use bfd_section_list_prepend. * xcofflink.c (_bfd_xcoff_bfd_final_link): Simplify list traversal. * bfd-in2.h: Regenerate. gas/ * config/obj-ecoff.c (ecoff_frob_file_before_fix): Correct section list traversal. Use bfd_section_list_prepend. * config/tc-mmix.c (mmix_frob_file): Don't needlessly iterate over the section list. * config/tc-xtensa.c (xtensa_remove_section): Delete. (xtensa_insert_section): Delete. (xtensa_move_seg_list_to_beginning): Use bfd_section_list_remove and bfd_section_list_prepend. (xtensa_reorder_seg_list): Use bfd_section_list_remove and bfd_section_list_insert_after. Index: bfd/elf.c =================================================================== RCS file: /cvs/src/src/bfd/elf.c,v retrieving revision 1.283 diff -u -p -r1.283 elf.c --- bfd/elf.c 3 May 2005 01:05:00 -0000 1.283 +++ bfd/elf.c 3 May 2005 15:25:16 -0000 @@ -2762,14 +2762,11 @@ assign_section_numbers (bfd *abfd, struc /* SHT_GROUP sections are in relocatable files only. */ if (link_info == NULL || link_info->relocatable) { - asection *n; - /* Put SHT_GROUP sections first. */ - for (sec = abfd->sections; sec; sec = n) + for (sec = abfd->sections; sec != NULL; sec = sec->next) { d = elf_section_data (sec); - n = sec->next; if (d->this_hdr.sh_type == SHT_GROUP) { if (sec->flags & SEC_LINKER_CREATED) Index: bfd/elfxx-ia64.c =================================================================== RCS file: /cvs/src/src/bfd/elfxx-ia64.c,v retrieving revision 1.154 diff -u -p -r1.154 elfxx-ia64.c --- bfd/elfxx-ia64.c 3 May 2005 01:05:01 -0000 1.154 +++ bfd/elfxx-ia64.c 3 May 2005 15:26:03 -0000 @@ -4934,7 +4934,7 @@ elfNN_ia64_object_p (bfd *abfd) /* Move the fake group section to the beginning. */ bfd_section_list_remove (abfd, group); - bfd_section_list_insert_before (abfd, abfd->sections, group); + bfd_section_list_prepend (abfd, group); elf_next_in_group (group) = sec; Index: bfd/section.c =================================================================== RCS file: /cvs/src/src/bfd/section.c,v retrieving revision 1.82 diff -u -p -r1.82 section.c --- bfd/section.c 3 May 2005 01:05:02 -0000 1.82 +++ bfd/section.c 3 May 2005 15:26:16 -0000 @@ -552,10 +552,7 @@ CODE_FRAGMENT . else \ . (ABFD)->sections = _next; \ . if (_next) \ -. { \ -. _next->prev = _prev; \ -. _s->next = NULL; \ -. } \ +. _next->prev = _prev; \ . else \ . (ABFD)->section_last = _prev; \ . } \ @@ -572,10 +569,32 @@ CODE_FRAGMENT . _abfd->section_last->next = _s; \ . } \ . else \ -. _abfd->sections = _s; \ +. { \ +. _s->prev = NULL; \ +. _abfd->sections = _s; \ +. } \ . _abfd->section_last = _s; \ . } \ . while (0) +.#define bfd_section_list_prepend(ABFD, S) \ +. do \ +. { \ +. asection *_s = S; \ +. bfd *_abfd = ABFD; \ +. _s->prev = NULL; \ +. if (_abfd->sections) \ +. { \ +. _s->next = _abfd->sections; \ +. _abfd->sections->prev = _s; \ +. } \ +. else \ +. { \ +. _s->next = NULL; \ +. _abfd->section_last = _s; \ +. } \ +. _abfd->sections = _s; \ +. } \ +. while (0) .#define bfd_section_list_insert_after(ABFD, A, S) \ . do \ . { \ @@ -586,7 +605,7 @@ CODE_FRAGMENT . _s->prev = _a; \ . _a->next = _s; \ . if (_next) \ -. _s->next->prev = _s; \ +. _next->prev = _s; \ . else \ . (ABFD)->section_last = _s; \ . } \ @@ -607,7 +626,7 @@ CODE_FRAGMENT . } \ . while (0) .#define bfd_section_removed_from_list(ABFD, S) \ -. ((S)->next == NULL && (S) != (ABFD)->section_last) +. ((S)->next == NULL ? (ABFD)->section_last != (S) : (S)->next->prev != (S)) . */ Index: bfd/sunos.c =================================================================== RCS file: /cvs/src/src/bfd/sunos.c,v retrieving revision 1.18 diff -u -p -r1.18 sunos.c --- bfd/sunos.c 3 May 2005 01:05:03 -0000 1.18 +++ bfd/sunos.c 3 May 2005 15:26:18 -0000 @@ -859,11 +859,10 @@ sunos_add_dynamic_symbols (bfd *abfd, abfd->sections = NULL; else { - asection *s, *n; + asection *s; - for (s = abfd->sections; s != NULL; s = n) + for (s = abfd->sections; s != NULL; s = s->next) { - n = s->next; if ((s->flags & SEC_LINKER_CREATED) == 0) bfd_section_list_remove (abfd, s); } Index: bfd/xcofflink.c =================================================================== RCS file: /cvs/src/src/bfd/xcofflink.c,v retrieving revision 1.39 diff -u -p -r1.39 xcofflink.c --- bfd/xcofflink.c 3 May 2005 01:05:03 -0000 1.39 +++ bfd/xcofflink.c 3 May 2005 15:26:21 -0000 @@ -5436,19 +5436,18 @@ _bfd_xcoff_bfd_final_link (bfd *abfd, st { bfd_boolean saw_contents; int indx; - asection **op; file_ptr sofar; /* Insert .pad sections before every section which has contents and is loaded, if it is preceded by some other section which has contents and is loaded. */ saw_contents = TRUE; - for (op = &abfd->sections; *op != NULL; op = &(*op)->next) + for (o = abfd->sections; o != NULL; o = o->next) { - if (strcmp ((*op)->name, ".pad") == 0) + if (strcmp (o->name, ".pad") == 0) saw_contents = FALSE; - else if (((*op)->flags & SEC_HAS_CONTENTS) != 0 - && ((*op)->flags & SEC_LOAD) != 0) + else if ((o->flags & SEC_HAS_CONTENTS) != 0 + && (o->flags & SEC_LOAD) != 0) { if (! saw_contents) saw_contents = TRUE; @@ -5465,9 +5464,7 @@ _bfd_xcoff_bfd_final_link (bfd *abfd, st n->alignment_power = 0; bfd_section_list_remove (abfd, n); - bfd_section_list_insert_before (abfd, *op, n); - - op = &n->next; + bfd_section_list_insert_before (abfd, o, n); saw_contents = FALSE; } } Index: gas/config/obj-ecoff.c =================================================================== RCS file: /cvs/src/src/gas/config/obj-ecoff.c,v retrieving revision 1.14 diff -u -p -r1.14 obj-ecoff.c --- gas/config/obj-ecoff.c 3 May 2005 12:02:47 -0000 1.14 +++ gas/config/obj-ecoff.c 3 May 2005 15:26:41 -0000 @@ -37,7 +37,7 @@ void ecoff_frob_file_before_fix (void) { bfd_vma addr; - asection **sec; + asection *sec; /* Set the section VMA values. We force the .sdata and .sbss sections to the end to ensure that their VMA addresses are close @@ -80,20 +80,19 @@ ecoff_frob_file_before_fix (void) for (i = 0; i < n_names; i++) secs[i] = NULL; - for (sec = &stdoutput->sections; *sec != NULL;) + for (sec = stdoutput->sections; sec != NULL; sec = sec->next) { for (i = 0; i < n_names; i++) - if (!strcmp ((*sec)->name, names[i])) + if (!strcmp (sec->name, names[i])) { - secs[i] = *sec; - bfd_section_list_remove (stdoutput, *sec); + secs[i] = sec; + bfd_section_list_remove (stdoutput, sec); break; } if (i == n_names) { - bfd_set_section_vma (stdoutput, *sec, addr); - addr += bfd_section_size (stdoutput, *sec); - sec = &(*sec)->next; + bfd_set_section_vma (stdoutput, sec, addr); + addr += bfd_section_size (stdoutput, sec); } } for (i = 0; i < n_names; i++) @@ -104,7 +103,7 @@ ecoff_frob_file_before_fix (void) } for (i = n_names - 1; i >= 0; i--) if (secs[i]) - bfd_section_list_insert_after (stdoutput, stdoutput->sections, secs[i]); + bfd_section_list_prepend (stdoutput, secs[i]); /* Fill in the register masks. */ { Index: gas/config/tc-mmix.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-mmix.c,v retrieving revision 1.21 diff -u -p -r1.21 tc-mmix.c --- gas/config/tc-mmix.c 3 May 2005 12:02:47 -0000 1.21 +++ gas/config/tc-mmix.c 3 May 2005 15:26:44 -0000 @@ -3747,18 +3747,11 @@ mmix_frob_file (void) if (real_reg_section != NULL) { - asection *secp; - /* FIXME: Pass error state gracefully. */ if (bfd_get_section_flags (stdoutput, real_reg_section) & SEC_HAS_CONTENTS) as_fatal (_("register section has contents\n")); - /* Really remove the section. */ - for (secp = stdoutput->sections; - secp != real_reg_section; - secp = secp->next) - ; - bfd_section_list_remove (stdoutput, secp); + bfd_section_list_remove (stdoutput, real_reg_section); --stdoutput->section_count; } Index: gas/config/tc-xtensa.c =================================================================== RCS file: /cvs/src/src/gas/config/tc-xtensa.c,v retrieving revision 1.37 diff -u -p -r1.37 tc-xtensa.c --- gas/config/tc-xtensa.c 3 May 2005 12:02:47 -0000 1.37 +++ gas/config/tc-xtensa.c 3 May 2005 15:26:50 -0000 @@ -9682,39 +9682,6 @@ set_subseg_freq (segT seg, subsegT subse /* Segment Lists and emit_state Stuff. */ -/* Remove the segment from the global sections list. */ - -static void -xtensa_remove_section (segT sec) -{ - /* Handle brain-dead bfd_section_list_remove macro, which - expect the address of the prior section's "next" field, not - just the address of the section to remove. */ - segT ps_next_ptr = stdoutput->sections; - - while (ps_next_ptr != sec && ps_next_ptr != NULL) - ps_next_ptr = ps_next_ptr->next; - - assert (ps_next_ptr != NULL); - - bfd_section_list_remove (stdoutput, ps_next_ptr); -} - - -static void -xtensa_insert_section (segT after_sec, segT sec) -{ - segT after_sec_next; - - if (after_sec == NULL) - after_sec_next = stdoutput->sections; - else - after_sec_next = after_sec->next; - - bfd_section_list_insert_after (stdoutput, after_sec_next, sec); -} - - static void xtensa_move_seg_list_to_beginning (seg_list *head) { @@ -9725,9 +9692,11 @@ xtensa_move_seg_list_to_beginning (seg_l /* Move the literal section to the front of the section list. */ assert (literal_section); - xtensa_remove_section (literal_section); - xtensa_insert_section (NULL, literal_section); - + if (literal_section != stdoutput->sections) + { + bfd_section_list_remove (stdoutput, literal_section); + bfd_section_list_prepend (stdoutput, literal_section); + } head = head->next; } } @@ -9893,8 +9862,8 @@ xtensa_reorder_seg_list (seg_list *head, assert (literal_section); if (literal_section != after) { - xtensa_remove_section (literal_section); - xtensa_insert_section (after, literal_section); + bfd_section_list_remove (stdoutput, literal_section); + bfd_section_list_insert_after (stdoutput, after, literal_section); } head = head->next; -- Alan Modra IBM OzLabs - Linux Technology Centre