]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - ld/emultempl/mmix-elfnmmo.em
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / ld / emultempl / mmix-elfnmmo.em
CommitLineData
3c3bdf30 1# This shell script emits a C file. -*- C -*-
250d07de 2# Copyright (C) 2001-2021 Free Software Foundation, Inc.
3c3bdf30 3#
f96b4a7b 4# This file is part of the GNU Binutils.
3c3bdf30
NC
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
f96b4a7b 8# the Free Software Foundation; either version 3 of the License, or
3c3bdf30
NC
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
f96b4a7b
NC
18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19# MA 02110-1301, USA.
3c3bdf30
NC
20#
21
075a2b89 22# This file is sourced from elf.em and mmo.em, used to define
3c3bdf30
NC
23# MMIX-specific things common to ELF and MMO.
24
92b93329 25fragment <<EOF
3c3bdf30
NC
26#include "elf/mmix.h"
27
5c3261b0
L
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
48fa4a5d
HPN
37/* Set up handling of linker-allocated global registers. */
38
39static void
0c7a8e5a 40mmix_before_allocation (void)
48fa4a5d
HPN
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
06335781
HPN
51 /* Force -relax on (regardless of whether we're doing a relocatable
52 link). */
28d5f677 53 ENABLE_RELAXATION;
48fa4a5d 54
f13a99db 55 if (!_bfd_mmix_before_linker_allocation (link_info.output_bfd, &link_info))
df5f2391 56 einfo (_("%X%P: internal problems setting up section %s"),
48fa4a5d
HPN
57 MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
58}
3c3bdf30
NC
59
60/* We need to set the VMA of the .MMIX.reg_contents section when it has
48fa4a5d
HPN
61 been allocated, and produce the final settings for the linker-generated
62 GREGs. */
3c3bdf30
NC
63
64static void
0c7a8e5a 65mmix_after_allocation (void)
3c3bdf30 66{
eaeb0a9d 67 asection *sec;
8017dbcb 68 bfd_signed_vma regvma;
3c3bdf30 69
eaeb0a9d
AM
70 gld${EMULATION_NAME}_after_allocation ();
71
83c2d653 72 /* If there's no register section, we don't need to do anything. On the
6266d8d4
HPN
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. */
eaeb0a9d
AM
83 sec = bfd_get_section_by_name (link_info.output_bfd,
84 MMIX_REG_CONTENTS_SECTION_NAME);
83c2d653
HPN
85 if (sec == NULL)
86 sec
f13a99db 87 = bfd_get_section_by_name (link_info.output_bfd,
83c2d653 88 MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
3c3bdf30
NC
89 if (sec == NULL)
90 return;
91
eea6121a 92 regvma = 256 * 8 - sec->size - 8;
3c3bdf30 93
74c44237
HPN
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. */
3c3bdf30 98 if (regvma < 32 * 8)
74c44237 99 {
df5f2391 100 einfo (_("%X%P: too many global registers: %u, max 223\n"),
eea6121a 101 (unsigned) sec->size / 8);
74c44237
HPN
102 regvma = 32 * 8;
103 }
3c3bdf30
NC
104
105 /* Set vma to correspond to first such register number * 8. */
fd361982 106 bfd_set_section_vma (sec, (bfd_vma) regvma);
3c3bdf30 107
3c3bdf30 108 /* Simplify symbol output for the register section (without contents;
48fa4a5d
HPN
109 created for register symbols) by setting the output offset to 0.
110 This section is only present when there are register symbols. */
f13a99db 111 sec = bfd_get_section_by_name (link_info.output_bfd, MMIX_REG_SECTION_NAME);
48fa4a5d 112 if (sec != NULL)
fd361982 113 bfd_set_section_vma (sec, 0);
3c3bdf30 114
f13a99db 115 if (!_bfd_mmix_after_linker_allocation (link_info.output_bfd, &link_info))
48fa4a5d 116 {
74c44237 117 /* This is a fatal error; make einfo call not return. */
df5f2391 118 einfo (_("%F%P: can't finalize linker-allocated global registers\n"));
48fa4a5d 119 }
3c3bdf30
NC
120}
121EOF
122
5c3261b0 123LDEMUL_BEFORE_PARSE=mmix_before_parse
48fa4a5d
HPN
124LDEMUL_AFTER_ALLOCATION=mmix_after_allocation
125LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation