mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-18 12:24:38 +08:00
Support on-demand global register allocation from
R_MMIX_BASE_PLUS_OFFSET relocs. * emultempl/mmix-elfnmmo.em (mmix_after_allocation): Rename from mmix_set_reg_section_vma. Call _bfd_mmix_finalize_linker_allocated_gregs. (mmix_before_allocation): New function. (LDEMUL_AFTER_ALLOCATION): Set to mmix_after_allocation. (LDEMUL_BEFORE_ALLOCATION): Define to mmix_before_allocation. * scripttempl/mmo.sc (.text): Mark .init, .fini as KEEP. (.MMIX.reg_contents): Add .MMIX.reg_contents.linker_allocated before .MMIX.reg_contents. * emultempl/mmo.em (gldmmo_before_allocation): Define to default. (mmo_after_open): New function. (LDEMUL_AFTER_OPEN): Define to mmo_after_open. * emulparams/elf64mmix.sh (OTHER_SECTIONS): Tweak formatting. Add .MMIX.reg_contents.linker_allocated before .MMIX.reg_contents.
This commit is contained in:
parent
930b4cb2c2
commit
48fa4a5def
19
ld/ChangeLog
19
ld/ChangeLog
@ -1,3 +1,22 @@
|
||||
2002-02-01 Hans-Peter Nilsson <hp@bitrange.com>
|
||||
|
||||
Support on-demand global register allocation from
|
||||
R_MMIX_BASE_PLUS_OFFSET relocs.
|
||||
* emultempl/mmix-elfnmmo.em (mmix_after_allocation): Rename from
|
||||
mmix_set_reg_section_vma. Call
|
||||
_bfd_mmix_finalize_linker_allocated_gregs.
|
||||
(mmix_before_allocation): New function.
|
||||
(LDEMUL_AFTER_ALLOCATION): Set to mmix_after_allocation.
|
||||
(LDEMUL_BEFORE_ALLOCATION): Define to mmix_before_allocation.
|
||||
* scripttempl/mmo.sc (.text): Mark .init, .fini as KEEP.
|
||||
(.MMIX.reg_contents): Add .MMIX.reg_contents.linker_allocated
|
||||
before .MMIX.reg_contents.
|
||||
* emultempl/mmo.em (gldmmo_before_allocation): Define to default.
|
||||
(mmo_after_open): New function.
|
||||
(LDEMUL_AFTER_OPEN): Define to mmo_after_open.
|
||||
* emulparams/elf64mmix.sh (OTHER_SECTIONS): Tweak formatting. Add
|
||||
.MMIX.reg_contents.linker_allocated before .MMIX.reg_contents.
|
||||
|
||||
2002-01-31 Ivan Guzvinec <ivang@opencores.org>
|
||||
|
||||
* emulparams/or32.sh: New file.
|
||||
|
@ -44,14 +44,15 @@ OTHER_TEXT_SECTIONS='
|
||||
PROVIDE (Main = DEFINED (Main) ? Main : (DEFINED (_start) ? _start : _start.));
|
||||
'
|
||||
|
||||
OTHER_SECTIONS="
|
||||
OTHER_SECTIONS='
|
||||
.MMIX.reg_contents :
|
||||
{
|
||||
/* Note that this section always has a fixed VMA - that of its
|
||||
first register * 8. */
|
||||
*(.MMIX.reg_contents.linker_allocated);
|
||||
*(.MMIX.reg_contents);
|
||||
}
|
||||
"
|
||||
'
|
||||
|
||||
# FIXME: Also bit by the PROVIDE bug? If not, this could be
|
||||
# EXECUTABLE_SYMBOLS.
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This shell script emits a C file. -*- C -*-
|
||||
# Copyright 2001 Free Software Foundation, Inc.
|
||||
# Copyright 2001, 2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of GLD, the Gnu Linker.
|
||||
#
|
||||
@ -24,13 +24,38 @@
|
||||
cat >>e${EMULATION_NAME}.c <<EOF
|
||||
#include "elf/mmix.h"
|
||||
|
||||
static void mmix_set_reg_section_vma PARAMS ((void));
|
||||
static void mmix_before_allocation PARAMS ((void));
|
||||
static void mmix_after_allocation PARAMS ((void));
|
||||
|
||||
/* We need to set the VMA of the .MMIX.reg_contents section when it has
|
||||
been allocated. */
|
||||
/* Set up handling of linker-allocated global registers. */
|
||||
|
||||
static void
|
||||
mmix_set_reg_section_vma ()
|
||||
mmix_before_allocation ()
|
||||
{
|
||||
/* Call the default first. */
|
||||
gld${EMULATION_NAME}_before_allocation ();
|
||||
|
||||
/* There's a needrelax.em which uses this ..._before_allocation-hook and
|
||||
just has the statement below as payload. It's more of a hassle to
|
||||
use that than to just include these two lines and take the
|
||||
maintenance burden to keep them in sync. (Of course we lose the
|
||||
maintenance burden of checking that it still does what we need.) */
|
||||
|
||||
/* Force -relax on if not doing a relocatable link. */
|
||||
if (! link_info.relocateable)
|
||||
command_line.relax = true;
|
||||
|
||||
if (!_bfd_mmix_prepare_linker_allocated_gregs (output_bfd, &link_info))
|
||||
einfo ("%X%P: Internal problems setting up section %s",
|
||||
MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
|
||||
}
|
||||
|
||||
/* We need to set the VMA of the .MMIX.reg_contents section when it has
|
||||
been allocated, and produce the final settings for the linker-generated
|
||||
GREGs. */
|
||||
|
||||
static void
|
||||
mmix_after_allocation ()
|
||||
{
|
||||
asection *sec
|
||||
= bfd_get_section_by_name (output_bfd, MMIX_REG_CONTENTS_SECTION_NAME);
|
||||
@ -61,14 +86,20 @@ mmix_set_reg_section_vma ()
|
||||
}
|
||||
|
||||
/* Simplify symbol output for the register section (without contents;
|
||||
created for register symbols) by setting the output offset to 0. */
|
||||
created for register symbols) by setting the output offset to 0.
|
||||
This section is only present when there are register symbols. */
|
||||
sec = bfd_get_section_by_name (output_bfd, MMIX_REG_SECTION_NAME);
|
||||
if (sec == NULL)
|
||||
return;
|
||||
|
||||
bfd_set_section_vma (abfd, sec, 0);
|
||||
if (sec != NULL)
|
||||
bfd_set_section_vma (abfd, sec, 0);
|
||||
|
||||
if (!_bfd_mmix_finalize_linker_allocated_gregs (output_bfd, &link_info))
|
||||
{
|
||||
einfo ("%X%P: Can't finalize linker-allocated global registers\n");
|
||||
/* In case stuff is added after this conditional. */
|
||||
return;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
LDEMUL_AFTER_ALLOCATION=mmix_set_reg_section_vma
|
||||
LDEMUL_AFTER_ALLOCATION=mmix_after_allocation
|
||||
LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This shell script emits a C file. -*- C -*-
|
||||
# Copyright 2001 Free Software Foundation, Inc.
|
||||
# Copyright 2001, 2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of GLD, the Gnu Linker.
|
||||
#
|
||||
@ -21,6 +21,13 @@
|
||||
# This file is sourced from elf32.em and mmo.em, used to define
|
||||
# linker MMIX-specifics common to ELF and MMO.
|
||||
|
||||
cat >>e${EMULATION_NAME}.c <<EOF
|
||||
/* Need to have this define before mmix-elfnmmo, which includes
|
||||
needrelax.em which uses this name for the before_allocation function,
|
||||
normally defined in elf32.em. */
|
||||
#define gldmmo_before_allocation before_allocation_default
|
||||
EOF
|
||||
|
||||
. ${srcdir}/emultempl/mmix-elfnmmo.em
|
||||
|
||||
cat >>e${EMULATION_NAME}.c <<EOF
|
||||
@ -31,6 +38,7 @@ static asection *output_prev_sec_find
|
||||
PARAMS ((lang_output_section_statement_type *));
|
||||
static void mmo_finish PARAMS ((void));
|
||||
static void mmo_wipe_sec_reloc_flag PARAMS ((bfd *, asection *, PTR));
|
||||
static void mmo_after_open PARAMS ((void));
|
||||
|
||||
/* Find the last output section before given output statement.
|
||||
Used by place_orphan. */
|
||||
@ -220,8 +228,26 @@ mmo_finish ()
|
||||
{
|
||||
bfd_map_over_sections (output_bfd, mmo_wipe_sec_reloc_flag, NULL);
|
||||
}
|
||||
|
||||
/* To get on-demand global register allocation right, we need to parse the
|
||||
relocs, like what happens when linking to ELF. It needs to be done
|
||||
before all input sections are supposed to be present. When linking to
|
||||
ELF, it's done when reading symbols. When linking to mmo, we do it
|
||||
when all input files are seen, which is equivalent. */
|
||||
|
||||
static void
|
||||
mmo_after_open ()
|
||||
{
|
||||
LANG_FOR_EACH_INPUT_STATEMENT (is)
|
||||
{
|
||||
if (bfd_get_flavour (is->the_bfd) == bfd_target_elf_flavour
|
||||
&& !_bfd_mmix_check_all_relocs (is->the_bfd, &link_info))
|
||||
einfo ("%X%P: Internal problems scanning %B after opening it",
|
||||
is->the_bfd);
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
LDEMUL_PLACE_ORPHAN=mmo_place_orphan
|
||||
LDEMUL_FINISH=mmo_finish
|
||||
LDEMUL_AFTER_OPEN=mmo_after_open
|
||||
|
@ -16,12 +16,12 @@ SECTIONS
|
||||
/* FIXME: Move .init, .fini, .ctors and .dtors to their own sections. */
|
||||
${RELOCATING+ PROVIDE (_init_start = .);}
|
||||
${RELOCATING+ PROVIDE (_init = .);}
|
||||
${RELOCATING+ *(.init)}
|
||||
${RELOCATING+ KEEP (*(.init))}
|
||||
${RELOCATING+ PROVIDE (_init_end = .);}
|
||||
|
||||
${RELOCATING+ PROVIDE (_fini_start = .);}
|
||||
${RELOCATING+ PROVIDE (_fini = .);}
|
||||
${RELOCATING+ *(.fini)}
|
||||
${RELOCATING+ KEEP (*(.fini))}
|
||||
${RELOCATING+ PROVIDE (_fini_end = .);}
|
||||
|
||||
/* FIXME: Align ctors, dtors, ehframe. */
|
||||
@ -115,6 +115,7 @@ SECTIONS
|
||||
{
|
||||
/* Note that this section always has a fixed VMA - that of its
|
||||
first register * 8. */
|
||||
*(.MMIX.reg_contents.linker_allocated);
|
||||
*(.MMIX.reg_contents);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user