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