mmix-elfnmmo.em 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # This shell script emits a C file. -*- C -*-
  2. # Copyright (C) 2001-2015 Free Software Foundation, Inc.
  3. #
  4. # This file is part of the GNU Binutils.
  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 3 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., 51 Franklin Street - Fifth Floor, Boston,
  19. # MA 02110-1301, USA.
  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. fragment <<EOF
  24. #include "elf/mmix.h"
  25. /* Set up handling of linker-allocated global registers. */
  26. static void
  27. mmix_before_allocation (void)
  28. {
  29. /* Call the default first. */
  30. gld${EMULATION_NAME}_before_allocation ();
  31. /* There's a needrelax.em which uses this ..._before_allocation-hook and
  32. just has the statement below as payload. It's more of a hassle to
  33. use that than to just include these two lines and take the
  34. maintenance burden to keep them in sync. (Of course we lose the
  35. maintenance burden of checking that it still does what we need.) */
  36. /* Force -relax on (regardless of whether we're doing a relocatable
  37. link). */
  38. ENABLE_RELAXATION;
  39. if (!_bfd_mmix_before_linker_allocation (link_info.output_bfd, &link_info))
  40. einfo ("%X%P: Internal problems setting up section %s",
  41. MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
  42. }
  43. /* We need to set the VMA of the .MMIX.reg_contents section when it has
  44. been allocated, and produce the final settings for the linker-generated
  45. GREGs. */
  46. static void
  47. mmix_after_allocation (void)
  48. {
  49. asection *sec;
  50. bfd_signed_vma regvma;
  51. gld${EMULATION_NAME}_after_allocation ();
  52. /* If there's no register section, we don't need to do anything. On the
  53. other hand, if there's a non-standard linker-script without a mapping
  54. from MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME when that section is
  55. present (as in the ld test "NOCROSSREFS 2"), that section (1) will be
  56. orphaned; not inserted in MMIX_REG_CONTENTS_SECTION_NAME and (2) we
  57. will not do the necessary preparations for those relocations that
  58. caused it to be created. We'll SEGV from the latter error. The
  59. former error in separation will result in a non-working binary, but
  60. that's expected when you play tricks with linker scripts. The
  61. "NOCROSSREFS 2" test does not run the output so it does not matter
  62. there. */
  63. sec = bfd_get_section_by_name (link_info.output_bfd,
  64. MMIX_REG_CONTENTS_SECTION_NAME);
  65. if (sec == NULL)
  66. sec
  67. = bfd_get_section_by_name (link_info.output_bfd,
  68. MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
  69. if (sec == NULL)
  70. return;
  71. regvma = 256 * 8 - sec->size - 8;
  72. /* If we start on a local register, we have too many global registers.
  73. We treat this error as nonfatal (meaning processing will continue in
  74. search for other errors), because it's a link error in the same way
  75. as an undefined symbol. */
  76. if (regvma < 32 * 8)
  77. {
  78. einfo ("%X%P: Too many global registers: %u, max 223\n",
  79. (unsigned) sec->size / 8);
  80. regvma = 32 * 8;
  81. }
  82. /* Set vma to correspond to first such register number * 8. */
  83. bfd_set_section_vma (link_info.output_bfd, sec, (bfd_vma) regvma);
  84. /* Simplify symbol output for the register section (without contents;
  85. created for register symbols) by setting the output offset to 0.
  86. This section is only present when there are register symbols. */
  87. sec = bfd_get_section_by_name (link_info.output_bfd, MMIX_REG_SECTION_NAME);
  88. if (sec != NULL)
  89. bfd_set_section_vma (sec->owner, sec, 0);
  90. if (!_bfd_mmix_after_linker_allocation (link_info.output_bfd, &link_info))
  91. {
  92. /* This is a fatal error; make einfo call not return. */
  93. einfo ("%F%P: Can't finalize linker-allocated global registers\n");
  94. }
  95. }
  96. EOF
  97. LDEMUL_AFTER_ALLOCATION=mmix_after_allocation
  98. LDEMUL_BEFORE_ALLOCATION=mmix_before_allocation