OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.18.50/] [ld/] [emultempl/] [mmix-elfnmmo.em] - Blame information for rev 179

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
# This shell script emits a C file. -*- C -*-
2
#   Copyright 2001, 2002, 2003, 2004, 2007, 2008
3
#   Free Software Foundation, Inc.
4
#
5
# This file is part of the GNU Binutils.
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
9
# the Free Software Foundation; either version 3 of the License, or
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
19
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
# MA 02110-1301, USA.
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
 
26
fragment <
27
#include "elf/mmix.h"
28
 
29
/* Set up handling of linker-allocated global registers.  */
30
 
31
static void
32
mmix_before_allocation (void)
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
 
43
  /* Force -relax on (regardless of whether we're doing a relocatable
44
     link).  */
45
  command_line.relax = TRUE;
46
 
47
  if (!_bfd_mmix_before_linker_allocation (link_info.output_bfd, &link_info))
48
    einfo ("%X%P: Internal problems setting up section %s",
49
           MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
50
}
51
 
52
/* We need to set the VMA of the .MMIX.reg_contents section when it has
53
   been allocated, and produce the final settings for the linker-generated
54
   GREGs.  */
55
 
56
static void
57
mmix_after_allocation (void)
58
{
59
  asection *sec
60
    = bfd_get_section_by_name (link_info.output_bfd,
61
                               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.  On the
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.  */
75
  if (sec == NULL)
76
    sec
77
      = bfd_get_section_by_name (link_info.output_bfd,
78
                                 MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
79
  if (sec == NULL)
80
    return;
81
 
82
  regvma = 256 * 8 - sec->size - 8;
83
 
84
  /* If we start on a local register, we have too many global registers.
85
     We treat this error as nonfatal (meaning processing will continue in
86
     search for other errors), because it's a link error in the same way
87
     as an undefined symbol.  */
88
  if (regvma < 32 * 8)
89
    {
90
      einfo ("%X%P: Too many global registers: %u, max 223\n",
91
             (unsigned) sec->size / 8);
92
      regvma = 32 * 8;
93
    }
94
 
95
  /* Set vma to correspond to first such register number * 8.  */
96
  bfd_set_section_vma (link_info.output_bfd, sec, (bfd_vma) regvma);
97
 
98
  /* Simplify symbol output for the register section (without contents;
99
     created for register symbols) by setting the output offset to 0.
100
     This section is only present when there are register symbols.  */
101
  sec = bfd_get_section_by_name (link_info.output_bfd, MMIX_REG_SECTION_NAME);
102
  if (sec != NULL)
103
    bfd_set_section_vma (abfd, sec, 0);
104
 
105
  if (!_bfd_mmix_after_linker_allocation (link_info.output_bfd, &link_info))
106
    {
107
      /* This is a fatal error; make einfo call not return.  */
108
      einfo ("%F%P: Can't finalize linker-allocated global registers\n");
109
    }
110
}
111
EOF
112
 
113
LDEMUL_AFTER_ALLOCATION=mmix_after_allocation
114
LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.