summaryrefslogtreecommitdiff
path: root/ld/emultempl/mmo.em
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2002-02-01 08:24:03 +0000
committerHans-Peter Nilsson <hp@axis.com>2002-02-01 08:24:03 +0000
commit846e4ba9c9f13f142251ba08494509c19eac8f69 (patch)
tree18e95a6855d057be67ae6e1cf7e3e2766da9a5ba /ld/emultempl/mmo.em
parent2fa8bc4370d278e122fc3cbf7b8823ee071faab6 (diff)
downloadbinutils-redhat-846e4ba9c9f13f142251ba08494509c19eac8f69.tar.gz
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.
Diffstat (limited to 'ld/emultempl/mmo.em')
-rw-r--r--ld/emultempl/mmo.em28
1 files changed, 27 insertions, 1 deletions
diff --git a/ld/emultempl/mmo.em b/ld/emultempl/mmo.em
index 8fed0f6c94..1a3941d388 100644
--- a/ld/emultempl/mmo.em
+++ b/ld/emultempl/mmo.em
@@ -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