* emultempl/mmix-elfnmmo.em (mmix_after_allocation): Use signed
[deliverable/binutils-gdb.git] / ld / emultempl / mmix-elfnmmo.em
1 # This shell script emits a C file. -*- C -*-
2 # Copyright 2001, 2002 Free Software Foundation, Inc.
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
24 cat >>e${EMULATION_NAME}.c <<EOF
25 #include "elf/mmix.h"
26
27 static void mmix_before_allocation PARAMS ((void));
28 static void mmix_after_allocation PARAMS ((void));
29
30 /* Set up handling of linker-allocated global registers. */
31
32 static void
33 mmix_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 }
52
53 /* We need to set the VMA of the .MMIX.reg_contents section when it has
54 been allocated, and produce the final settings for the linker-generated
55 GREGs. */
56
57 static void
58 mmix_after_allocation ()
59 {
60 asection *sec
61 = bfd_get_section_by_name (output_bfd, MMIX_REG_CONTENTS_SECTION_NAME);
62 bfd_signed_vma regvma;
63
64 /* If there's no register section, we don't need to do anything. */
65 if (sec == NULL)
66 return;
67
68 regvma = 256 * 8 - sec->_raw_size - 8;
69
70 /* If we start on a local register, we have too many global registers. */
71 if (regvma < 32 * 8)
72 einfo ("%X%P: Too many global registers: %u, max 223\n",
73 (unsigned) sec->_raw_size / 8);
74
75 /* Set vma to correspond to first such register number * 8. */
76 bfd_set_section_vma (output_bfd, sec, (bfd_vma) regvma);
77
78 /* ??? Why isn't the section size (_cooked_size) set? Doesn't it get
79 set regardless of presence of relocations? */
80 if (sec->_cooked_size == 0
81 && ! bfd_set_section_size (output_bfd, sec, sec->_raw_size))
82 {
83 einfo ("%X%P: Can't set section %s size to %u\n",
84 MMIX_REG_CONTENTS_SECTION_NAME, (unsigned) sec->_raw_size);
85 return;
86 }
87
88 /* Simplify symbol output for the register section (without contents;
89 created for register symbols) by setting the output offset to 0.
90 This section is only present when there are register symbols. */
91 sec = bfd_get_section_by_name (output_bfd, MMIX_REG_SECTION_NAME);
92 if (sec != NULL)
93 bfd_set_section_vma (abfd, sec, 0);
94
95 if (!_bfd_mmix_finalize_linker_allocated_gregs (output_bfd, &link_info))
96 {
97 einfo ("%X%P: Can't finalize linker-allocated global registers\n");
98 /* In case stuff is added after this conditional. */
99 return;
100 }
101 }
102 EOF
103
104 LDEMUL_AFTER_ALLOCATION=mmix_after_allocation
105 LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation
This page took 0.03302 seconds and 5 git commands to generate.