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