]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - ld/emultempl/sh64elf.em
Update sources to GPLv3
[thirdparty/binutils-gdb.git] / ld / emultempl / sh64elf.em
index 066cab86d8b1c4b74e013b91af412a80a77f3c5e..30dd68f169df2f6493607b21bd7b8ee8101e68f3 100644 (file)
@@ -1,11 +1,11 @@
 # This shell script emits a C file. -*- C -*-
-#   Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+#   Copyright 2000, 2001, 2002, 2003, 2004, 2007 Free Software Foundation, Inc.
 #
-# This file is part of GLD, the Gnu Linker.
+# This file is part of the GNU Binutils.
 #
 # 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
+# the Free Software Foundation; either version 3 of the License, or
 # (at your option) any later version.
 #
 # This program is distributed in the hope that it will be useful,
@@ -15,7 +15,8 @@
 #
 # 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
 #
 
 # This file is sourced from elf32.em, and defines extra sh64
@@ -33,9 +34,6 @@ cat >>e${EMULATION_NAME}.c <<EOF
 #include "elf/sh.h"
 #include "elf32-sh64.h"
 
-static void sh64_elf_${EMULATION_NAME}_before_allocation PARAMS ((void));
-static void sh64_elf_${EMULATION_NAME}_after_allocation PARAMS ((void));
-
 /* Check if we need a .cranges section and create it if it's not in any
    input file.  It might seem better to always create it and if unneeded,
    discard it, but I don't find a simple way to discard it totally from
@@ -47,7 +45,7 @@ static void sh64_elf_${EMULATION_NAME}_after_allocation PARAMS ((void));
    they will be linked.  */
 
 static void
-sh64_elf_${EMULATION_NAME}_before_allocation ()
+sh64_elf_${EMULATION_NAME}_before_allocation (void)
 {
   asection *cranges;
   asection *osec;
@@ -155,7 +153,7 @@ sh64_elf_${EMULATION_NAME}_before_allocation ()
                 isec = isec->next)
              {
                if (isec->output_section == osec
-                   && isec->_raw_size != 0
+                   && isec->size != 0
                    && (bfd_get_section_flags (isec->owner, isec)
                        & SEC_EXCLUDE) == 0)
                  {
@@ -182,7 +180,7 @@ sh64_elf_${EMULATION_NAME}_before_allocation ()
                 isec = isec->next)
              {
                if (isec->output_section == osec
-                   && isec->_raw_size != 0
+                   && isec->size != 0
                    && (bfd_get_section_flags (isec->owner, isec)
                        & SEC_EXCLUDE) == 0)
                  {
@@ -240,7 +238,7 @@ sh64_elf_${EMULATION_NAME}_before_allocation ()
 /* Size up and extend the .cranges section, merging generated entries.  */
 
 static void
-sh64_elf_${EMULATION_NAME}_after_allocation ()
+sh64_elf_${EMULATION_NAME}_after_allocation (void)
 {
   bfd_vma new_cranges = 0;
   bfd_vma cranges_growth = 0;
@@ -286,7 +284,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                 isec = isec->next)
              {
                if (isec->output_section == osec
-                   && isec->_raw_size != 0
+                   && isec->size != 0
                    && (bfd_get_section_flags (isec->owner, isec)
                        & SEC_EXCLUDE) == 0)
                  {
@@ -313,7 +311,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                 isec = isec->next)
              {
                if (isec->output_section == osec
-                   && isec->_raw_size != 0
+                   && isec->size != 0
                    && (bfd_get_section_flags (isec->owner, isec)
                        & SEC_EXCLUDE) == 0)
                  {
@@ -366,7 +364,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                 isec = isec->next)
              {
                if (isec->output_section == osec
-                   && isec->_raw_size != 0
+                   && isec->size != 0
                    && (bfd_get_section_flags (isec->owner, isec)
                        & SEC_EXCLUDE) == 0
                    && ((elf_section_data (isec)->this_hdr.sh_flags
@@ -378,14 +376,20 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
       }
     }
 
-  BFD_ASSERT (cranges->contents == NULL);
+  /* ldemul_after_allocation may be called twice.  First directly from
+     lang_process, and the second time when lang_process calls ldemul_finish,
+     which calls gld${EMULATION_NAME}_finish, e.g. gldshelf32_finish, which
+     is defined in emultempl/elf32.em and calls ldemul_after_allocation,
+     if bfd_elf_discard_info returned true.  */
+  if (cranges->contents != NULL)
+    free (cranges->contents);
+
   BFD_ASSERT (sh64_elf_section_data (cranges)->sh64_info != NULL);
 
   /* Make sure we have .cranges in memory even if there were only
      assembler-generated .cranges.  */
   cranges_growth = new_cranges * SH64_CRANGE_SIZE;
-  cranges->contents
-    = (bfd_byte *) xcalloc (cranges->_raw_size + cranges_growth, 1);
+  cranges->contents = xcalloc (cranges->size + cranges_growth, 1);
   bfd_set_section_flags (cranges->owner, cranges,
                         bfd_get_section_flags (cranges->owner, cranges)
                         | SEC_IN_MEMORY);
@@ -400,7 +404,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
       return;
     }
 
-  crangesp = cranges->contents + cranges->_raw_size;
+  crangesp = cranges->contents + cranges->size;
 
   /* Now pass over the sections again, and make reloc orders for the new
      .cranges entries.  Constants are set as we go.  */
@@ -434,7 +438,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                   as containing mixed data, thus already having .cranges
                   entries.  */
                if (isec->output_section == osec
-                   && isec->_raw_size != 0
+                   && isec->size != 0
                    && (bfd_get_section_flags (isec->owner, isec)
                        & SEC_EXCLUDE) == 0
                    && ((elf_section_data (isec)->this_hdr.sh_flags
@@ -455,9 +459,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                    else
                      cr_type = CRT_SH5_ISA16;
 
-                   cr_size
-                     = (isec->_cooked_size
-                        ? isec->_cooked_size : isec->_raw_size);
+                   cr_size = isec->size;
 
                    /* Sections can be empty, like .text in a file that
                       only contains other sections.  Ranges shouldn't be
@@ -483,9 +485,9 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                        continue;
                      }
 
-                   /* If we emit relocateable contents, we need a
+                   /* If we emit relocatable contents, we need a
                       relocation for the start address.  */
-                   if (link_info.relocateable || link_info.emitrelocations)
+                   if (link_info.relocatable || link_info.emitrelocations)
                      {
                        /* FIXME: We could perhaps use lang_add_reloc and
                           friends here, but I'm not really sure that
@@ -507,8 +509,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                             - cranges->contents);
                        cr_addr_order->size = 4;
                        cr_addr_order->u.reloc.p
-                         = ((struct bfd_link_order_reloc *)
-                            xmalloc (sizeof (struct bfd_link_order_reloc)));
+                         = xmalloc (sizeof (struct bfd_link_order_reloc));
 
                        cr_addr_order->u.reloc.p->reloc = BFD_RELOC_32;
                        cr_addr_order->u.reloc.p->u.section = osec;
@@ -520,13 +521,6 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                        bfd_put_32 (output_bfd, isec->output_offset,
                                    crangesp + SH64_CRANGE_CR_ADDR_OFFSET);
                        cr_addr_order->u.reloc.p->addend = 0;
-
-                       /* We must update the number of relocations here,
-                          since the elf linker does not take link orders
-                          into account when setting header sizes.  The
-                          actual relocation orders are however executed
-                          correctly.  */
-                       elf_section_data(cranges)->rel_count++;
                      }
                    else
                      bfd_put_32 (output_bfd,
@@ -540,7 +534,7 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
                    bfd_put_32 (output_bfd, cr_size,
                                crangesp + SH64_CRANGE_CR_SIZE_OFFSET);
 
-                   bfd_put_16 (output_bfd, (bfd_vma) cr_type,
+                   bfd_put_16 (output_bfd, cr_type,
                                crangesp + SH64_CRANGE_CR_TYPE_OFFSET);
 
                    last_cr_type = cr_type;
@@ -555,14 +549,14 @@ sh64_elf_${EMULATION_NAME}_after_allocation ()
     }
 
   /* The .cranges section will have this size, no larger or smaller.
-     Since relocs (if relocateable linking) will be emitted into the
+     Since relocs (if relocatable linking) will be emitted into the
      "extended" size, we must set the raw size to the total.  We have to
      keep track of the number of new .cranges entries.
 
      Sorting before writing is done by sh64_elf_final_write_processing.  */
 
-  cranges->_cooked_size = crangesp - cranges->contents;
   sh64_elf_section_data (cranges)->sh64_info->cranges_growth
-    = cranges->_cooked_size - cranges->_raw_size;
-  cranges->_raw_size = cranges->_cooked_size;
+    = crangesp - cranges->contents - cranges->size;
+  cranges->size = crangesp - cranges->contents;
+  cranges->rawsize = cranges->size;
 }