- /* Restore the global list pointer. */
- stat_ptr = old;
-
- if (place != NULL && os->bfd_section != NULL)
- {
- asection *snew, **pps;
-
- snew = os->bfd_section;
-
- /* Shuffle the bfd section list to make the output file look
- neater. This is really only cosmetic. */
- if (place->section == NULL)
- {
- asection *bfd_section = place->os->bfd_section;
-
- /* If the output statement hasn't been used to place
- any input sections (and thus doesn't have an output
- bfd_section), look for the closest prior output statement
- having an output section. */
- if (bfd_section == NULL)
- bfd_section = output_prev_sec_find (place->os);
-
- if (bfd_section != NULL && bfd_section != snew)
- place->section = &bfd_section->next;
- }
-
- if (place->section != NULL)
- {
- /* Unlink the section. */
- for (pps = &output_bfd->sections; *pps != snew; pps = &(*pps)->next)
- ;
- bfd_section_list_remove (output_bfd, pps);
-
- /* Now tack it on to the "place->os" section list. */
- bfd_section_list_insert (output_bfd, place->section, snew);
- }
-
- /* Save the end of this list. Further ophans of this type will
- follow the one we've just added. */
- place->section = &snew->next;
-
- /* The following is non-cosmetic. We try to put the output
- statements in some sort of reasonable order here, because
- they determine the final load addresses of the orphan
- sections. In addition, placing output statements in the
- wrong order may require extra segments. For instance,
- given a typical situation of all read-only sections placed
- in one segment and following that a segment containing all
- the read-write sections, we wouldn't want to place an orphan
- 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
- {
- /* Put it after the last orphan statement we added. */
- *add.tail = *place->stmt;
- *place->stmt = add.head;
- }
-
- /* Fix the global list pointer if we happened to tack our
- new list at the tail. */
- if (*old->tail == add.head)
- old->tail = add.tail;
-
- /* 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;
- }
- }