This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: Fixup references to bfd_section_list... macros
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