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