Added relocs-file for aarch64 to configure.tgt
[platform/upstream/binutils.git] / bfd / elf64-mmix.c
1 /* MMIX-specific support for 64-bit ELF.
2    Copyright (C) 2001-2014 Free Software Foundation, Inc.
3    Contributed by Hans-Peter Nilsson <hp@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   bfd_boolean has_warned_bpo;
83   bfd_boolean 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     bfd_boolean 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 bfd_boolean 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 *, bfd_error_handler_type);
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
196          32,                    /* bitsize */
197          FALSE,                 /* pc_relative */
198          0,                     /* bitpos */
199          complain_overflow_bitfield, /* 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          0,                     /* size (0 = byte, 1 = short, 2 = long) */
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          1,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          4,                     /* size (0 = byte, 1 = short, 2 = long) */
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          0,                     /* size (0 = byte, 1 = short, 2 = long) */
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          1,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          4,                     /* size (0 = byte, 1 = short, 2 = long) */
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 (0 = byte, 1 = short, 2 = long) */
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 (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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          1,                     /* size (0 = byte, 1 = short, 2 = long) */
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          1,                     /* size (0 = byte, 1 = short, 2 = long) */
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          4,                     /* size (0 = byte, 1 = short, 2 = long) */
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 (0 = byte, 1 = short, 2 = long) */
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          2,                     /* size (0 = byte, 1 = short, 2 = long) */
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 bfd_boolean
829 mmix_elf_new_section_hook (bfd *abfd, asection *sec)
830 {
831   if (!sec->used_by_bfd)
832     {
833       struct _mmix_elf_section_data *sdata;
834       bfd_size_type amt = sizeof (*sdata);
835
836       sdata = bfd_zalloc (abfd, amt);
837       if (sdata == NULL)
838         return FALSE;
839       sec->used_by_bfd = sdata;
840     }
841
842   return _bfd_elf_new_section_hook (abfd, sec);
843 }
844
845
846 /* This function performs the actual bitfiddling and sanity check for a
847    final relocation.  Each relocation gets its *worst*-case expansion
848    in size when it arrives here; any reduction in size should have been
849    caught in linker relaxation earlier.  When we get here, the relocation
850    looks like the smallest instruction with SWYM:s (nop:s) appended to the
851    max size.  We fill in those nop:s.
852
853    R_MMIX_GETA: (FIXME: Relaxation should break this up in 1, 2, 3 tetra)
854     GETA $N,foo
855    ->
856     SETL $N,foo & 0xffff
857     INCML $N,(foo >> 16) & 0xffff
858     INCMH $N,(foo >> 32) & 0xffff
859     INCH $N,(foo >> 48) & 0xffff
860
861    R_MMIX_CBRANCH: (FIXME: Relaxation should break this up, but
862    condbranches needing relaxation might be rare enough to not be
863    worthwhile.)
864     [P]Bcc $N,foo
865    ->
866     [~P]B~cc $N,.+20
867     SETL $255,foo & ...
868     INCML ...
869     INCMH ...
870     INCH ...
871     GO $255,$255,0
872
873    R_MMIX_PUSHJ: (FIXME: Relaxation...)
874     PUSHJ $N,foo
875    ->
876     SETL $255,foo & ...
877     INCML ...
878     INCMH ...
879     INCH ...
880     PUSHGO $N,$255,0
881
882    R_MMIX_JMP: (FIXME: Relaxation...)
883     JMP foo
884    ->
885     SETL $255,foo & ...
886     INCML ...
887     INCMH ...
888     INCH ...
889     GO $255,$255,0
890
891    R_MMIX_ADDR19 and R_MMIX_ADDR27 are just filled in.  */
892
893 static bfd_reloc_status_type
894 mmix_elf_perform_relocation (asection *isec, reloc_howto_type *howto,
895                              void *datap, bfd_vma addr, bfd_vma value,
896                              char **error_message)
897 {
898   bfd *abfd = isec->owner;
899   bfd_reloc_status_type flag = bfd_reloc_ok;
900   bfd_reloc_status_type r;
901   int offs = 0;
902   int reg = 255;
903
904   /* The worst case bits are all similar SETL/INCML/INCMH/INCH sequences.
905      We handle the differences here and the common sequence later.  */
906   switch (howto->type)
907     {
908     case R_MMIX_GETA:
909       offs = 0;
910       reg = bfd_get_8 (abfd, (bfd_byte *) datap + 1);
911
912       /* We change to an absolute value.  */
913       value += addr;
914       break;
915
916     case R_MMIX_CBRANCH:
917       {
918         int in1 = bfd_get_16 (abfd, (bfd_byte *) datap) << 16;
919
920         /* Invert the condition and prediction bit, and set the offset
921            to five instructions ahead.
922
923            We *can* do better if we want to.  If the branch is found to be
924            within limits, we could leave the branch as is; there'll just
925            be a bunch of NOP:s after it.  But we shouldn't see this
926            sequence often enough that it's worth doing it.  */
927
928         bfd_put_32 (abfd,
929                     (((in1 ^ ((PRED_INV_BIT | COND_INV_BIT) << 24)) & ~0xffff)
930                      | (24/4)),
931                     (bfd_byte *) datap);
932
933         /* Put a "GO $255,$255,0" after the common sequence.  */
934         bfd_put_32 (abfd,
935                     ((GO_INSN_BYTE | IMM_OFFSET_BIT) << 24) | 0xffff00,
936                     (bfd_byte *) datap + 20);
937
938         /* Common sequence starts at offset 4.  */
939         offs = 4;
940
941         /* We change to an absolute value.  */
942         value += addr;
943       }
944       break;
945
946     case R_MMIX_PUSHJ_STUBBABLE:
947       /* If the address fits, we're fine.  */
948       if ((value & 3) == 0
949           /* Note rightshift 0; see R_MMIX_JMP case below.  */
950           && (r = bfd_check_overflow (complain_overflow_signed,
951                                       howto->bitsize,
952                                       0,
953                                       bfd_arch_bits_per_address (abfd),
954                                       value)) == bfd_reloc_ok)
955         goto pcrel_mmix_reloc_fits;
956       else
957         {
958           bfd_size_type size = isec->rawsize ? isec->rawsize : isec->size;
959
960           /* We have the bytes at the PUSHJ insn and need to get the
961              position for the stub.  There's supposed to be room allocated
962              for the stub.  */
963           bfd_byte *stubcontents
964             = ((bfd_byte *) datap
965                - (addr - (isec->output_section->vma + isec->output_offset))
966                + size
967                + mmix_elf_section_data (isec)->pjs.stub_offset);
968           bfd_vma stubaddr;
969
970           if (mmix_elf_section_data (isec)->pjs.n_pushj_relocs == 0)
971             {
972               /* This shouldn't happen when linking to ELF or mmo, so
973                  this is an attempt to link to "binary", right?  We
974                  can't access the output bfd, so we can't verify that
975                  assumption.  We only know that the critical
976                  mmix_elf_check_common_relocs has not been called,
977                  which happens when the output format is different
978                  from the input format (and is not mmo).  */
979               if (! mmix_elf_section_data (isec)->has_warned_pushj)
980                 {
981                   /* For the first such error per input section, produce
982                      a verbose message.  */
983                   *error_message
984                     = _("invalid input relocation when producing"
985                         " non-ELF, non-mmo format output."
986                         "\n Please use the objcopy program to convert from"
987                         " ELF or mmo,"
988                         "\n or assemble using"
989                         " \"-no-expand\" (for gcc, \"-Wa,-no-expand\"");
990                   mmix_elf_section_data (isec)->has_warned_pushj = TRUE;
991                   return bfd_reloc_dangerous;
992                 }
993
994               /* For subsequent errors, return this one, which is
995                  rate-limited but looks a little bit different,
996                  hopefully without affecting user-friendliness.  */
997               return bfd_reloc_overflow;
998             }
999
1000           /* The address doesn't fit, so redirect the PUSHJ to the
1001              location of the stub.  */
1002           r = mmix_elf_perform_relocation (isec,
1003                                            &elf_mmix_howto_table
1004                                            [R_MMIX_ADDR19],
1005                                            datap,
1006                                            addr,
1007                                            isec->output_section->vma
1008                                            + isec->output_offset
1009                                            + size
1010                                            + (mmix_elf_section_data (isec)
1011                                               ->pjs.stub_offset)
1012                                            - addr,
1013                                            error_message);
1014           if (r != bfd_reloc_ok)
1015             return r;
1016
1017           stubaddr
1018             = (isec->output_section->vma
1019                + isec->output_offset
1020                + size
1021                + mmix_elf_section_data (isec)->pjs.stub_offset);
1022
1023           /* We generate a simple JMP if that suffices, else the whole 5
1024              insn stub.  */
1025           if (bfd_check_overflow (complain_overflow_signed,
1026                                   elf_mmix_howto_table[R_MMIX_ADDR27].bitsize,
1027                                   0,
1028                                   bfd_arch_bits_per_address (abfd),
1029                                   addr + value - stubaddr) == bfd_reloc_ok)
1030             {
1031               bfd_put_32 (abfd, JMP_INSN_BYTE << 24, stubcontents);
1032               r = mmix_elf_perform_relocation (isec,
1033                                                &elf_mmix_howto_table
1034                                                [R_MMIX_ADDR27],
1035                                                stubcontents,
1036                                                stubaddr,
1037                                                value + addr - stubaddr,
1038                                                error_message);
1039               mmix_elf_section_data (isec)->pjs.stub_offset += 4;
1040
1041               if (size + mmix_elf_section_data (isec)->pjs.stub_offset
1042                   > isec->size)
1043                 abort ();
1044
1045               return r;
1046             }
1047           else
1048             {
1049               /* Put a "GO $255,0" after the common sequence.  */
1050               bfd_put_32 (abfd,
1051                           ((GO_INSN_BYTE | IMM_OFFSET_BIT) << 24)
1052                           | 0xff00, (bfd_byte *) stubcontents + 16);
1053
1054               /* Prepare for the general code to set the first part of the
1055                  linker stub, and */
1056               value += addr;
1057               datap = stubcontents;
1058               mmix_elf_section_data (isec)->pjs.stub_offset
1059                 += MAX_PUSHJ_STUB_SIZE;
1060             }
1061         }
1062       break;
1063
1064     case R_MMIX_PUSHJ:
1065       {
1066         int inreg = bfd_get_8 (abfd, (bfd_byte *) datap + 1);
1067
1068         /* Put a "PUSHGO $N,$255,0" after the common sequence.  */
1069         bfd_put_32 (abfd,
1070                     ((PUSHGO_INSN_BYTE | IMM_OFFSET_BIT) << 24)
1071                     | (inreg << 16)
1072                     | 0xff00,
1073                     (bfd_byte *) datap + 16);
1074
1075         /* We change to an absolute value.  */
1076         value += addr;
1077       }
1078       break;
1079
1080     case R_MMIX_JMP:
1081       /* This one is a little special.  If we get here on a non-relaxing
1082          link, and the destination is actually in range, we don't need to
1083          execute the nops.
1084          If so, we fall through to the bit-fiddling relocs.
1085
1086          FIXME: bfd_check_overflow seems broken; the relocation is
1087          rightshifted before testing, so supply a zero rightshift.  */
1088
1089       if (! ((value & 3) == 0
1090              && (r = bfd_check_overflow (complain_overflow_signed,
1091                                          howto->bitsize,
1092                                          0,
1093                                          bfd_arch_bits_per_address (abfd),
1094                                          value)) == bfd_reloc_ok))
1095         {
1096           /* If the relocation doesn't fit in a JMP, we let the NOP:s be
1097              modified below, and put a "GO $255,$255,0" after the
1098              address-loading sequence.  */
1099           bfd_put_32 (abfd,
1100                       ((GO_INSN_BYTE | IMM_OFFSET_BIT) << 24)
1101                       | 0xffff00,
1102                       (bfd_byte *) datap + 16);
1103
1104           /* We change to an absolute value.  */
1105           value += addr;
1106           break;
1107         }
1108       /* FALLTHROUGH.  */
1109     case R_MMIX_ADDR19:
1110     case R_MMIX_ADDR27:
1111     pcrel_mmix_reloc_fits:
1112       /* These must be in range, or else we emit an error.  */
1113       if ((value & 3) == 0
1114           /* Note rightshift 0; see above.  */
1115           && (r = bfd_check_overflow (complain_overflow_signed,
1116                                       howto->bitsize,
1117                                       0,
1118                                       bfd_arch_bits_per_address (abfd),
1119                                       value)) == bfd_reloc_ok)
1120         {
1121           bfd_vma in1
1122             = bfd_get_32 (abfd, (bfd_byte *) datap);
1123           bfd_vma highbit;
1124
1125           if ((bfd_signed_vma) value < 0)
1126             {
1127               highbit = 1 << 24;
1128               value += (1 << (howto->bitsize - 1));
1129             }
1130           else
1131             highbit = 0;
1132
1133           value >>= 2;
1134
1135           bfd_put_32 (abfd,
1136                       (in1 & howto->src_mask)
1137                       | highbit
1138                       | (value & howto->dst_mask),
1139                       (bfd_byte *) datap);
1140
1141           return bfd_reloc_ok;
1142         }
1143       else
1144         return bfd_reloc_overflow;
1145
1146     case R_MMIX_BASE_PLUS_OFFSET:
1147       {
1148         struct bpo_reloc_section_info *bpodata
1149           = mmix_elf_section_data (isec)->bpo.reloc;
1150         asection *bpo_greg_section;
1151         struct bpo_greg_section_info *gregdata;
1152         size_t bpo_index;
1153
1154         if (bpodata == NULL)
1155           {
1156             /* This shouldn't happen when linking to ELF or mmo, so
1157                this is an attempt to link to "binary", right?  We
1158                can't access the output bfd, so we can't verify that
1159                assumption.  We only know that the critical
1160                mmix_elf_check_common_relocs has not been called, which
1161                happens when the output format is different from the
1162                input format (and is not mmo).  */
1163             if (! mmix_elf_section_data (isec)->has_warned_bpo)
1164               {
1165                 /* For the first such error per input section, produce
1166                    a verbose message.  */
1167                 *error_message
1168                   = _("invalid input relocation when producing"
1169                       " non-ELF, non-mmo format output."
1170                       "\n Please use the objcopy program to convert from"
1171                       " ELF or mmo,"
1172                       "\n or compile using the gcc-option"
1173                       " \"-mno-base-addresses\".");
1174                 mmix_elf_section_data (isec)->has_warned_bpo = TRUE;
1175                 return bfd_reloc_dangerous;
1176               }
1177
1178             /* For subsequent errors, return this one, which is
1179                rate-limited but looks a little bit different,
1180                hopefully without affecting user-friendliness.  */
1181             return bfd_reloc_overflow;
1182           }
1183
1184         bpo_greg_section = bpodata->bpo_greg_section;
1185         gregdata = mmix_elf_section_data (bpo_greg_section)->bpo.greg;
1186         bpo_index = gregdata->bpo_reloc_indexes[bpodata->bpo_index++];
1187
1188         /* A consistency check: The value we now have in "relocation" must
1189            be the same as the value we stored for that relocation.  It
1190            doesn't cost much, so can be left in at all times.  */
1191         if (value != gregdata->reloc_request[bpo_index].value)
1192           {
1193             (*_bfd_error_handler)
1194               (_("%s: Internal inconsistency error for value for\n\
1195  linker-allocated global register: linked: 0x%lx%08lx != relaxed: 0x%lx%08lx\n"),
1196                bfd_get_filename (isec->owner),
1197                (unsigned long) (value >> 32), (unsigned long) value,
1198                (unsigned long) (gregdata->reloc_request[bpo_index].value
1199                                 >> 32),
1200                (unsigned long) gregdata->reloc_request[bpo_index].value);
1201             bfd_set_error (bfd_error_bad_value);
1202             return bfd_reloc_overflow;
1203           }
1204
1205         /* Then store the register number and offset for that register
1206            into datap and datap + 1 respectively.  */
1207         bfd_put_8 (abfd,
1208                    gregdata->reloc_request[bpo_index].regindex
1209                    + bpo_greg_section->output_section->vma / 8,
1210                    datap);
1211         bfd_put_8 (abfd,
1212                    gregdata->reloc_request[bpo_index].offset,
1213                    ((unsigned char *) datap) + 1);
1214         return bfd_reloc_ok;
1215       }
1216
1217     case R_MMIX_REG_OR_BYTE:
1218     case R_MMIX_REG:
1219       if (value > 255)
1220         return bfd_reloc_overflow;
1221       bfd_put_8 (abfd, value, datap);
1222       return bfd_reloc_ok;
1223
1224     default:
1225       BAD_CASE (howto->type);
1226     }
1227
1228   /* This code adds the common SETL/INCML/INCMH/INCH worst-case
1229      sequence.  */
1230
1231   /* Lowest two bits must be 0.  We return bfd_reloc_overflow for
1232      everything that looks strange.  */
1233   if (value & 3)
1234     flag = bfd_reloc_overflow;
1235
1236   bfd_put_32 (abfd,
1237               (SETL_INSN_BYTE << 24) | (value & 0xffff) | (reg << 16),
1238               (bfd_byte *) datap + offs);
1239   bfd_put_32 (abfd,
1240               (INCML_INSN_BYTE << 24) | ((value >> 16) & 0xffff) | (reg << 16),
1241               (bfd_byte *) datap + offs + 4);
1242   bfd_put_32 (abfd,
1243               (INCMH_INSN_BYTE << 24) | ((value >> 32) & 0xffff) | (reg << 16),
1244               (bfd_byte *) datap + offs + 8);
1245   bfd_put_32 (abfd,
1246               (INCH_INSN_BYTE << 24) | ((value >> 48) & 0xffff) | (reg << 16),
1247               (bfd_byte *) datap + offs + 12);
1248
1249   return flag;
1250 }
1251
1252 /* Set the howto pointer for an MMIX ELF reloc (type RELA).  */
1253
1254 static void
1255 mmix_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
1256                          arelent *cache_ptr,
1257                          Elf_Internal_Rela *dst)
1258 {
1259   unsigned int r_type;
1260
1261   r_type = ELF64_R_TYPE (dst->r_info);
1262   BFD_ASSERT (r_type < (unsigned int) R_MMIX_max);
1263   cache_ptr->howto = &elf_mmix_howto_table[r_type];
1264 }
1265
1266 /* Any MMIX-specific relocation gets here at assembly time or when linking
1267    to other formats (such as mmo); this is the relocation function from
1268    the reloc_table.  We don't get here for final pure ELF linking.  */
1269
1270 static bfd_reloc_status_type
1271 mmix_elf_reloc (bfd *abfd,
1272                 arelent *reloc_entry,
1273                 asymbol *symbol,
1274                 void * data,
1275                 asection *input_section,
1276                 bfd *output_bfd,
1277                 char **error_message)
1278 {
1279   bfd_vma relocation;
1280   bfd_reloc_status_type r;
1281   asection *reloc_target_output_section;
1282   bfd_reloc_status_type flag = bfd_reloc_ok;
1283   bfd_vma output_base = 0;
1284
1285   r = bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1286                              input_section, output_bfd, error_message);
1287
1288   /* If that was all that was needed (i.e. this isn't a final link, only
1289      some segment adjustments), we're done.  */
1290   if (r != bfd_reloc_continue)
1291     return r;
1292
1293   if (bfd_is_und_section (symbol->section)
1294       && (symbol->flags & BSF_WEAK) == 0
1295       && output_bfd == (bfd *) NULL)
1296     return bfd_reloc_undefined;
1297
1298   /* Is the address of the relocation really within the section?  */
1299   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1300     return bfd_reloc_outofrange;
1301
1302   /* Work out which section the relocation is targeted at and the
1303      initial relocation command value.  */
1304
1305   /* Get symbol value.  (Common symbols are special.)  */
1306   if (bfd_is_com_section (symbol->section))
1307     relocation = 0;
1308   else
1309     relocation = symbol->value;
1310
1311   reloc_target_output_section = bfd_get_output_section (symbol);
1312
1313   /* Here the variable relocation holds the final address of the symbol we
1314      are relocating against, plus any addend.  */
1315   if (output_bfd)
1316     output_base = 0;
1317   else
1318     output_base = reloc_target_output_section->vma;
1319
1320   relocation += output_base + symbol->section->output_offset;
1321
1322   if (output_bfd != (bfd *) NULL)
1323     {
1324       /* Add in supplied addend.  */
1325       relocation += reloc_entry->addend;
1326
1327       /* This is a partial relocation, and we want to apply the
1328          relocation to the reloc entry rather than the raw data.
1329          Modify the reloc inplace to reflect what we now know.  */
1330       reloc_entry->addend = relocation;
1331       reloc_entry->address += input_section->output_offset;
1332       return flag;
1333     }
1334
1335   return mmix_final_link_relocate (reloc_entry->howto, input_section,
1336                                    data, reloc_entry->address,
1337                                    reloc_entry->addend, relocation,
1338                                    bfd_asymbol_name (symbol),
1339                                    reloc_target_output_section,
1340                                    error_message);
1341 }
1342 \f
1343 /* Relocate an MMIX ELF section.  Modified from elf32-fr30.c; look to it
1344    for guidance if you're thinking of copying this.  */
1345
1346 static bfd_boolean
1347 mmix_elf_relocate_section (bfd *output_bfd ATTRIBUTE_UNUSED,
1348                            struct bfd_link_info *info,
1349                            bfd *input_bfd,
1350                            asection *input_section,
1351                            bfd_byte *contents,
1352                            Elf_Internal_Rela *relocs,
1353                            Elf_Internal_Sym *local_syms,
1354                            asection **local_sections)
1355 {
1356   Elf_Internal_Shdr *symtab_hdr;
1357   struct elf_link_hash_entry **sym_hashes;
1358   Elf_Internal_Rela *rel;
1359   Elf_Internal_Rela *relend;
1360   bfd_size_type size;
1361   size_t pjsno = 0;
1362
1363   size = input_section->rawsize ? input_section->rawsize : input_section->size;
1364   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
1365   sym_hashes = elf_sym_hashes (input_bfd);
1366   relend = relocs + input_section->reloc_count;
1367
1368   /* Zero the stub area before we start.  */
1369   if (input_section->rawsize != 0
1370       && input_section->size > input_section->rawsize)
1371     memset (contents + input_section->rawsize, 0,
1372             input_section->size - input_section->rawsize);
1373
1374   for (rel = relocs; rel < relend; rel ++)
1375     {
1376       reloc_howto_type *howto;
1377       unsigned long r_symndx;
1378       Elf_Internal_Sym *sym;
1379       asection *sec;
1380       struct elf_link_hash_entry *h;
1381       bfd_vma relocation;
1382       bfd_reloc_status_type r;
1383       const char *name = NULL;
1384       int r_type;
1385       bfd_boolean undefined_signalled = FALSE;
1386
1387       r_type = ELF64_R_TYPE (rel->r_info);
1388
1389       if (r_type == R_MMIX_GNU_VTINHERIT
1390           || r_type == R_MMIX_GNU_VTENTRY)
1391         continue;
1392
1393       r_symndx = ELF64_R_SYM (rel->r_info);
1394
1395       howto = elf_mmix_howto_table + ELF64_R_TYPE (rel->r_info);
1396       h = NULL;
1397       sym = NULL;
1398       sec = NULL;
1399
1400       if (r_symndx < symtab_hdr->sh_info)
1401         {
1402           sym = local_syms + r_symndx;
1403           sec = local_sections [r_symndx];
1404           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
1405
1406           name = bfd_elf_string_from_elf_section (input_bfd,
1407                                                   symtab_hdr->sh_link,
1408                                                   sym->st_name);
1409           if (name == NULL)
1410             name = bfd_section_name (input_bfd, sec);
1411         }
1412       else
1413         {
1414           bfd_boolean unresolved_reloc, ignored;
1415
1416           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
1417                                    r_symndx, symtab_hdr, sym_hashes,
1418                                    h, sec, relocation,
1419                                    unresolved_reloc, undefined_signalled,
1420                                    ignored);
1421           name = h->root.root.string;
1422         }
1423
1424       if (sec != NULL && discarded_section (sec))
1425         RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
1426                                          rel, 1, relend, howto, 0, contents);
1427
1428       if (info->relocatable)
1429         {
1430           /* This is a relocatable link.  For most relocs we don't have to
1431              change anything, unless the reloc is against a section
1432              symbol, in which case we have to adjust according to where
1433              the section symbol winds up in the output section.  */
1434           if (sym != NULL && ELF_ST_TYPE (sym->st_info) == STT_SECTION)
1435             rel->r_addend += sec->output_offset;
1436
1437           /* For PUSHJ stub relocs however, we may need to change the
1438              reloc and the section contents, if the reloc doesn't reach
1439              beyond the end of the output section and previous stubs.
1440              Then we change the section contents to be a PUSHJ to the end
1441              of the input section plus stubs (we can do that without using
1442              a reloc), and then we change the reloc to be a R_MMIX_PUSHJ
1443              at the stub location.  */
1444           if (r_type == R_MMIX_PUSHJ_STUBBABLE)
1445             {
1446               /* We've already checked whether we need a stub; use that
1447                  knowledge.  */
1448               if (mmix_elf_section_data (input_section)->pjs.stub_size[pjsno]
1449                   != 0)
1450                 {
1451                   Elf_Internal_Rela relcpy;
1452
1453                   if (mmix_elf_section_data (input_section)
1454                       ->pjs.stub_size[pjsno] != MAX_PUSHJ_STUB_SIZE)
1455                     abort ();
1456
1457                   /* There's already a PUSHJ insn there, so just fill in
1458                      the offset bits to the stub.  */
1459                   if (mmix_final_link_relocate (elf_mmix_howto_table
1460                                                 + R_MMIX_ADDR19,
1461                                                 input_section,
1462                                                 contents,
1463                                                 rel->r_offset,
1464                                                 0,
1465                                                 input_section
1466                                                 ->output_section->vma
1467                                                 + input_section->output_offset
1468                                                 + size
1469                                                 + mmix_elf_section_data (input_section)
1470                                                 ->pjs.stub_offset,
1471                                                 NULL, NULL, NULL) != bfd_reloc_ok)
1472                     return FALSE;
1473
1474                   /* Put a JMP insn at the stub; it goes with the
1475                      R_MMIX_JMP reloc.  */
1476                   bfd_put_32 (output_bfd, JMP_INSN_BYTE << 24,
1477                               contents
1478                               + size
1479                               + mmix_elf_section_data (input_section)
1480                               ->pjs.stub_offset);
1481
1482                   /* Change the reloc to be at the stub, and to a full
1483                      R_MMIX_JMP reloc.  */
1484                   rel->r_info = ELF64_R_INFO (r_symndx, R_MMIX_JMP);
1485                   rel->r_offset
1486                     = (size
1487                        + mmix_elf_section_data (input_section)
1488                        ->pjs.stub_offset);
1489
1490                   mmix_elf_section_data (input_section)->pjs.stub_offset
1491                     += MAX_PUSHJ_STUB_SIZE;
1492
1493                   /* Shift this reloc to the end of the relocs to maintain
1494                      the r_offset sorted reloc order.  */
1495                   relcpy = *rel;
1496                   memmove (rel, rel + 1, (char *) relend - (char *) rel);
1497                   relend[-1] = relcpy;
1498
1499                   /* Back up one reloc, or else we'd skip the next reloc
1500                    in turn.  */
1501                   rel--;
1502                 }
1503
1504               pjsno++;
1505             }
1506           continue;
1507         }
1508
1509       r = mmix_final_link_relocate (howto, input_section,
1510                                     contents, rel->r_offset,
1511                                     rel->r_addend, relocation, name, sec, NULL);
1512
1513       if (r != bfd_reloc_ok)
1514         {
1515           bfd_boolean check_ok = TRUE;
1516           const char * msg = (const char *) NULL;
1517
1518           switch (r)
1519             {
1520             case bfd_reloc_overflow:
1521               check_ok = info->callbacks->reloc_overflow
1522                 (info, (h ? &h->root : NULL), name, howto->name,
1523                  (bfd_vma) 0, input_bfd, input_section, rel->r_offset);
1524               break;
1525
1526             case bfd_reloc_undefined:
1527               /* We may have sent this message above.  */
1528               if (! undefined_signalled)
1529                 check_ok = info->callbacks->undefined_symbol
1530                   (info, name, input_bfd, input_section, rel->r_offset,
1531                    TRUE);
1532               undefined_signalled = TRUE;
1533               break;
1534
1535             case bfd_reloc_outofrange:
1536               msg = _("internal error: out of range error");
1537               break;
1538
1539             case bfd_reloc_notsupported:
1540               msg = _("internal error: unsupported relocation error");
1541               break;
1542
1543             case bfd_reloc_dangerous:
1544               msg = _("internal error: dangerous relocation");
1545               break;
1546
1547             default:
1548               msg = _("internal error: unknown error");
1549               break;
1550             }
1551
1552           if (msg)
1553             check_ok = info->callbacks->warning
1554               (info, msg, name, input_bfd, input_section, rel->r_offset);
1555
1556           if (! check_ok)
1557             return FALSE;
1558         }
1559     }
1560
1561   return TRUE;
1562 }
1563 \f
1564 /* 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_get_section_name (symsec->owner, symsec),
1608                   MMIX_REG_CONTENTS_SECTION_NAME) == 0
1609           || strcmp (bfd_get_section_name (symsec->owner, 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               (_("%s: base-plus-offset relocation against register symbol: (unknown) in %s"),
1617                bfd_get_filename (input_section->owner),
1618                bfd_get_section_name (symsec->owner, symsec));
1619           else
1620             (*_bfd_error_handler)
1621               (_("%s: base-plus-offset relocation against register symbol: %s in %s"),
1622                bfd_get_filename (input_section->owner), symname,
1623                bfd_get_section_name (symsec->owner, symsec));
1624           return bfd_reloc_overflow;
1625         }
1626       goto do_mmix_reloc;
1627
1628     case R_MMIX_REG_OR_BYTE:
1629     case R_MMIX_REG:
1630       /* For now, we handle these alike.  They must refer to an register
1631          symbol, which is either relative to the register section and in
1632          the range 0..255, or is in the register contents section with vma
1633          regno * 8.  */
1634
1635       /* FIXME: A better way to check for reg contents section?
1636          FIXME: Postpone section->scaling to mmix_elf_perform_relocation? */
1637       if (symsec == NULL)
1638         return bfd_reloc_undefined;
1639
1640       if (strcmp (bfd_get_section_name (symsec->owner, symsec),
1641                   MMIX_REG_CONTENTS_SECTION_NAME) == 0)
1642         {
1643           if ((srel & 7) != 0 || srel < 32*8 || srel > 255*8)
1644             {
1645               /* The bfd_reloc_outofrange return value, though intuitively
1646                  a better value, will not get us an error.  */
1647               return bfd_reloc_overflow;
1648             }
1649           srel /= 8;
1650         }
1651       else if (strcmp (bfd_get_section_name (symsec->owner, symsec),
1652                        MMIX_REG_SECTION_NAME) == 0)
1653         {
1654           if (srel < 0 || srel > 255)
1655             /* The bfd_reloc_outofrange return value, though intuitively a
1656                better value, will not get us an error.  */
1657             return bfd_reloc_overflow;
1658         }
1659       else
1660         {
1661           /* Note: This is separated out into two messages in order
1662              to ease the translation into other languages.  */
1663           if (symname == NULL || *symname == 0)
1664             (*_bfd_error_handler)
1665               (_("%s: register relocation against non-register symbol: (unknown) in %s"),
1666                bfd_get_filename (input_section->owner),
1667                bfd_get_section_name (symsec->owner, symsec));
1668           else
1669             (*_bfd_error_handler)
1670               (_("%s: register relocation against non-register symbol: %s in %s"),
1671                bfd_get_filename (input_section->owner), symname,
1672                bfd_get_section_name (symsec->owner, symsec));
1673
1674           /* The bfd_reloc_outofrange return value, though intuitively a
1675              better value, will not get us an error.  */
1676           return bfd_reloc_overflow;
1677         }
1678     do_mmix_reloc:
1679       contents += r_offset;
1680       r = mmix_elf_perform_relocation (input_section, howto, contents,
1681                                        addr, srel, error_message);
1682       break;
1683
1684     case R_MMIX_LOCAL:
1685       /* This isn't a real relocation, it's just an assertion that the
1686          final relocation value corresponds to a local register.  We
1687          ignore the actual relocation; nothing is changed.  */
1688       {
1689         asection *regsec
1690           = bfd_get_section_by_name (input_section->output_section->owner,
1691                                      MMIX_REG_CONTENTS_SECTION_NAME);
1692         bfd_vma first_global;
1693
1694         /* Check that this is an absolute value, or a reference to the
1695            register contents section or the register (symbol) section.
1696            Absolute numbers can get here as undefined section.  Undefined
1697            symbols are signalled elsewhere, so there's no conflict in us
1698            accidentally handling it.  */
1699         if (!bfd_is_abs_section (symsec)
1700             && !bfd_is_und_section (symsec)
1701             && strcmp (bfd_get_section_name (symsec->owner, symsec),
1702                        MMIX_REG_CONTENTS_SECTION_NAME) != 0
1703             && strcmp (bfd_get_section_name (symsec->owner, symsec),
1704                        MMIX_REG_SECTION_NAME) != 0)
1705         {
1706           (*_bfd_error_handler)
1707             (_("%s: directive LOCAL valid only with a register or absolute value"),
1708              bfd_get_filename (input_section->owner));
1709
1710           return bfd_reloc_overflow;
1711         }
1712
1713       /* If we don't have a register contents section, then $255 is the
1714          first global register.  */
1715       if (regsec == NULL)
1716         first_global = 255;
1717       else
1718         {
1719           first_global
1720             = bfd_get_section_vma (input_section->output_section->owner,
1721                                    regsec) / 8;
1722           if (strcmp (bfd_get_section_name (symsec->owner, symsec),
1723                       MMIX_REG_CONTENTS_SECTION_NAME) == 0)
1724             {
1725               if ((srel & 7) != 0 || srel < 32*8 || srel > 255*8)
1726                 /* The bfd_reloc_outofrange return value, though
1727                    intuitively a better value, will not get us an error.  */
1728                 return bfd_reloc_overflow;
1729               srel /= 8;
1730             }
1731         }
1732
1733         if ((bfd_vma) srel >= first_global)
1734           {
1735             /* FIXME: Better error message.  */
1736             (*_bfd_error_handler)
1737               (_("%s: LOCAL directive: Register $%ld is not a local register.  First global register is $%ld."),
1738                bfd_get_filename (input_section->owner), (long) srel, (long) first_global);
1739
1740             return bfd_reloc_overflow;
1741           }
1742       }
1743       r = bfd_reloc_ok;
1744       break;
1745
1746     default:
1747       r = _bfd_final_link_relocate (howto, input_section->owner, input_section,
1748                                     contents, r_offset,
1749                                     relocation, r_addend);
1750     }
1751
1752   return r;
1753 }
1754 \f
1755 /* Return the section that should be marked against GC for a given
1756    relocation.  */
1757
1758 static asection *
1759 mmix_elf_gc_mark_hook (asection *sec,
1760                        struct bfd_link_info *info,
1761                        Elf_Internal_Rela *rel,
1762                        struct elf_link_hash_entry *h,
1763                        Elf_Internal_Sym *sym)
1764 {
1765   if (h != NULL)
1766     switch (ELF64_R_TYPE (rel->r_info))
1767       {
1768       case R_MMIX_GNU_VTINHERIT:
1769       case R_MMIX_GNU_VTENTRY:
1770         return NULL;
1771       }
1772
1773   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
1774 }
1775
1776 /* Update relocation info for a GC-excluded section.  We could supposedly
1777    perform the allocation after GC, but there's no suitable hook between
1778    GC (or section merge) and the point when all input sections must be
1779    present.  Better to waste some memory and (perhaps) a little time.  */
1780
1781 static bfd_boolean
1782 mmix_elf_gc_sweep_hook (bfd *abfd ATTRIBUTE_UNUSED,
1783                         struct bfd_link_info *info ATTRIBUTE_UNUSED,
1784                         asection *sec,
1785                         const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED)
1786 {
1787   struct bpo_reloc_section_info *bpodata
1788     = mmix_elf_section_data (sec)->bpo.reloc;
1789   asection *allocated_gregs_section;
1790
1791   /* If no bpodata here, we have nothing to do.  */
1792   if (bpodata == NULL)
1793     return TRUE;
1794
1795   allocated_gregs_section = bpodata->bpo_greg_section;
1796
1797   mmix_elf_section_data (allocated_gregs_section)->bpo.greg->n_bpo_relocs
1798     -= bpodata->n_bpo_relocs_this_section;
1799
1800   return TRUE;
1801 }
1802 \f
1803 /* Sort register relocs to come before expanding relocs.  */
1804
1805 static int
1806 mmix_elf_sort_relocs (const void * p1, const void * p2)
1807 {
1808   const Elf_Internal_Rela *r1 = (const Elf_Internal_Rela *) p1;
1809   const Elf_Internal_Rela *r2 = (const Elf_Internal_Rela *) p2;
1810   int r1_is_reg, r2_is_reg;
1811
1812   /* Sort primarily on r_offset & ~3, so relocs are done to consecutive
1813      insns.  */
1814   if ((r1->r_offset & ~(bfd_vma) 3) > (r2->r_offset & ~(bfd_vma) 3))
1815     return 1;
1816   else if ((r1->r_offset & ~(bfd_vma) 3) < (r2->r_offset & ~(bfd_vma) 3))
1817     return -1;
1818
1819   r1_is_reg
1820     = (ELF64_R_TYPE (r1->r_info) == R_MMIX_REG_OR_BYTE
1821        || ELF64_R_TYPE (r1->r_info) == R_MMIX_REG);
1822   r2_is_reg
1823     = (ELF64_R_TYPE (r2->r_info) == R_MMIX_REG_OR_BYTE
1824        || ELF64_R_TYPE (r2->r_info) == R_MMIX_REG);
1825   if (r1_is_reg != r2_is_reg)
1826     return r2_is_reg - r1_is_reg;
1827
1828   /* Neither or both are register relocs.  Then sort on full offset.  */
1829   if (r1->r_offset > r2->r_offset)
1830     return 1;
1831   else if (r1->r_offset < r2->r_offset)
1832     return -1;
1833   return 0;
1834 }
1835
1836 /* Subset of mmix_elf_check_relocs, common to ELF and mmo linking.  */
1837
1838 static bfd_boolean
1839 mmix_elf_check_common_relocs  (bfd *abfd,
1840                                struct bfd_link_info *info,
1841                                asection *sec,
1842                                const Elf_Internal_Rela *relocs)
1843 {
1844   bfd *bpo_greg_owner = NULL;
1845   asection *allocated_gregs_section = NULL;
1846   struct bpo_greg_section_info *gregdata = NULL;
1847   struct bpo_reloc_section_info *bpodata = NULL;
1848   const Elf_Internal_Rela *rel;
1849   const Elf_Internal_Rela *rel_end;
1850
1851   /* We currently have to abuse this COFF-specific member, since there's
1852      no target-machine-dedicated member.  There's no alternative outside
1853      the bfd_link_info struct; we can't specialize a hash-table since
1854      they're different between ELF and mmo.  */
1855   bpo_greg_owner = (bfd *) info->base_file;
1856
1857   rel_end = relocs + sec->reloc_count;
1858   for (rel = relocs; rel < rel_end; rel++)
1859     {
1860       switch (ELF64_R_TYPE (rel->r_info))
1861         {
1862           /* This relocation causes a GREG allocation.  We need to count
1863              them, and we need to create a section for them, so we need an
1864              object to fake as the owner of that section.  We can't use
1865              the ELF dynobj for this, since the ELF bits assume lots of
1866              DSO-related stuff if that member is non-NULL.  */
1867         case R_MMIX_BASE_PLUS_OFFSET:
1868           /* We don't do anything with this reloc for a relocatable link.  */
1869           if (info->relocatable)
1870             break;
1871
1872           if (bpo_greg_owner == NULL)
1873             {
1874               bpo_greg_owner = abfd;
1875               info->base_file = bpo_greg_owner;
1876             }
1877
1878           if (allocated_gregs_section == NULL)
1879             allocated_gregs_section
1880               = bfd_get_section_by_name (bpo_greg_owner,
1881                                          MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
1882
1883           if (allocated_gregs_section == NULL)
1884             {
1885               allocated_gregs_section
1886                 = bfd_make_section_with_flags (bpo_greg_owner,
1887                                                MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME,
1888                                                (SEC_HAS_CONTENTS
1889                                                 | SEC_IN_MEMORY
1890                                                 | SEC_LINKER_CREATED));
1891               /* Setting both SEC_ALLOC and SEC_LOAD means the section is
1892                  treated like any other section, and we'd get errors for
1893                  address overlap with the text section.  Let's set none of
1894                  those flags, as that is what currently happens for usual
1895                  GREG allocations, and that works.  */
1896               if (allocated_gregs_section == NULL
1897                   || !bfd_set_section_alignment (bpo_greg_owner,
1898                                                  allocated_gregs_section,
1899                                                  3))
1900                 return FALSE;
1901
1902               gregdata = (struct bpo_greg_section_info *)
1903                 bfd_zalloc (bpo_greg_owner, sizeof (struct bpo_greg_section_info));
1904               if (gregdata == NULL)
1905                 return FALSE;
1906               mmix_elf_section_data (allocated_gregs_section)->bpo.greg
1907                 = gregdata;
1908             }
1909           else if (gregdata == NULL)
1910             gregdata
1911               = mmix_elf_section_data (allocated_gregs_section)->bpo.greg;
1912
1913           /* Get ourselves some auxiliary info for the BPO-relocs.  */
1914           if (bpodata == NULL)
1915             {
1916               /* No use doing a separate iteration pass to find the upper
1917                  limit - just use the number of relocs.  */
1918               bpodata = (struct bpo_reloc_section_info *)
1919                 bfd_alloc (bpo_greg_owner,
1920                            sizeof (struct bpo_reloc_section_info)
1921                            * (sec->reloc_count + 1));
1922               if (bpodata == NULL)
1923                 return FALSE;
1924               mmix_elf_section_data (sec)->bpo.reloc = bpodata;
1925               bpodata->first_base_plus_offset_reloc
1926                 = bpodata->bpo_index
1927                 = gregdata->n_max_bpo_relocs;
1928               bpodata->bpo_greg_section
1929                 = allocated_gregs_section;
1930               bpodata->n_bpo_relocs_this_section = 0;
1931             }
1932
1933           bpodata->n_bpo_relocs_this_section++;
1934           gregdata->n_max_bpo_relocs++;
1935
1936           /* We don't get another chance to set this before GC; we've not
1937              set up any hook that runs before GC.  */
1938           gregdata->n_bpo_relocs
1939             = gregdata->n_max_bpo_relocs;
1940           break;
1941
1942         case R_MMIX_PUSHJ_STUBBABLE:
1943           mmix_elf_section_data (sec)->pjs.n_pushj_relocs++;
1944           break;
1945         }
1946     }
1947
1948   /* Allocate per-reloc stub storage and initialize it to the max stub
1949      size.  */
1950   if (mmix_elf_section_data (sec)->pjs.n_pushj_relocs != 0)
1951     {
1952       size_t i;
1953
1954       mmix_elf_section_data (sec)->pjs.stub_size
1955         = bfd_alloc (abfd, mmix_elf_section_data (sec)->pjs.n_pushj_relocs
1956                      * sizeof (mmix_elf_section_data (sec)
1957                                ->pjs.stub_size[0]));
1958       if (mmix_elf_section_data (sec)->pjs.stub_size == NULL)
1959         return FALSE;
1960
1961       for (i = 0; i < mmix_elf_section_data (sec)->pjs.n_pushj_relocs; i++)
1962         mmix_elf_section_data (sec)->pjs.stub_size[i] = MAX_PUSHJ_STUB_SIZE;
1963     }
1964
1965   return TRUE;
1966 }
1967
1968 /* Look through the relocs for a section during the first phase.  */
1969
1970 static bfd_boolean
1971 mmix_elf_check_relocs (bfd *abfd,
1972                        struct bfd_link_info *info,
1973                        asection *sec,
1974                        const Elf_Internal_Rela *relocs)
1975 {
1976   Elf_Internal_Shdr *symtab_hdr;
1977   struct elf_link_hash_entry **sym_hashes;
1978   const Elf_Internal_Rela *rel;
1979   const Elf_Internal_Rela *rel_end;
1980
1981   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1982   sym_hashes = elf_sym_hashes (abfd);
1983
1984   /* First we sort the relocs so that any register relocs come before
1985      expansion-relocs to the same insn.  FIXME: Not done for mmo.  */
1986   qsort ((void *) relocs, sec->reloc_count, sizeof (Elf_Internal_Rela),
1987          mmix_elf_sort_relocs);
1988
1989   /* Do the common part.  */
1990   if (!mmix_elf_check_common_relocs (abfd, info, sec, relocs))
1991     return FALSE;
1992
1993   if (info->relocatable)
1994     return TRUE;
1995
1996   rel_end = relocs + sec->reloc_count;
1997   for (rel = relocs; rel < rel_end; rel++)
1998     {
1999       struct elf_link_hash_entry *h;
2000       unsigned long r_symndx;
2001
2002       r_symndx = ELF64_R_SYM (rel->r_info);
2003       if (r_symndx < symtab_hdr->sh_info)
2004         h = NULL;
2005       else
2006         {
2007           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2008           while (h->root.type == bfd_link_hash_indirect
2009                  || h->root.type == bfd_link_hash_warning)
2010             h = (struct elf_link_hash_entry *) h->root.u.i.link;
2011
2012           /* PR15323, ref flags aren't set for references in the same
2013              object.  */
2014           h->root.non_ir_ref = 1;
2015         }
2016
2017       switch (ELF64_R_TYPE (rel->r_info))
2018         {
2019         /* This relocation describes the C++ object vtable hierarchy.
2020            Reconstruct it for later use during GC.  */
2021         case R_MMIX_GNU_VTINHERIT:
2022           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2023             return FALSE;
2024           break;
2025
2026         /* This relocation describes which C++ vtable entries are actually
2027            used.  Record for later use during GC.  */
2028         case R_MMIX_GNU_VTENTRY:
2029           BFD_ASSERT (h != NULL);
2030           if (h != NULL
2031               && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2032             return FALSE;
2033           break;
2034         }
2035     }
2036
2037   return TRUE;
2038 }
2039
2040 /* Wrapper for mmix_elf_check_common_relocs, called when linking to mmo.
2041    Copied from elf_link_add_object_symbols.  */
2042
2043 bfd_boolean
2044 _bfd_mmix_check_all_relocs (bfd *abfd, struct bfd_link_info *info)
2045 {
2046   asection *o;
2047
2048   for (o = abfd->sections; o != NULL; o = o->next)
2049     {
2050       Elf_Internal_Rela *internal_relocs;
2051       bfd_boolean ok;
2052
2053       if ((o->flags & SEC_RELOC) == 0
2054           || o->reloc_count == 0
2055           || ((info->strip == strip_all || info->strip == strip_debugger)
2056               && (o->flags & SEC_DEBUGGING) != 0)
2057           || bfd_is_abs_section (o->output_section))
2058         continue;
2059
2060       internal_relocs
2061         = _bfd_elf_link_read_relocs (abfd, o, NULL,
2062                                      (Elf_Internal_Rela *) NULL,
2063                                      info->keep_memory);
2064       if (internal_relocs == NULL)
2065         return FALSE;
2066
2067       ok = mmix_elf_check_common_relocs (abfd, info, o, internal_relocs);
2068
2069       if (! info->keep_memory)
2070         free (internal_relocs);
2071
2072       if (! ok)
2073         return FALSE;
2074     }
2075
2076   return TRUE;
2077 }
2078 \f
2079 /* Change symbols relative to the reg contents section to instead be to
2080    the register section, and scale them down to correspond to the register
2081    number.  */
2082
2083 static int
2084 mmix_elf_link_output_symbol_hook (struct bfd_link_info *info ATTRIBUTE_UNUSED,
2085                                   const char *name ATTRIBUTE_UNUSED,
2086                                   Elf_Internal_Sym *sym,
2087                                   asection *input_sec,
2088                                   struct elf_link_hash_entry *h ATTRIBUTE_UNUSED)
2089 {
2090   if (input_sec != NULL
2091       && input_sec->name != NULL
2092       && ELF_ST_TYPE (sym->st_info) != STT_SECTION
2093       && strcmp (input_sec->name, MMIX_REG_CONTENTS_SECTION_NAME) == 0)
2094     {
2095       sym->st_value /= 8;
2096       sym->st_shndx = SHN_REGISTER;
2097     }
2098
2099   return 1;
2100 }
2101
2102 /* We fake a register section that holds values that are register numbers.
2103    Having a SHN_REGISTER and register section translates better to other
2104    formats (e.g. mmo) than for example a STT_REGISTER attribute.
2105    This section faking is based on a construct in elf32-mips.c.  */
2106 static asection mmix_elf_reg_section;
2107 static asymbol mmix_elf_reg_section_symbol;
2108 static asymbol *mmix_elf_reg_section_symbol_ptr;
2109
2110 /* Handle the special section numbers that a symbol may use.  */
2111
2112 void
2113 mmix_elf_symbol_processing (abfd, asym)
2114      bfd *abfd ATTRIBUTE_UNUSED;
2115      asymbol *asym;
2116 {
2117   elf_symbol_type *elfsym;
2118
2119   elfsym = (elf_symbol_type *) asym;
2120   switch (elfsym->internal_elf_sym.st_shndx)
2121     {
2122     case SHN_REGISTER:
2123       if (mmix_elf_reg_section.name == NULL)
2124         {
2125           /* Initialize the register section.  */
2126           mmix_elf_reg_section.name = MMIX_REG_SECTION_NAME;
2127           mmix_elf_reg_section.flags = SEC_NO_FLAGS;
2128           mmix_elf_reg_section.output_section = &mmix_elf_reg_section;
2129           mmix_elf_reg_section.symbol = &mmix_elf_reg_section_symbol;
2130           mmix_elf_reg_section.symbol_ptr_ptr = &mmix_elf_reg_section_symbol_ptr;
2131           mmix_elf_reg_section_symbol.name = MMIX_REG_SECTION_NAME;
2132           mmix_elf_reg_section_symbol.flags = BSF_SECTION_SYM;
2133           mmix_elf_reg_section_symbol.section = &mmix_elf_reg_section;
2134           mmix_elf_reg_section_symbol_ptr = &mmix_elf_reg_section_symbol;
2135         }
2136       asym->section = &mmix_elf_reg_section;
2137       break;
2138
2139     default:
2140       break;
2141     }
2142 }
2143
2144 /* Given a BFD section, try to locate the corresponding ELF section
2145    index.  */
2146
2147 static bfd_boolean
2148 mmix_elf_section_from_bfd_section (bfd *       abfd ATTRIBUTE_UNUSED,
2149                                    asection *  sec,
2150                                    int *       retval)
2151 {
2152   if (strcmp (bfd_get_section_name (abfd, sec), MMIX_REG_SECTION_NAME) == 0)
2153     *retval = SHN_REGISTER;
2154   else
2155     return FALSE;
2156
2157   return TRUE;
2158 }
2159
2160 /* Hook called by the linker routine which adds symbols from an object
2161    file.  We must handle the special SHN_REGISTER section number here.
2162
2163    We also check that we only have *one* each of the section-start
2164    symbols, since otherwise having two with the same value would cause
2165    them to be "merged", but with the contents serialized.  */
2166
2167 static bfd_boolean
2168 mmix_elf_add_symbol_hook (bfd *abfd,
2169                           struct bfd_link_info *info ATTRIBUTE_UNUSED,
2170                           Elf_Internal_Sym *sym,
2171                           const char **namep ATTRIBUTE_UNUSED,
2172                           flagword *flagsp ATTRIBUTE_UNUSED,
2173                           asection **secp,
2174                           bfd_vma *valp ATTRIBUTE_UNUSED)
2175 {
2176   if (sym->st_shndx == SHN_REGISTER)
2177     {
2178       *secp = bfd_make_section_old_way (abfd, MMIX_REG_SECTION_NAME);
2179       (*secp)->flags |= SEC_LINKER_CREATED;
2180     }
2181   else if ((*namep)[0] == '_' && (*namep)[1] == '_' && (*namep)[2] == '.'
2182            && CONST_STRNEQ (*namep, MMIX_LOC_SECTION_START_SYMBOL_PREFIX))
2183     {
2184       /* See if we have another one.  */
2185       struct bfd_link_hash_entry *h = bfd_link_hash_lookup (info->hash,
2186                                                             *namep,
2187                                                             FALSE,
2188                                                             FALSE,
2189                                                             FALSE);
2190
2191       if (h != NULL && h->type != bfd_link_hash_undefined)
2192         {
2193           /* How do we get the asymbol (or really: the filename) from h?
2194              h->u.def.section->owner is NULL.  */
2195           ((*_bfd_error_handler)
2196            (_("%s: Error: multiple definition of `%s'; start of %s is set in a earlier linked file\n"),
2197             bfd_get_filename (abfd), *namep,
2198             *namep + strlen (MMIX_LOC_SECTION_START_SYMBOL_PREFIX)));
2199            bfd_set_error (bfd_error_bad_value);
2200            return FALSE;
2201         }
2202     }
2203
2204   return TRUE;
2205 }
2206
2207 /* We consider symbols matching "L.*:[0-9]+" to be local symbols.  */
2208
2209 static bfd_boolean
2210 mmix_elf_is_local_label_name (bfd *abfd, const char *name)
2211 {
2212   const char *colpos;
2213   int digits;
2214
2215   /* Also include the default local-label definition.  */
2216   if (_bfd_elf_is_local_label_name (abfd, name))
2217     return TRUE;
2218
2219   if (*name != 'L')
2220     return FALSE;
2221
2222   /* If there's no ":", or more than one, it's not a local symbol.  */
2223   colpos = strchr (name, ':');
2224   if (colpos == NULL || strchr (colpos + 1, ':') != NULL)
2225     return FALSE;
2226
2227   /* Check that there are remaining characters and that they are digits.  */
2228   if (colpos[1] == 0)
2229     return FALSE;
2230
2231   digits = strspn (colpos + 1, "0123456789");
2232   return digits != 0 && colpos[1 + digits] == 0;
2233 }
2234
2235 /* We get rid of the register section here.  */
2236
2237 bfd_boolean
2238 mmix_elf_final_link (bfd *abfd, struct bfd_link_info *info)
2239 {
2240   /* We never output a register section, though we create one for
2241      temporary measures.  Check that nobody entered contents into it.  */
2242   asection *reg_section;
2243
2244   reg_section = bfd_get_section_by_name (abfd, MMIX_REG_SECTION_NAME);
2245
2246   if (reg_section != NULL)
2247     {
2248       /* FIXME: Pass error state gracefully.  */
2249       if (bfd_get_section_flags (abfd, reg_section) & SEC_HAS_CONTENTS)
2250         _bfd_abort (__FILE__, __LINE__, _("Register section has contents\n"));
2251
2252       /* Really remove the section, if it hasn't already been done.  */
2253       if (!bfd_section_removed_from_list (abfd, reg_section))
2254         {
2255           bfd_section_list_remove (abfd, reg_section);
2256           --abfd->section_count;
2257         }
2258     }
2259
2260   if (! bfd_elf_final_link (abfd, info))
2261     return FALSE;
2262
2263   /* Since this section is marked SEC_LINKER_CREATED, it isn't output by
2264      the regular linker machinery.  We do it here, like other targets with
2265      special sections.  */
2266   if (info->base_file != NULL)
2267     {
2268       asection *greg_section
2269         = bfd_get_section_by_name ((bfd *) info->base_file,
2270                                    MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
2271       if (!bfd_set_section_contents (abfd,
2272                                      greg_section->output_section,
2273                                      greg_section->contents,
2274                                      (file_ptr) greg_section->output_offset,
2275                                      greg_section->size))
2276         return FALSE;
2277     }
2278   return TRUE;
2279 }
2280
2281 /* We need to include the maximum size of PUSHJ-stubs in the initial
2282    section size.  This is expected to shrink during linker relaxation.  */
2283
2284 static void
2285 mmix_set_relaxable_size (bfd *abfd ATTRIBUTE_UNUSED,
2286                          asection *sec,
2287                          void *ptr)
2288 {
2289   struct bfd_link_info *info = ptr;
2290
2291   /* Make sure we only do this for section where we know we want this,
2292      otherwise we might end up resetting the size of COMMONs.  */
2293   if (mmix_elf_section_data (sec)->pjs.n_pushj_relocs == 0)
2294     return;
2295
2296   sec->rawsize = sec->size;
2297   sec->size += (mmix_elf_section_data (sec)->pjs.n_pushj_relocs
2298                 * MAX_PUSHJ_STUB_SIZE);
2299
2300   /* For use in relocatable link, we start with a max stubs size.  See
2301      mmix_elf_relax_section.  */
2302   if (info->relocatable && sec->output_section)
2303     mmix_elf_section_data (sec->output_section)->pjs.stubs_size_sum
2304       += (mmix_elf_section_data (sec)->pjs.n_pushj_relocs
2305           * MAX_PUSHJ_STUB_SIZE);
2306 }
2307
2308 /* Initialize stuff for the linker-generated GREGs to match
2309    R_MMIX_BASE_PLUS_OFFSET relocs seen by the linker.  */
2310
2311 bfd_boolean
2312 _bfd_mmix_before_linker_allocation (bfd *abfd ATTRIBUTE_UNUSED,
2313                                     struct bfd_link_info *info)
2314 {
2315   asection *bpo_gregs_section;
2316   bfd *bpo_greg_owner;
2317   struct bpo_greg_section_info *gregdata;
2318   size_t n_gregs;
2319   bfd_vma gregs_size;
2320   size_t i;
2321   size_t *bpo_reloc_indexes;
2322   bfd *ibfd;
2323
2324   /* Set the initial size of sections.  */
2325   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
2326     bfd_map_over_sections (ibfd, mmix_set_relaxable_size, info);
2327
2328   /* The bpo_greg_owner bfd is supposed to have been set by
2329      mmix_elf_check_relocs when the first R_MMIX_BASE_PLUS_OFFSET is seen.
2330      If there is no such object, there was no R_MMIX_BASE_PLUS_OFFSET.  */
2331   bpo_greg_owner = (bfd *) info->base_file;
2332   if (bpo_greg_owner == NULL)
2333     return TRUE;
2334
2335   bpo_gregs_section
2336     = bfd_get_section_by_name (bpo_greg_owner,
2337                                MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
2338
2339   if (bpo_gregs_section == NULL)
2340     return TRUE;
2341
2342   /* We use the target-data handle in the ELF section data.  */
2343   gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg;
2344   if (gregdata == NULL)
2345     return FALSE;
2346
2347   n_gregs = gregdata->n_bpo_relocs;
2348   gregdata->n_allocated_bpo_gregs = n_gregs;
2349
2350   /* When this reaches zero during relaxation, all entries have been
2351      filled in and the size of the linker gregs can be calculated.  */
2352   gregdata->n_remaining_bpo_relocs_this_relaxation_round = n_gregs;
2353
2354   /* Set the zeroth-order estimate for the GREGs size.  */
2355   gregs_size = n_gregs * 8;
2356
2357   if (!bfd_set_section_size (bpo_greg_owner, bpo_gregs_section, gregs_size))
2358     return FALSE;
2359
2360   /* Allocate and set up the GREG arrays.  They're filled in at relaxation
2361      time.  Note that we must use the max number ever noted for the array,
2362      since the index numbers were created before GC.  */
2363   gregdata->reloc_request
2364     = bfd_zalloc (bpo_greg_owner,
2365                   sizeof (struct bpo_reloc_request)
2366                   * gregdata->n_max_bpo_relocs);
2367
2368   gregdata->bpo_reloc_indexes
2369     = bpo_reloc_indexes
2370     = bfd_alloc (bpo_greg_owner,
2371                  gregdata->n_max_bpo_relocs
2372                  * sizeof (size_t));
2373   if (bpo_reloc_indexes == NULL)
2374     return FALSE;
2375
2376   /* The default order is an identity mapping.  */
2377   for (i = 0; i < gregdata->n_max_bpo_relocs; i++)
2378     {
2379       bpo_reloc_indexes[i] = i;
2380       gregdata->reloc_request[i].bpo_reloc_no = i;
2381     }
2382
2383   return TRUE;
2384 }
2385 \f
2386 /* Fill in contents in the linker allocated gregs.  Everything is
2387    calculated at this point; we just move the contents into place here.  */
2388
2389 bfd_boolean
2390 _bfd_mmix_after_linker_allocation (bfd *abfd ATTRIBUTE_UNUSED,
2391                                    struct bfd_link_info *link_info)
2392 {
2393   asection *bpo_gregs_section;
2394   bfd *bpo_greg_owner;
2395   struct bpo_greg_section_info *gregdata;
2396   size_t n_gregs;
2397   size_t i, j;
2398   size_t lastreg;
2399   bfd_byte *contents;
2400
2401   /* The bpo_greg_owner bfd is supposed to have been set by mmix_elf_check_relocs
2402      when the first R_MMIX_BASE_PLUS_OFFSET is seen.  If there is no such
2403      object, there was no R_MMIX_BASE_PLUS_OFFSET.  */
2404   bpo_greg_owner = (bfd *) link_info->base_file;
2405   if (bpo_greg_owner == NULL)
2406     return TRUE;
2407
2408   bpo_gregs_section
2409     = bfd_get_section_by_name (bpo_greg_owner,
2410                                MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
2411
2412   /* This can't happen without DSO handling.  When DSOs are handled
2413      without any R_MMIX_BASE_PLUS_OFFSET seen, there will be no such
2414      section.  */
2415   if (bpo_gregs_section == NULL)
2416     return TRUE;
2417
2418   /* We use the target-data handle in the ELF section data.  */
2419
2420   gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg;
2421   if (gregdata == NULL)
2422     return FALSE;
2423
2424   n_gregs = gregdata->n_allocated_bpo_gregs;
2425
2426   bpo_gregs_section->contents
2427     = contents = bfd_alloc (bpo_greg_owner, bpo_gregs_section->size);
2428   if (contents == NULL)
2429     return FALSE;
2430
2431   /* Sanity check: If these numbers mismatch, some relocation has not been
2432      accounted for and the rest of gregdata is probably inconsistent.
2433      It's a bug, but it's more helpful to identify it than segfaulting
2434      below.  */
2435   if (gregdata->n_remaining_bpo_relocs_this_relaxation_round
2436       != gregdata->n_bpo_relocs)
2437     {
2438       (*_bfd_error_handler)
2439         (_("Internal inconsistency: remaining %u != max %u.\n\
2440   Please report this bug."),
2441          gregdata->n_remaining_bpo_relocs_this_relaxation_round,
2442          gregdata->n_bpo_relocs);
2443       return FALSE;
2444     }
2445
2446   for (lastreg = 255, i = 0, j = 0; j < n_gregs; i++)
2447     if (gregdata->reloc_request[i].regindex != lastreg)
2448       {
2449         bfd_put_64 (bpo_greg_owner, gregdata->reloc_request[i].value,
2450                     contents + j * 8);
2451         lastreg = gregdata->reloc_request[i].regindex;
2452         j++;
2453       }
2454
2455   return TRUE;
2456 }
2457
2458 /* Sort valid relocs to come before non-valid relocs, then on increasing
2459    value.  */
2460
2461 static int
2462 bpo_reloc_request_sort_fn (const void * p1, const void * p2)
2463 {
2464   const struct bpo_reloc_request *r1 = (const struct bpo_reloc_request *) p1;
2465   const struct bpo_reloc_request *r2 = (const struct bpo_reloc_request *) p2;
2466
2467   /* Primary function is validity; non-valid relocs sorted after valid
2468      ones.  */
2469   if (r1->valid != r2->valid)
2470     return r2->valid - r1->valid;
2471
2472   /* Then sort on value.  Don't simplify and return just the difference of
2473      the values: the upper bits of the 64-bit value would be truncated on
2474      a host with 32-bit ints.  */
2475   if (r1->value != r2->value)
2476     return r1->value > r2->value ? 1 : -1;
2477
2478   /* As a last re-sort, use the relocation number, so we get a stable
2479      sort.  The *addresses* aren't stable since items are swapped during
2480      sorting.  It depends on the qsort implementation if this actually
2481      happens.  */
2482   return r1->bpo_reloc_no > r2->bpo_reloc_no
2483     ? 1 : (r1->bpo_reloc_no < r2->bpo_reloc_no ? -1 : 0);
2484 }
2485
2486 /* For debug use only.  Dumps the global register allocations resulting
2487    from base-plus-offset relocs.  */
2488
2489 void
2490 mmix_dump_bpo_gregs (link_info, pf)
2491      struct bfd_link_info *link_info;
2492      bfd_error_handler_type pf;
2493 {
2494   bfd *bpo_greg_owner;
2495   asection *bpo_gregs_section;
2496   struct bpo_greg_section_info *gregdata;
2497   unsigned int i;
2498
2499   if (link_info == NULL || link_info->base_file == NULL)
2500     return;
2501
2502   bpo_greg_owner = (bfd *) link_info->base_file;
2503
2504   bpo_gregs_section
2505     = bfd_get_section_by_name (bpo_greg_owner,
2506                                MMIX_LD_ALLOCATED_REG_CONTENTS_SECTION_NAME);
2507
2508   if (bpo_gregs_section == NULL)
2509     return;
2510
2511   gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg;
2512   if (gregdata == NULL)
2513     return;
2514
2515   if (pf == NULL)
2516     pf = _bfd_error_handler;
2517
2518   /* These format strings are not translated.  They are for debug purposes
2519      only and never displayed to an end user.  Should they escape, we
2520      surely want them in original.  */
2521   (*pf) (" n_bpo_relocs: %u\n n_max_bpo_relocs: %u\n n_remain...round: %u\n\
2522  n_allocated_bpo_gregs: %u\n", gregdata->n_bpo_relocs,
2523      gregdata->n_max_bpo_relocs,
2524      gregdata->n_remaining_bpo_relocs_this_relaxation_round,
2525      gregdata->n_allocated_bpo_gregs);
2526
2527   if (gregdata->reloc_request)
2528     for (i = 0; i < gregdata->n_max_bpo_relocs; i++)
2529       (*pf) ("%4u (%4u)/%4u#%u: 0x%08lx%08lx  r: %3u o: %3u\n",
2530              i,
2531              (gregdata->bpo_reloc_indexes != NULL
2532               ? gregdata->bpo_reloc_indexes[i] : (size_t) -1),
2533              gregdata->reloc_request[i].bpo_reloc_no,
2534              gregdata->reloc_request[i].valid,
2535
2536              (unsigned long) (gregdata->reloc_request[i].value >> 32),
2537              (unsigned long) gregdata->reloc_request[i].value,
2538              gregdata->reloc_request[i].regindex,
2539              gregdata->reloc_request[i].offset);
2540 }
2541
2542 /* This links all R_MMIX_BASE_PLUS_OFFSET relocs into a special array, and
2543    when the last such reloc is done, an index-array is sorted according to
2544    the values and iterated over to produce register numbers (indexed by 0
2545    from the first allocated register number) and offsets for use in real
2546    relocation.  (N.B.: Relocatable runs are handled, not just punted.)
2547
2548    PUSHJ stub accounting is also done here.
2549
2550    Symbol- and reloc-reading infrastructure copied from elf-m10200.c.  */
2551
2552 static bfd_boolean
2553 mmix_elf_relax_section (bfd *abfd,
2554                         asection *sec,
2555                         struct bfd_link_info *link_info,
2556                         bfd_boolean *again)
2557 {
2558   Elf_Internal_Shdr *symtab_hdr;
2559   Elf_Internal_Rela *internal_relocs;
2560   Elf_Internal_Rela *irel, *irelend;
2561   asection *bpo_gregs_section = NULL;
2562   struct bpo_greg_section_info *gregdata;
2563   struct bpo_reloc_section_info *bpodata
2564     = mmix_elf_section_data (sec)->bpo.reloc;
2565   /* The initialization is to quiet compiler warnings.  The value is to
2566      spot a missing actual initialization.  */
2567   size_t bpono = (size_t) -1;
2568   size_t pjsno = 0;
2569   Elf_Internal_Sym *isymbuf = NULL;
2570   bfd_size_type size = sec->rawsize ? sec->rawsize : sec->size;
2571
2572   mmix_elf_section_data (sec)->pjs.stubs_size_sum = 0;
2573
2574   /* Assume nothing changes.  */
2575   *again = FALSE;
2576
2577   /* We don't have to do anything if this section does not have relocs, or
2578      if this is not a code section.  */
2579   if ((sec->flags & SEC_RELOC) == 0
2580       || sec->reloc_count == 0
2581       || (sec->flags & SEC_CODE) == 0
2582       || (sec->flags & SEC_LINKER_CREATED) != 0
2583       /* If no R_MMIX_BASE_PLUS_OFFSET relocs and no PUSHJ-stub relocs,
2584          then nothing to do.  */
2585       || (bpodata == NULL
2586           && mmix_elf_section_data (sec)->pjs.n_pushj_relocs == 0))
2587     return TRUE;
2588
2589   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2590
2591   if (bpodata != NULL)
2592     {
2593       bpo_gregs_section = bpodata->bpo_greg_section;
2594       gregdata = mmix_elf_section_data (bpo_gregs_section)->bpo.greg;
2595       bpono = bpodata->first_base_plus_offset_reloc;
2596     }
2597   else
2598     gregdata = NULL;
2599
2600   /* Get a copy of the native relocations.  */
2601   internal_relocs
2602     = _bfd_elf_link_read_relocs (abfd, sec, NULL,
2603                                  (Elf_Internal_Rela *) NULL,
2604                                  link_info->keep_memory);
2605   if (internal_relocs == NULL)
2606     goto error_return;
2607
2608   /* Walk through them looking for relaxing opportunities.  */
2609   irelend = internal_relocs + sec->reloc_count;
2610   for (irel = internal_relocs; irel < irelend; irel++)
2611     {
2612       bfd_vma symval;
2613       struct elf_link_hash_entry *h = NULL;
2614
2615       /* We only process two relocs.  */
2616       if (ELF64_R_TYPE (irel->r_info) != (int) R_MMIX_BASE_PLUS_OFFSET
2617           && ELF64_R_TYPE (irel->r_info) != (int) R_MMIX_PUSHJ_STUBBABLE)
2618         continue;
2619
2620       /* We process relocs in a distinctly different way when this is a
2621          relocatable link (for one, we don't look at symbols), so we avoid
2622          mixing its code with that for the "normal" relaxation.  */
2623       if (link_info->relocatable)
2624         {
2625           /* The only transformation in a relocatable link is to generate
2626              a full stub at the location of the stub calculated for the
2627              input section, if the relocated stub location, the end of the
2628              output section plus earlier stubs, cannot be reached.  Thus
2629              relocatable linking can only lead to worse code, but it still
2630              works.  */
2631           if (ELF64_R_TYPE (irel->r_info) == R_MMIX_PUSHJ_STUBBABLE)
2632             {
2633               /* If we can reach the end of the output-section and beyond
2634                  any current stubs, then we don't need a stub for this
2635                  reloc.  The relaxed order of output stub allocation may
2636                  not exactly match the straightforward order, so we always
2637                  assume presence of output stubs, which will allow
2638                  relaxation only on relocations indifferent to the
2639                  presence of output stub allocations for other relocations
2640                  and thus the order of output stub allocation.  */
2641               if (bfd_check_overflow (complain_overflow_signed,
2642                                       19,
2643                                       0,
2644                                       bfd_arch_bits_per_address (abfd),
2645                                       /* Output-stub location.  */
2646                                       sec->output_section->rawsize
2647                                       + (mmix_elf_section_data (sec
2648                                                                ->output_section)
2649                                          ->pjs.stubs_size_sum)
2650                                       /* Location of this PUSHJ reloc.  */
2651                                       - (sec->output_offset + irel->r_offset)
2652                                       /* Don't count *this* stub twice.  */
2653                                       - (mmix_elf_section_data (sec)
2654                                          ->pjs.stub_size[pjsno]
2655                                          + MAX_PUSHJ_STUB_SIZE))
2656                   == bfd_reloc_ok)
2657                 mmix_elf_section_data (sec)->pjs.stub_size[pjsno] = 0;
2658
2659               mmix_elf_section_data (sec)->pjs.stubs_size_sum
2660                 += mmix_elf_section_data (sec)->pjs.stub_size[pjsno];
2661
2662               pjsno++;
2663             }
2664
2665           continue;
2666         }
2667
2668       /* Get the value of the symbol referred to by the reloc.  */
2669       if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info)
2670         {
2671           /* A local symbol.  */
2672           Elf_Internal_Sym *isym;
2673           asection *sym_sec;
2674
2675           /* Read this BFD's local symbols if we haven't already.  */
2676           if (isymbuf == NULL)
2677             {
2678               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
2679               if (isymbuf == NULL)
2680                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
2681                                                 symtab_hdr->sh_info, 0,
2682                                                 NULL, NULL, NULL);
2683               if (isymbuf == 0)
2684                 goto error_return;
2685             }
2686
2687           isym = isymbuf + ELF64_R_SYM (irel->r_info);
2688           if (isym->st_shndx == SHN_UNDEF)
2689             sym_sec = bfd_und_section_ptr;
2690           else if (isym->st_shndx == SHN_ABS)
2691             sym_sec = bfd_abs_section_ptr;
2692           else if (isym->st_shndx == SHN_COMMON)
2693             sym_sec = bfd_com_section_ptr;
2694           else
2695             sym_sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
2696           symval = (isym->st_value
2697                     + sym_sec->output_section->vma
2698                     + sym_sec->output_offset);
2699         }
2700       else
2701         {
2702           unsigned long indx;
2703
2704           /* An external symbol.  */
2705           indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
2706           h = elf_sym_hashes (abfd)[indx];
2707           BFD_ASSERT (h != NULL);
2708           if (h->root.type != bfd_link_hash_defined
2709               && h->root.type != bfd_link_hash_defweak)
2710             {
2711               /* This appears to be a reference to an undefined symbol.  Just
2712                  ignore it--it will be caught by the regular reloc processing.
2713                  We need to keep BPO reloc accounting consistent, though
2714                  else we'll abort instead of emitting an error message.  */
2715               if (ELF64_R_TYPE (irel->r_info) == R_MMIX_BASE_PLUS_OFFSET
2716                   && gregdata != NULL)
2717                 {
2718                   gregdata->n_remaining_bpo_relocs_this_relaxation_round--;
2719                   bpono++;
2720                 }
2721               continue;
2722             }
2723
2724           symval = (h->root.u.def.value
2725                     + h->root.u.def.section->output_section->vma
2726                     + h->root.u.def.section->output_offset);
2727         }
2728
2729       if (ELF64_R_TYPE (irel->r_info) == (int) R_MMIX_PUSHJ_STUBBABLE)
2730         {
2731           bfd_vma value = symval + irel->r_addend;
2732           bfd_vma dot
2733             = (sec->output_section->vma
2734                + sec->output_offset
2735                + irel->r_offset);
2736           bfd_vma stubaddr
2737             = (sec->output_section->vma
2738                + sec->output_offset
2739                + size
2740                + mmix_elf_section_data (sec)->pjs.stubs_size_sum);
2741
2742           if ((value & 3) == 0
2743               && bfd_check_overflow (complain_overflow_signed,
2744                                      19,
2745                                      0,
2746                                      bfd_arch_bits_per_address (abfd),
2747                                      value - dot
2748                                      - (value > dot
2749                                         ? mmix_elf_section_data (sec)
2750                                         ->pjs.stub_size[pjsno]
2751                                         : 0))
2752               == bfd_reloc_ok)
2753             /* If the reloc fits, no stub is needed.  */
2754             mmix_elf_section_data (sec)->pjs.stub_size[pjsno] = 0;
2755           else
2756             /* Maybe we can get away with just a JMP insn?  */
2757             if ((value & 3) == 0
2758                 && bfd_check_overflow (complain_overflow_signed,
2759                                        27,
2760                                        0,
2761                                        bfd_arch_bits_per_address (abfd),
2762                                        value - stubaddr
2763                                        - (value > dot
2764                                           ? mmix_elf_section_data (sec)
2765                                           ->pjs.stub_size[pjsno] - 4
2766                                           : 0))
2767                 == bfd_reloc_ok)
2768               /* Yep, account for a stub consisting of a single JMP insn.  */
2769               mmix_elf_section_data (sec)->pjs.stub_size[pjsno] = 4;
2770           else
2771             /* Nope, go for the full insn stub.  It doesn't seem useful to
2772                emit the intermediate sizes; those will only be useful for
2773                a >64M program assuming contiguous code.  */
2774             mmix_elf_section_data (sec)->pjs.stub_size[pjsno]
2775               = MAX_PUSHJ_STUB_SIZE;
2776
2777           mmix_elf_section_data (sec)->pjs.stubs_size_sum
2778             += mmix_elf_section_data (sec)->pjs.stub_size[pjsno];
2779           pjsno++;
2780           continue;
2781         }
2782
2783       /* We're looking at a R_MMIX_BASE_PLUS_OFFSET reloc.  */
2784
2785       gregdata->reloc_request[gregdata->bpo_reloc_indexes[bpono]].value
2786         = symval + irel->r_addend;
2787       gregdata->reloc_request[gregdata->bpo_reloc_indexes[bpono++]].valid = TRUE;
2788       gregdata->n_remaining_bpo_relocs_this_relaxation_round--;
2789     }
2790
2791   /* Check if that was the last BPO-reloc.  If so, sort the values and
2792      calculate how many registers we need to cover them.  Set the size of
2793      the linker gregs, and if the number of registers changed, indicate
2794      that we need to relax some more because we have more work to do.  */
2795   if (gregdata != NULL
2796       && gregdata->n_remaining_bpo_relocs_this_relaxation_round == 0)
2797     {
2798       size_t i;
2799       bfd_vma prev_base;
2800       size_t regindex;
2801
2802       /* First, reset the remaining relocs for the next round.  */
2803       gregdata->n_remaining_bpo_relocs_this_relaxation_round
2804         = gregdata->n_bpo_relocs;
2805
2806       qsort (gregdata->reloc_request,
2807              gregdata->n_max_bpo_relocs,
2808              sizeof (struct bpo_reloc_request),
2809              bpo_reloc_request_sort_fn);
2810
2811       /* Recalculate indexes.  When we find a change (however unlikely
2812          after the initial iteration), we know we need to relax again,
2813          since items in the GREG-array are sorted by increasing value and
2814          stored in the relaxation phase.  */
2815       for (i = 0; i < gregdata->n_max_bpo_relocs; i++)
2816         if (gregdata->bpo_reloc_indexes[gregdata->reloc_request[i].bpo_reloc_no]
2817             != i)
2818           {
2819             gregdata->bpo_reloc_indexes[gregdata->reloc_request[i].bpo_reloc_no]
2820               = i;
2821             *again = TRUE;
2822           }
2823
2824       /* Allocate register numbers (indexing from 0).  Stop at the first
2825          non-valid reloc.  */
2826       for (i = 0, regindex = 0, prev_base = gregdata->reloc_request[0].value;
2827            i < gregdata->n_bpo_relocs;
2828            i++)
2829         {
2830           if (gregdata->reloc_request[i].value > prev_base + 255)
2831             {
2832               regindex++;
2833               prev_base = gregdata->reloc_request[i].value;
2834             }
2835           gregdata->reloc_request[i].regindex = regindex;
2836           gregdata->reloc_request[i].offset
2837             = gregdata->reloc_request[i].value - prev_base;
2838         }
2839
2840       /* If it's not the same as the last time, we need to relax again,
2841          because the size of the section has changed.  I'm not sure we
2842          actually need to do any adjustments since the shrinking happens
2843          at the start of this section, but better safe than sorry.  */
2844       if (gregdata->n_allocated_bpo_gregs != regindex + 1)
2845         {
2846           gregdata->n_allocated_bpo_gregs = regindex + 1;
2847           *again = TRUE;
2848         }
2849
2850       bpo_gregs_section->size = (regindex + 1) * 8;
2851     }
2852
2853   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
2854     {
2855       if (! link_info->keep_memory)
2856         free (isymbuf);
2857       else
2858         {
2859           /* Cache the symbols for elf_link_input_bfd.  */
2860           symtab_hdr->contents = (unsigned char *) isymbuf;
2861         }
2862     }
2863
2864   if (internal_relocs != NULL
2865       && elf_section_data (sec)->relocs != internal_relocs)
2866     free (internal_relocs);
2867
2868   if (sec->size < size + mmix_elf_section_data (sec)->pjs.stubs_size_sum)
2869     abort ();
2870
2871   if (sec->size > size + mmix_elf_section_data (sec)->pjs.stubs_size_sum)
2872     {
2873       sec->size = size + mmix_elf_section_data (sec)->pjs.stubs_size_sum;
2874       *again = TRUE;
2875     }
2876
2877   return TRUE;
2878
2879  error_return:
2880   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
2881     free (isymbuf);
2882   if (internal_relocs != NULL
2883       && elf_section_data (sec)->relocs != internal_relocs)
2884     free (internal_relocs);
2885   return FALSE;
2886 }
2887 \f
2888 #define ELF_ARCH                bfd_arch_mmix
2889 #define ELF_MACHINE_CODE        EM_MMIX
2890
2891 /* According to mmix-doc page 36 (paragraph 45), this should be (1LL << 48LL).
2892    However, that's too much for something somewhere in the linker part of
2893    BFD; perhaps the start-address has to be a non-zero multiple of this
2894    number, or larger than this number.  The symptom is that the linker
2895    complains: "warning: allocated section `.text' not in segment".  We
2896    settle for 64k; the page-size used in examples is 8k.
2897    #define ELF_MAXPAGESIZE 0x10000
2898
2899    Unfortunately, this causes excessive padding in the supposedly small
2900    for-education programs that are the expected usage (where people would
2901    inspect output).  We stick to 256 bytes just to have *some* default
2902    alignment.  */
2903 #define ELF_MAXPAGESIZE 0x100
2904
2905 #define TARGET_BIG_SYM          mmix_elf64_vec
2906 #define TARGET_BIG_NAME         "elf64-mmix"
2907
2908 #define elf_info_to_howto_rel           NULL
2909 #define elf_info_to_howto               mmix_info_to_howto_rela
2910 #define elf_backend_relocate_section    mmix_elf_relocate_section
2911 #define elf_backend_gc_mark_hook        mmix_elf_gc_mark_hook
2912 #define elf_backend_gc_sweep_hook       mmix_elf_gc_sweep_hook
2913
2914 #define elf_backend_link_output_symbol_hook \
2915         mmix_elf_link_output_symbol_hook
2916 #define elf_backend_add_symbol_hook     mmix_elf_add_symbol_hook
2917
2918 #define elf_backend_check_relocs        mmix_elf_check_relocs
2919 #define elf_backend_symbol_processing   mmix_elf_symbol_processing
2920 #define elf_backend_omit_section_dynsym \
2921   ((bfd_boolean (*) (bfd *, struct bfd_link_info *, asection *)) bfd_true)
2922
2923 #define bfd_elf64_bfd_is_local_label_name \
2924         mmix_elf_is_local_label_name
2925
2926 #define elf_backend_may_use_rel_p       0
2927 #define elf_backend_may_use_rela_p      1
2928 #define elf_backend_default_use_rela_p  1
2929
2930 #define elf_backend_can_gc_sections     1
2931 #define elf_backend_section_from_bfd_section \
2932         mmix_elf_section_from_bfd_section
2933
2934 #define bfd_elf64_new_section_hook      mmix_elf_new_section_hook
2935 #define bfd_elf64_bfd_final_link        mmix_elf_final_link
2936 #define bfd_elf64_bfd_relax_section     mmix_elf_relax_section
2937
2938 #include "elf64-target.h"