PATCH: Fix the relax finalize pass

H. J. Lu hjl@lucon.org
Thu May 15 02:19:00 GMT 2003


On Wed, May 14, 2003 at 06:01:25PM -0700, Richard Henderson wrote:
> On Wed, May 14, 2003 at 03:53:46PM -0700, H. J. Lu wrote:
> > 	* ldlang.c (lang_size_sections_1): Take one more argument to
> > 	indicate if the relax finalize pass is needed.
> > 	(lang_size_sections): Updated.
> > 	(lang_process): Likewise.
> > 	* ldlang.h (lang_size_sections_1): Likewise.
> > 	* pe-dll.c (pe_dll_fill_sections): Likewise.
> > 	(pe_exe_fill_sections): Likewise.
> > 	* emultempl/elf32.em (gld${EMULATION_NAME}_finish): Likewise.
> > 	* emultempl/hppaelf.em (hppaelf_layout_sections_again): Likewise.
> > 	* emultempl/ppc64elf.em (ppc_before_allocation): Likewise.
> > 	(ppc_layout_sections_again): Likewise.
> > 
> > 	* ldlang.c (lang_size_sections): Don't adjust data segment
> > 	address after the relax finalize pass starts.
> > 	(lang_process): Perform the relax finalize pass only when
> > 	needed. Finalize addresses before the relax finalize pass.
> 
> Ug.  This is becoming gross.
> 
> I think the proper way to handle this is to break up the relax
> pass in bfd so that the backend gets more control.
> 
>   (1) We need a "beginning of new pass" hook that is called
>       after sizes are guessed and addresses are assigned.
>       This is where we'd assign a new GP if needed.
> 
>       We'd like for this to be able to allocate a data structure
>       private to the backend, so that the pieces and passes can
>       communicate.
> 
>   (2) Existing relax hook operates on each section as usual.
>       It records information into the private data structure
>       as needed.
> 
>   (3) An "end of pass" hook that is called after all sections
>       are processed.  Using data collected from sections it
>       may decide to re-layout the GOT, or adjust dynamic 
>       relocations or whatever.  Currently we do this kind of
>       thing for every section, which wastes time.
> 
>       If this "end of pass" hook returns "no more iterations",
>       then it is also the case that the private data has been
>       deallocated.
> 
> Operation for ia64 would indeed pass through two phases, one
> in which we expand code by adding trampolines, and one in which
> we shrink data by eliminating got entries.  But all this would
> be controlled by the backend, and all lang_size_sections knows
> is that it's been told to continue around the relaxation loop.
> 
> As a side benefit, ia64 would get to keep track of the
> trampolines that it has added between sections and iterations,
> so that they can be re-used when they're in range.

It sounds good. Are you going to implement it? If not, I will give it
a try.


H.J.



More information about the Binutils mailing list