Update sources to GPLv3
[deliverable/binutils-gdb.git] / ld / emultempl / mmix-elfnmmo.em
CommitLineData
3c3bdf30 1# This shell script emits a C file. -*- C -*-
f96b4a7b 2# Copyright 2001, 2002, 2003, 2004, 2007 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
22# This file is sourced from elf32.em and mmo.em, used to define
23# MMIX-specific things common to ELF and MMO.
24
25cat >>e${EMULATION_NAME}.c <<EOF
26#include "elf/mmix.h"
27
48fa4a5d
HPN
28/* Set up handling of linker-allocated global registers. */
29
30static void
0c7a8e5a 31mmix_before_allocation (void)
48fa4a5d
HPN
32{
33 /* Call the default first. */
34 gld${EMULATION_NAME}_before_allocation ();
35
36 /* There's a needrelax.em which uses this ..._before_allocation-hook and
37 just has the statement below as payload. It's more of a hassle to
38 use that than to just include these two lines and take the
39 maintenance burden to keep them in sync. (Of course we lose the
40 maintenance burden of checking that it still does what we need.) */
41
06335781
HPN
42 /* Force -relax on (regardless of whether we're doing a relocatable
43 link). */
44 command_line.relax = TRUE;
48fa4a5d 45
06335781 46 if (!_bfd_mmix_before_linker_allocation (output_bfd, &link_info))
48fa4a5d
HPN
47 einfo ("%X%P: Internal problems setting up section %s",
48 MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
49}
3c3bdf30
NC
50
51/* We need to set the VMA of the .MMIX.reg_contents section when it has
48fa4a5d
HPN
52 been allocated, and produce the final settings for the linker-generated
53 GREGs. */
3c3bdf30
NC
54
55static void
0c7a8e5a 56mmix_after_allocation (void)
3c3bdf30
NC
57{
58 asection *sec
59 = bfd_get_section_by_name (output_bfd, MMIX_REG_CONTENTS_SECTION_NAME);
8017dbcb 60 bfd_signed_vma regvma;
3c3bdf30 61
83c2d653 62 /* If there's no register section, we don't need to do anything. On the
6266d8d4
HPN
63 other hand, if there's a non-standard linker-script without a mapping
64 from MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME when that section is
65 present (as in the ld test "NOCROSSREFS 2"), that section (1) will be
66 orphaned; not inserted in MMIX_REG_CONTENTS_SECTION_NAME and (2) we
67 will not do the necessary preparations for those relocations that
68 caused it to be created. We'll SEGV from the latter error. The
69 former error in separation will result in a non-working binary, but
70 that's expected when you play tricks with linker scripts. The
71 "NOCROSSREFS 2" test does not run the output so it does not matter
72 there. */
83c2d653
HPN
73 if (sec == NULL)
74 sec
75 = bfd_get_section_by_name (output_bfd,
76 MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
3c3bdf30
NC
77 if (sec == NULL)
78 return;
79
eea6121a 80 regvma = 256 * 8 - sec->size - 8;
3c3bdf30 81
74c44237
HPN
82 /* If we start on a local register, we have too many global registers.
83 We treat this error as nonfatal (meaning processing will continue in
84 search for other errors), because it's a link error in the same way
85 as an undefined symbol. */
3c3bdf30 86 if (regvma < 32 * 8)
74c44237
HPN
87 {
88 einfo ("%X%P: Too many global registers: %u, max 223\n",
eea6121a 89 (unsigned) sec->size / 8);
74c44237
HPN
90 regvma = 32 * 8;
91 }
3c3bdf30
NC
92
93 /* Set vma to correspond to first such register number * 8. */
8017dbcb 94 bfd_set_section_vma (output_bfd, sec, (bfd_vma) regvma);
3c3bdf30 95
3c3bdf30 96 /* Simplify symbol output for the register section (without contents;
48fa4a5d
HPN
97 created for register symbols) by setting the output offset to 0.
98 This section is only present when there are register symbols. */
3c3bdf30 99 sec = bfd_get_section_by_name (output_bfd, MMIX_REG_SECTION_NAME);
48fa4a5d
HPN
100 if (sec != NULL)
101 bfd_set_section_vma (abfd, sec, 0);
3c3bdf30 102
06335781 103 if (!_bfd_mmix_after_linker_allocation (output_bfd, &link_info))
48fa4a5d 104 {
74c44237
HPN
105 /* This is a fatal error; make einfo call not return. */
106 einfo ("%F%P: Can't finalize linker-allocated global registers\n");
48fa4a5d 107 }
3c3bdf30
NC
108}
109EOF
110
48fa4a5d
HPN
111LDEMUL_AFTER_ALLOCATION=mmix_after_allocation
112LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation
This page took 0.280493 seconds and 4 git commands to generate.