X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Femultempl%2Fmmix-elfnmmo.em;h=beb6f09ff31d89f8d24d3c419bbb15ca280971c3;hb=8b8c7c9f49992750f66f81b4601d593a3858d98c;hp=d1058b1cfc6c867c3f934c8d0e3884a29fb65531;hpb=3c3bdf30e42268e6193693acd1dc66d2d1792536;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/emultempl/mmix-elfnmmo.em b/ld/emultempl/mmix-elfnmmo.em index d1058b1cfc..beb6f09ff3 100644 --- a/ld/emultempl/mmix-elfnmmo.em +++ b/ld/emultempl/mmix-elfnmmo.em @@ -1,11 +1,11 @@ # This shell script emits a C file. -*- C -*- -# Copyright 2001 Free Software Foundation, Inc. +# Copyright (C) 2001-2016 Free Software Foundation, Inc. # -# This file is part of GLD, the Gnu Linker. +# This file is part of the GNU Binutils. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, @@ -15,60 +15,101 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +# MA 02110-1301, USA. # # This file is sourced from elf32.em and mmo.em, used to define # MMIX-specific things common to ELF and MMO. -cat >>e${EMULATION_NAME}.c <_raw_size - 8; + regvma = 256 * 8 - sec->size - 8; - /* If we start on a local register, we have too many global registers. */ + /* If we start on a local register, we have too many global registers. + We treat this error as nonfatal (meaning processing will continue in + search for other errors), because it's a link error in the same way + as an undefined symbol. */ if (regvma < 32 * 8) - einfo ("%X%P: Too many global registers: %u, max 223\n", - (unsigned) sec->_raw_size / 8); - - /* Set vma to correspond to first such register number * 8. */ - bfd_set_section_vma (output_bfd, sec, regvma); - - /* ??? Why isn't the section size (_cooked_size) set? Doesn't it get - set regardless of presence of relocations? */ - if (sec->_cooked_size == 0 - && ! bfd_set_section_size (output_bfd, sec, sec->_raw_size)) { - einfo ("%X%P: Can't set section %s size to %u\n", - MMIX_REG_CONTENTS_SECTION_NAME, (unsigned) sec->_raw_size); - return; + einfo ("%X%P: Too many global registers: %u, max 223\n", + (unsigned) sec->size / 8); + regvma = 32 * 8; } - /* Simplify symbol output for the register section (without contents; - created for register symbols) by setting the output offset to 0. */ - sec = bfd_get_section_by_name (output_bfd, MMIX_REG_SECTION_NAME); - if (sec == NULL) - return; + /* Set vma to correspond to first such register number * 8. */ + bfd_set_section_vma (link_info.output_bfd, sec, (bfd_vma) regvma); - bfd_set_section_vma (abfd, sec, 0); + /* Simplify symbol output for the register section (without contents; + 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 (link_info.output_bfd, MMIX_REG_SECTION_NAME); + if (sec != NULL) + bfd_set_section_vma (sec->owner, sec, 0); + if (!_bfd_mmix_after_linker_allocation (link_info.output_bfd, &link_info)) + { + /* This is a fatal error; make einfo call not return. */ + einfo ("%F%P: Can't finalize linker-allocated global registers\n"); + } } EOF -LDEMUL_AFTER_ALLOCATION=mmix_set_reg_section_vma +LDEMUL_AFTER_ALLOCATION=mmix_after_allocation +LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation