* ldemul.c (after_allocation_default): Run lang_relax_sections.
	* ldlang.h (lang_relax_sections): Declare.
	* ldlang.c (relax_sections): Delete.
	(lang_relax_sections): New function.
	(lang_process): Don't relax directly from here.
	* emultempl/alphaelf.em (alpha_finish): Call finish_default.
	* emultempl/armelf.em (arm_elf_after_allocation): Delete.  Move body..
	(gld${EMULATION_NAME}_finish): ..to here.  Move existing code..
	(gld${EMULATION_NAME}_after_allocation): ..to here.  New function.
	(LDEMUL_AFTER_ALLOCATION): Update.
	* emultempl/avrelf.em (avr_elf_finish, LDEMUL_FINISH): Delete.
	(avr_elf_after_allocation): New function.
	(LDEMUL_AFTER_ALLOCATION): Define.
	* emultempl/elf-generic.em (gld${EMULATION_NAME}_map_segments): Call
	lang_relax_sections.
	* emultempl/elf32.em (gld${EMULATION_NAME}_finish): Delete.  Move..
	(gld${EMULATION_NAME}_after_allocation): ..code to here.  New function.
	(LDEMUL_AFTER_ALLOCATION, LDEMUL_FINISH): Update.
	* emultempl/genelf.em (gld${EMULATION_NAME}_finish): Delete.  Move..
	(gld${EMULATION_NAME}_after_allocation): ..code to here.  New function.
	(LDEMUL_FINISH): Delete.
	(LDEMUL_AFTER_ALLOCATION): Define.
	* emultempl/hppaelf.em (gld${EMULATION_NAME}_finish): Delete.  Move..
	(gld${EMULATION_NAME}_after_allocation): ..to here.  New function.
	(LDEMUL_FINISH): Delete.
	(LDEMUL_AFTER_ALLOCATION): Define.
	* emultempl/m68hc1xelf.em (m68hc11elf_finish): Delete.  Move..
	(m68hc11elf_after_allocation): ..to here.  New function.
	(LDEMUL_FINISH): Delete.
	(LDEMUL_AFTER_ALLOCATION): Define.
	* emultempl/m68kelf.em (m68k_elf_after_allocation): Call
	gld${EMULATION_NAME}_after_allocation.
	* emultempl/mmix-elfnmmo.em (mmix_after_allocation): Call
	gld${EMULATION_NAME}_after_allocation.
	* emultempl/mmo.em (mmo_finish): Delete.  Move body..
	(gld${EMULATION_NAME}_after_allocation): ..to here.  New function.
	(LDEMUL_FINISH): Define.
	* emultempl/ppc64elf.em (ppc_layout_sections_again): Set elf_gp.
	(gld${EMULATION_NAME}_finish): Move code sizing sections..
	(gld${EMULATION_NAME}_after_allocation): ..to here.
	* emultempl/sh64elf.em (sh64_elf_${EMULATION_NAME}_after_allocation):
	Call gld${EMULATION_NAME}_after_allocation.
	* emultempl/spuelf.em (gld${EMULATION_NAME}_finish): Delete
	bfd_elf_discard_info and map_segments call.
This commit is contained in:
Alan Modra 2009-08-10 07:50:56 +00:00
parent a8ad78a74e
commit eaeb0a9d5c
18 changed files with 197 additions and 174 deletions

View file

@ -6159,35 +6159,58 @@ lang_find_relro_sections (void)
/* Relax all sections until bfd_relax_section gives up. */
static void
relax_sections (void)
void
lang_relax_sections (bfd_boolean need_layout)
{
/* Keep relaxing until bfd_relax_section gives up. */
bfd_boolean relax_again;
link_info.relax_trip = -1;
do
if (command_line.relax)
{
relax_again = FALSE;
link_info.relax_trip++;
/* We may need more than one relaxation pass. */
int i = link_info.relax_pass;
/* Note: pe-dll.c does something like this also. If you find
you need to change this code, you probably need to change
pe-dll.c also. DJ */
/* The backend can use it to determine the current pass. */
link_info.relax_pass = 0;
/* Do all the assignments with our current guesses as to
section sizes. */
lang_do_assignments ();
while (i--)
{
/* Keep relaxing until bfd_relax_section gives up. */
bfd_boolean relax_again;
/* We must do this after lang_do_assignments, because it uses
size. */
lang_reset_memory_regions ();
link_info.relax_trip = -1;
do
{
link_info.relax_trip++;
/* Perform another relax pass - this time we know where the
globals are, so can make a better guess. */
lang_size_sections (&relax_again, FALSE);
/* Note: pe-dll.c does something like this also. If you find
you need to change this code, you probably need to change
pe-dll.c also. DJ */
/* Do all the assignments with our current guesses as to
section sizes. */
lang_do_assignments ();
/* We must do this after lang_do_assignments, because it uses
size. */
lang_reset_memory_regions ();
/* Perform another relax pass - this time we know where the
globals are, so can make a better guess. */
relax_again = FALSE;
lang_size_sections (&relax_again, FALSE);
}
while (relax_again);
link_info.relax_pass++;
}
need_layout = TRUE;
}
if (need_layout)
{
/* Final extra sizing to report errors. */
lang_do_assignments ();
lang_reset_memory_regions ();
lang_size_sections (NULL, TRUE);
}
while (relax_again);
}
void
@ -6293,29 +6316,8 @@ lang_process (void)
/* Size up the sections. */
lang_size_sections (NULL, !command_line.relax);
/* Now run around and relax if we can. */
if (command_line.relax)
{
/* We may need more than one relaxation pass. */
int i = link_info.relax_pass;
/* The backend can use it to determine the current pass. */
link_info.relax_pass = 0;
while (i--)
{
relax_sections ();
link_info.relax_pass++;
}
/* Final extra sizing to report errors. */
lang_do_assignments ();
lang_reset_memory_regions ();
lang_size_sections (NULL, TRUE);
}
/* See if anything special should be done now we know how big
everything is. */
everything is. This is where relaxation is done. */
ldemul_after_allocation ();
/* Fix any .startof. or .sizeof. symbols. */