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