Home | History | Annotate | Line # | Download | only in bfd
elf64-mmix.c revision 1.1.1.11
      1 /* MMIX-specific support for 64-bit ELF.
      2    Copyright (C) 2001-2025 Free Software Foundation, Inc.
      3    Contributed by Hans-Peter Nilsson <hp (at) bitrange.com>
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      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 /* No specific ABI or "processor-specific supplement" defined.  */
     24 
     25 /* TODO:
     26    - "Traditional" linker relaxation (shrinking whole sections).
     27    - Merge reloc stubs jumping to same location.
     28    - GETA stub relaxation (call a stub for out of range new
     29      R_MMIX_GETA_STUBBABLE).  */
     30 
     31 #include "sysdep.h"
     32 #include "bfd.h"
     33 #include "libbfd.h"
     34 #include "elf-bfd.h"
     35 #include "elf/mmix.h"
     36 #include "opcode/mmix.h"
     37 
     38 #define MINUS_ONE	(((bfd_vma) 0) - 1)
     39 
     40 #define MAX_PUSHJ_STUB_SIZE (5 * 4)
     41 
     42 /* Put these everywhere in new code.  */
     43 #define FATAL_DEBUG						\
     44  _bfd_abort (__FILE__, __LINE__,				\
     45 	     "Internal: Non-debugged code (test-case missing)")
     46 
     47 #define BAD_CASE(x)				\
     48  _bfd_abort (__FILE__, __LINE__,		\
     49 	     "bad case for " #x)
     50 
     51 struct _mmix_elf_section_data
     52 {
     53   struct bfd_elf_section_data elf;
     54   union
     55   {
     56     struct bpo_reloc_section_info *reloc;
     57     struct bpo_greg_section_info *greg;
     58   } bpo;
     59 
     60   struct pushj_stub_info
     61   {
     62     /* Maximum number of stubs needed for this section.  */
     63     bfd_size_type n_pushj_relocs;
     64 
     65     /* Size of stubs after a mmix_elf_relax_section round.  */
     66     bfd_size_type stubs_size_sum;
     67 
     68     /* Per-reloc stubs_size_sum information.  The stubs_size_sum member is the sum
     69        of these.  Allocated in mmix_elf_check_common_relocs.  */
     70     bfd_size_type *stub_size;
     71 
     72     /* Offset of next stub during relocation.  Somewhat redundant with the
     73        above: error coverage is easier and we don't have to reset the
     74        stubs_size_sum for relocation.  */
     75     bfd_size_type stub_offset;
     76   } pjs;
     77 
     78   /* Whether there has been a warning that this section could not be
     79      linked due to a specific cause.  FIXME: a way to access the
     80      linker info or output section, then stuff the limiter guard
     81      there. */
     82   bool has_warned_bpo;
     83   bool has_warned_pushj;
     84 };
     85 
     86 #define mmix_elf_section_data(sec) \
     87   ((struct _mmix_elf_section_data *) elf_section_data (sec))
     88 
     89 /* For each section containing a base-plus-offset (BPO) reloc, we attach
     90    this struct as mmix_elf_section_data (section)->bpo, which is otherwise
     91    NULL.  */
     92 struct bpo_reloc_section_info
     93   {
     94     /* The base is 1; this is the first number in this section.  */
     95     size_t first_base_plus_offset_reloc;
     96 
     97     /* Number of BPO-relocs in this section.  */
     98     size_t n_bpo_relocs_this_section;
     99 
    100     /* Running index, used at relocation time.  */
    101     size_t bpo_index;
    102 
    103     /* We don't have access to the bfd_link_info struct in
    104        mmix_final_link_relocate.  What we really want to get at is the
    105        global single struct greg_relocation, so we stash it here.  */
    106     asection *bpo_greg_section;
    107   };
    108 
    109 /* Helper struct (in global context) for the one below.
    110    There's one of these created for every BPO reloc.  */
    111 struct bpo_reloc_request
    112   {
    113     bfd_vma value;
    114 
    115     /* Valid after relaxation.  The base is 0; the first register number
    116        must be added.  The offset is in range 0..255.  */
    117     size_t regindex;
    118     size_t offset;
    119 
    120     /* The order number for this BPO reloc, corresponding to the order in
    121        which BPO relocs were found.  Used to create an index after reloc
    122        requests are sorted.  */
    123     size_t bpo_reloc_no;
    124 
    125     /* Set when the value is computed.  Better than coding "guard values"
    126        into the other members.  Is FALSE only for BPO relocs in a GC:ed
    127        section.  */
    128     bool valid;
    129   };
    130 
    131 /* We attach this as mmix_elf_section_data (sec)->bpo in the linker-allocated
    132    greg contents section (MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME),
    133    which is linked into the register contents section
    134    (MMIX_REG_CONTENTS_SECTION_NAME).  This section is created by the
    135    linker; using the same hook as for usual with BPO relocs does not
    136    collide.  */
    137 struct bpo_greg_section_info
    138   {
    139     /* After GC, this reflects the number of remaining, non-excluded
    140        BPO-relocs.  */
    141     size_t n_bpo_relocs;
    142 
    143     /* This is the number of allocated bpo_reloc_requests; the size of
    144        sorted_indexes.  Valid after the check.*relocs functions are called
    145        for all incoming sections.  It includes the number of BPO relocs in
    146        sections that were GC:ed.  */
    147     size_t n_max_bpo_relocs;
    148 
    149     /* A counter used to find out when to fold the BPO gregs, since we
    150        don't have a single "after-relaxation" hook.  */
    151     size_t n_remaining_bpo_relocs_this_relaxation_round;
    152 
    153     /* The number of linker-allocated GREGs resulting from BPO relocs.
    154        This is an approximation after _bfd_mmix_before_linker_allocation
    155        and supposedly accurate after mmix_elf_relax_section is called for
    156        all incoming non-collected sections.  */
    157     size_t n_allocated_bpo_gregs;
    158 
    159     /* Index into reloc_request[], sorted on increasing "value", secondary
    160        by increasing index for strict sorting order.  */
    161     size_t *bpo_reloc_indexes;
    162 
    163     /* An array of all relocations, with the "value" member filled in by
    164        the relaxation function.  */
    165     struct bpo_reloc_request *reloc_request;
    166   };
    167 
    168 
    169 extern bool mmix_elf_final_link (bfd *, struct bfd_link_info *);
    170 
    171 extern void mmix_elf_symbol_processing (bfd *, asymbol *);
    172 
    173 /* Only intended to be called from a debugger.  */
    174 extern void mmix_dump_bpo_gregs
    175   (struct bfd_link_info *, void (*) (const char *, ...));
    176 
    177 static void
    178 mmix_set_relaxable_size (bfd *, asection *, void *);
    179 static bfd_reloc_status_type
    180 mmix_elf_reloc (bfd *, arelent *, asymbol *, void *,
    181 		asection *, bfd *, char **);
    182 static bfd_reloc_status_type
    183 mmix_final_link_relocate (reloc_howto_type *, asection *, bfd_byte *, bfd_vma,
    184 			  bfd_signed_vma, bfd_vma, const char *, asection *,
    185 			  char **);
    186 
    187 
    188 /* Watch out: this currently needs to have elements with the same index as
    189    their R_MMIX_ number.  */
    190 static reloc_howto_type elf_mmix_howto_table[] =
    191  {
    192   /* This reloc does nothing.  */
    193   HOWTO (R_MMIX_NONE,		/* type */
    194 	 0,			/* rightshift */
    195 	 0,			/* size */
    196 	 0,			/* bitsize */
    197 	 false,			/* pc_relative */
    198 	 0,			/* bitpos */
    199 	 complain_overflow_dont, /* complain_on_overflow */
    200 	 bfd_elf_generic_reloc,	/* special_function */
    201 	 "R_MMIX_NONE",		/* name */
    202 	 false,			/* partial_inplace */
    203 	 0,			/* src_mask */
    204 	 0,			/* dst_mask */
    205 	 false),		/* pcrel_offset */
    206 
    207   /* An 8 bit absolute relocation.  */
    208   HOWTO (R_MMIX_8,		/* type */
    209 	 0,			/* rightshift */
    210 	 1,			/* size */
    211 	 8,			/* bitsize */
    212 	 false,			/* pc_relative */
    213 	 0,			/* bitpos */
    214 	 complain_overflow_bitfield, /* complain_on_overflow */
    215 	 bfd_elf_generic_reloc,	/* special_function */
    216 	 "R_MMIX_8",		/* name */
    217 	 false,			/* partial_inplace */
    218 	 0,			/* src_mask */
    219 	 0xff,			/* dst_mask */
    220 	 false),		/* pcrel_offset */
    221 
    222   /* An 16 bit absolute relocation.  */
    223   HOWTO (R_MMIX_16,		/* type */
    224 	 0,			/* rightshift */
    225 	 2,			/* size */
    226 	 16,			/* bitsize */
    227 	 false,			/* pc_relative */
    228 	 0,			/* bitpos */
    229 	 complain_overflow_bitfield, /* complain_on_overflow */
    230 	 bfd_elf_generic_reloc,	/* special_function */
    231 	 "R_MMIX_16",		/* name */
    232 	 false,			/* partial_inplace */
    233 	 0,			/* src_mask */
    234 	 0xffff,		/* dst_mask */
    235 	 false),		/* pcrel_offset */
    236 
    237   /* An 24 bit absolute relocation.  */
    238   HOWTO (R_MMIX_24,		/* type */
    239 	 0,			/* rightshift */
    240 	 4,			/* size */
    241 	 24,			/* bitsize */
    242 	 false,			/* pc_relative */
    243 	 0,			/* bitpos */
    244 	 complain_overflow_bitfield, /* complain_on_overflow */
    245 	 bfd_elf_generic_reloc,	/* special_function */
    246 	 "R_MMIX_24",		/* name */
    247 	 false,			/* partial_inplace */
    248 	 ~0xffffff,		/* src_mask */
    249 	 0xffffff,		/* dst_mask */
    250 	 false),		/* pcrel_offset */
    251 
    252   /* A 32 bit absolute relocation.  */
    253   HOWTO (R_MMIX_32,		/* type */
    254 	 0,			/* rightshift */
    255 	 4,			/* size */
    256 	 32,			/* bitsize */
    257 	 false,			/* pc_relative */
    258 	 0,			/* bitpos */
    259 	 complain_overflow_bitfield, /* complain_on_overflow */
    260 	 bfd_elf_generic_reloc,	/* special_function */
    261 	 "R_MMIX_32",		/* name */
    262 	 false,			/* partial_inplace */
    263 	 0,			/* src_mask */
    264 	 0xffffffff,		/* dst_mask */
    265 	 false),		/* pcrel_offset */
    266 
    267   /* 64 bit relocation.  */
    268   HOWTO (R_MMIX_64,		/* type */
    269 	 0,			/* rightshift */
    270 	 8,			/* size */
    271 	 64,			/* bitsize */
    272 	 false,			/* pc_relative */
    273 	 0,			/* bitpos */
    274 	 complain_overflow_bitfield, /* complain_on_overflow */
    275 	 bfd_elf_generic_reloc,	/* special_function */
    276 	 "R_MMIX_64",		/* name */
    277 	 false,			/* partial_inplace */
    278 	 0,			/* src_mask */
    279 	 MINUS_ONE,		/* dst_mask */
    280 	 false),		/* pcrel_offset */
    281 
    282   /* An 8 bit PC-relative relocation.  */
    283   HOWTO (R_MMIX_PC_8,		/* type */
    284 	 0,			/* rightshift */
    285 	 1,			/* size */
    286 	 8,			/* bitsize */
    287 	 true,			/* pc_relative */
    288 	 0,			/* bitpos */
    289 	 complain_overflow_bitfield, /* complain_on_overflow */
    290 	 bfd_elf_generic_reloc,	/* special_function */
    291 	 "R_MMIX_PC_8",		/* name */
    292 	 false,			/* partial_inplace */
    293 	 0,			/* src_mask */
    294 	 0xff,			/* dst_mask */
    295 	 true),			/* pcrel_offset */
    296 
    297   /* An 16 bit PC-relative relocation.  */
    298   HOWTO (R_MMIX_PC_16,		/* type */
    299 	 0,			/* rightshift */
    300 	 2,			/* size */
    301 	 16,			/* bitsize */
    302 	 true,			/* pc_relative */
    303 	 0,			/* bitpos */
    304 	 complain_overflow_bitfield, /* complain_on_overflow */
    305 	 bfd_elf_generic_reloc,	/* special_function */
    306 	 "R_MMIX_PC_16",	/* name */
    307 	 false,			/* partial_inplace */
    308 	 0,			/* src_mask */
    309 	 0xffff,		/* dst_mask */
    310 	 true),			/* pcrel_offset */
    311 
    312   /* An 24 bit PC-relative relocation.  */
    313   HOWTO (R_MMIX_PC_24,		/* type */
    314 	 0,			/* rightshift */
    315 	 4,			/* size */
    316 	 24,			/* bitsize */
    317 	 true,			/* pc_relative */
    318 	 0,			/* bitpos */
    319 	 complain_overflow_bitfield, /* complain_on_overflow */
    320 	 bfd_elf_generic_reloc,	/* special_function */
    321 	 "R_MMIX_PC_24",	/* name */
    322 	 false,			/* partial_inplace */
    323 	 ~0xffffff,		/* src_mask */
    324 	 0xffffff,		/* dst_mask */
    325 	 true),			/* pcrel_offset */
    326 
    327   /* A 32 bit absolute PC-relative relocation.  */
    328   HOWTO (R_MMIX_PC_32,		/* type */
    329 	 0,			/* rightshift */
    330 	 4,			/* size */
    331 	 32,			/* bitsize */
    332 	 true,			/* pc_relative */
    333 	 0,			/* bitpos */
    334 	 complain_overflow_bitfield, /* complain_on_overflow */
    335 	 bfd_elf_generic_reloc,	/* special_function */
    336 	 "R_MMIX_PC_32",	/* name */
    337 	 false,			/* partial_inplace */
    338 	 0,			/* src_mask */
    339 	 0xffffffff,		/* dst_mask */
    340 	 true),			/* pcrel_offset */
    341 
    342   /* 64 bit PC-relative relocation.  */
    343   HOWTO (R_MMIX_PC_64,		/* type */
    344 	 0,			/* rightshift */
    345 	 8,			/* size */
    346 	 64,			/* bitsize */
    347 	 true,			/* pc_relative */
    348 	 0,			/* bitpos */
    349 	 complain_overflow_bitfield, /* complain_on_overflow */
    350 	 bfd_elf_generic_reloc,	/* special_function */
    351 	 "R_MMIX_PC_64",	/* name */
    352 	 false,			/* partial_inplace */
    353 	 0,			/* src_mask */
    354 	 MINUS_ONE,		/* dst_mask */
    355 	 true),			/* pcrel_offset */
    356 
    357   /* GNU extension to record C++ vtable hierarchy.  */
    358   HOWTO (R_MMIX_GNU_VTINHERIT, /* type */
    359 	 0,			/* rightshift */
    360 	 0,			/* size */
    361 	 0,			/* bitsize */
    362 	 false,			/* pc_relative */
    363 	 0,			/* bitpos */
    364 	 complain_overflow_dont, /* complain_on_overflow */
    365 	 NULL,			/* special_function */
    366 	 "R_MMIX_GNU_VTINHERIT", /* name */
    367 	 false,			/* partial_inplace */
    368 	 0,			/* src_mask */
    369 	 0,			/* dst_mask */
    370 	 true),			/* pcrel_offset */
    371 
    372   /* GNU extension to record C++ vtable member usage.  */
    373   HOWTO (R_MMIX_GNU_VTENTRY,	/* type */
    374 	 0,			/* rightshift */
    375 	 0,			/* size */
    376 	 0,			/* bitsize */
    377 	 false,			/* pc_relative */
    378 	 0,			/* bitpos */
    379 	 complain_overflow_dont, /* complain_on_overflow */
    380 	 _bfd_elf_rel_vtable_reloc_fn,	/* special_function */
    381 	 "R_MMIX_GNU_VTENTRY", /* name */
    382 	 false,			/* partial_inplace */
    383 	 0,			/* src_mask */
    384 	 0,			/* dst_mask */
    385 	 false),		/* pcrel_offset */
    386 
    387   /* The GETA relocation is supposed to get any address that could
    388      possibly be reached by the GETA instruction.  It can silently expand
    389      to get a 64-bit operand, but will complain if any of the two least
    390      significant bits are set.  The howto members reflect a simple GETA.  */
    391   HOWTO (R_MMIX_GETA,		/* type */
    392 	 2,			/* rightshift */
    393 	 4,			/* size */
    394 	 19,			/* bitsize */
    395 	 true,			/* pc_relative */
    396 	 0,			/* bitpos */
    397 	 complain_overflow_signed, /* complain_on_overflow */
    398 	 mmix_elf_reloc,	/* special_function */
    399 	 "R_MMIX_GETA",		/* name */
    400 	 false,			/* partial_inplace */
    401 	 ~0x0100ffff,		/* src_mask */
    402 	 0x0100ffff,		/* dst_mask */
    403 	 true),			/* pcrel_offset */
    404 
    405   HOWTO (R_MMIX_GETA_1,		/* type */
    406 	 2,			/* rightshift */
    407 	 4,			/* size */
    408 	 19,			/* bitsize */
    409 	 true,			/* pc_relative */
    410 	 0,			/* bitpos */
    411 	 complain_overflow_signed, /* complain_on_overflow */
    412 	 mmix_elf_reloc,	/* special_function */
    413 	 "R_MMIX_GETA_1",		/* name */
    414 	 false,			/* partial_inplace */
    415 	 ~0x0100ffff,		/* src_mask */
    416 	 0x0100ffff,		/* dst_mask */
    417 	 true),			/* pcrel_offset */
    418 
    419   HOWTO (R_MMIX_GETA_2,		/* type */
    420 	 2,			/* rightshift */
    421 	 4,			/* size */
    422 	 19,			/* bitsize */
    423 	 true,			/* pc_relative */
    424 	 0,			/* bitpos */
    425 	 complain_overflow_signed, /* complain_on_overflow */
    426 	 mmix_elf_reloc,	/* special_function */
    427 	 "R_MMIX_GETA_2",		/* name */
    428 	 false,			/* partial_inplace */
    429 	 ~0x0100ffff,		/* src_mask */
    430 	 0x0100ffff,		/* dst_mask */
    431 	 true),			/* pcrel_offset */
    432 
    433   HOWTO (R_MMIX_GETA_3,		/* type */
    434 	 2,			/* rightshift */
    435 	 4,			/* size */
    436 	 19,			/* bitsize */
    437 	 true,			/* pc_relative */
    438 	 0,			/* bitpos */
    439 	 complain_overflow_signed, /* complain_on_overflow */
    440 	 mmix_elf_reloc,	/* special_function */
    441 	 "R_MMIX_GETA_3",		/* name */
    442 	 false,			/* partial_inplace */
    443 	 ~0x0100ffff,		/* src_mask */
    444 	 0x0100ffff,		/* dst_mask */
    445 	 true),			/* pcrel_offset */
    446 
    447   /* The conditional branches are supposed to reach any (code) address.
    448      It can silently expand to a 64-bit operand, but will emit an error if
    449      any of the two least significant bits are set.  The howto members
    450      reflect a simple branch.  */
    451   HOWTO (R_MMIX_CBRANCH,	/* type */
    452 	 2,			/* rightshift */
    453 	 4,			/* size */
    454 	 19,			/* bitsize */
    455 	 true,			/* pc_relative */
    456 	 0,			/* bitpos */
    457 	 complain_overflow_signed, /* complain_on_overflow */
    458 	 mmix_elf_reloc,	/* special_function */
    459 	 "R_MMIX_CBRANCH",	/* name */
    460 	 false,			/* partial_inplace */
    461 	 ~0x0100ffff,		/* src_mask */
    462 	 0x0100ffff,		/* dst_mask */
    463 	 true),			/* pcrel_offset */
    464 
    465   HOWTO (R_MMIX_CBRANCH_J,	/* type */
    466 	 2,			/* rightshift */
    467 	 4,			/* size */
    468 	 19,			/* bitsize */
    469 	 true,			/* pc_relative */
    470 	 0,			/* bitpos */
    471 	 complain_overflow_signed, /* complain_on_overflow */
    472 	 mmix_elf_reloc,	/* special_function */
    473 	 "R_MMIX_CBRANCH_J",	/* name */
    474 	 false,			/* partial_inplace */
    475 	 ~0x0100ffff,		/* src_mask */
    476 	 0x0100ffff,		/* dst_mask */
    477 	 true),			/* pcrel_offset */
    478 
    479   HOWTO (R_MMIX_CBRANCH_1,	/* type */
    480 	 2,			/* rightshift */
    481 	 4,			/* size */
    482 	 19,			/* bitsize */
    483 	 true,			/* pc_relative */
    484 	 0,			/* bitpos */
    485 	 complain_overflow_signed, /* complain_on_overflow */
    486 	 mmix_elf_reloc,	/* special_function */
    487 	 "R_MMIX_CBRANCH_1",	/* name */
    488 	 false,			/* partial_inplace */
    489 	 ~0x0100ffff,		/* src_mask */
    490 	 0x0100ffff,		/* dst_mask */
    491 	 true),			/* pcrel_offset */
    492 
    493   HOWTO (R_MMIX_CBRANCH_2,	/* type */
    494 	 2,			/* rightshift */
    495 	 4,			/* size */
    496 	 19,			/* bitsize */
    497 	 true,			/* pc_relative */
    498 	 0,			/* bitpos */
    499 	 complain_overflow_signed, /* complain_on_overflow */
    500 	 mmix_elf_reloc,	/* special_function */
    501 	 "R_MMIX_CBRANCH_2",	/* name */
    502 	 false,			/* partial_inplace */
    503 	 ~0x0100ffff,		/* src_mask */
    504 	 0x0100ffff,		/* dst_mask */
    505 	 true),			/* pcrel_offset */
    506 
    507   HOWTO (R_MMIX_CBRANCH_3,	/* type */
    508 	 2,			/* rightshift */
    509 	 4,			/* size */
    510 	 19,			/* bitsize */
    511 	 true,			/* pc_relative */
    512 	 0,			/* bitpos */
    513 	 complain_overflow_signed, /* complain_on_overflow */
    514 	 mmix_elf_reloc,	/* special_function */
    515 	 "R_MMIX_CBRANCH_3",	/* name */
    516 	 false,			/* partial_inplace */
    517 	 ~0x0100ffff,		/* src_mask */
    518 	 0x0100ffff,		/* dst_mask */
    519 	 true),			/* pcrel_offset */
    520 
    521   /* The PUSHJ instruction can reach any (code) address, as long as it's
    522      the beginning of a function (no usable restriction).  It can silently
    523      expand to a 64-bit operand, but will emit an error if any of the two
    524      least significant bits are set.  It can also expand into a call to a
    525      stub; see R_MMIX_PUSHJ_STUBBABLE.  The howto members reflect a simple
    526      PUSHJ.  */
    527   HOWTO (R_MMIX_PUSHJ,		/* type */
    528 	 2,			/* rightshift */
    529 	 4,			/* size */
    530 	 19,			/* bitsize */
    531 	 true,			/* pc_relative */
    532 	 0,			/* bitpos */
    533 	 complain_overflow_signed, /* complain_on_overflow */
    534 	 mmix_elf_reloc,	/* special_function */
    535 	 "R_MMIX_PUSHJ",	/* name */
    536 	 false,			/* partial_inplace */
    537 	 ~0x0100ffff,		/* src_mask */
    538 	 0x0100ffff,		/* dst_mask */
    539 	 true),			/* pcrel_offset */
    540 
    541   HOWTO (R_MMIX_PUSHJ_1,	/* type */
    542 	 2,			/* rightshift */
    543 	 4,			/* size */
    544 	 19,			/* bitsize */
    545 	 true,			/* pc_relative */
    546 	 0,			/* bitpos */
    547 	 complain_overflow_signed, /* complain_on_overflow */
    548 	 mmix_elf_reloc,	/* special_function */
    549 	 "R_MMIX_PUSHJ_1",	/* name */
    550 	 false,			/* partial_inplace */
    551 	 ~0x0100ffff,		/* src_mask */
    552 	 0x0100ffff,		/* dst_mask */
    553 	 true),			/* pcrel_offset */
    554 
    555   HOWTO (R_MMIX_PUSHJ_2,	/* type */
    556 	 2,			/* rightshift */
    557 	 4,			/* size */
    558 	 19,			/* bitsize */
    559 	 true,			/* pc_relative */
    560 	 0,			/* bitpos */
    561 	 complain_overflow_signed, /* complain_on_overflow */
    562 	 mmix_elf_reloc,	/* special_function */
    563 	 "R_MMIX_PUSHJ_2",	/* name */
    564 	 false,			/* partial_inplace */
    565 	 ~0x0100ffff,		/* src_mask */
    566 	 0x0100ffff,		/* dst_mask */
    567 	 true),			/* pcrel_offset */
    568 
    569   HOWTO (R_MMIX_PUSHJ_3,	/* type */
    570 	 2,			/* rightshift */
    571 	 4,			/* size */
    572 	 19,			/* bitsize */
    573 	 true,			/* pc_relative */
    574 	 0,			/* bitpos */
    575 	 complain_overflow_signed, /* complain_on_overflow */
    576 	 mmix_elf_reloc,	/* special_function */
    577 	 "R_MMIX_PUSHJ_3",	/* name */
    578 	 false,			/* partial_inplace */
    579 	 ~0x0100ffff,		/* src_mask */
    580 	 0x0100ffff,		/* dst_mask */
    581 	 true),			/* pcrel_offset */
    582 
    583   /* A JMP is supposed to reach any (code) address.  By itself, it can
    584      reach +-64M; the expansion can reach all 64 bits.  Note that the 64M
    585      limit is soon reached if you link the program in wildly different
    586      memory segments.  The howto members reflect a trivial JMP.  */
    587   HOWTO (R_MMIX_JMP,		/* type */
    588 	 2,			/* rightshift */
    589 	 4,			/* size */
    590 	 27,			/* bitsize */
    591 	 true,			/* pc_relative */
    592 	 0,			/* bitpos */
    593 	 complain_overflow_signed, /* complain_on_overflow */
    594 	 mmix_elf_reloc,	/* special_function */
    595 	 "R_MMIX_JMP",		/* name */
    596 	 false,			/* partial_inplace */
    597 	 ~0x1ffffff,		/* src_mask */
    598 	 0x1ffffff,		/* dst_mask */
    599 	 true),			/* pcrel_offset */
    600 
    601   HOWTO (R_MMIX_JMP_1,		/* type */
    602 	 2,			/* rightshift */
    603 	 4,			/* size */
    604 	 27,			/* bitsize */
    605 	 true,			/* pc_relative */
    606 	 0,			/* bitpos */
    607 	 complain_overflow_signed, /* complain_on_overflow */
    608 	 mmix_elf_reloc,	/* special_function */
    609 	 "R_MMIX_JMP_1",	/* name */
    610 	 false,			/* partial_inplace */
    611 	 ~0x1ffffff,		/* src_mask */
    612 	 0x1ffffff,		/* dst_mask */
    613 	 true),			/* pcrel_offset */
    614 
    615   HOWTO (R_MMIX_JMP_2,		/* type */
    616 	 2,			/* rightshift */
    617 	 4,			/* size */
    618 	 27,			/* bitsize */
    619 	 true,			/* pc_relative */
    620 	 0,			/* bitpos */
    621 	 complain_overflow_signed, /* complain_on_overflow */
    622 	 mmix_elf_reloc,	/* special_function */
    623 	 "R_MMIX_JMP_2",	/* name */
    624 	 false,			/* partial_inplace */
    625 	 ~0x1ffffff,		/* src_mask */
    626 	 0x1ffffff,		/* dst_mask */
    627 	 true),			/* pcrel_offset */
    628 
    629   HOWTO (R_MMIX_JMP_3,		/* type */
    630 	 2,			/* rightshift */
    631 	 4,			/* size */
    632 	 27,			/* bitsize */
    633 	 true,			/* pc_relative */
    634 	 0,			/* bitpos */
    635 	 complain_overflow_signed, /* complain_on_overflow */
    636 	 mmix_elf_reloc,	/* special_function */
    637 	 "R_MMIX_JMP_3",	/* name */
    638 	 false,			/* partial_inplace */
    639 	 ~0x1ffffff,		/* src_mask */
    640 	 0x1ffffff,		/* dst_mask */
    641 	 true),			/* pcrel_offset */
    642 
    643   /* When we don't emit link-time-relaxable code from the assembler, or
    644      when relaxation has done all it can do, these relocs are used.  For
    645      GETA/PUSHJ/branches.  */
    646   HOWTO (R_MMIX_ADDR19,		/* type */
    647 	 2,			/* rightshift */
    648 	 4,			/* size */
    649 	 19,			/* bitsize */
    650 	 true,			/* pc_relative */
    651 	 0,			/* bitpos */
    652 	 complain_overflow_signed, /* complain_on_overflow */
    653 	 mmix_elf_reloc,	/* special_function */
    654 	 "R_MMIX_ADDR19",	/* name */
    655 	 false,			/* partial_inplace */
    656 	 ~0x0100ffff,		/* src_mask */
    657 	 0x0100ffff,		/* dst_mask */
    658 	 true),			/* pcrel_offset */
    659 
    660   /* For JMP.  */
    661   HOWTO (R_MMIX_ADDR27,		/* type */
    662 	 2,			/* rightshift */
    663 	 4,			/* size */
    664 	 27,			/* bitsize */
    665 	 true,			/* pc_relative */
    666 	 0,			/* bitpos */
    667 	 complain_overflow_signed, /* complain_on_overflow */
    668 	 mmix_elf_reloc,	/* special_function */
    669 	 "R_MMIX_ADDR27",	/* name */
    670 	 false,			/* partial_inplace */
    671 	 ~0x1ffffff,		/* src_mask */
    672 	 0x1ffffff,		/* dst_mask */
    673 	 true),			/* pcrel_offset */
    674 
    675   /* A general register or the value 0..255.  If a value, then the
    676      instruction (offset -3) needs adjusting.  */
    677   HOWTO (R_MMIX_REG_OR_BYTE,	/* type */
    678 	 0,			/* rightshift */
    679 	 2,			/* size */
    680 	 8,			/* bitsize */
    681 	 false,			/* pc_relative */
    682 	 0,			/* bitpos */
    683 	 complain_overflow_bitfield, /* complain_on_overflow */
    684 	 mmix_elf_reloc,	/* special_function */
    685 	 "R_MMIX_REG_OR_BYTE",	/* name */
    686 	 false,			/* partial_inplace */
    687 	 0,			/* src_mask */
    688 	 0xff,			/* dst_mask */
    689 	 false),		/* pcrel_offset */
    690 
    691   /* A general register.  */
    692   HOWTO (R_MMIX_REG,		/* type */
    693 	 0,			/* rightshift */
    694 	 2,			/* size */
    695 	 8,			/* bitsize */
    696 	 false,			/* pc_relative */
    697 	 0,			/* bitpos */
    698 	 complain_overflow_bitfield, /* complain_on_overflow */
    699 	 mmix_elf_reloc,	/* special_function */
    700 	 "R_MMIX_REG",		/* name */
    701 	 false,			/* partial_inplace */
    702 	 0,			/* src_mask */
    703 	 0xff,			/* dst_mask */
    704 	 false),		/* pcrel_offset */
    705 
    706   /* A register plus an index, corresponding to the relocation expression.
    707      The sizes must correspond to the valid range of the expression, while
    708      the bitmasks correspond to what we store in the image.  */
    709   HOWTO (R_MMIX_BASE_PLUS_OFFSET,	/* type */
    710 	 0,			/* rightshift */
    711 	 8,			/* size */
    712 	 64,			/* bitsize */
    713 	 false,			/* pc_relative */
    714 	 0,			/* bitpos */
    715 	 complain_overflow_bitfield, /* complain_on_overflow */
    716 	 mmix_elf_reloc,	/* special_function */
    717 	 "R_MMIX_BASE_PLUS_OFFSET", /* name */
    718 	 false,			/* partial_inplace */
    719 	 0,			/* src_mask */
    720 	 0xffff,		/* dst_mask */
    721 	 false),		/* pcrel_offset */
    722 
    723   /* A "magic" relocation for a LOCAL expression, asserting that the
    724      expression is less than the number of global registers.  No actual
    725      modification of the contents is done.  Implementing this as a
    726      relocation was less intrusive than e.g. putting such expressions in a
    727      section to discard *after* relocation.  */
    728   HOWTO (R_MMIX_LOCAL,		/* type */
    729 	 0,			/* rightshift */
    730 	 0,			/* size */
    731 	 0,			/* bitsize */
    732 	 false,			/* pc_relative */
    733 	 0,			/* bitpos */
    734 	 complain_overflow_dont, /* complain_on_overflow */
    735 	 mmix_elf_reloc,	/* special_function */
    736 	 "R_MMIX_LOCAL",	/* name */
    737 	 false,			/* partial_inplace */
    738 	 0,			/* src_mask */
    739 	 0,			/* dst_mask */
    740 	 false),		/* pcrel_offset */
    741 
    742   HOWTO (R_MMIX_PUSHJ_STUBBABLE, /* type */
    743 	 2,			/* rightshift */
    744 	 4,			/* size */
    745 	 19,			/* bitsize */
    746 	 true,			/* pc_relative */
    747 	 0,			/* bitpos */
    748 	 complain_overflow_signed, /* complain_on_overflow */
    749 	 mmix_elf_reloc,	/* special_function */
    750 	 "R_MMIX_PUSHJ_STUBBABLE", /* name */
    751 	 false,			/* partial_inplace */
    752 	 ~0x0100ffff,		/* src_mask */
    753 	 0x0100ffff,		/* dst_mask */
    754 	 true)			/* pcrel_offset */
    755  };
    756 
    757 
    758 /* Map BFD reloc types to MMIX ELF reloc types.  */
    759 
    760 struct mmix_reloc_map
    761   {
    762     bfd_reloc_code_real_type bfd_reloc_val;
    763     enum elf_mmix_reloc_type elf_reloc_val;
    764   };
    765 
    766 
    767 static const struct mmix_reloc_map mmix_reloc_map[] =
    768   {
    769     {BFD_RELOC_NONE, R_MMIX_NONE},
    770     {BFD_RELOC_8, R_MMIX_8},
    771     {BFD_RELOC_16, R_MMIX_16},
    772     {BFD_RELOC_24, R_MMIX_24},
    773     {BFD_RELOC_32, R_MMIX_32},
    774     {BFD_RELOC_64, R_MMIX_64},
    775     {BFD_RELOC_8_PCREL, R_MMIX_PC_8},
    776     {BFD_RELOC_16_PCREL, R_MMIX_PC_16},
    777     {BFD_RELOC_24_PCREL, R_MMIX_PC_24},
    778     {BFD_RELOC_32_PCREL, R_MMIX_PC_32},
    779     {BFD_RELOC_64_PCREL, R_MMIX_PC_64},
    780     {BFD_RELOC_VTABLE_INHERIT, R_MMIX_GNU_VTINHERIT},
    781     {BFD_RELOC_VTABLE_ENTRY, R_MMIX_GNU_VTENTRY},
    782     {BFD_RELOC_MMIX_GETA, R_MMIX_GETA},
    783     {BFD_RELOC_MMIX_CBRANCH, R_MMIX_CBRANCH},
    784     {BFD_RELOC_MMIX_PUSHJ, R_MMIX_PUSHJ},
    785     {BFD_RELOC_MMIX_JMP, R_MMIX_JMP},
    786     {BFD_RELOC_MMIX_ADDR19, R_MMIX_ADDR19},
    787     {BFD_RELOC_MMIX_ADDR27, R_MMIX_ADDR27},
    788     {BFD_RELOC_MMIX_REG_OR_BYTE, R_MMIX_REG_OR_BYTE},
    789     {BFD_RELOC_MMIX_REG, R_MMIX_REG},
    790     {BFD_RELOC_MMIX_BASE_PLUS_OFFSET, R_MMIX_BASE_PLUS_OFFSET},
    791     {BFD_RELOC_MMIX_LOCAL, R_MMIX_LOCAL},
    792     {BFD_RELOC_MMIX_PUSHJ_STUBBABLE, R_MMIX_PUSHJ_STUBBABLE}
    793   };
    794 
    795 static reloc_howto_type *
    796 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    797 				 bfd_reloc_code_real_type code)
    798 {
    799   unsigned int i;
    800 
    801   for (i = 0;
    802        i < sizeof (mmix_reloc_map) / sizeof (mmix_reloc_map[0]);
    803        i++)
    804     {
    805       if (mmix_reloc_map[i].bfd_reloc_val == code)
    806 	return &elf_mmix_howto_table[mmix_reloc_map[i].elf_reloc_val];
    807     }
    808 
    809   return NULL;
    810 }
    811 
    812 static reloc_howto_type *
    813 bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
    814 				 const char *r_name)
    815 {
    816   unsigned int i;
    817 
    818   for (i = 0;
    819        i < sizeof (elf_mmix_howto_table) / sizeof (elf_mmix_howto_table[0]);
    820        i++)
    821     if (elf_mmix_howto_table[i].name != NULL
    822 	&& strcasecmp (elf_mmix_howto_table[i].name, r_name) == 0)
    823       return &elf_mmix_howto_table[i];
    824 
    825   return NULL;
    826 }
    827 
    828 static bool
    829 mmix_elf_new_section_hook (bfd *abfd, asection *sec)
    830 {
    831   struct _mmix_elf_section_data *sdata;
    832 
    833   sdata = bfd_zalloc (abfd, sizeof (*sdata));
    834   if (sdata == NULL)
    835     return false;
    836   sec->used_by_bfd = sdata;
    837 
    838   return _bfd_elf_new_section_hook (abfd, sec);
    839 }
    840 
    841 
    842 /* This function performs the actual bitfiddling and sanity check for a
    843    final relocation.  Each relocation gets its *worst*-case expansion
    844    in size when it arrives here; any reduction in size should have been
    845    caught in linker relaxation earlier.  When we get here, the relocation
    846    looks like the smallest instruction with SWYM:s (nop:s) appended to the
    847    max size.  We fill in those nop:s.
    848 
    849    R_MMIX_GETA: (FIXME: Relaxation should break this up in 1, 2, 3 tetra)
    850     GETA $N,foo
    851    ->
    852     SETL $N,foo & 0xffff
    853     INCML $N,(foo >> 16) & 0xffff
    854     INCMH $N,(foo >> 32) & 0xffff
    855     INCH $N,(foo >> 48) & 0xffff
    856 
    857    R_MMIX_CBRANCH: (FIXME: Relaxation should break this up, but
    858    condbranches needing relaxation might be rare enough to not be
    859    worthwhile.)
    860     [P]Bcc $N,foo
    861    ->
    862     [~P]B~cc $N,.+20
    863     SETL $255,foo & ...
    864     INCML ...
    865     INCMH ...
    866     INCH ...
    867     GO $255,$255,0
    868 
    869    R_MMIX_PUSHJ: (FIXME: Relaxation...)
    870     PUSHJ $N,foo
    871    ->
    872     SETL $255,foo & ...
    873     INCML ...
    874     INCMH ...
    875     INCH ...
    876     PUSHGO $N,$255,0
    877 
    878    R_MMIX_JMP: (FIXME: Relaxation...)
    879     JMP foo
    880    ->
    881     SETL $255,foo & ...
    882     INCML ...
    883     INCMH ...
    884     INCH ...
    885     GO $255,$255,0
    886 
    887    R_MMIX_ADDR19 and R_MMIX_ADDR27 are just filled in.  */
    888 
    889 static bfd_reloc_status_type
    890 mmix_elf_perform_relocation (asection *isec, reloc_howto_type *howto,
    891 			     void *datap, bfd_vma addr, bfd_vma value,
    892 			     char **error_message)
    893 {
    894   bfd *abfd = isec->owner;
    895   bfd_reloc_status_type flag = bfd_reloc_ok;
    896   bfd_reloc_status_type r;
    897   int offs = 0;
    898   int reg = 255;
    899 
    900   /* The worst case bits are all similar SETL/INCML/INCMH/INCH sequences.
    901      We handle the differences here and the common sequence later.  */
    902   switch (howto->type)
    903     {
    904     case R_MMIX_GETA:
    905       offs = 0;
    906       reg = bfd_get_8 (abfd, (bfd_byte *) datap + 1);
    907 
    908       /* We change to an absolute value.  */
    909       value += addr;
    910       break;
    911 
    912     case R_MMIX_CBRANCH:
    913       {
    914 	int in1 = bfd_get_16 (abfd, (bfd_byte *) datap) << 16;
    915 
    916 	/* Invert the condition and prediction bit, and set the offset
    917 	   to five instructions ahead.
    918 
    919 	   We *can* do better if we want to.  If the branch is found to be
    920 	   within limits, we could leave the branch as is; there'll just
    921 	   be a bunch of NOP:s after it.  But we shouldn't see this
    922 	   sequence often enough that it's worth doing it.  */
    923 
    924 	bfd_put_32 (abfd,
    925 		    (((in1 ^ ((PRED_INV_BIT | COND_INV_BIT) << 24)) & ~0xffff)
    926 		     | (24/4)),
    927 		    (bfd_byte *) datap);
    928 
    929 	/* Put a "GO $255,$255,0" after the common sequence.  */
    930 	bfd_put_32 (abfd,
    931 		    ((GO_INSN_BYTE | IMM_OFFSET_BIT) << 24) | 0xffff00,
    932 		    (bfd_byte *) datap + 20);
    933 
    934 	/* Common sequence starts at offset 4.  */
    935 	offs = 4;
    936 
    937 	/* We change to an absolute value.  */
    938 	value += addr;
    939       }
    940       break;
    941 
    942     case R_MMIX_PUSHJ_STUBBABLE:
    943       /* If the address fits, we're fine.  */
    944       if ((value & 3) == 0
    945 	  /* Note rightshift 0; see R_MMIX_JMP case below.  */
    946 	  && (r = bfd_check_overflow (complain_overflow_signed,
    947 				      howto->bitsize,
    948 				      0,
    949 				      bfd_arch_bits_per_address (abfd),
    950 				      value)) == bfd_reloc_ok)
    951 	goto pcrel_mmix_reloc_fits;
    952       else
    953 	{
    954 	  bfd_size_type size = isec->rawsize ? isec->rawsize : isec->size;
    955 
    956 	  /* We have the bytes at the PUSHJ insn and need to get the
    957 	     position for the stub.  There's supposed to be room allocated
    958 	     for the stub.  */
    959 	  bfd_byte *stubcontents
    960 	    = ((bfd_byte *) datap
    961 	       - (addr - (isec->output_section->vma + isec->output_offset))
    962 	       + size
    963 	       + mmix_elf_section_data (isec)->pjs.stub_offset);
    964 	  bfd_vma stubaddr;
    965 
    966 	  if (mmix_elf_section_data (isec)->pjs.n_pushj_relocs == 0)
    967 	    {
    968 	      /* This shouldn't happen when linking to ELF or mmo, so
    969 		 this is an attempt to link to "binary", right?  We
    970 		 can't access the output bfd, so we can't verify that
    971 		 assumption.  We only know that the critical
    972 		 mmix_elf_check_common_relocs has not been called,
    973 		 which happens when the output format is different
    974 		 from the input format (and is not mmo).  */
    975 	      if (! mmix_elf_section_data (isec)->has_warned_pushj)
    976 		{
    977 		  /* For the first such error per input section, produce
    978 		     a verbose message.  */
    979 		  *error_message
    980 		    = _("invalid input relocation when producing"
    981 			" non-ELF, non-mmo format output;"
    982 			" please use the objcopy program to convert from"
    983 			" ELF or mmo,"
    984 			" or assemble using"
    985 			" \"-no-expand\" (for gcc, \"-Wa,-no-expand\"");
    986 		  mmix_elf_section_data (isec)->has_warned_pushj = true;
    987 		  return bfd_reloc_dangerous;
    988 		}
    989 
    990 	      /* For subsequent errors, return this one, which is
    991 		 rate-limited but looks a little bit different,
    992 		 hopefully without affecting user-friendliness.  */
    993 	      return bfd_reloc_overflow;
    994 	    }
    995 
    996 	  /* The address doesn't fit, so redirect the PUSHJ to the
    997 	     location of the stub.  */
    998 	  r = mmix_elf_perform_relocation (isec,
    999 					   &elf_mmix_howto_table
   1000 					   [R_MMIX_ADDR19],
   1001 					   datap,
   1002 					   addr,
   1003 					   isec->output_section->vma
   1004 					   + isec->output_offset
   1005 					   + size
   1006 					   + (mmix_elf_section_data (isec)
   1007 					      ->pjs.stub_offset)
   1008 					   - addr,
   1009 					   error_message);
   1010 	  if (r != bfd_reloc_ok)
   1011 	    return r;
   1012 
   1013 	  stubaddr
   1014 	    = (isec->output_section->vma
   1015 	       + isec->output_offset
   1016 	       + size
   1017 	       + mmix_elf_section_data (isec)->pjs.stub_offset);
   1018 
   1019 	  /* We generate a simple JMP if that suffices, else the whole 5
   1020 	     insn stub.  */
   1021 	  if (bfd_check_overflow (complain_overflow_signed,
   1022 				  elf_mmix_howto_table[R_MMIX_ADDR27].bitsize,
   1023 				  0,
   1024 				  bfd_arch_bits_per_address (abfd),
   1025 				  addr + value - stubaddr) == bfd_reloc_ok)
   1026 	    {
   1027 	      bfd_put_32 (abfd, JMP_INSN_BYTE << 24, stubcontents);
   1028 	      r = mmix_elf_perform_relocation (isec,
   1029 					       &elf_mmix_howto_table
   1030 					       [R_MMIX_ADDR27],
   1031 					       stubcontents,
   1032 					       stubaddr,
   1033 					       value + addr - stubaddr,
   1034 					       error_message);
   1035 	      mmix_elf_section_data (isec)->pjs.stub_offset += 4;
   1036 
   1037 	      if (size + mmix_elf_section_data (isec)->pjs.stub_offset
   1038 		  > isec->size)
   1039 		abort ();
   1040 
   1041 	      return r;
   1042 	    }
   1043 	  else
   1044 	    {
   1045 	      /* Put a "GO $255,0" after the common sequence.  */
   1046 	      bfd_put_32 (abfd,
   1047 			  ((GO_INSN_BYTE | IMM_OFFSET_BIT) << 24)
   1048 			  | 0xff00, (bfd_byte *) stubcontents + 16);
   1049 
   1050 	      /* Prepare for the general code to set the first part of the
   1051 		 linker stub, and */
   1052 	      value += addr;
   1053 	      datap = stubcontents;
   1054 	      mmix_elf_section_data (isec)->pjs.stub_offset
   1055 		+= MAX_PUSHJ_STUB_SIZE;
   1056 	    }
   1057 	}
   1058       break;
   1059 
   1060     case R_MMIX_PUSHJ:
   1061       {
   1062 	int inreg = bfd_get_8 (abfd, (bfd_byte *) datap + 1);
   1063 
   1064 	/* Put a "PUSHGO $N,$255,0" after the common sequence.  */
   1065 	bfd_put_32 (abfd,
   1066 		    ((PUSHGO_INSN_BYTE | IMM_OFFSET_BIT) << 24)
   1067 		    | (inreg << 16)
   1068 		    | 0xff00,
   1069 		    (bfd_byte *) datap + 16);
   1070 
   1071 	/* We change to an absolute value.  */
   1072 	value += addr;
   1073       }
   1074       break;
   1075 
   1076     case R_MMIX_JMP:
   1077       /* This one is a little special.  If we get here on a non-relaxing
   1078 	 link, and the destination is actually in range, we don't need to
   1079 	 execute the nops.
   1080 	 If so, we fall through to the bit-fiddling relocs.
   1081 
   1082 	 FIXME: bfd_check_overflow seems broken; the relocation is
   1083 	 rightshifted before testing, so supply a zero rightshift.  */
   1084 
   1085       if (! ((value & 3) == 0
   1086 	     && (r = bfd_check_overflow (complain_overflow_signed,
   1087 					 howto->bitsize,
   1088 					 0,
   1089 					 bfd_arch_bits_per_address (abfd),
   1090 					 value)) == bfd_reloc_ok))
   1091 	{
   1092 	  /* If the relocation doesn't fit in a JMP, we let the NOP:s be
   1093 	     modified below, and put a "GO $255,$255,0" after the
   1094 	     address-loading sequence.  */
   1095 	  bfd_put_32 (abfd,
   1096 		      ((GO_INSN_BYTE | IMM_OFFSET_BIT) << 24)
   1097 		      | 0xffff00,
   1098 		      (bfd_byte *) datap + 16);
   1099 
   1100 	  /* We change to an absolute value.  */
   1101 	  value += addr;
   1102 	  break;
   1103 	}
   1104       /* FALLTHROUGH.  */
   1105     case R_MMIX_ADDR19:
   1106     case R_MMIX_ADDR27:
   1107     pcrel_mmix_reloc_fits:
   1108       /* These must be in range, or else we emit an error.  */
   1109       if ((value & 3) == 0
   1110 	  /* Note rightshift 0; see above.  */
   1111 	  && (r = bfd_check_overflow (complain_overflow_signed,
   1112 				      howto->bitsize,
   1113 				      0,
   1114 				      bfd_arch_bits_per_address (abfd),
   1115 				      value)) == bfd_reloc_ok)
   1116 	{
   1117 	  bfd_vma in1
   1118 	    = bfd_get_32 (abfd, (bfd_byte *) datap);
   1119 	  bfd_vma highbit;
   1120 
   1121 	  if ((bfd_signed_vma) value < 0)
   1122 	    {
   1123 	      highbit = 1 << 24;
   1124 	      value += (1 << (howto->bitsize - 1));
   1125 	    }
   1126 	  else
   1127 	    highbit = 0;
   1128 
   1129 	  value >>= 2;
   1130 
   1131 	  bfd_put_32 (abfd,
   1132 		      (in1 & howto->src_mask)
   1133 		      | highbit
   1134 		      | (value & howto->dst_mask),
   1135 		      (bfd_byte *) datap);
   1136 
   1137 	  return bfd_reloc_ok;
   1138 	}
   1139       else
   1140 	return bfd_reloc_overflow;
   1141 
   1142     case R_MMIX_BASE_PLUS_OFFSET:
   1143       {
   1144 	struct bpo_reloc_section_info *bpodata
   1145 	  = mmix_elf_section_data (isec)->bpo.reloc;
   1146 	asection *bpo_greg_section;
   1147 	struct bpo_greg_section_info *gregdata;
   1148 	size_t bpo_index;
   1149 
   1150 	if (bpodata == NULL)
   1151 	  {
   1152 	    /* This shouldn't happen when linking to ELF or mmo, so
   1153 	       this is an attempt to link to "binary", right?  We
   1154 	       can't access the output bfd, so we can't verify that
   1155 	       assumption.  We only know that the critical
   1156 	       mmix_elf_check_common_relocs has not been called, which
   1157 	       happens when the output format is different from the
   1158 	       input format (and is not mmo).  */
   1159 	    if (! mmix_elf_section_data (isec)->has_warned_bpo)
   1160 	      {
   1161 		/* For the first such error per input section, produce
   1162 		   a verbose message.  */
   1163 		*error_message
   1164 		  = _("invalid input relocation when producing"
   1165 		      " non-ELF, non-mmo format output;"
   1166 		      " please use the objcopy program to convert from"
   1167 		      " ELF or mmo,"
   1168 		      " or compile using the gcc-option"
   1169 		      " \"-mno-base-addresses\".");
   1170 		mmix_elf_section_data (isec)->has_warned_bpo = true;
   1171 		return bfd_reloc_dangerous;
   1172 	      }
   1173 
   1174 	    /* For subsequent errors, return this one, which is
   1175 	       rate-limited but looks a little bit different,
   1176 	       hopefully without affecting user-friendliness.  */
   1177 	    return bfd_reloc_overflow;
   1178 	  }
   1179 
   1180 	bpo_greg_section = bpodata->bpo_greg_section;
   1181 	gregdata = mmix_elf_section_data (bpo_greg_section)->bpo.greg;
   1182 	bpo_index = gregdata->bpo_reloc_indexes[bpodata->bpo_index++];
   1183 
   1184 	/* A consistency check: The value we now have in "relocation" must
   1185 	   be the same as the value we stored for that relocation.  It
   1186 	   doesn't cost much, so can be left in at all times.  */
   1187 	if (value != gregdata->reloc_request[bpo_index].value)
   1188 	  {
   1189 	    _bfd_error_handler
   1190 	      /* xgettext:c-format */
   1191 	      (_("%pB: Internal inconsistency error for value for\n\
   1192  linker-allocated global register: linked: %#" PRIx64 " != relaxed: %#" PRIx64 ""),
   1193 	       isec->owner,
   1194 	       (uint64_t) value,
   1195 	       (uint64_t) gregdata->reloc_request[bpo_index].value);
   1196 	    bfd_set_error (bfd_error_bad_value);
   1197 	    return bfd_reloc_overflow;
   1198 	  }
   1199 
   1200 	/* Then store the register number and offset for that register
   1201 	   into datap and datap + 1 respectively.  */
   1202 	bfd_put_8 (abfd,
   1203 		   gregdata->reloc_request[bpo_index].regindex
   1204 		   + bpo_greg_section->output_section->vma / 8,
   1205 		   datap);
   1206 	bfd_put_8 (abfd,
   1207 		   gregdata->reloc_request[bpo_index].offset,
   1208 		   ((unsigned char *) datap) + 1);
   1209 	return bfd_reloc_ok;
   1210       }
   1211 
   1212     case R_MMIX_REG_OR_BYTE:
   1213     case R_MMIX_REG:
   1214       if (value > 255)
   1215 	return bfd_reloc_overflow;
   1216       bfd_put_8 (abfd, value, datap);
   1217       return bfd_reloc_ok;
   1218 
   1219     default:
   1220       BAD_CASE (howto->type);
   1221     }
   1222 
   1223   /* This code adds the common SETL/INCML/INCMH/INCH worst-case
   1224      sequence.  */
   1225 
   1226   /* Lowest two bits must be 0.  We return bfd_reloc_overflow for
   1227      everything that looks strange.  */
   1228   if (value & 3)
   1229     flag = bfd_reloc_overflow;
   1230 
   1231   bfd_put_32 (abfd,
   1232 	      (SETL_INSN_BYTE << 24) | (value & 0xffff) | (reg << 16),
   1233 	      (bfd_byte *) datap + offs);
   1234   bfd_put_32 (abfd,
   1235 	      (INCML_INSN_BYTE << 24) | ((value >> 16) & 0xffff) | (reg << 16),
   1236 	      (bfd_byte *) datap + offs + 4);
   1237   bfd_put_32 (abfd,
   1238 	      (INCMH_INSN_BYTE << 24) | ((value >> 32) & 0xffff) | (reg << 16),
   1239 	      (bfd_byte *) datap + offs + 8);
   1240   bfd_put_32 (abfd,
   1241 	      (INCH_INSN_BYTE << 24) | ((value >> 48) & 0xffff) | (reg << 16),
   1242 	      (bfd_byte *) datap + offs + 12);
   1243 
   1244   return flag;
   1245 }
   1246 
   1247 /* Set the howto pointer for an MMIX ELF reloc (type RELA).  */
   1248 
   1249 static bool
   1250 mmix_info_to_howto_rela (bfd *abfd,
   1251 			 arelent *cache_ptr,
   1252 			 Elf_Internal_Rela *dst)
   1253 {
   1254   unsigned int r_type;
   1255 
   1256   r_type = ELF64_R_TYPE (dst->r_info);
   1257   if (r_type >= (unsigned int) R_MMIX_max)
   1258     {
   1259       /* xgettext:c-format */
   1260       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
   1261 			  abfd, r_type);
   1262       bfd_set_error (bfd_error_bad_value);
   1263       return false;
   1264     }
   1265   cache_ptr->howto = &elf_mmix_howto_table[r_type];
   1266   return true;
   1267 }
   1268 
   1269 /* Any MMIX-specific relocation gets here at assembly time or when linking
   1270    to other formats (such as mmo); this is the relocation function from
   1271    the reloc_table.  We don't get here for final pure ELF linking.  */
   1272 
   1273 static bfd_reloc_status_type
   1274 mmix_elf_reloc (bfd *abfd,
   1275 		arelent *reloc_entry,
   1276 		asymbol *symbol,
   1277 		void * data,
   1278 		asection *input_section,
   1279 		bfd *output_bfd,
   1280 		char **error_message)
   1281 {
   1282   bfd_vma relocation;
   1283   bfd_reloc_status_type r;
   1284   asection *reloc_target_output_section;
   1285   bfd_reloc_status_type flag = bfd_reloc_ok;
   1286   bfd_vma output_base = 0;
   1287 
   1288   r = bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
   1289 			     input_section, output_bfd, error_message);
   1290 
   1291   /* If that was all that was needed (i.e. this isn't a final link, only
   1292      some segment adjustments), we're done.  */
   1293   if (r != bfd_reloc_continue)
   1294     return r;
   1295 
   1296   if (bfd_is_und_section (symbol->section)
   1297       && (symbol->flags & BSF_WEAK) == 0
   1298       && output_bfd == (bfd *) NULL)
   1299     return bfd_reloc_undefined;
   1300 
   1301   /* Is the address of the relocation really within the section?  */
   1302   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
   1303     return bfd_reloc_outofrange;
   1304 
   1305   /* Work out which section the relocation is targeted at and the
   1306      initial relocation command value.  */
   1307 
   1308   /* Get symbol value.  (Common symbols are special.)  */
   1309   if (bfd_is_com_section (symbol->section))
   1310     relocation = 0;
   1311   else
   1312     relocation = symbol->value;
   1313 
   1314   reloc_target_output_section = bfd_asymbol_section (symbol)->output_section;
   1315 
   1316   /* Here the variable relocation holds the final address of the symbol we
   1317      are relocating against, plus any addend.  */
   1318   if (output_bfd)
   1319     output_base = 0;
   1320   else
   1321     output_base = reloc_target_output_section->vma;
   1322 
   1323   relocation += output_base + symbol->section->output_offset;
   1324 
   1325   if (output_bfd != (bfd *) NULL)
   1326     {
   1327       /* Add in supplied addend.  */
   1328       relocation += reloc_entry->addend;
   1329 
   1330       /* This is a partial relocation, and we want to apply the
   1331 	 relocation to the reloc entry rather than the raw data.
   1332 	 Modify the reloc inplace to reflect what we now know.  */
   1333       reloc_entry->addend = relocation;
   1334       reloc_entry->address += input_section->output_offset;
   1335       return flag;
   1336     }
   1337 
   1338   return mmix_final_link_relocate (reloc_entry->howto, input_section,
   1339 				   data, reloc_entry->address,
   1340 				   reloc_entry->addend, relocation,
   1341 				   bfd_asymbol_name (symbol),
   1342 				   reloc_target_output_section,
   1343 				   error_message);
   1344 }
   1345 
   1346 /* Relocate an MMIX ELF section.  Modified from elf32-fr30.c; look to it
   1348    for guidance if you're thinking of copying this.  */
   1349 
   1350 static int
   1351 mmix_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
   1352 			   struct bfd_link_info *info,
   1353 			   bfd *input_bfd,
   1354 			   asection *input_section,
   1355 			   bfd_byte *contents,
   1356 			   Elf_Internal_Rela *relocs,
   1357 			   Elf_Internal_Sym *local_syms,
   1358 			   asection **local_sections)
   1359 {
   1360   Elf_Internal_Shdr *symtab_hdr;
   1361   struct elf_link_hash_entry **sym_hashes;
   1362   Elf_Internal_Rela *rel;
   1363   Elf_Internal_Rela *relend;
   1364   bfd_size_type size;
   1365   size_t pjsno = 0;
   1366 
   1367   size = input_section->rawsize ? input_section->rawsize : input_section->size;
   1368   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   1369   sym_hashes = elf_sym_hashes (input_bfd);
   1370   relend = relocs + input_section->reloc_count;
   1371 
   1372   /* Zero the stub area before we start.  */
   1373   if (input_section->rawsize != 0
   1374       && input_section->size > input_section->rawsize)
   1375     memset (contents + input_section->rawsize, 0,
   1376 	    input_section->size - input_section->rawsize);
   1377 
   1378   for (rel = relocs; rel < relend; rel ++)
   1379     {
   1380       reloc_howto_type *howto;
   1381       unsigned long r_symndx;
   1382       Elf_Internal_Sym *sym;
   1383       asection *sec;
   1384       struct elf_link_hash_entry *h;
   1385       bfd_vma relocation;
   1386       bfd_reloc_status_type r;
   1387       const char *name = NULL;
   1388       int r_type;
   1389       bool undefined_signalled = false;
   1390 
   1391       r_type = ELF64_R_TYPE (rel->r_info);
   1392 
   1393       if (r_type == R_MMIX_GNU_VTINHERIT
   1394 	  || r_type == R_MMIX_GNU_VTENTRY)
   1395 	continue;
   1396 
   1397       r_symndx = ELF64_R_SYM (rel->r_info);
   1398 
   1399       howto = elf_mmix_howto_table + ELF64_R_TYPE (rel->r_info);
   1400       h = NULL;
   1401       sym = NULL;
   1402       sec = NULL;
   1403 
   1404       if (r_symndx < symtab_hdr->sh_info)
   1405 	{
   1406 	  sym = local_syms + r_symndx;
   1407 	  sec = local_sections [r_symndx];
   1408 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
   1409 
   1410 	  name = bfd_elf_string_from_elf_section (input_bfd,
   1411 						  symtab_hdr->sh_link,
   1412 						  sym->st_name);
   1413 	  if (name == NULL)
   1414 	    name = bfd_section_name (sec);
   1415 	}
   1416       else
   1417 	{
   1418 	  bool unresolved_reloc, ignored;
   1419 
   1420 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   1421 				   r_symndx, symtab_hdr, sym_hashes,
   1422 				   h, sec, relocation,
   1423 				   unresolved_reloc, undefined_signalled,
   1424 				   ignored);
   1425 	  name = h->root.root.string;
   1426 	}
   1427 
   1428       if (sec != NULL && discarded_section (sec))
   1429 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   1430 					 rel, 1, relend, howto, 0, contents);
   1431 
   1432       if (bfd_link_relocatable (info))
   1433 	{
   1434 	  /* This is a relocatable link.  For most relocs we don't have to
   1435 	     change anything, unless the reloc is against a section
   1436 	     symbol, in which case we have to adjust according to where
   1437 	     the section symbol winds up in the output section.  */
   1438 	  if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
   1439 	    rel->r_addend += sec->output_offset;
   1440 
   1441 	  /* For PUSHJ stub relocs however, we may need to change the
   1442 	     reloc and the section contents, if the reloc doesn't reach
   1443 	     beyond the end of the output section and previous stubs.
   1444 	     Then we change the section contents to be a PUSHJ to the end
   1445 	     of the input section plus stubs (we can do that without using
   1446 	     a reloc), and then we change the reloc to be a R_MMIX_PUSHJ
   1447 	     at the stub location.  */
   1448 	  if (r_type == R_MMIX_PUSHJ_STUBBABLE)
   1449 	    {
   1450 	      /* We've already checked whether we need a stub; use that
   1451 		 knowledge.  */
   1452 	      if (mmix_elf_section_data (input_section)->pjs.stub_size[pjsno]
   1453 		  != 0)
   1454 		{
   1455 		  Elf_Internal_Rela relcpy;
   1456 
   1457 		  if (mmix_elf_section_data (input_section)
   1458 		      ->pjs.stub_size[pjsno] != MAX_PUSHJ_STUB_SIZE)
   1459 		    abort ();
   1460 
   1461 		  /* There's already a PUSHJ insn there, so just fill in
   1462 		     the offset bits to the stub.  */
   1463 		  if (mmix_final_link_relocate (elf_mmix_howto_table
   1464 						+ R_MMIX_ADDR19,
   1465 						input_section,
   1466 						contents,
   1467 						rel->r_offset,
   1468 						0,
   1469 						input_section
   1470 						->output_section->vma
   1471 						+ input_section->output_offset
   1472 						+ size
   1473 						+ mmix_elf_section_data (input_section)
   1474 						->pjs.stub_offset,
   1475 						NULL, NULL, NULL) != bfd_reloc_ok)
   1476 		    return false;
   1477 
   1478 		  /* Put a JMP insn at the stub; it goes with the
   1479 		     R_MMIX_JMP reloc.  */
   1480 		  bfd_put_32 (output_bfd, JMP_INSN_BYTE << 24,
   1481 			      contents
   1482 			      + size
   1483 			      + mmix_elf_section_data (input_section)
   1484 			      ->pjs.stub_offset);
   1485 
   1486 		  /* Change the reloc to be at the stub, and to a full
   1487 		     R_MMIX_JMP reloc.  */
   1488 		  rel->r_info = ELF64_R_INFO (r_symndx, R_MMIX_JMP);
   1489 		  rel->r_offset
   1490 		    = (size
   1491 		       + mmix_elf_section_data (input_section)
   1492 		       ->pjs.stub_offset);
   1493 
   1494 		  mmix_elf_section_data (input_section)->pjs.stub_offset
   1495 		    += MAX_PUSHJ_STUB_SIZE;
   1496 
   1497 		  /* Shift this reloc to the end of the relocs to maintain
   1498 		     the r_offset sorted reloc order.  */
   1499 		  relcpy = *rel;
   1500 		  memmove (rel, rel + 1, (char *) relend - (char *) (rel + 1));
   1501 		  relend[-1] = relcpy;
   1502 
   1503 		  /* Back up one reloc, or else we'd skip the next reloc
   1504 		   in turn.  */
   1505 		  rel--;
   1506 		}
   1507 
   1508 	      pjsno++;
   1509 	    }
   1510 	  continue;
   1511 	}
   1512 
   1513       r = mmix_final_link_relocate (howto, input_section,
   1514 				    contents, rel->r_offset,
   1515 				    rel->r_addend, relocation, name, sec, NULL);
   1516 
   1517       if (r != bfd_reloc_ok)
   1518 	{
   1519 	  const char * msg = (const char *) NULL;
   1520 
   1521 	  switch (r)
   1522 	    {
   1523 	    case bfd_reloc_overflow:
   1524 	      info->callbacks->reloc_overflow
   1525 		(info, (h ? &h->root : NULL), name, howto->name,
   1526 		 (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
   1527 	      break;
   1528 
   1529 	    case bfd_reloc_undefined:
   1530 	      /* We may have sent this message above.  */
   1531 	      if (! undefined_signalled)
   1532 		info->callbacks->undefined_symbol
   1533 		  (info, name, input_bfd, input_section, rel->r_offset, true);
   1534 	      undefined_signalled = true;
   1535 	      break;
   1536 
   1537 	    case bfd_reloc_outofrange:
   1538 	      msg = _("internal error: out of range error");
   1539 	      break;
   1540 
   1541 	    case bfd_reloc_notsupported:
   1542 	      msg = _("internal error: unsupported relocation error");
   1543 	      break;
   1544 
   1545 	    case bfd_reloc_dangerous:
   1546 	      msg = _("internal error: dangerous relocation");
   1547 	      break;
   1548 
   1549 	    default:
   1550 	      msg = _("internal error: unknown error");
   1551 	      break;
   1552 	    }
   1553 
   1554 	  if (msg)
   1555 	    (*info->callbacks->warning) (info, msg, name, input_bfd,
   1556 					 input_section, rel->r_offset);
   1557 	}
   1558     }
   1559 
   1560   return true;
   1561 }
   1562 
   1563 /* Perform a single relocation.  By default we use the standard BFD
   1565    routines.  A few relocs we have to do ourselves.  */
   1566 
   1567 static bfd_reloc_status_type
   1568 mmix_final_link_relocate (reloc_howto_type *howto, asection *input_section,
   1569 			  bfd_byte *contents, bfd_vma r_offset,
   1570 			  bfd_signed_vma r_addend, bfd_vma relocation,
   1571 			  const char *symname, asection *symsec,
   1572 			  char **error_message)
   1573 {
   1574   bfd_reloc_status_type r = bfd_reloc_ok;
   1575   bfd_vma addr
   1576     = (input_section->output_section->vma
   1577        + input_section->output_offset
   1578        + r_offset);
   1579   bfd_signed_vma srel
   1580     = (bfd_signed_vma) relocation + r_addend;
   1581 
   1582   switch (howto->type)
   1583     {
   1584       /* All these are PC-relative.  */
   1585     case R_MMIX_PUSHJ_STUBBABLE:
   1586     case R_MMIX_PUSHJ:
   1587     case R_MMIX_CBRANCH:
   1588     case R_MMIX_ADDR19:
   1589     case R_MMIX_GETA:
   1590     case R_MMIX_ADDR27:
   1591     case R_MMIX_JMP:
   1592       contents += r_offset;
   1593 
   1594       srel -= (input_section->output_section->vma
   1595 	       + input_section->output_offset
   1596 	       + r_offset);
   1597 
   1598       r = mmix_elf_perform_relocation (input_section, howto, contents,
   1599 				       addr, srel, error_message);
   1600       break;
   1601 
   1602     case R_MMIX_BASE_PLUS_OFFSET:
   1603       if (symsec == NULL)
   1604 	return bfd_reloc_undefined;
   1605 
   1606       /* Check that we're not relocating against a register symbol.  */
   1607       if (strcmp (bfd_section_name (symsec),
   1608 		  MMIX_REG_CONTENTS_SECTION_NAME) == 0
   1609 	  || strcmp (bfd_section_name (symsec),
   1610 		     MMIX_REG_SECTION_NAME) == 0)
   1611 	{
   1612 	  /* Note: This is separated out into two messages in order
   1613 	     to ease the translation into other languages.  */
   1614 	  if (symname == NULL || *symname == 0)
   1615 	    _bfd_error_handler
   1616 	      /* xgettext:c-format */
   1617 	      (_("%pB: base-plus-offset relocation against register symbol:"
   1618 		 " (unknown) in %pA"),
   1619 	       input_section->owner, symsec);
   1620 	  else
   1621 	    _bfd_error_handler
   1622 	      /* xgettext:c-format */
   1623 	      (_("%pB: base-plus-offset relocation against register symbol:"
   1624 		 " %s in %pA"),
   1625 	       input_section->owner, symname, symsec);
   1626 	  return bfd_reloc_overflow;
   1627 	}
   1628       goto do_mmix_reloc;
   1629 
   1630     case R_MMIX_REG_OR_BYTE:
   1631     case R_MMIX_REG:
   1632       /* For now, we handle these alike.  They must refer to an register
   1633 	 symbol, which is either relative to the register section and in
   1634 	 the range 0..255, or is in the register contents section with vma
   1635 	 regno * 8.  */
   1636 
   1637       /* FIXME: A better way to check for reg contents section?
   1638 	 FIXME: Postpone section->scaling to mmix_elf_perform_relocation? */
   1639       if (symsec == NULL)
   1640 	return bfd_reloc_undefined;
   1641 
   1642       if (strcmp (bfd_section_name (symsec),
   1643 		  MMIX_REG_CONTENTS_SECTION_NAME) == 0)
   1644 	{
   1645 	  if ((srel & 7) != 0 || srel < 32*8 || srel > 255*8)
   1646 	    {
   1647 	      /* The bfd_reloc_outofrange return value, though intuitively
   1648 		 a better value, will not get us an error.  */
   1649 	      return bfd_reloc_overflow;
   1650 	    }
   1651 	  srel /= 8;
   1652 	}
   1653       else if (strcmp (bfd_section_name (symsec),
   1654 		       MMIX_REG_SECTION_NAME) == 0)
   1655 	{
   1656 	  if (srel < 0 || srel > 255)
   1657 	    /* The bfd_reloc_outofrange return value, though intuitively a
   1658 	       better value, will not get us an error.  */
   1659 	    return bfd_reloc_overflow;
   1660 	}
   1661       else
   1662 	{
   1663 	  /* Note: This is separated out into two messages in order
   1664 	     to ease the translation into other languages.  */
   1665 	  if (symname == NULL || *symname == 0)
   1666 	    _bfd_error_handler
   1667 	      /* xgettext:c-format */
   1668 	      (_("%pB: register relocation against non-register symbol:"
   1669 		 " (unknown) in %pA"),
   1670 	       input_section->owner, symsec);
   1671 	  else
   1672 	    _bfd_error_handler
   1673 	      /* xgettext:c-format */
   1674 	      (_("%pB: register relocation against non-register symbol:"
   1675 		 " %s in %pA"),
   1676 	       input_section->owner, symname, symsec);
   1677 
   1678 	  /* The bfd_reloc_outofrange return value, though intuitively a
   1679 	     better value, will not get us an error.  */
   1680 	  return bfd_reloc_overflow;
   1681 	}
   1682     do_mmix_reloc:
   1683       contents += r_offset;
   1684       r = mmix_elf_perform_relocation (input_section, howto, contents,
   1685 				       addr, srel, error_message);
   1686       break;
   1687 
   1688     case R_MMIX_LOCAL:
   1689       /* This isn't a real relocation, it's just an assertion that the
   1690 	 final relocation value corresponds to a local register.  We
   1691 	 ignore the actual relocation; nothing is changed.  */
   1692       {
   1693 	asection *regsec
   1694 	  = bfd_get_section_by_name (input_section->output_section->owner,
   1695 				     MMIX_REG_CONTENTS_SECTION_NAME);
   1696 	bfd_vma first_global;
   1697 
   1698 	/* Check that this is an absolute value, or a reference to the
   1699 	   register contents section or the register (symbol) section.
   1700 	   Absolute numbers can get here as undefined section.  Undefined
   1701 	   symbols are signalled elsewhere, so there's no conflict in us
   1702 	   accidentally handling it.  */
   1703 	if (!bfd_is_abs_section (symsec)
   1704 	    && !bfd_is_und_section (symsec)
   1705 	    && strcmp (bfd_section_name (symsec),
   1706 		       MMIX_REG_CONTENTS_SECTION_NAME) != 0
   1707 	    && strcmp (bfd_section_name (symsec),
   1708 		       MMIX_REG_SECTION_NAME) != 0)
   1709 	{
   1710 	  _bfd_error_handler
   1711 	    (_("%pB: directive LOCAL valid only with a register or absolute value"),
   1712 	     input_section->owner);
   1713 
   1714 	  return bfd_reloc_overflow;
   1715 	}
   1716 
   1717       /* If we don't have a register contents section, then $255 is the
   1718 	 first global register.  */
   1719       if (regsec == NULL)
   1720 	first_global = 255;
   1721       else
   1722 	{
   1723 	  first_global = bfd_section_vma (regsec) / 8;
   1724 	  if (strcmp (bfd_section_name (symsec),
   1725 		      MMIX_REG_CONTENTS_SECTION_NAME) == 0)
   1726 	    {
   1727 	      if ((srel & 7) != 0 || srel < 32*8 || srel > 255*8)
   1728 		/* The bfd_reloc_outofrange return value, though
   1729 		   intuitively a better value, will not get us an error.  */
   1730 		return bfd_reloc_overflow;
   1731 	      srel /= 8;
   1732 	    }
   1733 	}
   1734 
   1735 	if ((bfd_vma) srel >= first_global)
   1736 	  {
   1737 	    /* FIXME: Better error message.  */
   1738 	    _bfd_error_handler
   1739 	      /* xgettext:c-format */
   1740 	      (_("%pB: LOCAL directive: "
   1741 		 "register $%" PRId64 " is not a local register;"
   1742 		 " first global register is $%" PRId64),
   1743 	       input_section->owner, (int64_t) srel, (int64_t) first_global);
   1744 
   1745 	    return bfd_reloc_overflow;
   1746 	  }
   1747       }
   1748       r = bfd_reloc_ok;
   1749       break;
   1750 
   1751     default:
   1752       r = _bfd_final_link_relocate (howto, input_section->owner, input_section,
   1753 				    contents, r_offset,
   1754 				    relocation, r_addend);
   1755     }
   1756 
   1757   return r;
   1758 }
   1759 
   1760 /* Return the section that should be marked against GC for a given
   1762    relocation.  */
   1763 
   1764 static asection *
   1765 mmix_elf_gc_mark_hook (asection *sec,
   1766 		       struct bfd_link_info *info,
   1767 		       Elf_Internal_Rela *rel,
   1768 		       struct elf_link_hash_entry *h,
   1769 		       Elf_Internal_Sym *sym)
   1770 {
   1771   if (h != NULL)
   1772     switch (ELF64_R_TYPE (rel->r_info))
   1773       {
   1774       case R_MMIX_GNU_VTINHERIT:
   1775       case R_MMIX_GNU_VTENTRY:
   1776 	return NULL;
   1777       }
   1778 
   1779   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
   1780 }
   1781 
   1782 /* Sort register relocs to come before expanding relocs.  */
   1784 
   1785 static int
   1786 mmix_elf_sort_relocs (const void * p1, const void * p2)
   1787 {
   1788   const Elf_Internal_Rela *r1 = (const Elf_Internal_Rela *) p1;
   1789   const Elf_Internal_Rela *r2 = (const Elf_Internal_Rela *) p2;
   1790   int r1_is_reg, r2_is_reg;
   1791 
   1792   /* Sort primarily on r_offset & ~3, so relocs are done to consecutive
   1793      insns.  */
   1794   if ((r1->r_offset & ~(bfd_vma) 3) > (r2->r_offset & ~(bfd_vma) 3))
   1795     return 1;
   1796   else if ((r1->r_offset & ~(bfd_vma) 3) < (r2->r_offset & ~(bfd_vma) 3))
   1797     return -1;
   1798 
   1799   r1_is_reg
   1800     = (ELF64_R_TYPE (r1->r_info) == R_MMIX_REG_OR_BYTE
   1801        || ELF64_R_TYPE (r1->r_info) == R_MMIX_REG);
   1802   r2_is_reg
   1803     = (ELF64_R_TYPE (r2->r_info) == R_MMIX_REG_OR_BYTE
   1804        || ELF64_R_TYPE (r2->r_info) == R_MMIX_REG);
   1805   if (r1_is_reg != r2_is_reg)
   1806     return r2_is_reg - r1_is_reg;
   1807 
   1808   /* Neither or both are register relocs.  Then sort on full offset.  */
   1809   if (r1->r_offset > r2->r_offset)
   1810     return 1;
   1811   else if (r1->r_offset < r2->r_offset)
   1812     return -1;
   1813   return 0;
   1814 }
   1815 
   1816 /* Subset of mmix_elf_check_relocs, common to ELF and mmo linking.  */
   1817 
   1818 static bool
   1819 mmix_elf_check_common_relocs  (bfd *abfd,
   1820 			       struct bfd_link_info *info,
   1821 			       asection *sec,
   1822 			       const Elf_Internal_Rela *relocs)
   1823 {
   1824   bfd *bpo_greg_owner = NULL;
   1825   asection *allocated_gregs_section = NULL;
   1826   struct bpo_greg_section_info *gregdata = NULL;
   1827   struct bpo_reloc_section_info *bpodata = NULL;
   1828   const Elf_Internal_Rela *rel;
   1829   const Elf_Internal_Rela *rel_end;
   1830 
   1831   /* We currently have to abuse this COFF-specific member, since there's
   1832      no target-machine-dedicated member.  There's no alternative outside
   1833      the bfd_link_info struct; we can't specialize a hash-table since
   1834      they're different between ELF and mmo.  */
   1835   bpo_greg_owner = (bfd *) info->base_file;
   1836 
   1837   rel_end = relocs + sec->reloc_count;
   1838   for (rel = relocs; rel < rel_end; rel++)
   1839     {
   1840       switch (ELF64_R_TYPE (rel->r_info))
   1841 	{
   1842 	  /* This relocation causes a GREG allocation.  We need to count
   1843 	     them, and we need to create a section for them, so we need an
   1844 	     object to fake as the owner of that section.  We can't use
   1845 	     the ELF dynobj for this, since the ELF bits assume lots of
   1846 	     DSO-related stuff if that member is non-NULL.  */
   1847 	case R_MMIX_BASE_PLUS_OFFSET:
   1848 	  /* We don't do anything with this reloc for a relocatable link.  */
   1849 	  if (bfd_link_relocatable (info))
   1850 	    break;
   1851 
   1852 	  if (bpo_greg_owner == NULL)
   1853 	    {
   1854 	      bpo_greg_owner = abfd;
   1855 	      info->base_file = bpo_greg_owner;
   1856 	    }
   1857 
   1858 	  if (allocated_gregs_section == NULL)
   1859 	    allocated_gregs_section
   1860 	      = bfd_get_section_by_name (bpo_greg_owner,
   1861 					 MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
   1862 
   1863 	  if (allocated_gregs_section == NULL)
   1864 	    {
   1865 	      allocated_gregs_section
   1866 		= bfd_make_section_with_flags (bpo_greg_owner,
   1867 					       MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME,
   1868 					       (SEC_HAS_CONTENTS
   1869 						| SEC_IN_MEMORY
   1870 						| SEC_LINKER_CREATED));
   1871 	      /* Setting both SEC_ALLOC and SEC_LOAD means the section is
   1872 		 treated like any other section, and we'd get errors for
   1873 		 address overlap with the text section.  Let's set none of
   1874 		 those flags, as that is what currently happens for usual
   1875 		 GREG allocations, and that works.  */
   1876 	      if (allocated_gregs_section == NULL
   1877 		  || !bfd_set_section_alignment (allocated_gregs_section, 3))
   1878 		return false;
   1879 
   1880 	      gregdata = (struct bpo_greg_section_info *)
   1881 		bfd_zalloc (bpo_greg_owner, sizeof (struct bpo_greg_section_info));
   1882 	      if (gregdata == NULL)
   1883 		return false;
   1884 	      mmix_elf_section_data (allocated_gregs_section)->bpo.greg
   1885 		= gregdata;
   1886 	    }
   1887 	  else if (gregdata == NULL)
   1888 	    gregdata
   1889 	      = mmix_elf_section_data (allocated_gregs_section)->bpo.greg;
   1890 
   1891 	  /* Get ourselves some auxiliary info for the BPO-relocs.  */
   1892 	  if (bpodata == NULL)
   1893 	    {
   1894 	      /* No use doing a separate iteration pass to find the upper
   1895 		 limit - just use the number of relocs.  */
   1896 	      bpodata = (struct bpo_reloc_section_info *)
   1897 		bfd_alloc (bpo_greg_owner,
   1898 			   sizeof (struct bpo_reloc_section_info)
   1899 			   * (sec->reloc_count + 1));
   1900 	      if (bpodata == NULL)
   1901 		return false;
   1902 	      mmix_elf_section_data (sec)->bpo.reloc = bpodata;
   1903 	      bpodata->first_base_plus_offset_reloc
   1904 		= bpodata->bpo_index
   1905 		= gregdata->n_max_bpo_relocs;
   1906 	      bpodata->bpo_greg_section
   1907 		= allocated_gregs_section;
   1908 	      bpodata->n_bpo_relocs_this_section = 0;
   1909 	    }
   1910 
   1911 	  bpodata->n_bpo_relocs_this_section++;
   1912 	  gregdata->n_max_bpo_relocs++;
   1913 
   1914 	  /* We don't get another chance to set this before GC; we've not
   1915 	     set up any hook that runs before GC.  */
   1916 	  gregdata->n_bpo_relocs
   1917 	    = gregdata->n_max_bpo_relocs;
   1918 	  break;
   1919 
   1920 	case R_MMIX_PUSHJ_STUBBABLE:
   1921 	  mmix_elf_section_data (sec)->pjs.n_pushj_relocs++;
   1922 	  break;
   1923 	}
   1924     }
   1925 
   1926   /* Allocate per-reloc stub storage and initialize it to the max stub
   1927      size.  */
   1928   if (mmix_elf_section_data (sec)->pjs.n_pushj_relocs != 0)
   1929     {
   1930       size_t i;
   1931 
   1932       mmix_elf_section_data (sec)->pjs.stub_size
   1933 	= bfd_alloc (abfd, mmix_elf_section_data (sec)->pjs.n_pushj_relocs
   1934 		     * sizeof (mmix_elf_section_data (sec)
   1935 			       ->pjs.stub_size[0]));
   1936       if (mmix_elf_section_data (sec)->pjs.stub_size == NULL)
   1937 	return false;
   1938 
   1939       for (i = 0; i < mmix_elf_section_data (sec)->pjs.n_pushj_relocs; i++)
   1940 	mmix_elf_section_data (sec)->pjs.stub_size[i] = MAX_PUSHJ_STUB_SIZE;
   1941     }
   1942 
   1943   return true;
   1944 }
   1945 
   1946 /* Look through the relocs for a section during the first phase.  */
   1947 
   1948 static bool
   1949 mmix_elf_check_relocs (bfd *abfd,
   1950 		       struct bfd_link_info *info,
   1951 		       asection *sec,
   1952 		       const Elf_Internal_Rela *relocs)
   1953 {
   1954   Elf_Internal_Shdr *symtab_hdr;
   1955   struct elf_link_hash_entry **sym_hashes;
   1956   const Elf_Internal_Rela *rel;
   1957   const Elf_Internal_Rela *rel_end;
   1958 
   1959   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1960   sym_hashes = elf_sym_hashes (abfd);
   1961 
   1962   /* First we sort the relocs so that any register relocs come before
   1963      expansion-relocs to the same insn.  FIXME: Not done for mmo.  */
   1964   qsort ((void *) relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
   1965 	 mmix_elf_sort_relocs);
   1966 
   1967   /* Do the common part.  */
   1968   if (!mmix_elf_check_common_relocs (abfd, info, sec, relocs))
   1969     return false;
   1970 
   1971   if (bfd_link_relocatable (info))
   1972     return true;
   1973 
   1974   rel_end = relocs + sec->reloc_count;
   1975   for (rel = relocs; rel < rel_end; rel++)
   1976     {
   1977       struct elf_link_hash_entry *h;
   1978       unsigned long r_symndx;
   1979 
   1980       r_symndx = ELF64_R_SYM (rel->r_info);
   1981       if (r_symndx < symtab_hdr->sh_info)
   1982 	h = NULL;
   1983       else
   1984 	{
   1985 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
   1986 	  while (h->root.type == bfd_link_hash_indirect
   1987 		 || h->root.type == bfd_link_hash_warning)
   1988 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1989 	}
   1990 
   1991       switch (ELF64_R_TYPE (rel->r_info))
   1992 	{
   1993 	/* This relocation describes the C++ object vtable hierarchy.
   1994 	   Reconstruct it for later use during GC.  */
   1995 	case R_MMIX_GNU_VTINHERIT:
   1996 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
   1997 	    return false;
   1998 	  break;
   1999 
   2000 	/* This relocation describes which C++ vtable entries are actually
   2001 	   used.  Record for later use during GC.  */
   2002 	case R_MMIX_GNU_VTENTRY:
   2003 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
   2004 	    return false;
   2005 	  break;
   2006 	}
   2007     }
   2008 
   2009   return true;
   2010 }
   2011 
   2012 /* Wrapper for mmix_elf_check_common_relocs, called when linking to mmo.
   2013    Copied from elf_link_add_object_symbols.  */
   2014 
   2015 bool
   2016 _bfd_mmix_check_all_relocs (bfd *abfd, struct bfd_link_info *info)
   2017 {
   2018   asection *o;
   2019 
   2020   for (o = abfd->sections; o != NULL; o = o->next)
   2021     {
   2022       Elf_Internal_Rela *internal_relocs;
   2023       bool ok;
   2024 
   2025       if ((o->flags & SEC_RELOC) == 0
   2026 	  || o->reloc_count == 0
   2027 	  || ((info->strip == strip_all || info->strip == strip_debugger)
   2028 	      && (o->flags & SEC_DEBUGGING) != 0)
   2029 	  || bfd_is_abs_section (o->output_section))
   2030 	continue;
   2031 
   2032       internal_relocs
   2033 	= _bfd_elf_link_read_relocs (abfd, o, NULL,
   2034 				     (Elf_Internal_Rela *) NULL,
   2035 				     info->keep_memory);
   2036       if (internal_relocs == NULL)
   2037 	return false;
   2038 
   2039       ok = mmix_elf_check_common_relocs (abfd, info, o, internal_relocs);
   2040 
   2041       if (! info->keep_memory)
   2042 	free (internal_relocs);
   2043 
   2044       if (! ok)
   2045 	return false;
   2046     }
   2047 
   2048   return true;
   2049 }
   2050 
   2051 /* Change symbols relative to the reg contents section to instead be to
   2053    the register section, and scale them down to correspond to the register
   2054    number.  */
   2055 
   2056 static int
   2057 mmix_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2058 				  const char *name ATTRIBUTE_UNUSED,
   2059 				  Elf_Internal_Sym *sym,
   2060 				  asection *input_sec,
   2061 				  struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
   2062 {
   2063   if (input_sec != NULL
   2064       && input_sec->name != NULL
   2065       && ELF_ST_TYPE (sym->st_info) != STT_SECTION
   2066       && strcmp (input_sec->name, MMIX_REG_CONTENTS_SECTION_NAME) == 0)
   2067     {
   2068       sym->st_value /= 8;
   2069       sym->st_shndx = SHN_REGISTER;
   2070     }
   2071 
   2072   return 1;
   2073 }
   2074 
   2075 /* We fake a register section that holds values that are register numbers.
   2076    Having a SHN_REGISTER and register section translates better to other
   2077    formats (e.g. mmo) than for example a STT_REGISTER attribute.
   2078    This section faking is based on a construct in elf32-mips.c.  */
   2079 static asection mmix_elf_reg_section;
   2080 static const asymbol mmix_elf_reg_section_symbol =
   2081   GLOBAL_SYM_INIT (MMIX_REG_SECTION_NAME, &mmix_elf_reg_section);
   2082 static asection mmix_elf_reg_section =
   2083   BFD_FAKE_SECTION (mmix_elf_reg_section, &mmix_elf_reg_section_symbol,
   2084 		    MMIX_REG_SECTION_NAME, 0, SEC_NO_FLAGS);
   2085 
   2086 /* Handle the special section numbers that a symbol may use.  */
   2087 
   2088 void
   2089 mmix_elf_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *asym)
   2090 {
   2091   elf_symbol_type *elfsym;
   2092 
   2093   elfsym = (elf_symbol_type *) asym;
   2094   switch (elfsym->internal_elf_sym.st_shndx)
   2095     {
   2096     case SHN_REGISTER:
   2097       asym->section = &mmix_elf_reg_section;
   2098       break;
   2099 
   2100     default:
   2101       break;
   2102     }
   2103 }
   2104 
   2105 /* Given a BFD section, try to locate the corresponding ELF section
   2106    index.  */
   2107 
   2108 static bool
   2109 mmix_elf_section_from_bfd_section (bfd *       abfd ATTRIBUTE_UNUSED,
   2110 				   asection *  sec,
   2111 				   int *       retval)
   2112 {
   2113   if (strcmp (bfd_section_name (sec), MMIX_REG_SECTION_NAME) == 0)
   2114     *retval = SHN_REGISTER;
   2115   else
   2116     return false;
   2117 
   2118   return true;
   2119 }
   2120 
   2121 /* Hook called by the linker routine which adds symbols from an object
   2122    file.  We must handle the special SHN_REGISTER section number here.
   2123 
   2124    We also check that we only have *one* each of the section-start
   2125    symbols, since otherwise having two with the same value would cause
   2126    them to be "merged", but with the contents serialized.  */
   2127 
   2128 static bool
   2129 mmix_elf_add_symbol_hook (bfd *abfd,
   2130 			  struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2131 			  Elf_Internal_Sym *sym,
   2132 			  const char **namep ATTRIBUTE_UNUSED,
   2133 			  flagword *flagsp ATTRIBUTE_UNUSED,
   2134 			  asection **secp,
   2135 			  bfd_vma *valp ATTRIBUTE_UNUSED)
   2136 {
   2137   if (sym->st_shndx == SHN_REGISTER)
   2138     {
   2139       *secp = bfd_make_section_old_way (abfd, MMIX_REG_SECTION_NAME);
   2140       (*secp)->flags |= SEC_LINKER_CREATED;
   2141     }
   2142   else if ((*namep)[0] == '_' && (*namep)[1] == '_' && (*namep)[2] == '.'
   2143 	   && startswith (*namep, MMIX_LOC_SECTION_START_SYMBOL_PREFIX))
   2144     {
   2145       /* See if we have another one.  */
   2146       struct bfd_link_hash_entry *h = bfd_link_hash_lookup (info->hash,
   2147 							    *namep,
   2148 							    false,
   2149 							    false,
   2150 							    false);
   2151 
   2152       if (h != NULL && h->type != bfd_link_hash_undefined)
   2153 	{
   2154 	  /* How do we get the asymbol (or really: the filename) from h?
   2155 	     h->u.def.section->owner is NULL.  */
   2156 	  _bfd_error_handler
   2157 	    /* xgettext:c-format */
   2158 	    (_("%pB: error: multiple definition of `%s'; start of %s "
   2159 	       "is set in a earlier linked file"),
   2160 	     abfd, *namep,
   2161 	     *namep + strlen (MMIX_LOC_SECTION_START_SYMBOL_PREFIX));
   2162 	   bfd_set_error (bfd_error_bad_value);
   2163 	   return false;
   2164 	}
   2165     }
   2166 
   2167   return true;
   2168 }
   2169 
   2170 /* We consider symbols matching "L.*:[0-9]+" to be local symbols.  */
   2171 
   2172 static bool
   2173 mmix_elf_is_local_label_name (bfd *abfd, const char *name)
   2174 {
   2175   const char *colpos;
   2176   int digits;
   2177 
   2178   /* Also include the default local-label definition.  */
   2179   if (_bfd_elf_is_local_label_name (abfd, name))
   2180     return true;
   2181 
   2182   if (*name != 'L')
   2183     return false;
   2184 
   2185   /* If there's no ":", or more than one, it's not a local symbol.  */
   2186   colpos = strchr (name, ':');
   2187   if (colpos == NULL || strchr (colpos + 1, ':') != NULL)
   2188     return false;
   2189 
   2190   /* Check that there are remaining characters and that they are digits.  */
   2191   if (colpos[1] == 0)
   2192     return false;
   2193 
   2194   digits = strspn (colpos + 1, "0123456789");
   2195   return digits != 0 && colpos[1 + digits] == 0;
   2196 }
   2197 
   2198 /* We get rid of the register section here.  */
   2199 
   2200 bool
   2201 mmix_elf_final_link (bfd *abfd, struct bfd_link_info *info)
   2202 {
   2203   /* We never output a register section, though we create one for
   2204      temporary measures.  Check that nobody entered contents into it.  */
   2205   asection *reg_section;
   2206 
   2207   reg_section = bfd_get_section_by_name (abfd, MMIX_REG_SECTION_NAME);
   2208 
   2209   if (reg_section != NULL)
   2210     {
   2211       /* FIXME: Pass error state gracefully.  */
   2212       if (bfd_section_flags (reg_section) & SEC_HAS_CONTENTS)
   2213 	_bfd_abort (__FILE__, __LINE__, _("register section has contents\n"));
   2214 
   2215       /* Really remove the section, if it hasn't already been done.  */
   2216       if (!bfd_section_removed_from_list (abfd, reg_section))
   2217 	{
   2218 	  bfd_section_list_remove (abfd, reg_section);
   2219 	  --abfd->section_count;
   2220 	}
   2221     }
   2222 
   2223   if (! bfd_elf_final_link (abfd, info))
   2224     return false;
   2225 
   2226   /* Since this section is marked SEC_LINKER_CREATED, it isn't output by
   2227      the regular linker machinery.  We do it here, like other targets with
   2228      special sections.  */
   2229   if (info->base_file != NULL)
   2230     {
   2231       asection *greg_section
   2232 	= bfd_get_section_by_name ((bfd *) info->base_file,
   2233 				   MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
   2234       if (!bfd_set_section_contents (abfd,
   2235 				     greg_section->output_section,
   2236 				     greg_section->contents,
   2237 				     (file_ptr) greg_section->output_offset,
   2238 				     greg_section->size))
   2239 	return false;
   2240     }
   2241   return true;
   2242 }
   2243 
   2244 /* We need to include the maximum size of PUSHJ-stubs in the initial
   2245    section size.  This is expected to shrink during linker relaxation.  */
   2246 
   2247 static void
   2248 mmix_set_relaxable_size (bfd *abfd ATTRIBUTE_UNUSED,
   2249 			 asection *sec,
   2250 			 void *ptr)
   2251 {
   2252   struct bfd_link_info *info = ptr;
   2253 
   2254   /* Make sure we only do this for section where we know we want this,
   2255      otherwise we might end up resetting the size of COMMONs.  */
   2256   if (mmix_elf_section_data (sec)->pjs.n_pushj_relocs == 0)
   2257     return;
   2258 
   2259   sec->rawsize = sec->size;
   2260   sec->size += (mmix_elf_section_data (sec)->pjs.n_pushj_relocs
   2261 		* MAX_PUSHJ_STUB_SIZE);
   2262 
   2263   /* For use in relocatable link, we start with a max stubs size.  See
   2264      mmix_elf_relax_section.  */
   2265   if (bfd_link_relocatable (info) && sec->output_section)
   2266     mmix_elf_section_data (sec->output_section)->pjs.stubs_size_sum
   2267       += (mmix_elf_section_data (sec)->pjs.n_pushj_relocs
   2268 	  * MAX_PUSHJ_STUB_SIZE);
   2269 }
   2270 
   2271 /* Initialize stuff for the linker-generated GREGs to match
   2272    R_MMIX_BASE_PLUS_OFFSET relocs seen by the linker.  */
   2273 
   2274 bool
   2275 _bfd_mmix_before_linker_allocation (bfd *abfd ATTRIBUTE_UNUSED,
   2276 				    struct bfd_link_info *info)
   2277 {
   2278   asection *bpo_gregs_section;
   2279   bfd *bpo_greg_owner;
   2280   struct bpo_greg_section_info *gregdata;
   2281   size_t n_gregs;
   2282   bfd_vma gregs_size;
   2283   size_t i;
   2284   size_t *bpo_reloc_indexes;
   2285   bfd *ibfd;
   2286 
   2287   /* Set the initial size of sections.  */
   2288   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
   2289     bfd_map_over_sections (ibfd, mmix_set_relaxable_size, info);
   2290 
   2291   /* The bpo_greg_owner bfd is supposed to have been set by
   2292      mmix_elf_check_relocs when the first R_MMIX_BASE_PLUS_OFFSET is seen.
   2293      If there is no such object, there was no R_MMIX_BASE_PLUS_OFFSET.  */
   2294   bpo_greg_owner = (bfd *) info->base_file;
   2295   if (bpo_greg_owner == NULL)
   2296     return true;
   2297 
   2298   bpo_gregs_section
   2299     = bfd_get_section_by_name (bpo_greg_owner,
   2300 			       MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
   2301 
   2302   if (bpo_gregs_section == NULL)
   2303     return true;
   2304 
   2305   /* We use the target-data handle in the ELF section data.  */
   2306   gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg;
   2307   if (gregdata == NULL)
   2308     return false;
   2309 
   2310   n_gregs = gregdata->n_bpo_relocs;
   2311   gregdata->n_allocated_bpo_gregs = n_gregs;
   2312 
   2313   /* When this reaches zero during relaxation, all entries have been
   2314      filled in and the size of the linker gregs can be calculated.  */
   2315   gregdata->n_remaining_bpo_relocs_this_relaxation_round = n_gregs;
   2316 
   2317   /* Set the zeroth-order estimate for the GREGs size.  */
   2318   gregs_size = n_gregs * 8;
   2319 
   2320   if (!bfd_set_section_size (bpo_gregs_section, gregs_size))
   2321     return false;
   2322 
   2323   /* Allocate and set up the GREG arrays.  They're filled in at relaxation
   2324      time.  Note that we must use the max number ever noted for the array,
   2325      since the index numbers were created before GC.  */
   2326   gregdata->reloc_request
   2327     = bfd_zalloc (bpo_greg_owner,
   2328 		  sizeof (struct bpo_reloc_request)
   2329 		  * gregdata->n_max_bpo_relocs);
   2330 
   2331   gregdata->bpo_reloc_indexes
   2332     = bpo_reloc_indexes
   2333     = bfd_alloc (bpo_greg_owner,
   2334 		 gregdata->n_max_bpo_relocs
   2335 		 * sizeof (size_t));
   2336   if (bpo_reloc_indexes == NULL)
   2337     return false;
   2338 
   2339   /* The default order is an identity mapping.  */
   2340   for (i = 0; i < gregdata->n_max_bpo_relocs; i++)
   2341     {
   2342       bpo_reloc_indexes[i] = i;
   2343       gregdata->reloc_request[i].bpo_reloc_no = i;
   2344     }
   2345 
   2346   return true;
   2347 }
   2348 
   2349 /* Fill in contents in the linker allocated gregs.  Everything is
   2351    calculated at this point; we just move the contents into place here.  */
   2352 
   2353 bool
   2354 _bfd_mmix_after_linker_allocation (bfd *abfd ATTRIBUTE_UNUSED,
   2355 				   struct bfd_link_info *link_info)
   2356 {
   2357   asection *bpo_gregs_section;
   2358   bfd *bpo_greg_owner;
   2359   struct bpo_greg_section_info *gregdata;
   2360   size_t n_gregs;
   2361   size_t i, j;
   2362   size_t lastreg;
   2363   bfd_byte *contents;
   2364 
   2365   /* The bpo_greg_owner bfd is supposed to have been set by mmix_elf_check_relocs
   2366      when the first R_MMIX_BASE_PLUS_OFFSET is seen.  If there is no such
   2367      object, there was no R_MMIX_BASE_PLUS_OFFSET.  */
   2368   bpo_greg_owner = (bfd *) link_info->base_file;
   2369   if (bpo_greg_owner == NULL)
   2370     return true;
   2371 
   2372   bpo_gregs_section
   2373     = bfd_get_section_by_name (bpo_greg_owner,
   2374 			       MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
   2375 
   2376   /* This can't happen without DSO handling.  When DSOs are handled
   2377      without any R_MMIX_BASE_PLUS_OFFSET seen, there will be no such
   2378      section.  */
   2379   if (bpo_gregs_section == NULL)
   2380     return true;
   2381 
   2382   /* We use the target-data handle in the ELF section data.  */
   2383 
   2384   gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg;
   2385   if (gregdata == NULL)
   2386     return false;
   2387 
   2388   n_gregs = gregdata->n_allocated_bpo_gregs;
   2389 
   2390   bpo_gregs_section->contents
   2391     = contents = bfd_alloc (bpo_greg_owner, bpo_gregs_section->size);
   2392   if (contents == NULL)
   2393     return false;
   2394   bpo_gregs_section->alloced = 1;
   2395 
   2396   /* Sanity check: If these numbers mismatch, some relocation has not been
   2397      accounted for and the rest of gregdata is probably inconsistent.
   2398      It's a bug, but it's more helpful to identify it than segfaulting
   2399      below.  */
   2400   if (gregdata->n_remaining_bpo_relocs_this_relaxation_round
   2401       != gregdata->n_bpo_relocs)
   2402     {
   2403       _bfd_error_handler
   2404 	/* xgettext:c-format */
   2405 	(_("internal inconsistency: remaining %lu != max %lu;"
   2406 	   " please report this bug"),
   2407 	 (unsigned long) gregdata->n_remaining_bpo_relocs_this_relaxation_round,
   2408 	 (unsigned long) gregdata->n_bpo_relocs);
   2409       return false;
   2410     }
   2411 
   2412   for (lastreg = 255, i = 0, j = 0; j < n_gregs; i++)
   2413     if (gregdata->reloc_request[i].regindex != lastreg)
   2414       {
   2415 	bfd_put_64 (bpo_greg_owner, gregdata->reloc_request[i].value,
   2416 		    contents + j * 8);
   2417 	lastreg = gregdata->reloc_request[i].regindex;
   2418 	j++;
   2419       }
   2420 
   2421   return true;
   2422 }
   2423 
   2424 /* Sort valid relocs to come before non-valid relocs, then on increasing
   2425    value.  */
   2426 
   2427 static int
   2428 bpo_reloc_request_sort_fn (const void * p1, const void * p2)
   2429 {
   2430   const struct bpo_reloc_request *r1 = (const struct bpo_reloc_request *) p1;
   2431   const struct bpo_reloc_request *r2 = (const struct bpo_reloc_request *) p2;
   2432 
   2433   /* Primary function is validity; non-valid relocs sorted after valid
   2434      ones.  */
   2435   if (r1->valid != r2->valid)
   2436     return r2->valid - r1->valid;
   2437 
   2438   /* Then sort on value.  Don't simplify and return just the difference of
   2439      the values: the upper bits of the 64-bit value would be truncated on
   2440      a host with 32-bit ints.  */
   2441   if (r1->value != r2->value)
   2442     return r1->value > r2->value ? 1 : -1;
   2443 
   2444   /* As a last re-sort, use the relocation number, so we get a stable
   2445      sort.  The *addresses* aren't stable since items are swapped during
   2446      sorting.  It depends on the qsort implementation if this actually
   2447      happens.  */
   2448   return r1->bpo_reloc_no > r2->bpo_reloc_no
   2449     ? 1 : (r1->bpo_reloc_no < r2->bpo_reloc_no ? -1 : 0);
   2450 }
   2451 
   2452 /* For debug use only.  Dumps the global register allocations resulting
   2453    from base-plus-offset relocs.  */
   2454 
   2455 void
   2456 mmix_dump_bpo_gregs (struct bfd_link_info *link_info,
   2457 		     void (*pf) (const char *fmt, ...))
   2458 {
   2459   bfd *bpo_greg_owner;
   2460   asection *bpo_gregs_section;
   2461   struct bpo_greg_section_info *gregdata;
   2462   unsigned int i;
   2463 
   2464   if (link_info == NULL || link_info->base_file == NULL)
   2465     return;
   2466 
   2467   bpo_greg_owner = (bfd *) link_info->base_file;
   2468 
   2469   bpo_gregs_section
   2470     = bfd_get_section_by_name (bpo_greg_owner,
   2471 			       MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
   2472 
   2473   if (bpo_gregs_section == NULL)
   2474     return;
   2475 
   2476   gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg;
   2477   if (gregdata == NULL)
   2478     return;
   2479 
   2480   if (pf == NULL)
   2481     pf = _bfd_error_handler;
   2482 
   2483   /* These format strings are not translated.  They are for debug purposes
   2484      only and never displayed to an end user.  Should they escape, we
   2485      surely want them in original.  */
   2486   (*pf) (" n_bpo_relocs: %u\n n_max_bpo_relocs: %u\n n_remain...round: %u\n\
   2487  n_allocated_bpo_gregs: %u\n", gregdata->n_bpo_relocs,
   2488      gregdata->n_max_bpo_relocs,
   2489      gregdata->n_remaining_bpo_relocs_this_relaxation_round,
   2490      gregdata->n_allocated_bpo_gregs);
   2491 
   2492   if (gregdata->reloc_request)
   2493     for (i = 0; i < gregdata->n_max_bpo_relocs; i++)
   2494       (*pf) ("%4u (%4u)/%4u#%u: 0x%08lx%08lx  r: %3u o: %3u\n",
   2495 	     i,
   2496 	     (gregdata->bpo_reloc_indexes != NULL
   2497 	      ? gregdata->bpo_reloc_indexes[i] : (size_t) -1),
   2498 	     gregdata->reloc_request[i].bpo_reloc_no,
   2499 	     gregdata->reloc_request[i].valid,
   2500 
   2501 	     (unsigned long) (gregdata->reloc_request[i].value >> 32),
   2502 	     (unsigned long) gregdata->reloc_request[i].value,
   2503 	     gregdata->reloc_request[i].regindex,
   2504 	     gregdata->reloc_request[i].offset);
   2505 }
   2506 
   2507 /* This links all R_MMIX_BASE_PLUS_OFFSET relocs into a special array, and
   2508    when the last such reloc is done, an index-array is sorted according to
   2509    the values and iterated over to produce register numbers (indexed by 0
   2510    from the first allocated register number) and offsets for use in real
   2511    relocation.  (N.B.: Relocatable runs are handled, not just punted.)
   2512 
   2513    PUSHJ stub accounting is also done here.
   2514 
   2515    Symbol- and reloc-reading infrastructure copied from elf-m10200.c.  */
   2516 
   2517 static bool
   2518 mmix_elf_relax_section (bfd *abfd,
   2519 			asection *sec,
   2520 			struct bfd_link_info *link_info,
   2521 			bool *again)
   2522 {
   2523   Elf_Internal_Shdr *symtab_hdr;
   2524   Elf_Internal_Rela *internal_relocs;
   2525   Elf_Internal_Rela *irel, *irelend;
   2526   asection *bpo_gregs_section = NULL;
   2527   struct bpo_greg_section_info *gregdata;
   2528   struct bpo_reloc_section_info *bpodata
   2529     = mmix_elf_section_data (sec)->bpo.reloc;
   2530   /* The initialization is to quiet compiler warnings.  The value is to
   2531      spot a missing actual initialization.  */
   2532   size_t bpono = (size_t) -1;
   2533   size_t pjsno = 0;
   2534   size_t pjsno_undefs = 0;
   2535   Elf_Internal_Sym *isymbuf = NULL;
   2536   bfd_size_type size = sec->rawsize ? sec->rawsize : sec->size;
   2537 
   2538   mmix_elf_section_data (sec)->pjs.stubs_size_sum = 0;
   2539 
   2540   /* Assume nothing changes.  */
   2541   *again = false;
   2542 
   2543   /* We don't have to do anything if this section does not have relocs, or
   2544      if this is not a code section.  */
   2545   if ((sec->flags & SEC_RELOC) == 0
   2546       || sec->reloc_count == 0
   2547       || (sec->flags & SEC_CODE) == 0
   2548       || (sec->flags & SEC_LINKER_CREATED) != 0
   2549       /* If no R_MMIX_BASE_PLUS_OFFSET relocs and no PUSHJ-stub relocs,
   2550 	 then nothing to do.  */
   2551       || (bpodata == NULL
   2552 	  && mmix_elf_section_data (sec)->pjs.n_pushj_relocs == 0))
   2553     return true;
   2554 
   2555   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   2556 
   2557   if (bpodata != NULL)
   2558     {
   2559       bpo_gregs_section = bpodata->bpo_greg_section;
   2560       gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg;
   2561       bpono = bpodata->first_base_plus_offset_reloc;
   2562     }
   2563   else
   2564     gregdata = NULL;
   2565 
   2566   /* Get a copy of the native relocations.  */
   2567   internal_relocs
   2568     = _bfd_elf_link_read_relocs (abfd, sec, NULL,
   2569 				 (Elf_Internal_Rela *) NULL,
   2570 				 link_info->keep_memory);
   2571   if (internal_relocs == NULL)
   2572     goto error_return;
   2573 
   2574   /* Walk through them looking for relaxing opportunities.  */
   2575   irelend = internal_relocs + sec->reloc_count;
   2576   for (irel = internal_relocs; irel < irelend; irel++)
   2577     {
   2578       bfd_vma symval;
   2579       struct elf_link_hash_entry *h = NULL;
   2580 
   2581       /* We only process two relocs.  */
   2582       if (ELF64_R_TYPE (irel->r_info) != (int) R_MMIX_BASE_PLUS_OFFSET
   2583 	  && ELF64_R_TYPE (irel->r_info) != (int) R_MMIX_PUSHJ_STUBBABLE)
   2584 	continue;
   2585 
   2586       /* We process relocs in a distinctly different way when this is a
   2587 	 relocatable link (for one, we don't look at symbols), so we avoid
   2588 	 mixing its code with that for the "normal" relaxation.  */
   2589       if (bfd_link_relocatable (link_info))
   2590 	{
   2591 	  /* The only transformation in a relocatable link is to generate
   2592 	     a full stub at the location of the stub calculated for the
   2593 	     input section, if the relocated stub location, the end of the
   2594 	     output section plus earlier stubs, cannot be reached.  Thus
   2595 	     relocatable linking can only lead to worse code, but it still
   2596 	     works.  */
   2597 	  if (ELF64_R_TYPE (irel->r_info) == R_MMIX_PUSHJ_STUBBABLE)
   2598 	    {
   2599 	      /* If we can reach the end of the output-section and beyond
   2600 		 any current stubs, then we don't need a stub for this
   2601 		 reloc.  The relaxed order of output stub allocation may
   2602 		 not exactly match the straightforward order, so we always
   2603 		 assume presence of output stubs, which will allow
   2604 		 relaxation only on relocations indifferent to the
   2605 		 presence of output stub allocations for other relocations
   2606 		 and thus the order of output stub allocation.  */
   2607 	      if (bfd_check_overflow (complain_overflow_signed,
   2608 				      19,
   2609 				      0,
   2610 				      bfd_arch_bits_per_address (abfd),
   2611 				      /* Output-stub location.  */
   2612 				      sec->output_section->rawsize
   2613 				      + (mmix_elf_section_data (sec
   2614 							       ->output_section)
   2615 					 ->pjs.stubs_size_sum)
   2616 				      /* Location of this PUSHJ reloc.  */
   2617 				      - (sec->output_offset + irel->r_offset)
   2618 				      /* Don't count *this* stub twice.  */
   2619 				      - (mmix_elf_section_data (sec)
   2620 					 ->pjs.stub_size[pjsno]
   2621 					 + MAX_PUSHJ_STUB_SIZE))
   2622 		  == bfd_reloc_ok)
   2623 		mmix_elf_section_data (sec)->pjs.stub_size[pjsno] = 0;
   2624 
   2625 	      mmix_elf_section_data (sec)->pjs.stubs_size_sum
   2626 		+= mmix_elf_section_data (sec)->pjs.stub_size[pjsno];
   2627 
   2628 	      pjsno++;
   2629 	    }
   2630 
   2631 	  continue;
   2632 	}
   2633 
   2634       /* Get the value of the symbol referred to by the reloc.  */
   2635       if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info)
   2636 	{
   2637 	  /* A local symbol.  */
   2638 	  Elf_Internal_Sym *isym;
   2639 	  asection *sym_sec;
   2640 
   2641 	  /* Read this BFD's local symbols if we haven't already.  */
   2642 	  if (isymbuf == NULL)
   2643 	    {
   2644 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
   2645 	      if (isymbuf == NULL)
   2646 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
   2647 						symtab_hdr->sh_info, 0,
   2648 						NULL, NULL, NULL);
   2649 	      if (isymbuf == 0)
   2650 		goto error_return;
   2651 	    }
   2652 
   2653 	  isym = isymbuf + ELF64_R_SYM (irel->r_info);
   2654 	  if (isym->st_shndx == SHN_UNDEF)
   2655 	    sym_sec = bfd_und_section_ptr;
   2656 	  else if (isym->st_shndx == SHN_ABS)
   2657 	    sym_sec = bfd_abs_section_ptr;
   2658 	  else if (isym->st_shndx == SHN_COMMON)
   2659 	    sym_sec = bfd_com_section_ptr;
   2660 	  else
   2661 	    sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   2662 	  symval = (isym->st_value
   2663 		    + sym_sec->output_section->vma
   2664 		    + sym_sec->output_offset);
   2665 	}
   2666       else
   2667 	{
   2668 	  unsigned long indx;
   2669 
   2670 	  /* An external symbol.  */
   2671 	  indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
   2672 	  h = elf_sym_hashes (abfd)[indx];
   2673 	  BFD_ASSERT (h != NULL);
   2674 	  if (h->root.type == bfd_link_hash_undefweak)
   2675 	    /* FIXME: for R_MMIX_PUSHJ_STUBBABLE, there are alternatives to
   2676 	       the canonical value 0 for an unresolved weak symbol to
   2677 	       consider: as the debug-friendly approach, resolve to "abort"
   2678 	       (or a port-specific function), or as the space-friendly
   2679 	       approach resolve to the next instruction (like some other
   2680 	       ports, notably ARM and AArch64).  These alternatives require
   2681 	       matching code in mmix_elf_perform_relocation or its caller.  */
   2682 	    symval = 0;
   2683 	  else if (h->root.type == bfd_link_hash_defined
   2684 		   || h->root.type == bfd_link_hash_defweak)
   2685 	    symval = (h->root.u.def.value
   2686 		      + h->root.u.def.section->output_section->vma
   2687 		      + h->root.u.def.section->output_offset);
   2688 	  else
   2689 	    {
   2690 	      /* This appears to be a reference to an undefined symbol.  Just
   2691 		 ignore it--it will be caught by the regular reloc processing.
   2692 		 We need to keep BPO reloc accounting consistent, though
   2693 		 else we'll abort instead of emitting an error message.  */
   2694 	      if (ELF64_R_TYPE (irel->r_info) == R_MMIX_BASE_PLUS_OFFSET
   2695 		  && gregdata != NULL)
   2696 		{
   2697 		  gregdata->n_remaining_bpo_relocs_this_relaxation_round--;
   2698 		  bpono++;
   2699 		}
   2700 
   2701 	      /* Similarly, keep accounting consistent for PUSHJ
   2702 		 referring to an undefined symbol.  */
   2703 	      if (ELF64_R_TYPE (irel->r_info) == R_MMIX_PUSHJ_STUBBABLE)
   2704 		pjsno_undefs++;
   2705 	      continue;
   2706 	    }
   2707 	}
   2708 
   2709       if (ELF64_R_TYPE (irel->r_info) == (int) R_MMIX_PUSHJ_STUBBABLE)
   2710 	{
   2711 	  bfd_vma value = symval + irel->r_addend;
   2712 	  bfd_vma dot
   2713 	    = (sec->output_section->vma
   2714 	       + sec->output_offset
   2715 	       + irel->r_offset);
   2716 	  bfd_vma stubaddr
   2717 	    = (sec->output_section->vma
   2718 	       + sec->output_offset
   2719 	       + size
   2720 	       + mmix_elf_section_data (sec)->pjs.stubs_size_sum);
   2721 
   2722 	  if ((value & 3) == 0
   2723 	      && bfd_check_overflow (complain_overflow_signed,
   2724 				     19,
   2725 				     0,
   2726 				     bfd_arch_bits_per_address (abfd),
   2727 				     value - dot
   2728 				     - (value > dot
   2729 					? mmix_elf_section_data (sec)
   2730 					->pjs.stub_size[pjsno]
   2731 					: 0))
   2732 	      == bfd_reloc_ok)
   2733 	    /* If the reloc fits, no stub is needed.  */
   2734 	    mmix_elf_section_data (sec)->pjs.stub_size[pjsno] = 0;
   2735 	  else
   2736 	    /* Maybe we can get away with just a JMP insn?  */
   2737 	    if ((value & 3) == 0
   2738 		&& bfd_check_overflow (complain_overflow_signed,
   2739 				       27,
   2740 				       0,
   2741 				       bfd_arch_bits_per_address (abfd),
   2742 				       value - stubaddr
   2743 				       - (value > dot
   2744 					  ? mmix_elf_section_data (sec)
   2745 					  ->pjs.stub_size[pjsno] - 4
   2746 					  : 0))
   2747 		== bfd_reloc_ok)
   2748 	      /* Yep, account for a stub consisting of a single JMP insn.  */
   2749 	      mmix_elf_section_data (sec)->pjs.stub_size[pjsno] = 4;
   2750 	  else
   2751 	    /* Nope, go for the full insn stub.  It doesn't seem useful to
   2752 	       emit the intermediate sizes; those will only be useful for
   2753 	       a >64M program assuming contiguous code.  */
   2754 	    mmix_elf_section_data (sec)->pjs.stub_size[pjsno]
   2755 	      = MAX_PUSHJ_STUB_SIZE;
   2756 
   2757 	  mmix_elf_section_data (sec)->pjs.stubs_size_sum
   2758 	    += mmix_elf_section_data (sec)->pjs.stub_size[pjsno];
   2759 	  pjsno++;
   2760 	  continue;
   2761 	}
   2762 
   2763       /* We're looking at a R_MMIX_BASE_PLUS_OFFSET reloc.  */
   2764 
   2765       gregdata->reloc_request[gregdata->bpo_reloc_indexes[bpono]].value
   2766 	= symval + irel->r_addend;
   2767       gregdata->reloc_request[gregdata->bpo_reloc_indexes[bpono++]].valid = true;
   2768       gregdata->n_remaining_bpo_relocs_this_relaxation_round--;
   2769     }
   2770 
   2771   /* Check if that was the last BPO-reloc.  If so, sort the values and
   2772      calculate how many registers we need to cover them.  Set the size of
   2773      the linker gregs, and if the number of registers changed, indicate
   2774      that we need to relax some more because we have more work to do.  */
   2775   if (gregdata != NULL
   2776       && gregdata->n_remaining_bpo_relocs_this_relaxation_round == 0)
   2777     {
   2778       size_t i;
   2779       bfd_vma prev_base;
   2780       size_t regindex;
   2781 
   2782       /* First, reset the remaining relocs for the next round.  */
   2783       gregdata->n_remaining_bpo_relocs_this_relaxation_round
   2784 	= gregdata->n_bpo_relocs;
   2785 
   2786       qsort (gregdata->reloc_request,
   2787 	     gregdata->n_max_bpo_relocs,
   2788 	     sizeof (struct bpo_reloc_request),
   2789 	     bpo_reloc_request_sort_fn);
   2790 
   2791       /* Recalculate indexes.  When we find a change (however unlikely
   2792 	 after the initial iteration), we know we need to relax again,
   2793 	 since items in the GREG-array are sorted by increasing value and
   2794 	 stored in the relaxation phase.  */
   2795       for (i = 0; i < gregdata->n_max_bpo_relocs; i++)
   2796 	if (gregdata->bpo_reloc_indexes[gregdata->reloc_request[i].bpo_reloc_no]
   2797 	    != i)
   2798 	  {
   2799 	    gregdata->bpo_reloc_indexes[gregdata->reloc_request[i].bpo_reloc_no]
   2800 	      = i;
   2801 	    *again = true;
   2802 	  }
   2803 
   2804       /* Allocate register numbers (indexing from 0).  Stop at the first
   2805 	 non-valid reloc.  */
   2806       for (i = 0, regindex = 0, prev_base = gregdata->reloc_request[0].value;
   2807 	   i < gregdata->n_bpo_relocs;
   2808 	   i++)
   2809 	{
   2810 	  if (gregdata->reloc_request[i].value > prev_base + 255)
   2811 	    {
   2812 	      regindex++;
   2813 	      prev_base = gregdata->reloc_request[i].value;
   2814 	    }
   2815 	  gregdata->reloc_request[i].regindex = regindex;
   2816 	  gregdata->reloc_request[i].offset
   2817 	    = gregdata->reloc_request[i].value - prev_base;
   2818 	}
   2819 
   2820       /* If it's not the same as the last time, we need to relax again,
   2821 	 because the size of the section has changed.  I'm not sure we
   2822 	 actually need to do any adjustments since the shrinking happens
   2823 	 at the start of this section, but better safe than sorry.  */
   2824       if (gregdata->n_allocated_bpo_gregs != regindex + 1)
   2825 	{
   2826 	  gregdata->n_allocated_bpo_gregs = regindex + 1;
   2827 	  *again = true;
   2828 	}
   2829 
   2830       bpo_gregs_section->size = (regindex + 1) * 8;
   2831     }
   2832 
   2833   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
   2834     {
   2835       if (! link_info->keep_memory)
   2836 	free (isymbuf);
   2837       else
   2838 	{
   2839 	  /* Cache the symbols for elf_link_input_bfd.  */
   2840 	  symtab_hdr->contents = (unsigned char *) isymbuf;
   2841 	}
   2842     }
   2843 
   2844   BFD_ASSERT(pjsno + pjsno_undefs
   2845 	     == mmix_elf_section_data (sec)->pjs.n_pushj_relocs);
   2846 
   2847   if (elf_section_data (sec)->relocs != internal_relocs)
   2848     free (internal_relocs);
   2849 
   2850   if (sec->size < size + mmix_elf_section_data (sec)->pjs.stubs_size_sum)
   2851     abort ();
   2852 
   2853   if (sec->size > size + mmix_elf_section_data (sec)->pjs.stubs_size_sum)
   2854     {
   2855       sec->size = size + mmix_elf_section_data (sec)->pjs.stubs_size_sum;
   2856       *again = true;
   2857     }
   2858 
   2859   return true;
   2860 
   2861  error_return:
   2862   if ((unsigned char *) isymbuf != symtab_hdr->contents)
   2863     free (isymbuf);
   2864   if (elf_section_data (sec)->relocs != internal_relocs)
   2865     free (internal_relocs);
   2866   return false;
   2867 }
   2868 
   2869 #define ELF_ARCH		bfd_arch_mmix
   2871 #define ELF_MACHINE_CODE	EM_MMIX
   2872 #define ELF_TARGET_ID		MMIX_ELF_DATA
   2873 
   2874 /* According to mmix-doc page 36 (paragraph 45), this should be (1LL << 48LL).
   2875    However, that's too much for something somewhere in the linker part of
   2876    BFD; perhaps the start-address has to be a non-zero multiple of this
   2877    number, or larger than this number.  The symptom is that the linker
   2878    complains: "warning: allocated section `.text' not in segment".  We
   2879    settle for 64k; the page-size used in examples is 8k.
   2880    #define ELF_MAXPAGESIZE 0x10000
   2881 
   2882    Unfortunately, this causes excessive padding in the supposedly small
   2883    for-education programs that are the expected usage (where people would
   2884    inspect output).  We stick to 256 bytes just to have *some* default
   2885    alignment.  */
   2886 #define ELF_MAXPAGESIZE 0x100
   2887 
   2888 #define TARGET_BIG_SYM		mmix_elf64_vec
   2889 #define TARGET_BIG_NAME		"elf64-mmix"
   2890 
   2891 #define elf_info_to_howto_rel		NULL
   2892 #define elf_info_to_howto		mmix_info_to_howto_rela
   2893 #define elf_backend_relocate_section	mmix_elf_relocate_section
   2894 #define elf_backend_gc_mark_hook	mmix_elf_gc_mark_hook
   2895 
   2896 #define elf_backend_link_output_symbol_hook \
   2897 	mmix_elf_link_output_symbol_hook
   2898 #define elf_backend_add_symbol_hook	mmix_elf_add_symbol_hook
   2899 
   2900 #define elf_backend_check_relocs	mmix_elf_check_relocs
   2901 #define elf_backend_symbol_processing	mmix_elf_symbol_processing
   2902 #define elf_backend_omit_section_dynsym _bfd_elf_omit_section_dynsym_all
   2903 
   2904 #define bfd_elf64_bfd_copy_link_hash_symbol_type \
   2905   _bfd_generic_copy_link_hash_symbol_type
   2906 
   2907 #define bfd_elf64_bfd_is_local_label_name \
   2908 	mmix_elf_is_local_label_name
   2909 
   2910 #define elf_backend_may_use_rel_p	0
   2911 #define elf_backend_may_use_rela_p	1
   2912 #define elf_backend_default_use_rela_p	1
   2913 
   2914 #define elf_backend_can_gc_sections	1
   2915 #define elf_backend_section_from_bfd_section \
   2916 	mmix_elf_section_from_bfd_section
   2917 
   2918 #define bfd_elf64_new_section_hook	mmix_elf_new_section_hook
   2919 #define bfd_elf64_bfd_final_link	mmix_elf_final_link
   2920 #define bfd_elf64_bfd_relax_section	mmix_elf_relax_section
   2921 
   2922 #include "elf64-target.h"
   2923