# This shell script emits a C file. -*- C -*-
#   Copyright 2006 Free Software Foundation, Inc.
#
# This file is part of GLD, the Gnu Linker.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
#

# This file is sourced from elf32.em and from ELF targets that use
# generic.em.
#
cat >>e${EMULATION_NAME}.c <<EOF

static void
gld${EMULATION_NAME}_map_segments (bfd_boolean need_layout)
{
  int tries = 10;

  while (tries)
    {
      if (output_bfd->xvec->flavour == bfd_target_elf_flavour)
	{
	  bfd_size_type phdr_size;

	  phdr_size = elf_tdata (output_bfd)->program_header_size;
	  /* If we don't have user supplied phdrs, throw away any
	     previous linker generated program headers.  */
	  if (lang_phdr_list == NULL)
	    elf_tdata (output_bfd)->segment_map = NULL;
	  if (!_bfd_elf_map_sections_to_segments (output_bfd, &link_info))
	    einfo ("%F%P: map sections to segments failed: %E\n");

	  if (phdr_size != elf_tdata (output_bfd)->program_header_size)
	    need_layout = TRUE;
	}

      if (!need_layout)
	break;

      lang_reset_memory_regions ();

      /* Resize the sections.  */
      lang_size_sections (NULL, TRUE);

      /* Redo special stuff.  */
      ldemul_after_allocation ();

      /* Do the assignments again.  */
      lang_do_assignments ();

      need_layout = FALSE;
      --tries;
    }

  if (tries == 0)
    einfo (_("%P%F: looping in map_segments"));
}
EOF
