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