Home | History | Annotate | Line # | Download | only in emultempl
      1 # This shell script emits a C file. -*- C -*-
      2 #   Copyright (C) 2001-2025 Free Software Foundation, Inc.
      3 #
      4 # This file is part of the GNU Binutils.
      5 #
      6 # This program is free software; you can redistribute it and/or modify
      7 # it under the terms of the GNU General Public License as published by
      8 # the Free Software Foundation; either version 3 of the License, or
      9 # (at your option) any later version.
     10 #
     11 # This program is distributed in the hope that it will be useful,
     12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 # GNU General Public License for more details.
     15 #
     16 # You should have received a copy of the GNU General Public License
     17 # along with this program; if not, write to the Free Software
     18 # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19 # MA 02110-1301, USA.
     20 #
     21 
     22 # This file is sourced from elf.em and mmo.em, used to define
     23 # MMIX-specific things common to ELF and MMO.
     24 
     25 fragment <<EOF
     26 #include "elf/mmix.h"
     27 
     28 static void gld${EMULATION_NAME}_before_parse (void);
     29 
     30 static void
     31 mmix_before_parse (void)
     32 {
     33   link_info.check_relocs_after_open_input = true;
     34   gld${EMULATION_NAME}_before_parse ();
     35 }
     36 
     37 /* Set up handling of linker-allocated global registers.  */
     38 
     39 static void
     40 mmix_before_allocation (void)
     41 {
     42   /* Call the default first.  */
     43   gld${EMULATION_NAME}_before_allocation ();
     44 
     45   /* There's a needrelax.em which uses this ..._before_allocation-hook and
     46      just has the statement below as payload.  It's more of a hassle to
     47      use that than to just include these two lines and take the
     48      maintenance burden to keep them in sync.  (Of course we lose the
     49      maintenance burden of checking that it still does what we need.)  */
     50 
     51   /* Force -relax on (regardless of whether we're doing a relocatable
     52      link).  */
     53   ENABLE_RELAXATION;
     54 
     55   if (!_bfd_mmix_before_linker_allocation (link_info.output_bfd, &link_info))
     56     einfo (_("%X%P: internal problems setting up section %s"),
     57 	   MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
     58 }
     59 
     60 /* We need to set the VMA of the .MMIX.reg_contents section when it has
     61    been allocated, and produce the final settings for the linker-generated
     62    GREGs.  */
     63 
     64 static void
     65 mmix_after_allocation (void)
     66 {
     67   asection *sec;
     68   bfd_signed_vma regvma;
     69 
     70   gld${EMULATION_NAME}_after_allocation ();
     71 
     72   /* If there's no register section, we don't need to do anything.  On the
     73      other hand, if there's a non-standard linker-script without a mapping
     74      from MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME when that section is
     75      present (as in the ld test "NOCROSSREFS 2"), that section (1) will be
     76      orphaned; not inserted in MMIX_REG_CONTENTS_SECTION_NAME and (2) we
     77      will not do the necessary preparations for those relocations that
     78      caused it to be created.  We'll SEGV from the latter error.  The
     79      former error in separation will result in a non-working binary, but
     80      that's expected when you play tricks with linker scripts.  The
     81      "NOCROSSREFS 2" test does not run the output so it does not matter
     82      there.  */
     83   sec = bfd_get_section_by_name (link_info.output_bfd,
     84 				 MMIX_REG_CONTENTS_SECTION_NAME);
     85   if (sec == NULL)
     86     sec
     87       = bfd_get_section_by_name (link_info.output_bfd,
     88 				 MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
     89   if (sec == NULL)
     90     return;
     91 
     92   regvma = 256 * 8 - sec->size - 8;
     93 
     94   /* If we start on a local register, we have too many global registers.
     95      We treat this error as nonfatal (meaning processing will continue in
     96      search for other errors), because it's a link error in the same way
     97      as an undefined symbol.  */
     98   if (regvma < 32 * 8)
     99     {
    100       einfo (_("%X%P: too many global registers: %u, max 223\n"),
    101 	     (unsigned) sec->size / 8);
    102       regvma = 32 * 8;
    103     }
    104 
    105   /* Set vma to correspond to first such register number * 8.  */
    106   bfd_set_section_vma (sec, (bfd_vma) regvma);
    107 
    108   /* Simplify symbol output for the register section (without contents;
    109      created for register symbols) by setting the output offset to 0.
    110      This section is only present when there are register symbols.  */
    111   sec = bfd_get_section_by_name (link_info.output_bfd, MMIX_REG_SECTION_NAME);
    112   if (sec != NULL)
    113     bfd_set_section_vma (sec, 0);
    114 
    115   if (!_bfd_mmix_after_linker_allocation (link_info.output_bfd, &link_info))
    116     fatal (_("%P: can't finalize linker-allocated global registers\n"));
    117 }
    118 EOF
    119 
    120 LDEMUL_BEFORE_PARSE=mmix_before_parse
    121 LDEMUL_AFTER_ALLOCATION=mmix_after_allocation
    122 LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation
    123