Coverage Report

Created: 2023-08-28 06:25

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