Coverage Report

Created: 2026-03-10 08:46

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