1# This shell script emits a C file. -*- C -*- 2# Copyright (C) 2001-2022 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 25fragment <<EOF 26#include "elf/mmix.h" 27 28static void gld${EMULATION_NAME}_before_parse (void); 29 30static void 31mmix_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 39static void 40mmix_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 64static void 65mmix_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 { 117 /* This is a fatal error; make einfo call not return. */ 118 einfo (_("%F%P: can't finalize linker-allocated global registers\n")); 119 } 120} 121EOF 122 123LDEMUL_BEFORE_PARSE=mmix_before_parse 124LDEMUL_AFTER_ALLOCATION=mmix_after_allocation 125LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation 126