* emultempl/elf32.em (struct orphan_save): Add os_tail field.

(gld${EMULATION_NAME}_place_orphan): Re-order output_section_statement
	list too.
This commit is contained in:
Alan Modra 2002-12-10 03:34:43 +00:00
parent f56074d698
commit 1e5e54006d
2 changed files with 28 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2002-12-10 Alan Modra <amodra@bigpond.net.au>
* emultempl/elf32.em (struct orphan_save): Add os_tail field.
(gld${EMULATION_NAME}_place_orphan): Re-order output_section_statement
list too.
2002-12-08 Alan Modra <amodra@bigpond.net.au>
* ldlang.h: Formatting.

View File

@ -1071,6 +1071,7 @@ struct orphan_save {
lang_output_section_statement_type *os;
asection **section;
lang_statement_union_type **stmt;
lang_statement_union_type **os_tail;
};
static bfd_boolean
@ -1093,6 +1094,7 @@ gld${EMULATION_NAME}_place_orphan (file, s)
const char *secname;
const char *ps = NULL;
lang_output_section_statement_type *os;
lang_statement_union_type **os_tail;
etree_type *load_base;
int isdyn = 0;
@ -1242,6 +1244,7 @@ gld${EMULATION_NAME}_place_orphan (file, s)
exp_nameop (ADDR, secname));
}
os_tail = lang_output_section_statement.tail;
os = lang_enter_output_section_statement (secname, address, 0,
(bfd_vma) 0,
(etree_type *) NULL,
@ -1321,11 +1324,15 @@ gld${EMULATION_NAME}_place_orphan (file, s)
read/write section before or amongst the read-only ones. */
if (add.head != NULL)
{
lang_statement_union_type *newly_added_os;
if (place->stmt == NULL)
{
/* Put the new statement list right at the head. */
*add.tail = place->os->header.next;
place->os->header.next = add.head;
place->os_tail = &place->os->next;
}
else
{
@ -1341,6 +1348,21 @@ gld${EMULATION_NAME}_place_orphan (file, s)
/* Save the end of this list. */
place->stmt = add.tail;
/* Do the same for the list of output section statements. */
newly_added_os = *os_tail;
*os_tail = NULL;
newly_added_os->output_section_statement.next = *place->os_tail;
*place->os_tail = newly_added_os;
place->os_tail = &newly_added_os->output_section_statement.next;
/* Fixing the global list pointer here is a little different.
We added to the list in lang_enter_output_section_statement,
trimmed off the new output_section_statment above when
assigning *os_tail = NULL, but possibly added it back in
the same place when assigning *place->os_tail. */
if (*os_tail == NULL)
lang_output_section_statement.tail = os_tail;
}
}