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