OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [elf64-mmix.c] - Blame information for rev 161

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.