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

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [gdb-7.2/] [gdb-7.2-or32-1.0rc1/] [bfd/] [elf32-spu.c] - Blame information for rev 341

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 330 jeremybenn
/* SPU specific support for 32-bit ELF
2
 
3
   Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4
 
5
   This file is part of BFD, the Binary File Descriptor library.
6
 
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
 
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
 
17
   You should have received a copy of the GNU General Public License along
18
   with this program; if not, write to the Free Software Foundation, Inc.,
19
   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
20
 
21
#include "sysdep.h"
22
#include "libiberty.h"
23
#include "bfd.h"
24
#include "bfdlink.h"
25
#include "libbfd.h"
26
#include "elf-bfd.h"
27
#include "elf/spu.h"
28
#include "elf32-spu.h"
29
 
30
/* We use RELA style relocs.  Don't define USE_REL.  */
31
 
32
static bfd_reloc_status_type spu_elf_rel9 (bfd *, arelent *, asymbol *,
33
                                           void *, asection *,
34
                                           bfd *, char **);
35
 
36
/* Values of type 'enum elf_spu_reloc_type' are used to index this
37
   array, so it must be declared in the order of that type.  */
38
 
39
static reloc_howto_type elf_howto_table[] = {
40
  HOWTO (R_SPU_NONE,       0, 0,  0, FALSE,  0, complain_overflow_dont,
41
         bfd_elf_generic_reloc, "SPU_NONE",
42
         FALSE, 0, 0x00000000, FALSE),
43
  HOWTO (R_SPU_ADDR10,     4, 2, 10, FALSE, 14, complain_overflow_bitfield,
44
         bfd_elf_generic_reloc, "SPU_ADDR10",
45
         FALSE, 0, 0x00ffc000, FALSE),
46
  HOWTO (R_SPU_ADDR16,     2, 2, 16, FALSE,  7, complain_overflow_bitfield,
47
         bfd_elf_generic_reloc, "SPU_ADDR16",
48
         FALSE, 0, 0x007fff80, FALSE),
49
  HOWTO (R_SPU_ADDR16_HI, 16, 2, 16, FALSE,  7, complain_overflow_bitfield,
50
         bfd_elf_generic_reloc, "SPU_ADDR16_HI",
51
         FALSE, 0, 0x007fff80, FALSE),
52
  HOWTO (R_SPU_ADDR16_LO,  0, 2, 16, FALSE,  7, complain_overflow_dont,
53
         bfd_elf_generic_reloc, "SPU_ADDR16_LO",
54
         FALSE, 0, 0x007fff80, FALSE),
55
  HOWTO (R_SPU_ADDR18,     0, 2, 18, FALSE,  7, complain_overflow_bitfield,
56
         bfd_elf_generic_reloc, "SPU_ADDR18",
57
         FALSE, 0, 0x01ffff80, FALSE),
58
  HOWTO (R_SPU_ADDR32,     0, 2, 32, FALSE,  0, complain_overflow_dont,
59
         bfd_elf_generic_reloc, "SPU_ADDR32",
60
         FALSE, 0, 0xffffffff, FALSE),
61
  HOWTO (R_SPU_REL16,      2, 2, 16,  TRUE,  7, complain_overflow_bitfield,
62
         bfd_elf_generic_reloc, "SPU_REL16",
63
         FALSE, 0, 0x007fff80, TRUE),
64
  HOWTO (R_SPU_ADDR7,      0, 2,  7, FALSE, 14, complain_overflow_dont,
65
         bfd_elf_generic_reloc, "SPU_ADDR7",
66
         FALSE, 0, 0x001fc000, FALSE),
67
  HOWTO (R_SPU_REL9,       2, 2,  9,  TRUE,  0, complain_overflow_signed,
68
         spu_elf_rel9,          "SPU_REL9",
69
         FALSE, 0, 0x0180007f, TRUE),
70
  HOWTO (R_SPU_REL9I,      2, 2,  9,  TRUE,  0, complain_overflow_signed,
71
         spu_elf_rel9,          "SPU_REL9I",
72
         FALSE, 0, 0x0000c07f, TRUE),
73
  HOWTO (R_SPU_ADDR10I,    0, 2, 10, FALSE, 14, complain_overflow_signed,
74
         bfd_elf_generic_reloc, "SPU_ADDR10I",
75
         FALSE, 0, 0x00ffc000, FALSE),
76
  HOWTO (R_SPU_ADDR16I,    0, 2, 16, FALSE,  7, complain_overflow_signed,
77
         bfd_elf_generic_reloc, "SPU_ADDR16I",
78
         FALSE, 0, 0x007fff80, FALSE),
79
  HOWTO (R_SPU_REL32,      0, 2, 32, TRUE,  0, complain_overflow_dont,
80
         bfd_elf_generic_reloc, "SPU_REL32",
81
         FALSE, 0, 0xffffffff, TRUE),
82
  HOWTO (R_SPU_ADDR16X,    0, 2, 16, FALSE,  7, complain_overflow_bitfield,
83
         bfd_elf_generic_reloc, "SPU_ADDR16X",
84
         FALSE, 0, 0x007fff80, FALSE),
85
  HOWTO (R_SPU_PPU32,      0, 2, 32, FALSE,  0, complain_overflow_dont,
86
         bfd_elf_generic_reloc, "SPU_PPU32",
87
         FALSE, 0, 0xffffffff, FALSE),
88
  HOWTO (R_SPU_PPU64,      0, 4, 64, FALSE,  0, complain_overflow_dont,
89
         bfd_elf_generic_reloc, "SPU_PPU64",
90
         FALSE, 0, -1, FALSE),
91
  HOWTO (R_SPU_ADD_PIC,      0, 0, 0, FALSE,  0, complain_overflow_dont,
92
         bfd_elf_generic_reloc, "SPU_ADD_PIC",
93
         FALSE, 0, 0x00000000, FALSE),
94
};
95
 
96
static struct bfd_elf_special_section const spu_elf_special_sections[] = {
97
  { "._ea", 4, 0, SHT_PROGBITS, SHF_WRITE },
98
  { ".toe", 4, 0, SHT_NOBITS, SHF_ALLOC },
99
  { NULL, 0, 0, 0, 0 }
100
};
101
 
102
static enum elf_spu_reloc_type
103
spu_elf_bfd_to_reloc_type (bfd_reloc_code_real_type code)
104
{
105
  switch (code)
106
    {
107
    default:
108
      return R_SPU_NONE;
109
    case BFD_RELOC_SPU_IMM10W:
110
      return R_SPU_ADDR10;
111
    case BFD_RELOC_SPU_IMM16W:
112
      return R_SPU_ADDR16;
113
    case BFD_RELOC_SPU_LO16:
114
      return R_SPU_ADDR16_LO;
115
    case BFD_RELOC_SPU_HI16:
116
      return R_SPU_ADDR16_HI;
117
    case BFD_RELOC_SPU_IMM18:
118
      return R_SPU_ADDR18;
119
    case BFD_RELOC_SPU_PCREL16:
120
      return R_SPU_REL16;
121
    case BFD_RELOC_SPU_IMM7:
122
      return R_SPU_ADDR7;
123
    case BFD_RELOC_SPU_IMM8:
124
      return R_SPU_NONE;
125
    case BFD_RELOC_SPU_PCREL9a:
126
      return R_SPU_REL9;
127
    case BFD_RELOC_SPU_PCREL9b:
128
      return R_SPU_REL9I;
129
    case BFD_RELOC_SPU_IMM10:
130
      return R_SPU_ADDR10I;
131
    case BFD_RELOC_SPU_IMM16:
132
      return R_SPU_ADDR16I;
133
    case BFD_RELOC_32:
134
      return R_SPU_ADDR32;
135
    case BFD_RELOC_32_PCREL:
136
      return R_SPU_REL32;
137
    case BFD_RELOC_SPU_PPU32:
138
      return R_SPU_PPU32;
139
    case BFD_RELOC_SPU_PPU64:
140
      return R_SPU_PPU64;
141
    case BFD_RELOC_SPU_ADD_PIC:
142
      return R_SPU_ADD_PIC;
143
    }
144
}
145
 
146
static void
147
spu_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
148
                       arelent *cache_ptr,
149
                       Elf_Internal_Rela *dst)
150
{
151
  enum elf_spu_reloc_type r_type;
152
 
153
  r_type = (enum elf_spu_reloc_type) ELF32_R_TYPE (dst->r_info);
154
  BFD_ASSERT (r_type < R_SPU_max);
155
  cache_ptr->howto = &elf_howto_table[(int) r_type];
156
}
157
 
158
static reloc_howto_type *
159
spu_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
160
                           bfd_reloc_code_real_type code)
161
{
162
  enum elf_spu_reloc_type r_type = spu_elf_bfd_to_reloc_type (code);
163
 
164
  if (r_type == R_SPU_NONE)
165
    return NULL;
166
 
167
  return elf_howto_table + r_type;
168
}
169
 
170
static reloc_howto_type *
171
spu_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
172
                           const char *r_name)
173
{
174
  unsigned int i;
175
 
176
  for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
177
    if (elf_howto_table[i].name != NULL
178
        && strcasecmp (elf_howto_table[i].name, r_name) == 0)
179
      return &elf_howto_table[i];
180
 
181
  return NULL;
182
}
183
 
184
/* Apply R_SPU_REL9 and R_SPU_REL9I relocs.  */
185
 
186
static bfd_reloc_status_type
187
spu_elf_rel9 (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
188
              void *data, asection *input_section,
189
              bfd *output_bfd, char **error_message)
190
{
191
  bfd_size_type octets;
192
  bfd_vma val;
193
  long insn;
194
 
195
  /* If this is a relocatable link (output_bfd test tells us), just
196
     call the generic function.  Any adjustment will be done at final
197
     link time.  */
198
  if (output_bfd != NULL)
199
    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
200
                                  input_section, output_bfd, error_message);
201
 
202
  if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
203
    return bfd_reloc_outofrange;
204
  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
205
 
206
  /* Get symbol value.  */
207
  val = 0;
208
  if (!bfd_is_com_section (symbol->section))
209
    val = symbol->value;
210
  if (symbol->section->output_section)
211
    val += symbol->section->output_section->vma;
212
 
213
  val += reloc_entry->addend;
214
 
215
  /* Make it pc-relative.  */
216
  val -= input_section->output_section->vma + input_section->output_offset;
217
 
218
  val >>= 2;
219
  if (val + 256 >= 512)
220
    return bfd_reloc_overflow;
221
 
222
  insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
223
 
224
  /* Move two high bits of value to REL9I and REL9 position.
225
     The mask will take care of selecting the right field.  */
226
  val = (val & 0x7f) | ((val & 0x180) << 7) | ((val & 0x180) << 16);
227
  insn &= ~reloc_entry->howto->dst_mask;
228
  insn |= val & reloc_entry->howto->dst_mask;
229
  bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
230
  return bfd_reloc_ok;
231
}
232
 
233
static bfd_boolean
234
spu_elf_new_section_hook (bfd *abfd, asection *sec)
235
{
236
  if (!sec->used_by_bfd)
237
    {
238
      struct _spu_elf_section_data *sdata;
239
 
240
      sdata = bfd_zalloc (abfd, sizeof (*sdata));
241
      if (sdata == NULL)
242
        return FALSE;
243
      sec->used_by_bfd = sdata;
244
    }
245
 
246
  return _bfd_elf_new_section_hook (abfd, sec);
247
}
248
 
249
/* Set up overlay info for executables.  */
250
 
251
static bfd_boolean
252
spu_elf_object_p (bfd *abfd)
253
{
254
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
255
    {
256
      unsigned int i, num_ovl, num_buf;
257
      Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
258
      Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd);
259
      Elf_Internal_Phdr *last_phdr = NULL;
260
 
261
      for (num_buf = 0, num_ovl = 0, i = 0; i < ehdr->e_phnum; i++, phdr++)
262
        if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_OVERLAY) != 0)
263
          {
264
            unsigned int j;
265
 
266
            ++num_ovl;
267
            if (last_phdr == NULL
268
                || ((last_phdr->p_vaddr ^ phdr->p_vaddr) & 0x3ffff) != 0)
269
              ++num_buf;
270
            last_phdr = phdr;
271
            for (j = 1; j < elf_numsections (abfd); j++)
272
              {
273
                Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[j];
274
 
275
                if (ELF_SECTION_SIZE (shdr, phdr) != 0
276
                    && ELF_SECTION_IN_SEGMENT (shdr, phdr))
277
                  {
278
                    asection *sec = shdr->bfd_section;
279
                    spu_elf_section_data (sec)->u.o.ovl_index = num_ovl;
280
                    spu_elf_section_data (sec)->u.o.ovl_buf = num_buf;
281
                  }
282
              }
283
          }
284
    }
285
  return TRUE;
286
}
287
 
288
/* Specially mark defined symbols named _EAR_* with BSF_KEEP so that
289
   strip --strip-unneeded will not remove them.  */
290
 
291
static void
292
spu_elf_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
293
{
294
  if (sym->name != NULL
295
      && sym->section != bfd_abs_section_ptr
296
      && strncmp (sym->name, "_EAR_", 5) == 0)
297
    sym->flags |= BSF_KEEP;
298
}
299
 
300
/* SPU ELF linker hash table.  */
301
 
302
struct spu_link_hash_table
303
{
304
  struct elf_link_hash_table elf;
305
 
306
  struct spu_elf_params *params;
307
 
308
  /* Shortcuts to overlay sections.  */
309
  asection *ovtab;
310
  asection *init;
311
  asection *toe;
312
  asection **ovl_sec;
313
 
314
  /* Count of stubs in each overlay section.  */
315
  unsigned int *stub_count;
316
 
317
  /* The stub section for each overlay section.  */
318
  asection **stub_sec;
319
 
320
  struct elf_link_hash_entry *ovly_entry[2];
321
 
322
  /* Number of overlay buffers.  */
323
  unsigned int num_buf;
324
 
325
  /* Total number of overlays.  */
326
  unsigned int num_overlays;
327
 
328
  /* For soft icache.  */
329
  unsigned int line_size_log2;
330
  unsigned int num_lines_log2;
331
  unsigned int fromelem_size_log2;
332
 
333
  /* How much memory we have.  */
334
  unsigned int local_store;
335
 
336
  /* Count of overlay stubs needed in non-overlay area.  */
337
  unsigned int non_ovly_stub;
338
 
339
  /* Pointer to the fixup section */
340
  asection *sfixup;
341
 
342
  /* Set on error.  */
343
  unsigned int stub_err : 1;
344
};
345
 
346
/* Hijack the generic got fields for overlay stub accounting.  */
347
 
348
struct got_entry
349
{
350
  struct got_entry *next;
351
  unsigned int ovl;
352
  union {
353
    bfd_vma addend;
354
    bfd_vma br_addr;
355
  };
356
  bfd_vma stub_addr;
357
};
358
 
359
#define spu_hash_table(p) \
360
  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
361
  == SPU_ELF_DATA ? ((struct spu_link_hash_table *) ((p)->hash)) : NULL)
362
 
363
struct call_info
364
{
365
  struct function_info *fun;
366
  struct call_info *next;
367
  unsigned int count;
368
  unsigned int max_depth;
369
  unsigned int is_tail : 1;
370
  unsigned int is_pasted : 1;
371
  unsigned int broken_cycle : 1;
372
  unsigned int priority : 13;
373
};
374
 
375
struct function_info
376
{
377
  /* List of functions called.  Also branches to hot/cold part of
378
     function.  */
379
  struct call_info *call_list;
380
  /* For hot/cold part of function, point to owner.  */
381
  struct function_info *start;
382
  /* Symbol at start of function.  */
383
  union {
384
    Elf_Internal_Sym *sym;
385
    struct elf_link_hash_entry *h;
386
  } u;
387
  /* Function section.  */
388
  asection *sec;
389
  asection *rodata;
390
  /* Where last called from, and number of sections called from.  */
391
  asection *last_caller;
392
  unsigned int call_count;
393
  /* Address range of (this part of) function.  */
394
  bfd_vma lo, hi;
395
  /* Offset where we found a store of lr, or -1 if none found.  */
396
  bfd_vma lr_store;
397
  /* Offset where we found the stack adjustment insn.  */
398
  bfd_vma sp_adjust;
399
  /* Stack usage.  */
400
  int stack;
401
  /* Distance from root of call tree.  Tail and hot/cold branches
402
     count as one deeper.  We aren't counting stack frames here.  */
403
  unsigned int depth;
404
  /* Set if global symbol.  */
405
  unsigned int global : 1;
406
  /* Set if known to be start of function (as distinct from a hunk
407
     in hot/cold section.  */
408
  unsigned int is_func : 1;
409
  /* Set if not a root node.  */
410
  unsigned int non_root : 1;
411
  /* Flags used during call tree traversal.  It's cheaper to replicate
412
     the visit flags than have one which needs clearing after a traversal.  */
413
  unsigned int visit1 : 1;
414
  unsigned int visit2 : 1;
415
  unsigned int marking : 1;
416
  unsigned int visit3 : 1;
417
  unsigned int visit4 : 1;
418
  unsigned int visit5 : 1;
419
  unsigned int visit6 : 1;
420
  unsigned int visit7 : 1;
421
};
422
 
423
struct spu_elf_stack_info
424
{
425
  int num_fun;
426
  int max_fun;
427
  /* Variable size array describing functions, one per contiguous
428
     address range belonging to a function.  */
429
  struct function_info fun[1];
430
};
431
 
432
static struct function_info *find_function (asection *, bfd_vma,
433
                                            struct bfd_link_info *);
434
 
435
/* Create a spu ELF linker hash table.  */
436
 
437
static struct bfd_link_hash_table *
438
spu_elf_link_hash_table_create (bfd *abfd)
439
{
440
  struct spu_link_hash_table *htab;
441
 
442
  htab = bfd_malloc (sizeof (*htab));
443
  if (htab == NULL)
444
    return NULL;
445
 
446
  if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd,
447
                                      _bfd_elf_link_hash_newfunc,
448
                                      sizeof (struct elf_link_hash_entry),
449
                                      SPU_ELF_DATA))
450
    {
451
      free (htab);
452
      return NULL;
453
    }
454
 
455
  memset (&htab->ovtab, 0,
456
          sizeof (*htab) - offsetof (struct spu_link_hash_table, ovtab));
457
 
458
  htab->elf.init_got_refcount.refcount = 0;
459
  htab->elf.init_got_refcount.glist = NULL;
460
  htab->elf.init_got_offset.offset = 0;
461
  htab->elf.init_got_offset.glist = NULL;
462
  return &htab->elf.root;
463
}
464
 
465
void
466
spu_elf_setup (struct bfd_link_info *info, struct spu_elf_params *params)
467
{
468
  bfd_vma max_branch_log2;
469
 
470
  struct spu_link_hash_table *htab = spu_hash_table (info);
471
  htab->params = params;
472
  htab->line_size_log2 = bfd_log2 (htab->params->line_size);
473
  htab->num_lines_log2 = bfd_log2 (htab->params->num_lines);
474
 
475
  /* For the software i-cache, we provide a "from" list whose size
476
     is a power-of-two number of quadwords, big enough to hold one
477
     byte per outgoing branch.  Compute this number here.  */
478
  max_branch_log2 = bfd_log2 (htab->params->max_branch);
479
  htab->fromelem_size_log2 = max_branch_log2 > 4 ? max_branch_log2 - 4 : 0;
480
}
481
 
482
/* Find the symbol for the given R_SYMNDX in IBFD and set *HP and *SYMP
483
   to (hash, NULL) for global symbols, and (NULL, sym) for locals.  Set
484
   *SYMSECP to the symbol's section.  *LOCSYMSP caches local syms.  */
485
 
486
static bfd_boolean
487
get_sym_h (struct elf_link_hash_entry **hp,
488
           Elf_Internal_Sym **symp,
489
           asection **symsecp,
490
           Elf_Internal_Sym **locsymsp,
491
           unsigned long r_symndx,
492
           bfd *ibfd)
493
{
494
  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
495
 
496
  if (r_symndx >= symtab_hdr->sh_info)
497
    {
498
      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
499
      struct elf_link_hash_entry *h;
500
 
501
      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
502
      while (h->root.type == bfd_link_hash_indirect
503
             || h->root.type == bfd_link_hash_warning)
504
        h = (struct elf_link_hash_entry *) h->root.u.i.link;
505
 
506
      if (hp != NULL)
507
        *hp = h;
508
 
509
      if (symp != NULL)
510
        *symp = NULL;
511
 
512
      if (symsecp != NULL)
513
        {
514
          asection *symsec = NULL;
515
          if (h->root.type == bfd_link_hash_defined
516
              || h->root.type == bfd_link_hash_defweak)
517
            symsec = h->root.u.def.section;
518
          *symsecp = symsec;
519
        }
520
    }
521
  else
522
    {
523
      Elf_Internal_Sym *sym;
524
      Elf_Internal_Sym *locsyms = *locsymsp;
525
 
526
      if (locsyms == NULL)
527
        {
528
          locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
529
          if (locsyms == NULL)
530
            locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
531
                                            symtab_hdr->sh_info,
532
                                            0, NULL, NULL, NULL);
533
          if (locsyms == NULL)
534
            return FALSE;
535
          *locsymsp = locsyms;
536
        }
537
      sym = locsyms + r_symndx;
538
 
539
      if (hp != NULL)
540
        *hp = NULL;
541
 
542
      if (symp != NULL)
543
        *symp = sym;
544
 
545
      if (symsecp != NULL)
546
        *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
547
    }
548
 
549
  return TRUE;
550
}
551
 
552
/* Create the note section if not already present.  This is done early so
553
   that the linker maps the sections to the right place in the output.  */
554
 
555
bfd_boolean
556
spu_elf_create_sections (struct bfd_link_info *info)
557
{
558
  struct spu_link_hash_table *htab = spu_hash_table (info);
559
  bfd *ibfd;
560
 
561
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
562
    if (bfd_get_section_by_name (ibfd, SPU_PTNOTE_SPUNAME) != NULL)
563
      break;
564
 
565
  if (ibfd == NULL)
566
    {
567
      /* Make SPU_PTNOTE_SPUNAME section.  */
568
      asection *s;
569
      size_t name_len;
570
      size_t size;
571
      bfd_byte *data;
572
      flagword flags;
573
 
574
      ibfd = info->input_bfds;
575
      flags = SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
576
      s = bfd_make_section_anyway_with_flags (ibfd, SPU_PTNOTE_SPUNAME, flags);
577
      if (s == NULL
578
          || !bfd_set_section_alignment (ibfd, s, 4))
579
        return FALSE;
580
 
581
      name_len = strlen (bfd_get_filename (info->output_bfd)) + 1;
582
      size = 12 + ((sizeof (SPU_PLUGIN_NAME) + 3) & -4);
583
      size += (name_len + 3) & -4;
584
 
585
      if (!bfd_set_section_size (ibfd, s, size))
586
        return FALSE;
587
 
588
      data = bfd_zalloc (ibfd, size);
589
      if (data == NULL)
590
        return FALSE;
591
 
592
      bfd_put_32 (ibfd, sizeof (SPU_PLUGIN_NAME), data + 0);
593
      bfd_put_32 (ibfd, name_len, data + 4);
594
      bfd_put_32 (ibfd, 1, data + 8);
595
      memcpy (data + 12, SPU_PLUGIN_NAME, sizeof (SPU_PLUGIN_NAME));
596
      memcpy (data + 12 + ((sizeof (SPU_PLUGIN_NAME) + 3) & -4),
597
              bfd_get_filename (info->output_bfd), name_len);
598
      s->contents = data;
599
    }
600
 
601
  if (htab->params->emit_fixups)
602
    {
603
      asection *s;
604
      flagword flags;
605
      ibfd = info->input_bfds;
606
      flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY | SEC_HAS_CONTENTS
607
              | SEC_IN_MEMORY;
608
      s = bfd_make_section_anyway_with_flags (ibfd, ".fixup", flags);
609
      if (s == NULL || !bfd_set_section_alignment (ibfd, s, 2))
610
        return FALSE;
611
      htab->sfixup = s;
612
    }
613
 
614
  return TRUE;
615
}
616
 
617
/* qsort predicate to sort sections by vma.  */
618
 
619
static int
620
sort_sections (const void *a, const void *b)
621
{
622
  const asection *const *s1 = a;
623
  const asection *const *s2 = b;
624
  bfd_signed_vma delta = (*s1)->vma - (*s2)->vma;
625
 
626
  if (delta != 0)
627
    return delta < 0 ? -1 : 1;
628
 
629
  return (*s1)->index - (*s2)->index;
630
}
631
 
632
/* Identify overlays in the output bfd, and number them.
633
   Returns 0 on error, 1 if no overlays, 2 if overlays.  */
634
 
635
int
636
spu_elf_find_overlays (struct bfd_link_info *info)
637
{
638
  struct spu_link_hash_table *htab = spu_hash_table (info);
639
  asection **alloc_sec;
640
  unsigned int i, n, ovl_index, num_buf;
641
  asection *s;
642
  bfd_vma ovl_end;
643
  static const char *const entry_names[2][2] = {
644
    { "__ovly_load", "__icache_br_handler" },
645
    { "__ovly_return", "__icache_call_handler" }
646
  };
647
 
648
  if (info->output_bfd->section_count < 2)
649
    return 1;
650
 
651
  alloc_sec
652
    = bfd_malloc (info->output_bfd->section_count * sizeof (*alloc_sec));
653
  if (alloc_sec == NULL)
654
    return 0;
655
 
656
  /* Pick out all the alloced sections.  */
657
  for (n = 0, s = info->output_bfd->sections; s != NULL; s = s->next)
658
    if ((s->flags & SEC_ALLOC) != 0
659
        && (s->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != SEC_THREAD_LOCAL
660
        && s->size != 0)
661
      alloc_sec[n++] = s;
662
 
663
  if (n == 0)
664
    {
665
      free (alloc_sec);
666
      return 1;
667
    }
668
 
669
  /* Sort them by vma.  */
670
  qsort (alloc_sec, n, sizeof (*alloc_sec), sort_sections);
671
 
672
  ovl_end = alloc_sec[0]->vma + alloc_sec[0]->size;
673
  if (htab->params->ovly_flavour == ovly_soft_icache)
674
    {
675
      unsigned int prev_buf = 0, set_id = 0;
676
 
677
      /* Look for an overlapping vma to find the first overlay section.  */
678
      bfd_vma vma_start = 0;
679
 
680
      for (i = 1; i < n; i++)
681
        {
682
          s = alloc_sec[i];
683
          if (s->vma < ovl_end)
684
            {
685
              asection *s0 = alloc_sec[i - 1];
686
              vma_start = s0->vma;
687
              ovl_end = (s0->vma
688
                         + ((bfd_vma) 1
689
                            << (htab->num_lines_log2 + htab->line_size_log2)));
690
              --i;
691
              break;
692
            }
693
          else
694
            ovl_end = s->vma + s->size;
695
        }
696
 
697
      /* Now find any sections within the cache area.  */
698
      for (ovl_index = 0, num_buf = 0; i < n; i++)
699
        {
700
          s = alloc_sec[i];
701
          if (s->vma >= ovl_end)
702
            break;
703
 
704
          /* A section in an overlay area called .ovl.init is not
705
             an overlay, in the sense that it might be loaded in
706
             by the overlay manager, but rather the initial
707
             section contents for the overlay buffer.  */
708
          if (strncmp (s->name, ".ovl.init", 9) != 0)
709
            {
710
              num_buf = ((s->vma - vma_start) >> htab->line_size_log2) + 1;
711
              set_id = (num_buf == prev_buf)? set_id + 1 : 0;
712
              prev_buf = num_buf;
713
 
714
              if ((s->vma - vma_start) & (htab->params->line_size - 1))
715
                {
716
                  info->callbacks->einfo (_("%X%P: overlay section %A "
717
                                            "does not start on a cache line.\n"),
718
                                          s);
719
                  bfd_set_error (bfd_error_bad_value);
720
                  return 0;
721
                }
722
              else if (s->size > htab->params->line_size)
723
                {
724
                  info->callbacks->einfo (_("%X%P: overlay section %A "
725
                                            "is larger than a cache line.\n"),
726
                                          s);
727
                  bfd_set_error (bfd_error_bad_value);
728
                  return 0;
729
                }
730
 
731
              alloc_sec[ovl_index++] = s;
732
              spu_elf_section_data (s)->u.o.ovl_index
733
                = (set_id << htab->num_lines_log2) + num_buf;
734
              spu_elf_section_data (s)->u.o.ovl_buf = num_buf;
735
            }
736
        }
737
 
738
      /* Ensure there are no more overlay sections.  */
739
      for ( ; i < n; i++)
740
        {
741
          s = alloc_sec[i];
742
          if (s->vma < ovl_end)
743
            {
744
              info->callbacks->einfo (_("%X%P: overlay section %A "
745
                                        "is not in cache area.\n"),
746
                                      alloc_sec[i-1]);
747
              bfd_set_error (bfd_error_bad_value);
748
              return 0;
749
            }
750
          else
751
            ovl_end = s->vma + s->size;
752
        }
753
    }
754
  else
755
    {
756
      /* Look for overlapping vmas.  Any with overlap must be overlays.
757
         Count them.  Also count the number of overlay regions.  */
758
      for (ovl_index = 0, num_buf = 0, i = 1; i < n; i++)
759
        {
760
          s = alloc_sec[i];
761
          if (s->vma < ovl_end)
762
            {
763
              asection *s0 = alloc_sec[i - 1];
764
 
765
              if (spu_elf_section_data (s0)->u.o.ovl_index == 0)
766
                {
767
                  ++num_buf;
768
                  if (strncmp (s0->name, ".ovl.init", 9) != 0)
769
                    {
770
                      alloc_sec[ovl_index] = s0;
771
                      spu_elf_section_data (s0)->u.o.ovl_index = ++ovl_index;
772
                      spu_elf_section_data (s0)->u.o.ovl_buf = num_buf;
773
                    }
774
                  else
775
                    ovl_end = s->vma + s->size;
776
                }
777
              if (strncmp (s->name, ".ovl.init", 9) != 0)
778
                {
779
                  alloc_sec[ovl_index] = s;
780
                  spu_elf_section_data (s)->u.o.ovl_index = ++ovl_index;
781
                  spu_elf_section_data (s)->u.o.ovl_buf = num_buf;
782
                  if (s0->vma != s->vma)
783
                    {
784
                      info->callbacks->einfo (_("%X%P: overlay sections %A "
785
                                                "and %A do not start at the "
786
                                                "same address.\n"),
787
                                              s0, s);
788
                      bfd_set_error (bfd_error_bad_value);
789
                      return 0;
790
                    }
791
                  if (ovl_end < s->vma + s->size)
792
                    ovl_end = s->vma + s->size;
793
                }
794
            }
795
          else
796
            ovl_end = s->vma + s->size;
797
        }
798
    }
799
 
800
  htab->num_overlays = ovl_index;
801
  htab->num_buf = num_buf;
802
  htab->ovl_sec = alloc_sec;
803
 
804
  if (ovl_index == 0)
805
    return 1;
806
 
807
  for (i = 0; i < 2; i++)
808
    {
809
      const char *name;
810
      struct elf_link_hash_entry *h;
811
 
812
      name = entry_names[i][htab->params->ovly_flavour];
813
      h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
814
      if (h == NULL)
815
        return 0;
816
 
817
      if (h->root.type == bfd_link_hash_new)
818
        {
819
          h->root.type = bfd_link_hash_undefined;
820
          h->ref_regular = 1;
821
          h->ref_regular_nonweak = 1;
822
          h->non_elf = 0;
823
        }
824
      htab->ovly_entry[i] = h;
825
    }
826
 
827
  return 2;
828
}
829
 
830
/* Non-zero to use bra in overlay stubs rather than br.  */
831
#define BRA_STUBS 0
832
 
833
#define BRA     0x30000000
834
#define BRASL   0x31000000
835
#define BR      0x32000000
836
#define BRSL    0x33000000
837
#define NOP     0x40200000
838
#define LNOP    0x00200000
839
#define ILA     0x42000000
840
 
841
/* Return true for all relative and absolute branch instructions.
842
   bra   00110000 0..
843
   brasl 00110001 0..
844
   br    00110010 0..
845
   brsl  00110011 0..
846
   brz   00100000 0..
847
   brnz  00100001 0..
848
   brhz  00100010 0..
849
   brhnz 00100011 0..  */
850
 
851
static bfd_boolean
852
is_branch (const unsigned char *insn)
853
{
854
  return (insn[0] & 0xec) == 0x20 && (insn[1] & 0x80) == 0;
855
}
856
 
857
/* Return true for all indirect branch instructions.
858
   bi     00110101 000
859
   bisl   00110101 001
860
   iret   00110101 010
861
   bisled 00110101 011
862
   biz    00100101 000
863
   binz   00100101 001
864
   bihz   00100101 010
865
   bihnz  00100101 011  */
866
 
867
static bfd_boolean
868
is_indirect_branch (const unsigned char *insn)
869
{
870
  return (insn[0] & 0xef) == 0x25 && (insn[1] & 0x80) == 0;
871
}
872
 
873
/* Return true for branch hint instructions.
874
   hbra  0001000..
875
   hbrr  0001001..  */
876
 
877
static bfd_boolean
878
is_hint (const unsigned char *insn)
879
{
880
  return (insn[0] & 0xfc) == 0x10;
881
}
882
 
883
/* True if INPUT_SECTION might need overlay stubs.  */
884
 
885
static bfd_boolean
886
maybe_needs_stubs (asection *input_section)
887
{
888
  /* No stubs for debug sections and suchlike.  */
889
  if ((input_section->flags & SEC_ALLOC) == 0)
890
    return FALSE;
891
 
892
  /* No stubs for link-once sections that will be discarded.  */
893
  if (input_section->output_section == bfd_abs_section_ptr)
894
    return FALSE;
895
 
896
  /* Don't create stubs for .eh_frame references.  */
897
  if (strcmp (input_section->name, ".eh_frame") == 0)
898
    return FALSE;
899
 
900
  return TRUE;
901
}
902
 
903
enum _stub_type
904
{
905
  no_stub,
906
  call_ovl_stub,
907
  br000_ovl_stub,
908
  br001_ovl_stub,
909
  br010_ovl_stub,
910
  br011_ovl_stub,
911
  br100_ovl_stub,
912
  br101_ovl_stub,
913
  br110_ovl_stub,
914
  br111_ovl_stub,
915
  nonovl_stub,
916
  stub_error
917
};
918
 
919
/* Return non-zero if this reloc symbol should go via an overlay stub.
920
   Return 2 if the stub must be in non-overlay area.  */
921
 
922
static enum _stub_type
923
needs_ovl_stub (struct elf_link_hash_entry *h,
924
                Elf_Internal_Sym *sym,
925
                asection *sym_sec,
926
                asection *input_section,
927
                Elf_Internal_Rela *irela,
928
                bfd_byte *contents,
929
                struct bfd_link_info *info)
930
{
931
  struct spu_link_hash_table *htab = spu_hash_table (info);
932
  enum elf_spu_reloc_type r_type;
933
  unsigned int sym_type;
934
  bfd_boolean branch, hint, call;
935
  enum _stub_type ret = no_stub;
936
  bfd_byte insn[4];
937
 
938
  if (sym_sec == NULL
939
      || sym_sec->output_section == bfd_abs_section_ptr
940
      || spu_elf_section_data (sym_sec->output_section) == NULL)
941
    return ret;
942
 
943
  if (h != NULL)
944
    {
945
      /* Ensure no stubs for user supplied overlay manager syms.  */
946
      if (h == htab->ovly_entry[0] || h == htab->ovly_entry[1])
947
        return ret;
948
 
949
      /* setjmp always goes via an overlay stub, because then the return
950
         and hence the longjmp goes via __ovly_return.  That magically
951
         makes setjmp/longjmp between overlays work.  */
952
      if (strncmp (h->root.root.string, "setjmp", 6) == 0
953
          && (h->root.root.string[6] == '\0' || h->root.root.string[6] == '@'))
954
        ret = call_ovl_stub;
955
    }
956
 
957
  if (h != NULL)
958
    sym_type = h->type;
959
  else
960
    sym_type = ELF_ST_TYPE (sym->st_info);
961
 
962
  r_type = ELF32_R_TYPE (irela->r_info);
963
  branch = FALSE;
964
  hint = FALSE;
965
  call = FALSE;
966
  if (r_type == R_SPU_REL16 || r_type == R_SPU_ADDR16)
967
    {
968
      if (contents == NULL)
969
        {
970
          contents = insn;
971
          if (!bfd_get_section_contents (input_section->owner,
972
                                         input_section,
973
                                         contents,
974
                                         irela->r_offset, 4))
975
            return stub_error;
976
        }
977
      else
978
        contents += irela->r_offset;
979
 
980
      branch = is_branch (contents);
981
      hint = is_hint (contents);
982
      if (branch || hint)
983
        {
984
          call = (contents[0] & 0xfd) == 0x31;
985
          if (call
986
              && sym_type != STT_FUNC
987
              && contents != insn)
988
            {
989
              /* It's common for people to write assembly and forget
990
                 to give function symbols the right type.  Handle
991
                 calls to such symbols, but warn so that (hopefully)
992
                 people will fix their code.  We need the symbol
993
                 type to be correct to distinguish function pointer
994
                 initialisation from other pointer initialisations.  */
995
              const char *sym_name;
996
 
997
              if (h != NULL)
998
                sym_name = h->root.root.string;
999
              else
1000
                {
1001
                  Elf_Internal_Shdr *symtab_hdr;
1002
                  symtab_hdr = &elf_tdata (input_section->owner)->symtab_hdr;
1003
                  sym_name = bfd_elf_sym_name (input_section->owner,
1004
                                               symtab_hdr,
1005
                                               sym,
1006
                                               sym_sec);
1007
                }
1008
              (*_bfd_error_handler) (_("warning: call to non-function"
1009
                                       " symbol %s defined in %B"),
1010
                                     sym_sec->owner, sym_name);
1011
 
1012
            }
1013
        }
1014
    }
1015
 
1016
  if ((!branch && htab->params->ovly_flavour == ovly_soft_icache)
1017
      || (sym_type != STT_FUNC
1018
          && !(branch || hint)
1019
          && (sym_sec->flags & SEC_CODE) == 0))
1020
    return no_stub;
1021
 
1022
  /* Usually, symbols in non-overlay sections don't need stubs.  */
1023
  if (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index == 0
1024
      && !htab->params->non_overlay_stubs)
1025
    return ret;
1026
 
1027
  /* A reference from some other section to a symbol in an overlay
1028
     section needs a stub.  */
1029
  if (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index
1030
       != spu_elf_section_data (input_section->output_section)->u.o.ovl_index)
1031
    {
1032
      unsigned int lrlive = 0;
1033
      if (branch)
1034
        lrlive = (contents[1] & 0x70) >> 4;
1035
 
1036
      if (!lrlive && (call || sym_type == STT_FUNC))
1037
        ret = call_ovl_stub;
1038
      else
1039
        ret = br000_ovl_stub + lrlive;
1040
    }
1041
 
1042
  /* If this insn isn't a branch then we are possibly taking the
1043
     address of a function and passing it out somehow.  Soft-icache code
1044
     always generates inline code to do indirect branches.  */
1045
  if (!(branch || hint)
1046
      && sym_type == STT_FUNC
1047
      && htab->params->ovly_flavour != ovly_soft_icache)
1048
    ret = nonovl_stub;
1049
 
1050
  return ret;
1051
}
1052
 
1053
static bfd_boolean
1054
count_stub (struct spu_link_hash_table *htab,
1055
            bfd *ibfd,
1056
            asection *isec,
1057
            enum _stub_type stub_type,
1058
            struct elf_link_hash_entry *h,
1059
            const Elf_Internal_Rela *irela)
1060
{
1061
  unsigned int ovl = 0;
1062
  struct got_entry *g, **head;
1063
  bfd_vma addend;
1064
 
1065
  /* If this instruction is a branch or call, we need a stub
1066
     for it.  One stub per function per overlay.
1067
     If it isn't a branch, then we are taking the address of
1068
     this function so need a stub in the non-overlay area
1069
     for it.  One stub per function.  */
1070
  if (stub_type != nonovl_stub)
1071
    ovl = spu_elf_section_data (isec->output_section)->u.o.ovl_index;
1072
 
1073
  if (h != NULL)
1074
    head = &h->got.glist;
1075
  else
1076
    {
1077
      if (elf_local_got_ents (ibfd) == NULL)
1078
        {
1079
          bfd_size_type amt = (elf_tdata (ibfd)->symtab_hdr.sh_info
1080
                               * sizeof (*elf_local_got_ents (ibfd)));
1081
          elf_local_got_ents (ibfd) = bfd_zmalloc (amt);
1082
          if (elf_local_got_ents (ibfd) == NULL)
1083
            return FALSE;
1084
        }
1085
      head = elf_local_got_ents (ibfd) + ELF32_R_SYM (irela->r_info);
1086
    }
1087
 
1088
  if (htab->params->ovly_flavour == ovly_soft_icache)
1089
    {
1090
      htab->stub_count[ovl] += 1;
1091
      return TRUE;
1092
    }
1093
 
1094
  addend = 0;
1095
  if (irela != NULL)
1096
    addend = irela->r_addend;
1097
 
1098
  if (ovl == 0)
1099
    {
1100
      struct got_entry *gnext;
1101
 
1102
      for (g = *head; g != NULL; g = g->next)
1103
        if (g->addend == addend && g->ovl == 0)
1104
          break;
1105
 
1106
      if (g == NULL)
1107
        {
1108
          /* Need a new non-overlay area stub.  Zap other stubs.  */
1109
          for (g = *head; g != NULL; g = gnext)
1110
            {
1111
              gnext = g->next;
1112
              if (g->addend == addend)
1113
                {
1114
                  htab->stub_count[g->ovl] -= 1;
1115
                  free (g);
1116
                }
1117
            }
1118
        }
1119
    }
1120
  else
1121
    {
1122
      for (g = *head; g != NULL; g = g->next)
1123
        if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
1124
          break;
1125
    }
1126
 
1127
  if (g == NULL)
1128
    {
1129
      g = bfd_malloc (sizeof *g);
1130
      if (g == NULL)
1131
        return FALSE;
1132
      g->ovl = ovl;
1133
      g->addend = addend;
1134
      g->stub_addr = (bfd_vma) -1;
1135
      g->next = *head;
1136
      *head = g;
1137
 
1138
      htab->stub_count[ovl] += 1;
1139
    }
1140
 
1141
  return TRUE;
1142
}
1143
 
1144
/* Support two sizes of overlay stubs, a slower more compact stub of two
1145
   intructions, and a faster stub of four instructions.
1146
   Soft-icache stubs are four or eight words.  */
1147
 
1148
static unsigned int
1149
ovl_stub_size (struct spu_elf_params *params)
1150
{
1151
  return 16 << params->ovly_flavour >> params->compact_stub;
1152
}
1153
 
1154
static unsigned int
1155
ovl_stub_size_log2 (struct spu_elf_params *params)
1156
{
1157
  return 4 + params->ovly_flavour - params->compact_stub;
1158
}
1159
 
1160
/* Two instruction overlay stubs look like:
1161
 
1162
   brsl $75,__ovly_load
1163
   .word target_ovl_and_address
1164
 
1165
   ovl_and_address is a word with the overlay number in the top 14 bits
1166
   and local store address in the bottom 18 bits.
1167
 
1168
   Four instruction overlay stubs look like:
1169
 
1170
   ila $78,ovl_number
1171
   lnop
1172
   ila $79,target_address
1173
   br __ovly_load
1174
 
1175
   Software icache stubs are:
1176
 
1177
   .word target_index
1178
   .word target_ia;
1179
   .word lrlive_branchlocalstoreaddr;
1180
   brasl $75,__icache_br_handler
1181
   .quad xor_pattern
1182
*/
1183
 
1184
static bfd_boolean
1185
build_stub (struct bfd_link_info *info,
1186
            bfd *ibfd,
1187
            asection *isec,
1188
            enum _stub_type stub_type,
1189
            struct elf_link_hash_entry *h,
1190
            const Elf_Internal_Rela *irela,
1191
            bfd_vma dest,
1192
            asection *dest_sec)
1193
{
1194
  struct spu_link_hash_table *htab = spu_hash_table (info);
1195
  unsigned int ovl, dest_ovl, set_id;
1196
  struct got_entry *g, **head;
1197
  asection *sec;
1198
  bfd_vma addend, from, to, br_dest, patt;
1199
  unsigned int lrlive;
1200
 
1201
  ovl = 0;
1202
  if (stub_type != nonovl_stub)
1203
    ovl = spu_elf_section_data (isec->output_section)->u.o.ovl_index;
1204
 
1205
  if (h != NULL)
1206
    head = &h->got.glist;
1207
  else
1208
    head = elf_local_got_ents (ibfd) + ELF32_R_SYM (irela->r_info);
1209
 
1210
  addend = 0;
1211
  if (irela != NULL)
1212
    addend = irela->r_addend;
1213
 
1214
  if (htab->params->ovly_flavour == ovly_soft_icache)
1215
    {
1216
      g = bfd_malloc (sizeof *g);
1217
      if (g == NULL)
1218
        return FALSE;
1219
      g->ovl = ovl;
1220
      g->br_addr = 0;
1221
      if (irela != NULL)
1222
        g->br_addr = (irela->r_offset
1223
                      + isec->output_offset
1224
                      + isec->output_section->vma);
1225
      g->next = *head;
1226
      *head = g;
1227
    }
1228
  else
1229
    {
1230
      for (g = *head; g != NULL; g = g->next)
1231
        if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
1232
          break;
1233
      if (g == NULL)
1234
        abort ();
1235
 
1236
      if (g->ovl == 0 && ovl != 0)
1237
        return TRUE;
1238
 
1239
      if (g->stub_addr != (bfd_vma) -1)
1240
        return TRUE;
1241
    }
1242
 
1243
  sec = htab->stub_sec[ovl];
1244
  dest += dest_sec->output_offset + dest_sec->output_section->vma;
1245
  from = sec->size + sec->output_offset + sec->output_section->vma;
1246
  g->stub_addr = from;
1247
  to = (htab->ovly_entry[0]->root.u.def.value
1248
        + htab->ovly_entry[0]->root.u.def.section->output_offset
1249
        + htab->ovly_entry[0]->root.u.def.section->output_section->vma);
1250
 
1251
  if (((dest | to | from) & 3) != 0)
1252
    {
1253
      htab->stub_err = 1;
1254
      return FALSE;
1255
    }
1256
  dest_ovl = spu_elf_section_data (dest_sec->output_section)->u.o.ovl_index;
1257
 
1258
  if (htab->params->ovly_flavour == ovly_normal
1259
      && !htab->params->compact_stub)
1260
    {
1261
      bfd_put_32 (sec->owner, ILA + ((dest_ovl << 7) & 0x01ffff80) + 78,
1262
                  sec->contents + sec->size);
1263
      bfd_put_32 (sec->owner, LNOP,
1264
                  sec->contents + sec->size + 4);
1265
      bfd_put_32 (sec->owner, ILA + ((dest << 7) & 0x01ffff80) + 79,
1266
                  sec->contents + sec->size + 8);
1267
      if (!BRA_STUBS)
1268
        bfd_put_32 (sec->owner, BR + (((to - (from + 12)) << 5) & 0x007fff80),
1269
                    sec->contents + sec->size + 12);
1270
      else
1271
        bfd_put_32 (sec->owner, BRA + ((to << 5) & 0x007fff80),
1272
                    sec->contents + sec->size + 12);
1273
    }
1274
  else if (htab->params->ovly_flavour == ovly_normal
1275
           && htab->params->compact_stub)
1276
    {
1277
      if (!BRA_STUBS)
1278
        bfd_put_32 (sec->owner, BRSL + (((to - from) << 5) & 0x007fff80) + 75,
1279
                    sec->contents + sec->size);
1280
      else
1281
        bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
1282
                    sec->contents + sec->size);
1283
      bfd_put_32 (sec->owner, (dest & 0x3ffff) | (dest_ovl << 18),
1284
                  sec->contents + sec->size + 4);
1285
    }
1286
  else if (htab->params->ovly_flavour == ovly_soft_icache
1287
           && htab->params->compact_stub)
1288
    {
1289
      lrlive = 0;
1290
      if (stub_type == nonovl_stub)
1291
        ;
1292
      else if (stub_type == call_ovl_stub)
1293
        /* A brsl makes lr live and *(*sp+16) is live.
1294
           Tail calls have the same liveness.  */
1295
        lrlive = 5;
1296
      else if (!htab->params->lrlive_analysis)
1297
        /* Assume stack frame and lr save.  */
1298
        lrlive = 1;
1299
      else if (irela != NULL)
1300
        {
1301
          /* Analyse branch instructions.  */
1302
          struct function_info *caller;
1303
          bfd_vma off;
1304
 
1305
          caller = find_function (isec, irela->r_offset, info);
1306
          if (caller->start == NULL)
1307
            off = irela->r_offset;
1308
          else
1309
            {
1310
              struct function_info *found = NULL;
1311
 
1312
              /* Find the earliest piece of this function that
1313
                 has frame adjusting instructions.  We might
1314
                 see dynamic frame adjustment (eg. for alloca)
1315
                 in some later piece, but functions using
1316
                 alloca always set up a frame earlier.  Frame
1317
                 setup instructions are always in one piece.  */
1318
              if (caller->lr_store != (bfd_vma) -1
1319
                  || caller->sp_adjust != (bfd_vma) -1)
1320
                found = caller;
1321
              while (caller->start != NULL)
1322
                {
1323
                  caller = caller->start;
1324
                  if (caller->lr_store != (bfd_vma) -1
1325
                      || caller->sp_adjust != (bfd_vma) -1)
1326
                    found = caller;
1327
                }
1328
              if (found != NULL)
1329
                caller = found;
1330
              off = (bfd_vma) -1;
1331
            }
1332
 
1333
          if (off > caller->sp_adjust)
1334
            {
1335
              if (off > caller->lr_store)
1336
                /* Only *(*sp+16) is live.  */
1337
                lrlive = 1;
1338
              else
1339
                /* If no lr save, then we must be in a
1340
                   leaf function with a frame.
1341
                   lr is still live.  */
1342
                lrlive = 4;
1343
            }
1344
          else if (off > caller->lr_store)
1345
            {
1346
              /* Between lr save and stack adjust.  */
1347
              lrlive = 3;
1348
              /* This should never happen since prologues won't
1349
                 be split here.  */
1350
              BFD_ASSERT (0);
1351
            }
1352
          else
1353
            /* On entry to function.  */
1354
            lrlive = 5;
1355
 
1356
          if (stub_type != br000_ovl_stub
1357
              && lrlive != stub_type - br000_ovl_stub)
1358
            info->callbacks->einfo (_("%A:0x%v lrlive .brinfo (%u) differs "
1359
                                      "from analysis (%u)\n"),
1360
                                    isec, irela->r_offset, lrlive,
1361
                                    stub_type - br000_ovl_stub);
1362
        }
1363
 
1364
      /* If given lrlive info via .brinfo, use it.  */
1365
      if (stub_type > br000_ovl_stub)
1366
        lrlive = stub_type - br000_ovl_stub;
1367
 
1368
      if (ovl == 0)
1369
        to = (htab->ovly_entry[1]->root.u.def.value
1370
              + htab->ovly_entry[1]->root.u.def.section->output_offset
1371
              + htab->ovly_entry[1]->root.u.def.section->output_section->vma);
1372
 
1373
      /* The branch that uses this stub goes to stub_addr + 4.  We'll
1374
         set up an xor pattern that can be used by the icache manager
1375
         to modify this branch to go directly to its destination.  */
1376
      g->stub_addr += 4;
1377
      br_dest = g->stub_addr;
1378
      if (irela == NULL)
1379
        {
1380
          /* Except in the case of _SPUEAR_ stubs, the branch in
1381
             question is the one in the stub itself.  */
1382
          BFD_ASSERT (stub_type == nonovl_stub);
1383
          g->br_addr = g->stub_addr;
1384
          br_dest = to;
1385
        }
1386
 
1387
      set_id = ((dest_ovl - 1) >> htab->num_lines_log2) + 1;
1388
      bfd_put_32 (sec->owner, (set_id << 18) | (dest & 0x3ffff),
1389
                  sec->contents + sec->size);
1390
      bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
1391
                  sec->contents + sec->size + 4);
1392
      bfd_put_32 (sec->owner, (lrlive << 29) | (g->br_addr & 0x3ffff),
1393
                  sec->contents + sec->size + 8);
1394
      patt = dest ^ br_dest;
1395
      if (irela != NULL && ELF32_R_TYPE (irela->r_info) == R_SPU_REL16)
1396
        patt = (dest - g->br_addr) ^ (br_dest - g->br_addr);
1397
      bfd_put_32 (sec->owner, (patt << 5) & 0x007fff80,
1398
                  sec->contents + sec->size + 12);
1399
 
1400
      if (ovl == 0)
1401
        /* Extra space for linked list entries.  */
1402
        sec->size += 16;
1403
    }
1404
  else
1405
    abort ();
1406
 
1407
  sec->size += ovl_stub_size (htab->params);
1408
 
1409
  if (htab->params->emit_stub_syms)
1410
    {
1411
      size_t len;
1412
      char *name;
1413
      int add;
1414
 
1415
      len = 8 + sizeof (".ovl_call.") - 1;
1416
      if (h != NULL)
1417
        len += strlen (h->root.root.string);
1418
      else
1419
        len += 8 + 1 + 8;
1420
      add = 0;
1421
      if (irela != NULL)
1422
        add = (int) irela->r_addend & 0xffffffff;
1423
      if (add != 0)
1424
        len += 1 + 8;
1425
      name = bfd_malloc (len);
1426
      if (name == NULL)
1427
        return FALSE;
1428
 
1429
      sprintf (name, "%08x.ovl_call.", g->ovl);
1430
      if (h != NULL)
1431
        strcpy (name + 8 + sizeof (".ovl_call.") - 1, h->root.root.string);
1432
      else
1433
        sprintf (name + 8 + sizeof (".ovl_call.") - 1, "%x:%x",
1434
                 dest_sec->id & 0xffffffff,
1435
                 (int) ELF32_R_SYM (irela->r_info) & 0xffffffff);
1436
      if (add != 0)
1437
        sprintf (name + len - 9, "+%x", add);
1438
 
1439
      h = elf_link_hash_lookup (&htab->elf, name, TRUE, TRUE, FALSE);
1440
      free (name);
1441
      if (h == NULL)
1442
        return FALSE;
1443
      if (h->root.type == bfd_link_hash_new)
1444
        {
1445
          h->root.type = bfd_link_hash_defined;
1446
          h->root.u.def.section = sec;
1447
          h->size = ovl_stub_size (htab->params);
1448
          h->root.u.def.value = sec->size - h->size;
1449
          h->type = STT_FUNC;
1450
          h->ref_regular = 1;
1451
          h->def_regular = 1;
1452
          h->ref_regular_nonweak = 1;
1453
          h->forced_local = 1;
1454
          h->non_elf = 0;
1455
        }
1456
    }
1457
 
1458
  return TRUE;
1459
}
1460
 
1461
/* Called via elf_link_hash_traverse to allocate stubs for any _SPUEAR_
1462
   symbols.  */
1463
 
1464
static bfd_boolean
1465
allocate_spuear_stubs (struct elf_link_hash_entry *h, void *inf)
1466
{
1467
  /* Symbols starting with _SPUEAR_ need a stub because they may be
1468
     invoked by the PPU.  */
1469
  struct bfd_link_info *info = inf;
1470
  struct spu_link_hash_table *htab = spu_hash_table (info);
1471
  asection *sym_sec;
1472
 
1473
  if ((h->root.type == bfd_link_hash_defined
1474
       || h->root.type == bfd_link_hash_defweak)
1475
      && h->def_regular
1476
      && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0
1477
      && (sym_sec = h->root.u.def.section) != NULL
1478
      && sym_sec->output_section != bfd_abs_section_ptr
1479
      && spu_elf_section_data (sym_sec->output_section) != NULL
1480
      && (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index != 0
1481
          || htab->params->non_overlay_stubs))
1482
    {
1483
      return count_stub (htab, NULL, NULL, nonovl_stub, h, NULL);
1484
    }
1485
 
1486
  return TRUE;
1487
}
1488
 
1489
static bfd_boolean
1490
build_spuear_stubs (struct elf_link_hash_entry *h, void *inf)
1491
{
1492
  /* Symbols starting with _SPUEAR_ need a stub because they may be
1493
     invoked by the PPU.  */
1494
  struct bfd_link_info *info = inf;
1495
  struct spu_link_hash_table *htab = spu_hash_table (info);
1496
  asection *sym_sec;
1497
 
1498
  if ((h->root.type == bfd_link_hash_defined
1499
       || h->root.type == bfd_link_hash_defweak)
1500
      && h->def_regular
1501
      && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0
1502
      && (sym_sec = h->root.u.def.section) != NULL
1503
      && sym_sec->output_section != bfd_abs_section_ptr
1504
      && spu_elf_section_data (sym_sec->output_section) != NULL
1505
      && (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index != 0
1506
          || htab->params->non_overlay_stubs))
1507
    {
1508
      return build_stub (info, NULL, NULL, nonovl_stub, h, NULL,
1509
                         h->root.u.def.value, sym_sec);
1510
    }
1511
 
1512
  return TRUE;
1513
}
1514
 
1515
/* Size or build stubs.  */
1516
 
1517
static bfd_boolean
1518
process_stubs (struct bfd_link_info *info, bfd_boolean build)
1519
{
1520
  struct spu_link_hash_table *htab = spu_hash_table (info);
1521
  bfd *ibfd;
1522
 
1523
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1524
    {
1525
      extern const bfd_target bfd_elf32_spu_vec;
1526
      Elf_Internal_Shdr *symtab_hdr;
1527
      asection *isec;
1528
      Elf_Internal_Sym *local_syms = NULL;
1529
 
1530
      if (ibfd->xvec != &bfd_elf32_spu_vec)
1531
        continue;
1532
 
1533
      /* We'll need the symbol table in a second.  */
1534
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1535
      if (symtab_hdr->sh_info == 0)
1536
        continue;
1537
 
1538
      /* Walk over each section attached to the input bfd.  */
1539
      for (isec = ibfd->sections; isec != NULL; isec = isec->next)
1540
        {
1541
          Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1542
 
1543
          /* If there aren't any relocs, then there's nothing more to do.  */
1544
          if ((isec->flags & SEC_RELOC) == 0
1545
              || isec->reloc_count == 0)
1546
            continue;
1547
 
1548
          if (!maybe_needs_stubs (isec))
1549
            continue;
1550
 
1551
          /* Get the relocs.  */
1552
          internal_relocs = _bfd_elf_link_read_relocs (ibfd, isec, NULL, NULL,
1553
                                                       info->keep_memory);
1554
          if (internal_relocs == NULL)
1555
            goto error_ret_free_local;
1556
 
1557
          /* Now examine each relocation.  */
1558
          irela = internal_relocs;
1559
          irelaend = irela + isec->reloc_count;
1560
          for (; irela < irelaend; irela++)
1561
            {
1562
              enum elf_spu_reloc_type r_type;
1563
              unsigned int r_indx;
1564
              asection *sym_sec;
1565
              Elf_Internal_Sym *sym;
1566
              struct elf_link_hash_entry *h;
1567
              enum _stub_type stub_type;
1568
 
1569
              r_type = ELF32_R_TYPE (irela->r_info);
1570
              r_indx = ELF32_R_SYM (irela->r_info);
1571
 
1572
              if (r_type >= R_SPU_max)
1573
                {
1574
                  bfd_set_error (bfd_error_bad_value);
1575
                error_ret_free_internal:
1576
                  if (elf_section_data (isec)->relocs != internal_relocs)
1577
                    free (internal_relocs);
1578
                error_ret_free_local:
1579
                  if (local_syms != NULL
1580
                      && (symtab_hdr->contents
1581
                          != (unsigned char *) local_syms))
1582
                    free (local_syms);
1583
                  return FALSE;
1584
                }
1585
 
1586
              /* Determine the reloc target section.  */
1587
              if (!get_sym_h (&h, &sym, &sym_sec, &local_syms, r_indx, ibfd))
1588
                goto error_ret_free_internal;
1589
 
1590
              stub_type = needs_ovl_stub (h, sym, sym_sec, isec, irela,
1591
                                          NULL, info);
1592
              if (stub_type == no_stub)
1593
                continue;
1594
              else if (stub_type == stub_error)
1595
                goto error_ret_free_internal;
1596
 
1597
              if (htab->stub_count == NULL)
1598
                {
1599
                  bfd_size_type amt;
1600
                  amt = (htab->num_overlays + 1) * sizeof (*htab->stub_count);
1601
                  htab->stub_count = bfd_zmalloc (amt);
1602
                  if (htab->stub_count == NULL)
1603
                    goto error_ret_free_internal;
1604
                }
1605
 
1606
              if (!build)
1607
                {
1608
                  if (!count_stub (htab, ibfd, isec, stub_type, h, irela))
1609
                    goto error_ret_free_internal;
1610
                }
1611
              else
1612
                {
1613
                  bfd_vma dest;
1614
 
1615
                  if (h != NULL)
1616
                    dest = h->root.u.def.value;
1617
                  else
1618
                    dest = sym->st_value;
1619
                  dest += irela->r_addend;
1620
                  if (!build_stub (info, ibfd, isec, stub_type, h, irela,
1621
                                   dest, sym_sec))
1622
                    goto error_ret_free_internal;
1623
                }
1624
            }
1625
 
1626
          /* We're done with the internal relocs, free them.  */
1627
          if (elf_section_data (isec)->relocs != internal_relocs)
1628
            free (internal_relocs);
1629
        }
1630
 
1631
      if (local_syms != NULL
1632
          && symtab_hdr->contents != (unsigned char *) local_syms)
1633
        {
1634
          if (!info->keep_memory)
1635
            free (local_syms);
1636
          else
1637
            symtab_hdr->contents = (unsigned char *) local_syms;
1638
        }
1639
    }
1640
 
1641
  return TRUE;
1642
}
1643
 
1644
/* Allocate space for overlay call and return stubs.
1645
   Return 0 on error, 1 if no overlays, 2 otherwise.  */
1646
 
1647
int
1648
spu_elf_size_stubs (struct bfd_link_info *info)
1649
{
1650
  struct spu_link_hash_table *htab;
1651
  bfd *ibfd;
1652
  bfd_size_type amt;
1653
  flagword flags;
1654
  unsigned int i;
1655
  asection *stub;
1656
 
1657
  if (!process_stubs (info, FALSE))
1658
    return 0;
1659
 
1660
  htab = spu_hash_table (info);
1661
  elf_link_hash_traverse (&htab->elf, allocate_spuear_stubs, info);
1662
  if (htab->stub_err)
1663
    return 0;
1664
 
1665
  ibfd = info->input_bfds;
1666
  if (htab->stub_count != NULL)
1667
    {
1668
      amt = (htab->num_overlays + 1) * sizeof (*htab->stub_sec);
1669
      htab->stub_sec = bfd_zmalloc (amt);
1670
      if (htab->stub_sec == NULL)
1671
        return 0;
1672
 
1673
      flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
1674
               | SEC_HAS_CONTENTS | SEC_IN_MEMORY);
1675
      stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
1676
      htab->stub_sec[0] = stub;
1677
      if (stub == NULL
1678
          || !bfd_set_section_alignment (ibfd, stub,
1679
                                         ovl_stub_size_log2 (htab->params)))
1680
        return 0;
1681
      stub->size = htab->stub_count[0] * ovl_stub_size (htab->params);
1682
      if (htab->params->ovly_flavour == ovly_soft_icache)
1683
        /* Extra space for linked list entries.  */
1684
        stub->size += htab->stub_count[0] * 16;
1685
 
1686
      for (i = 0; i < htab->num_overlays; ++i)
1687
        {
1688
          asection *osec = htab->ovl_sec[i];
1689
          unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
1690
          stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
1691
          htab->stub_sec[ovl] = stub;
1692
          if (stub == NULL
1693
              || !bfd_set_section_alignment (ibfd, stub,
1694
                                             ovl_stub_size_log2 (htab->params)))
1695
            return 0;
1696
          stub->size = htab->stub_count[ovl] * ovl_stub_size (htab->params);
1697
        }
1698
    }
1699
 
1700
  if (htab->params->ovly_flavour == ovly_soft_icache)
1701
    {
1702
      /* Space for icache manager tables.
1703
         a) Tag array, one quadword per cache line.
1704
         b) Rewrite "to" list, one quadword per cache line.
1705
         c) Rewrite "from" list, one byte per outgoing branch (rounded up to
1706
            a power-of-two number of full quadwords) per cache line.  */
1707
 
1708
      flags = SEC_ALLOC;
1709
      htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
1710
      if (htab->ovtab == NULL
1711
          || !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
1712
        return 0;
1713
 
1714
      htab->ovtab->size = (16 + 16 + (16 << htab->fromelem_size_log2))
1715
                          << htab->num_lines_log2;
1716
 
1717
      flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1718
      htab->init = bfd_make_section_anyway_with_flags (ibfd, ".ovini", flags);
1719
      if (htab->init == NULL
1720
          || !bfd_set_section_alignment (ibfd, htab->init, 4))
1721
        return 0;
1722
 
1723
      htab->init->size = 16;
1724
    }
1725
  else if (htab->stub_count == NULL)
1726
    return 1;
1727
  else
1728
    {
1729
      /* htab->ovtab consists of two arrays.
1730
         .      struct {
1731
         .        u32 vma;
1732
         .        u32 size;
1733
         .        u32 file_off;
1734
         .        u32 buf;
1735
         .      } _ovly_table[];
1736
         .
1737
         .      struct {
1738
         .        u32 mapped;
1739
         .      } _ovly_buf_table[];
1740
         .  */
1741
 
1742
      flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1743
      htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
1744
      if (htab->ovtab == NULL
1745
          || !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
1746
        return 0;
1747
 
1748
      htab->ovtab->size = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
1749
    }
1750
 
1751
  htab->toe = bfd_make_section_anyway_with_flags (ibfd, ".toe", SEC_ALLOC);
1752
  if (htab->toe == NULL
1753
      || !bfd_set_section_alignment (ibfd, htab->toe, 4))
1754
    return 0;
1755
  htab->toe->size = 16;
1756
 
1757
  return 2;
1758
}
1759
 
1760
/* Called from ld to place overlay manager data sections.  This is done
1761
   after the overlay manager itself is loaded, mainly so that the
1762
   linker's htab->init section is placed after any other .ovl.init
1763
   sections.  */
1764
 
1765
void
1766
spu_elf_place_overlay_data (struct bfd_link_info *info)
1767
{
1768
  struct spu_link_hash_table *htab = spu_hash_table (info);
1769
  unsigned int i;
1770
 
1771
  if (htab->stub_sec != NULL)
1772
    {
1773
      (*htab->params->place_spu_section) (htab->stub_sec[0], NULL, ".text");
1774
 
1775
      for (i = 0; i < htab->num_overlays; ++i)
1776
        {
1777
          asection *osec = htab->ovl_sec[i];
1778
          unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
1779
          (*htab->params->place_spu_section) (htab->stub_sec[ovl], osec, NULL);
1780
        }
1781
    }
1782
 
1783
  if (htab->params->ovly_flavour == ovly_soft_icache)
1784
    (*htab->params->place_spu_section) (htab->init, NULL, ".ovl.init");
1785
 
1786
  if (htab->ovtab != NULL)
1787
    {
1788
      const char *ovout = ".data";
1789
      if (htab->params->ovly_flavour == ovly_soft_icache)
1790
        ovout = ".bss";
1791
      (*htab->params->place_spu_section) (htab->ovtab, NULL, ovout);
1792
    }
1793
 
1794
  if (htab->toe != NULL)
1795
    (*htab->params->place_spu_section) (htab->toe, NULL, ".toe");
1796
}
1797
 
1798
/* Functions to handle embedded spu_ovl.o object.  */
1799
 
1800
static void *
1801
ovl_mgr_open (struct bfd *nbfd ATTRIBUTE_UNUSED, void *stream)
1802
{
1803
  return stream;
1804
}
1805
 
1806
static file_ptr
1807
ovl_mgr_pread (struct bfd *abfd ATTRIBUTE_UNUSED,
1808
               void *stream,
1809
               void *buf,
1810
               file_ptr nbytes,
1811
               file_ptr offset)
1812
{
1813
  struct _ovl_stream *os;
1814
  size_t count;
1815
  size_t max;
1816
 
1817
  os = (struct _ovl_stream *) stream;
1818
  max = (const char *) os->end - (const char *) os->start;
1819
 
1820
  if ((ufile_ptr) offset >= max)
1821
    return 0;
1822
 
1823
  count = nbytes;
1824
  if (count > max - offset)
1825
    count = max - offset;
1826
 
1827
  memcpy (buf, (const char *) os->start + offset, count);
1828
  return count;
1829
}
1830
 
1831
bfd_boolean
1832
spu_elf_open_builtin_lib (bfd **ovl_bfd, const struct _ovl_stream *stream)
1833
{
1834
  *ovl_bfd = bfd_openr_iovec ("builtin ovl_mgr",
1835
                              "elf32-spu",
1836
                              ovl_mgr_open,
1837
                              (void *) stream,
1838
                              ovl_mgr_pread,
1839
                              NULL,
1840
                              NULL);
1841
  return *ovl_bfd != NULL;
1842
}
1843
 
1844
static unsigned int
1845
overlay_index (asection *sec)
1846
{
1847
  if (sec == NULL
1848
      || sec->output_section == bfd_abs_section_ptr)
1849
    return 0;
1850
  return spu_elf_section_data (sec->output_section)->u.o.ovl_index;
1851
}
1852
 
1853
/* Define an STT_OBJECT symbol.  */
1854
 
1855
static struct elf_link_hash_entry *
1856
define_ovtab_symbol (struct spu_link_hash_table *htab, const char *name)
1857
{
1858
  struct elf_link_hash_entry *h;
1859
 
1860
  h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
1861
  if (h == NULL)
1862
    return NULL;
1863
 
1864
  if (h->root.type != bfd_link_hash_defined
1865
      || !h->def_regular)
1866
    {
1867
      h->root.type = bfd_link_hash_defined;
1868
      h->root.u.def.section = htab->ovtab;
1869
      h->type = STT_OBJECT;
1870
      h->ref_regular = 1;
1871
      h->def_regular = 1;
1872
      h->ref_regular_nonweak = 1;
1873
      h->non_elf = 0;
1874
    }
1875
  else if (h->root.u.def.section->owner != NULL)
1876
    {
1877
      (*_bfd_error_handler) (_("%B is not allowed to define %s"),
1878
                             h->root.u.def.section->owner,
1879
                             h->root.root.string);
1880
      bfd_set_error (bfd_error_bad_value);
1881
      return NULL;
1882
    }
1883
  else
1884
    {
1885
      (*_bfd_error_handler) (_("you are not allowed to define %s in a script"),
1886
                             h->root.root.string);
1887
      bfd_set_error (bfd_error_bad_value);
1888
      return NULL;
1889
    }
1890
 
1891
  return h;
1892
}
1893
 
1894
/* Fill in all stubs and the overlay tables.  */
1895
 
1896
static bfd_boolean
1897
spu_elf_build_stubs (struct bfd_link_info *info)
1898
{
1899
  struct spu_link_hash_table *htab = spu_hash_table (info);
1900
  struct elf_link_hash_entry *h;
1901
  bfd_byte *p;
1902
  asection *s;
1903
  bfd *obfd;
1904
  unsigned int i;
1905
 
1906
  if (htab->num_overlays != 0)
1907
    {
1908
      for (i = 0; i < 2; i++)
1909
        {
1910
          h = htab->ovly_entry[i];
1911
          if (h != NULL
1912
              && (h->root.type == bfd_link_hash_defined
1913
                  || h->root.type == bfd_link_hash_defweak)
1914
              && h->def_regular)
1915
            {
1916
              s = h->root.u.def.section->output_section;
1917
              if (spu_elf_section_data (s)->u.o.ovl_index)
1918
                {
1919
                  (*_bfd_error_handler) (_("%s in overlay section"),
1920
                                         h->root.root.string);
1921
                  bfd_set_error (bfd_error_bad_value);
1922
                  return FALSE;
1923
                }
1924
            }
1925
        }
1926
    }
1927
 
1928
  if (htab->stub_sec != NULL)
1929
    {
1930
      for (i = 0; i <= htab->num_overlays; i++)
1931
        if (htab->stub_sec[i]->size != 0)
1932
          {
1933
            htab->stub_sec[i]->contents = bfd_zalloc (htab->stub_sec[i]->owner,
1934
                                                      htab->stub_sec[i]->size);
1935
            if (htab->stub_sec[i]->contents == NULL)
1936
              return FALSE;
1937
            htab->stub_sec[i]->rawsize = htab->stub_sec[i]->size;
1938
            htab->stub_sec[i]->size = 0;
1939
          }
1940
 
1941
      /* Fill in all the stubs.  */
1942
      process_stubs (info, TRUE);
1943
      if (!htab->stub_err)
1944
        elf_link_hash_traverse (&htab->elf, build_spuear_stubs, info);
1945
 
1946
      if (htab->stub_err)
1947
        {
1948
          (*_bfd_error_handler) (_("overlay stub relocation overflow"));
1949
          bfd_set_error (bfd_error_bad_value);
1950
          return FALSE;
1951
        }
1952
 
1953
      for (i = 0; i <= htab->num_overlays; i++)
1954
        {
1955
          if (htab->stub_sec[i]->size != htab->stub_sec[i]->rawsize)
1956
            {
1957
              (*_bfd_error_handler)  (_("stubs don't match calculated size"));
1958
              bfd_set_error (bfd_error_bad_value);
1959
              return FALSE;
1960
            }
1961
          htab->stub_sec[i]->rawsize = 0;
1962
        }
1963
    }
1964
 
1965
  if (htab->ovtab == NULL || htab->ovtab->size == 0)
1966
    return TRUE;
1967
 
1968
  htab->ovtab->contents = bfd_zalloc (htab->ovtab->owner, htab->ovtab->size);
1969
  if (htab->ovtab->contents == NULL)
1970
    return FALSE;
1971
 
1972
  p = htab->ovtab->contents;
1973
  if (htab->params->ovly_flavour == ovly_soft_icache)
1974
    {
1975
      bfd_vma off;
1976
 
1977
      h = define_ovtab_symbol (htab, "__icache_tag_array");
1978
      if (h == NULL)
1979
        return FALSE;
1980
      h->root.u.def.value = 0;
1981
      h->size = 16 << htab->num_lines_log2;
1982
      off = h->size;
1983
 
1984
      h = define_ovtab_symbol (htab, "__icache_tag_array_size");
1985
      if (h == NULL)
1986
        return FALSE;
1987
      h->root.u.def.value = 16 << htab->num_lines_log2;
1988
      h->root.u.def.section = bfd_abs_section_ptr;
1989
 
1990
      h = define_ovtab_symbol (htab, "__icache_rewrite_to");
1991
      if (h == NULL)
1992
        return FALSE;
1993
      h->root.u.def.value = off;
1994
      h->size = 16 << htab->num_lines_log2;
1995
      off += h->size;
1996
 
1997
      h = define_ovtab_symbol (htab, "__icache_rewrite_to_size");
1998
      if (h == NULL)
1999
        return FALSE;
2000
      h->root.u.def.value = 16 << htab->num_lines_log2;
2001
      h->root.u.def.section = bfd_abs_section_ptr;
2002
 
2003
      h = define_ovtab_symbol (htab, "__icache_rewrite_from");
2004
      if (h == NULL)
2005
        return FALSE;
2006
      h->root.u.def.value = off;
2007
      h->size = 16 << (htab->fromelem_size_log2 + htab->num_lines_log2);
2008
      off += h->size;
2009
 
2010
      h = define_ovtab_symbol (htab, "__icache_rewrite_from_size");
2011
      if (h == NULL)
2012
        return FALSE;
2013
      h->root.u.def.value = 16 << (htab->fromelem_size_log2
2014
                                   + htab->num_lines_log2);
2015
      h->root.u.def.section = bfd_abs_section_ptr;
2016
 
2017
      h = define_ovtab_symbol (htab, "__icache_log2_fromelemsize");
2018
      if (h == NULL)
2019
        return FALSE;
2020
      h->root.u.def.value = htab->fromelem_size_log2;
2021
      h->root.u.def.section = bfd_abs_section_ptr;
2022
 
2023
      h = define_ovtab_symbol (htab, "__icache_base");
2024
      if (h == NULL)
2025
        return FALSE;
2026
      h->root.u.def.value = htab->ovl_sec[0]->vma;
2027
      h->root.u.def.section = bfd_abs_section_ptr;
2028
      h->size = htab->num_buf << htab->line_size_log2;
2029
 
2030
      h = define_ovtab_symbol (htab, "__icache_linesize");
2031
      if (h == NULL)
2032
        return FALSE;
2033
      h->root.u.def.value = 1 << htab->line_size_log2;
2034
      h->root.u.def.section = bfd_abs_section_ptr;
2035
 
2036
      h = define_ovtab_symbol (htab, "__icache_log2_linesize");
2037
      if (h == NULL)
2038
        return FALSE;
2039
      h->root.u.def.value = htab->line_size_log2;
2040
      h->root.u.def.section = bfd_abs_section_ptr;
2041
 
2042
      h = define_ovtab_symbol (htab, "__icache_neg_log2_linesize");
2043
      if (h == NULL)
2044
        return FALSE;
2045
      h->root.u.def.value = -htab->line_size_log2;
2046
      h->root.u.def.section = bfd_abs_section_ptr;
2047
 
2048
      h = define_ovtab_symbol (htab, "__icache_cachesize");
2049
      if (h == NULL)
2050
        return FALSE;
2051
      h->root.u.def.value = 1 << (htab->num_lines_log2 + htab->line_size_log2);
2052
      h->root.u.def.section = bfd_abs_section_ptr;
2053
 
2054
      h = define_ovtab_symbol (htab, "__icache_log2_cachesize");
2055
      if (h == NULL)
2056
        return FALSE;
2057
      h->root.u.def.value = htab->num_lines_log2 + htab->line_size_log2;
2058
      h->root.u.def.section = bfd_abs_section_ptr;
2059
 
2060
      h = define_ovtab_symbol (htab, "__icache_neg_log2_cachesize");
2061
      if (h == NULL)
2062
        return FALSE;
2063
      h->root.u.def.value = -(htab->num_lines_log2 + htab->line_size_log2);
2064
      h->root.u.def.section = bfd_abs_section_ptr;
2065
 
2066
      if (htab->init != NULL && htab->init->size != 0)
2067
        {
2068
          htab->init->contents = bfd_zalloc (htab->init->owner,
2069
                                             htab->init->size);
2070
          if (htab->init->contents == NULL)
2071
            return FALSE;
2072
 
2073
          h = define_ovtab_symbol (htab, "__icache_fileoff");
2074
          if (h == NULL)
2075
            return FALSE;
2076
          h->root.u.def.value = 0;
2077
          h->root.u.def.section = htab->init;
2078
          h->size = 8;
2079
        }
2080
    }
2081
  else
2082
    {
2083
      /* Write out _ovly_table.  */
2084
      /* set low bit of .size to mark non-overlay area as present.  */
2085
      p[7] = 1;
2086
      obfd = htab->ovtab->output_section->owner;
2087
      for (s = obfd->sections; s != NULL; s = s->next)
2088
        {
2089
          unsigned int ovl_index = spu_elf_section_data (s)->u.o.ovl_index;
2090
 
2091
          if (ovl_index != 0)
2092
            {
2093
              unsigned long off = ovl_index * 16;
2094
              unsigned int ovl_buf = spu_elf_section_data (s)->u.o.ovl_buf;
2095
 
2096
              bfd_put_32 (htab->ovtab->owner, s->vma, p + off);
2097
              bfd_put_32 (htab->ovtab->owner, (s->size + 15) & -16,
2098
                          p + off + 4);
2099
              /* file_off written later in spu_elf_modify_program_headers.  */
2100
              bfd_put_32 (htab->ovtab->owner, ovl_buf, p + off + 12);
2101
            }
2102
        }
2103
 
2104
      h = define_ovtab_symbol (htab, "_ovly_table");
2105
      if (h == NULL)
2106
        return FALSE;
2107
      h->root.u.def.value = 16;
2108
      h->size = htab->num_overlays * 16;
2109
 
2110
      h = define_ovtab_symbol (htab, "_ovly_table_end");
2111
      if (h == NULL)
2112
        return FALSE;
2113
      h->root.u.def.value = htab->num_overlays * 16 + 16;
2114
      h->size = 0;
2115
 
2116
      h = define_ovtab_symbol (htab, "_ovly_buf_table");
2117
      if (h == NULL)
2118
        return FALSE;
2119
      h->root.u.def.value = htab->num_overlays * 16 + 16;
2120
      h->size = htab->num_buf * 4;
2121
 
2122
      h = define_ovtab_symbol (htab, "_ovly_buf_table_end");
2123
      if (h == NULL)
2124
        return FALSE;
2125
      h->root.u.def.value = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
2126
      h->size = 0;
2127
    }
2128
 
2129
  h = define_ovtab_symbol (htab, "_EAR_");
2130
  if (h == NULL)
2131
    return FALSE;
2132
  h->root.u.def.section = htab->toe;
2133
  h->root.u.def.value = 0;
2134
  h->size = 16;
2135
 
2136
  return TRUE;
2137
}
2138
 
2139
/* Check that all loadable section VMAs lie in the range
2140
   LO .. HI inclusive, and stash some parameters for --auto-overlay.  */
2141
 
2142
asection *
2143
spu_elf_check_vma (struct bfd_link_info *info)
2144
{
2145
  struct elf_segment_map *m;
2146
  unsigned int i;
2147
  struct spu_link_hash_table *htab = spu_hash_table (info);
2148
  bfd *abfd = info->output_bfd;
2149
  bfd_vma hi = htab->params->local_store_hi;
2150
  bfd_vma lo = htab->params->local_store_lo;
2151
 
2152
  htab->local_store = hi + 1 - lo;
2153
 
2154
  for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2155
    if (m->p_type == PT_LOAD)
2156
      for (i = 0; i < m->count; i++)
2157
        if (m->sections[i]->size != 0
2158
            && (m->sections[i]->vma < lo
2159
                || m->sections[i]->vma > hi
2160
                || m->sections[i]->vma + m->sections[i]->size - 1 > hi))
2161
          return m->sections[i];
2162
 
2163
  return NULL;
2164
}
2165
 
2166
/* OFFSET in SEC (presumably) is the beginning of a function prologue.
2167
   Search for stack adjusting insns, and return the sp delta.
2168
   If a store of lr is found save the instruction offset to *LR_STORE.
2169
   If a stack adjusting instruction is found, save that offset to
2170
   *SP_ADJUST.  */
2171
 
2172
static int
2173
find_function_stack_adjust (asection *sec,
2174
                            bfd_vma offset,
2175
                            bfd_vma *lr_store,
2176
                            bfd_vma *sp_adjust)
2177
{
2178
  int reg[128];
2179
 
2180
  memset (reg, 0, sizeof (reg));
2181
  for ( ; offset + 4 <= sec->size; offset += 4)
2182
    {
2183
      unsigned char buf[4];
2184
      int rt, ra;
2185
      int imm;
2186
 
2187
      /* Assume no relocs on stack adjusing insns.  */
2188
      if (!bfd_get_section_contents (sec->owner, sec, buf, offset, 4))
2189
        break;
2190
 
2191
      rt = buf[3] & 0x7f;
2192
      ra = ((buf[2] & 0x3f) << 1) | (buf[3] >> 7);
2193
 
2194
      if (buf[0] == 0x24 /* stqd */)
2195
        {
2196
          if (rt == 0 /* lr */ && ra == 1 /* sp */)
2197
            *lr_store = offset;
2198
          continue;
2199
        }
2200
 
2201
      /* Partly decoded immediate field.  */
2202
      imm = (buf[1] << 9) | (buf[2] << 1) | (buf[3] >> 7);
2203
 
2204
      if (buf[0] == 0x1c /* ai */)
2205
        {
2206
          imm >>= 7;
2207
          imm = (imm ^ 0x200) - 0x200;
2208
          reg[rt] = reg[ra] + imm;
2209
 
2210
          if (rt == 1 /* sp */)
2211
            {
2212
              if (reg[rt] > 0)
2213
                break;
2214
              *sp_adjust = offset;
2215
              return reg[rt];
2216
            }
2217
        }
2218
      else if (buf[0] == 0x18 && (buf[1] & 0xe0) == 0 /* a */)
2219
        {
2220
          int rb = ((buf[1] & 0x1f) << 2) | ((buf[2] & 0xc0) >> 6);
2221
 
2222
          reg[rt] = reg[ra] + reg[rb];
2223
          if (rt == 1)
2224
            {
2225
              if (reg[rt] > 0)
2226
                break;
2227
              *sp_adjust = offset;
2228
              return reg[rt];
2229
            }
2230
        }
2231
      else if (buf[0] == 0x08 && (buf[1] & 0xe0) == 0 /* sf */)
2232
        {
2233
          int rb = ((buf[1] & 0x1f) << 2) | ((buf[2] & 0xc0) >> 6);
2234
 
2235
          reg[rt] = reg[rb] - reg[ra];
2236
          if (rt == 1)
2237
            {
2238
              if (reg[rt] > 0)
2239
                break;
2240
              *sp_adjust = offset;
2241
              return reg[rt];
2242
            }
2243
        }
2244
      else if ((buf[0] & 0xfc) == 0x40 /* il, ilh, ilhu, ila */)
2245
        {
2246
          if (buf[0] >= 0x42 /* ila */)
2247
            imm |= (buf[0] & 1) << 17;
2248
          else
2249
            {
2250
              imm &= 0xffff;
2251
 
2252
              if (buf[0] == 0x40 /* il */)
2253
                {
2254
                  if ((buf[1] & 0x80) == 0)
2255
                    continue;
2256
                  imm = (imm ^ 0x8000) - 0x8000;
2257
                }
2258
              else if ((buf[1] & 0x80) == 0 /* ilhu */)
2259
                imm <<= 16;
2260
            }
2261
          reg[rt] = imm;
2262
          continue;
2263
        }
2264
      else if (buf[0] == 0x60 && (buf[1] & 0x80) != 0 /* iohl */)
2265
        {
2266
          reg[rt] |= imm & 0xffff;
2267
          continue;
2268
        }
2269
      else if (buf[0] == 0x04 /* ori */)
2270
        {
2271
          imm >>= 7;
2272
          imm = (imm ^ 0x200) - 0x200;
2273
          reg[rt] = reg[ra] | imm;
2274
          continue;
2275
        }
2276
      else if (buf[0] == 0x32 && (buf[1] & 0x80) != 0 /* fsmbi */)
2277
        {
2278
          reg[rt] = (  ((imm & 0x8000) ? 0xff000000 : 0)
2279
                     | ((imm & 0x4000) ? 0x00ff0000 : 0)
2280
                     | ((imm & 0x2000) ? 0x0000ff00 : 0)
2281
                     | ((imm & 0x1000) ? 0x000000ff : 0));
2282
          continue;
2283
        }
2284
      else if (buf[0] == 0x16 /* andbi */)
2285
        {
2286
          imm >>= 7;
2287
          imm &= 0xff;
2288
          imm |= imm << 8;
2289
          imm |= imm << 16;
2290
          reg[rt] = reg[ra] & imm;
2291
          continue;
2292
        }
2293
      else if (buf[0] == 0x33 && imm == 1 /* brsl .+4 */)
2294
        {
2295
          /* Used in pic reg load.  Say rt is trashed.  Won't be used
2296
             in stack adjust, but we need to continue past this branch.  */
2297
          reg[rt] = 0;
2298
          continue;
2299
        }
2300
      else if (is_branch (buf) || is_indirect_branch (buf))
2301
        /* If we hit a branch then we must be out of the prologue.  */
2302
        break;
2303
    }
2304
 
2305
  return 0;
2306
}
2307
 
2308
/* qsort predicate to sort symbols by section and value.  */
2309
 
2310
static Elf_Internal_Sym *sort_syms_syms;
2311
static asection **sort_syms_psecs;
2312
 
2313
static int
2314
sort_syms (const void *a, const void *b)
2315
{
2316
  Elf_Internal_Sym *const *s1 = a;
2317
  Elf_Internal_Sym *const *s2 = b;
2318
  asection *sec1,*sec2;
2319
  bfd_signed_vma delta;
2320
 
2321
  sec1 = sort_syms_psecs[*s1 - sort_syms_syms];
2322
  sec2 = sort_syms_psecs[*s2 - sort_syms_syms];
2323
 
2324
  if (sec1 != sec2)
2325
    return sec1->index - sec2->index;
2326
 
2327
  delta = (*s1)->st_value - (*s2)->st_value;
2328
  if (delta != 0)
2329
    return delta < 0 ? -1 : 1;
2330
 
2331
  delta = (*s2)->st_size - (*s1)->st_size;
2332
  if (delta != 0)
2333
    return delta < 0 ? -1 : 1;
2334
 
2335
  return *s1 < *s2 ? -1 : 1;
2336
}
2337
 
2338
/* Allocate a struct spu_elf_stack_info with MAX_FUN struct function_info
2339
   entries for section SEC.  */
2340
 
2341
static struct spu_elf_stack_info *
2342
alloc_stack_info (asection *sec, int max_fun)
2343
{
2344
  struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2345
  bfd_size_type amt;
2346
 
2347
  amt = sizeof (struct spu_elf_stack_info);
2348
  amt += (max_fun - 1) * sizeof (struct function_info);
2349
  sec_data->u.i.stack_info = bfd_zmalloc (amt);
2350
  if (sec_data->u.i.stack_info != NULL)
2351
    sec_data->u.i.stack_info->max_fun = max_fun;
2352
  return sec_data->u.i.stack_info;
2353
}
2354
 
2355
/* Add a new struct function_info describing a (part of a) function
2356
   starting at SYM_H.  Keep the array sorted by address.  */
2357
 
2358
static struct function_info *
2359
maybe_insert_function (asection *sec,
2360
                       void *sym_h,
2361
                       bfd_boolean global,
2362
                       bfd_boolean is_func)
2363
{
2364
  struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2365
  struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2366
  int i;
2367
  bfd_vma off, size;
2368
 
2369
  if (sinfo == NULL)
2370
    {
2371
      sinfo = alloc_stack_info (sec, 20);
2372
      if (sinfo == NULL)
2373
        return NULL;
2374
    }
2375
 
2376
  if (!global)
2377
    {
2378
      Elf_Internal_Sym *sym = sym_h;
2379
      off = sym->st_value;
2380
      size = sym->st_size;
2381
    }
2382
  else
2383
    {
2384
      struct elf_link_hash_entry *h = sym_h;
2385
      off = h->root.u.def.value;
2386
      size = h->size;
2387
    }
2388
 
2389
  for (i = sinfo->num_fun; --i >= 0; )
2390
    if (sinfo->fun[i].lo <= off)
2391
      break;
2392
 
2393
  if (i >= 0)
2394
    {
2395
      /* Don't add another entry for an alias, but do update some
2396
         info.  */
2397
      if (sinfo->fun[i].lo == off)
2398
        {
2399
          /* Prefer globals over local syms.  */
2400
          if (global && !sinfo->fun[i].global)
2401
            {
2402
              sinfo->fun[i].global = TRUE;
2403
              sinfo->fun[i].u.h = sym_h;
2404
            }
2405
          if (is_func)
2406
            sinfo->fun[i].is_func = TRUE;
2407
          return &sinfo->fun[i];
2408
        }
2409
      /* Ignore a zero-size symbol inside an existing function.  */
2410
      else if (sinfo->fun[i].hi > off && size == 0)
2411
        return &sinfo->fun[i];
2412
    }
2413
 
2414
  if (sinfo->num_fun >= sinfo->max_fun)
2415
    {
2416
      bfd_size_type amt = sizeof (struct spu_elf_stack_info);
2417
      bfd_size_type old = amt;
2418
 
2419
      old += (sinfo->max_fun - 1) * sizeof (struct function_info);
2420
      sinfo->max_fun += 20 + (sinfo->max_fun >> 1);
2421
      amt += (sinfo->max_fun - 1) * sizeof (struct function_info);
2422
      sinfo = bfd_realloc (sinfo, amt);
2423
      if (sinfo == NULL)
2424
        return NULL;
2425
      memset ((char *) sinfo + old, 0, amt - old);
2426
      sec_data->u.i.stack_info = sinfo;
2427
    }
2428
 
2429
  if (++i < sinfo->num_fun)
2430
    memmove (&sinfo->fun[i + 1], &sinfo->fun[i],
2431
             (sinfo->num_fun - i) * sizeof (sinfo->fun[i]));
2432
  sinfo->fun[i].is_func = is_func;
2433
  sinfo->fun[i].global = global;
2434
  sinfo->fun[i].sec = sec;
2435
  if (global)
2436
    sinfo->fun[i].u.h = sym_h;
2437
  else
2438
    sinfo->fun[i].u.sym = sym_h;
2439
  sinfo->fun[i].lo = off;
2440
  sinfo->fun[i].hi = off + size;
2441
  sinfo->fun[i].lr_store = -1;
2442
  sinfo->fun[i].sp_adjust = -1;
2443
  sinfo->fun[i].stack = -find_function_stack_adjust (sec, off,
2444
                                                     &sinfo->fun[i].lr_store,
2445
                                                     &sinfo->fun[i].sp_adjust);
2446
  sinfo->num_fun += 1;
2447
  return &sinfo->fun[i];
2448
}
2449
 
2450
/* Return the name of FUN.  */
2451
 
2452
static const char *
2453
func_name (struct function_info *fun)
2454
{
2455
  asection *sec;
2456
  bfd *ibfd;
2457
  Elf_Internal_Shdr *symtab_hdr;
2458
 
2459
  while (fun->start != NULL)
2460
    fun = fun->start;
2461
 
2462
  if (fun->global)
2463
    return fun->u.h->root.root.string;
2464
 
2465
  sec = fun->sec;
2466
  if (fun->u.sym->st_name == 0)
2467
    {
2468
      size_t len = strlen (sec->name);
2469
      char *name = bfd_malloc (len + 10);
2470
      if (name == NULL)
2471
        return "(null)";
2472
      sprintf (name, "%s+%lx", sec->name,
2473
               (unsigned long) fun->u.sym->st_value & 0xffffffff);
2474
      return name;
2475
    }
2476
  ibfd = sec->owner;
2477
  symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2478
  return bfd_elf_sym_name (ibfd, symtab_hdr, fun->u.sym, sec);
2479
}
2480
 
2481
/* Read the instruction at OFF in SEC.  Return true iff the instruction
2482
   is a nop, lnop, or stop 0 (all zero insn).  */
2483
 
2484
static bfd_boolean
2485
is_nop (asection *sec, bfd_vma off)
2486
{
2487
  unsigned char insn[4];
2488
 
2489
  if (off + 4 > sec->size
2490
      || !bfd_get_section_contents (sec->owner, sec, insn, off, 4))
2491
    return FALSE;
2492
  if ((insn[0] & 0xbf) == 0 && (insn[1] & 0xe0) == 0x20)
2493
    return TRUE;
2494
  if (insn[0] == 0 && insn[1] == 0 && insn[2] == 0 && insn[3] == 0)
2495
    return TRUE;
2496
  return FALSE;
2497
}
2498
 
2499
/* Extend the range of FUN to cover nop padding up to LIMIT.
2500
   Return TRUE iff some instruction other than a NOP was found.  */
2501
 
2502
static bfd_boolean
2503
insns_at_end (struct function_info *fun, bfd_vma limit)
2504
{
2505
  bfd_vma off = (fun->hi + 3) & -4;
2506
 
2507
  while (off < limit && is_nop (fun->sec, off))
2508
    off += 4;
2509
  if (off < limit)
2510
    {
2511
      fun->hi = off;
2512
      return TRUE;
2513
    }
2514
  fun->hi = limit;
2515
  return FALSE;
2516
}
2517
 
2518
/* Check and fix overlapping function ranges.  Return TRUE iff there
2519
   are gaps in the current info we have about functions in SEC.  */
2520
 
2521
static bfd_boolean
2522
check_function_ranges (asection *sec, struct bfd_link_info *info)
2523
{
2524
  struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2525
  struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2526
  int i;
2527
  bfd_boolean gaps = FALSE;
2528
 
2529
  if (sinfo == NULL)
2530
    return FALSE;
2531
 
2532
  for (i = 1; i < sinfo->num_fun; i++)
2533
    if (sinfo->fun[i - 1].hi > sinfo->fun[i].lo)
2534
      {
2535
        /* Fix overlapping symbols.  */
2536
        const char *f1 = func_name (&sinfo->fun[i - 1]);
2537
        const char *f2 = func_name (&sinfo->fun[i]);
2538
 
2539
        info->callbacks->einfo (_("warning: %s overlaps %s\n"), f1, f2);
2540
        sinfo->fun[i - 1].hi = sinfo->fun[i].lo;
2541
      }
2542
    else if (insns_at_end (&sinfo->fun[i - 1], sinfo->fun[i].lo))
2543
      gaps = TRUE;
2544
 
2545
  if (sinfo->num_fun == 0)
2546
    gaps = TRUE;
2547
  else
2548
    {
2549
      if (sinfo->fun[0].lo != 0)
2550
        gaps = TRUE;
2551
      if (sinfo->fun[sinfo->num_fun - 1].hi > sec->size)
2552
        {
2553
          const char *f1 = func_name (&sinfo->fun[sinfo->num_fun - 1]);
2554
 
2555
          info->callbacks->einfo (_("warning: %s exceeds section size\n"), f1);
2556
          sinfo->fun[sinfo->num_fun - 1].hi = sec->size;
2557
        }
2558
      else if (insns_at_end (&sinfo->fun[sinfo->num_fun - 1], sec->size))
2559
        gaps = TRUE;
2560
    }
2561
  return gaps;
2562
}
2563
 
2564
/* Search current function info for a function that contains address
2565
   OFFSET in section SEC.  */
2566
 
2567
static struct function_info *
2568
find_function (asection *sec, bfd_vma offset, struct bfd_link_info *info)
2569
{
2570
  struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2571
  struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2572
  int lo, hi, mid;
2573
 
2574
  lo = 0;
2575
  hi = sinfo->num_fun;
2576
  while (lo < hi)
2577
    {
2578
      mid = (lo + hi) / 2;
2579
      if (offset < sinfo->fun[mid].lo)
2580
        hi = mid;
2581
      else if (offset >= sinfo->fun[mid].hi)
2582
        lo = mid + 1;
2583
      else
2584
        return &sinfo->fun[mid];
2585
    }
2586
  info->callbacks->einfo (_("%A:0x%v not found in function table\n"),
2587
                          sec, offset);
2588
  bfd_set_error (bfd_error_bad_value);
2589
  return NULL;
2590
}
2591
 
2592
/* Add CALLEE to CALLER call list if not already present.  Return TRUE
2593
   if CALLEE was new.  If this function return FALSE, CALLEE should
2594
   be freed.  */
2595
 
2596
static bfd_boolean
2597
insert_callee (struct function_info *caller, struct call_info *callee)
2598
{
2599
  struct call_info **pp, *p;
2600
 
2601
  for (pp = &caller->call_list; (p = *pp) != NULL; pp = &p->next)
2602
    if (p->fun == callee->fun)
2603
      {
2604
        /* Tail calls use less stack than normal calls.  Retain entry
2605
           for normal call over one for tail call.  */
2606
        p->is_tail &= callee->is_tail;
2607
        if (!p->is_tail)
2608
          {
2609
            p->fun->start = NULL;
2610
            p->fun->is_func = TRUE;
2611
          }
2612
        p->count += callee->count;
2613
        /* Reorder list so most recent call is first.  */
2614
        *pp = p->next;
2615
        p->next = caller->call_list;
2616
        caller->call_list = p;
2617
        return FALSE;
2618
      }
2619
  callee->next = caller->call_list;
2620
  caller->call_list = callee;
2621
  return TRUE;
2622
}
2623
 
2624
/* Copy CALL and insert the copy into CALLER.  */
2625
 
2626
static bfd_boolean
2627
copy_callee (struct function_info *caller, const struct call_info *call)
2628
{
2629
  struct call_info *callee;
2630
  callee = bfd_malloc (sizeof (*callee));
2631
  if (callee == NULL)
2632
    return FALSE;
2633
  *callee = *call;
2634
  if (!insert_callee (caller, callee))
2635
    free (callee);
2636
  return TRUE;
2637
}
2638
 
2639
/* We're only interested in code sections.  Testing SEC_IN_MEMORY excludes
2640
   overlay stub sections.  */
2641
 
2642
static bfd_boolean
2643
interesting_section (asection *s)
2644
{
2645
  return (s->output_section != bfd_abs_section_ptr
2646
          && ((s->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_IN_MEMORY))
2647
              == (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2648
          && s->size != 0);
2649
}
2650
 
2651
/* Rummage through the relocs for SEC, looking for function calls.
2652
   If CALL_TREE is true, fill in call graph.  If CALL_TREE is false,
2653
   mark destination symbols on calls as being functions.  Also
2654
   look at branches, which may be tail calls or go to hot/cold
2655
   section part of same function.  */
2656
 
2657
static bfd_boolean
2658
mark_functions_via_relocs (asection *sec,
2659
                           struct bfd_link_info *info,
2660
                           int call_tree)
2661
{
2662
  Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2663
  Elf_Internal_Shdr *symtab_hdr;
2664
  void *psyms;
2665
  unsigned int priority = 0;
2666
  static bfd_boolean warned;
2667
 
2668
  if (!interesting_section (sec)
2669
      || sec->reloc_count == 0)
2670
    return TRUE;
2671
 
2672
  internal_relocs = _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL,
2673
                                               info->keep_memory);
2674
  if (internal_relocs == NULL)
2675
    return FALSE;
2676
 
2677
  symtab_hdr = &elf_tdata (sec->owner)->symtab_hdr;
2678
  psyms = &symtab_hdr->contents;
2679
  irela = internal_relocs;
2680
  irelaend = irela + sec->reloc_count;
2681
  for (; irela < irelaend; irela++)
2682
    {
2683
      enum elf_spu_reloc_type r_type;
2684
      unsigned int r_indx;
2685
      asection *sym_sec;
2686
      Elf_Internal_Sym *sym;
2687
      struct elf_link_hash_entry *h;
2688
      bfd_vma val;
2689
      bfd_boolean nonbranch, is_call;
2690
      struct function_info *caller;
2691
      struct call_info *callee;
2692
 
2693
      r_type = ELF32_R_TYPE (irela->r_info);
2694
      nonbranch = r_type != R_SPU_REL16 && r_type != R_SPU_ADDR16;
2695
 
2696
      r_indx = ELF32_R_SYM (irela->r_info);
2697
      if (!get_sym_h (&h, &sym, &sym_sec, psyms, r_indx, sec->owner))
2698
        return FALSE;
2699
 
2700
      if (sym_sec == NULL
2701
          || sym_sec->output_section == bfd_abs_section_ptr)
2702
        continue;
2703
 
2704
      is_call = FALSE;
2705
      if (!nonbranch)
2706
        {
2707
          unsigned char insn[4];
2708
 
2709
          if (!bfd_get_section_contents (sec->owner, sec, insn,
2710
                                         irela->r_offset, 4))
2711
            return FALSE;
2712
          if (is_branch (insn))
2713
            {
2714
              is_call = (insn[0] & 0xfd) == 0x31;
2715
              priority = insn[1] & 0x0f;
2716
              priority <<= 8;
2717
              priority |= insn[2];
2718
              priority <<= 8;
2719
              priority |= insn[3];
2720
              priority >>= 7;
2721
              if ((sym_sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2722
                  != (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2723
                {
2724
                  if (!warned)
2725
                    info->callbacks->einfo
2726
                      (_("%B(%A+0x%v): call to non-code section"
2727
                         " %B(%A), analysis incomplete\n"),
2728
                       sec->owner, sec, irela->r_offset,
2729
                       sym_sec->owner, sym_sec);
2730
                  warned = TRUE;
2731
                  continue;
2732
                }
2733
            }
2734
          else
2735
            {
2736
              nonbranch = TRUE;
2737
              if (is_hint (insn))
2738
                continue;
2739
            }
2740
        }
2741
 
2742
      if (nonbranch)
2743
        {
2744
          /* For --auto-overlay, count possible stubs we need for
2745
             function pointer references.  */
2746
          unsigned int sym_type;
2747
          if (h)
2748
            sym_type = h->type;
2749
          else
2750
            sym_type = ELF_ST_TYPE (sym->st_info);
2751
          if (sym_type == STT_FUNC)
2752
            {
2753
              if (call_tree && spu_hash_table (info)->params->auto_overlay)
2754
                spu_hash_table (info)->non_ovly_stub += 1;
2755
              /* If the symbol type is STT_FUNC then this must be a
2756
                 function pointer initialisation.  */
2757
              continue;
2758
            }
2759
          /* Ignore data references.  */
2760
          if ((sym_sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2761
              != (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2762
            continue;
2763
          /* Otherwise we probably have a jump table reloc for
2764
             a switch statement or some other reference to a
2765
             code label.  */
2766
        }
2767
 
2768
      if (h)
2769
        val = h->root.u.def.value;
2770
      else
2771
        val = sym->st_value;
2772
      val += irela->r_addend;
2773
 
2774
      if (!call_tree)
2775
        {
2776
          struct function_info *fun;
2777
 
2778
          if (irela->r_addend != 0)
2779
            {
2780
              Elf_Internal_Sym *fake = bfd_zmalloc (sizeof (*fake));
2781
              if (fake == NULL)
2782
                return FALSE;
2783
              fake->st_value = val;
2784
              fake->st_shndx
2785
                = _bfd_elf_section_from_bfd_section (sym_sec->owner, sym_sec);
2786
              sym = fake;
2787
            }
2788
          if (sym)
2789
            fun = maybe_insert_function (sym_sec, sym, FALSE, is_call);
2790
          else
2791
            fun = maybe_insert_function (sym_sec, h, TRUE, is_call);
2792
          if (fun == NULL)
2793
            return FALSE;
2794
          if (irela->r_addend != 0
2795
              && fun->u.sym != sym)
2796
            free (sym);
2797
          continue;
2798
        }
2799
 
2800
      caller = find_function (sec, irela->r_offset, info);
2801
      if (caller == NULL)
2802
        return FALSE;
2803
      callee = bfd_malloc (sizeof *callee);
2804
      if (callee == NULL)
2805
        return FALSE;
2806
 
2807
      callee->fun = find_function (sym_sec, val, info);
2808
      if (callee->fun == NULL)
2809
        return FALSE;
2810
      callee->is_tail = !is_call;
2811
      callee->is_pasted = FALSE;
2812
      callee->broken_cycle = FALSE;
2813
      callee->priority = priority;
2814
      callee->count = nonbranch? 0 : 1;
2815
      if (callee->fun->last_caller != sec)
2816
        {
2817
          callee->fun->last_caller = sec;
2818
          callee->fun->call_count += 1;
2819
        }
2820
      if (!insert_callee (caller, callee))
2821
        free (callee);
2822
      else if (!is_call
2823
               && !callee->fun->is_func
2824
               && callee->fun->stack == 0)
2825
        {
2826
          /* This is either a tail call or a branch from one part of
2827
             the function to another, ie. hot/cold section.  If the
2828
             destination has been called by some other function then
2829
             it is a separate function.  We also assume that functions
2830
             are not split across input files.  */
2831
          if (sec->owner != sym_sec->owner)
2832
            {
2833
              callee->fun->start = NULL;
2834
              callee->fun->is_func = TRUE;
2835
            }
2836
          else if (callee->fun->start == NULL)
2837
            {
2838
              struct function_info *caller_start = caller;
2839
              while (caller_start->start)
2840
                caller_start = caller_start->start;
2841
 
2842
              if (caller_start != callee->fun)
2843
                callee->fun->start = caller_start;
2844
            }
2845
          else
2846
            {
2847
              struct function_info *callee_start;
2848
              struct function_info *caller_start;
2849
              callee_start = callee->fun;
2850
              while (callee_start->start)
2851
                callee_start = callee_start->start;
2852
              caller_start = caller;
2853
              while (caller_start->start)
2854
                caller_start = caller_start->start;
2855
              if (caller_start != callee_start)
2856
                {
2857
                  callee->fun->start = NULL;
2858
                  callee->fun->is_func = TRUE;
2859
                }
2860
            }
2861
        }
2862
    }
2863
 
2864
  return TRUE;
2865
}
2866
 
2867
/* Handle something like .init or .fini, which has a piece of a function.
2868
   These sections are pasted together to form a single function.  */
2869
 
2870
static bfd_boolean
2871
pasted_function (asection *sec)
2872
{
2873
  struct bfd_link_order *l;
2874
  struct _spu_elf_section_data *sec_data;
2875
  struct spu_elf_stack_info *sinfo;
2876
  Elf_Internal_Sym *fake;
2877
  struct function_info *fun, *fun_start;
2878
 
2879
  fake = bfd_zmalloc (sizeof (*fake));
2880
  if (fake == NULL)
2881
    return FALSE;
2882
  fake->st_value = 0;
2883
  fake->st_size = sec->size;
2884
  fake->st_shndx
2885
    = _bfd_elf_section_from_bfd_section (sec->owner, sec);
2886
  fun = maybe_insert_function (sec, fake, FALSE, FALSE);
2887
  if (!fun)
2888
    return FALSE;
2889
 
2890
  /* Find a function immediately preceding this section.  */
2891
  fun_start = NULL;
2892
  for (l = sec->output_section->map_head.link_order; l != NULL; l = l->next)
2893
    {
2894
      if (l->u.indirect.section == sec)
2895
        {
2896
          if (fun_start != NULL)
2897
            {
2898
              struct call_info *callee = bfd_malloc (sizeof *callee);
2899
              if (callee == NULL)
2900
                return FALSE;
2901
 
2902
              fun->start = fun_start;
2903
              callee->fun = fun;
2904
              callee->is_tail = TRUE;
2905
              callee->is_pasted = TRUE;
2906
              callee->broken_cycle = FALSE;
2907
              callee->priority = 0;
2908
              callee->count = 1;
2909
              if (!insert_callee (fun_start, callee))
2910
                free (callee);
2911
              return TRUE;
2912
            }
2913
          break;
2914
        }
2915
      if (l->type == bfd_indirect_link_order
2916
          && (sec_data = spu_elf_section_data (l->u.indirect.section)) != NULL
2917
          && (sinfo = sec_data->u.i.stack_info) != NULL
2918
          && sinfo->num_fun != 0)
2919
        fun_start = &sinfo->fun[sinfo->num_fun - 1];
2920
    }
2921
 
2922
  /* Don't return an error if we did not find a function preceding this
2923
     section.  The section may have incorrect flags.  */
2924
  return TRUE;
2925
}
2926
 
2927
/* Map address ranges in code sections to functions.  */
2928
 
2929
static bfd_boolean
2930
discover_functions (struct bfd_link_info *info)
2931
{
2932
  bfd *ibfd;
2933
  int bfd_idx;
2934
  Elf_Internal_Sym ***psym_arr;
2935
  asection ***sec_arr;
2936
  bfd_boolean gaps = FALSE;
2937
 
2938
  bfd_idx = 0;
2939
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2940
    bfd_idx++;
2941
 
2942
  psym_arr = bfd_zmalloc (bfd_idx * sizeof (*psym_arr));
2943
  if (psym_arr == NULL)
2944
    return FALSE;
2945
  sec_arr = bfd_zmalloc (bfd_idx * sizeof (*sec_arr));
2946
  if (sec_arr == NULL)
2947
    return FALSE;
2948
 
2949
  for (ibfd = info->input_bfds, bfd_idx = 0;
2950
       ibfd != NULL;
2951
       ibfd = ibfd->link_next, bfd_idx++)
2952
    {
2953
      extern const bfd_target bfd_elf32_spu_vec;
2954
      Elf_Internal_Shdr *symtab_hdr;
2955
      asection *sec;
2956
      size_t symcount;
2957
      Elf_Internal_Sym *syms, *sy, **psyms, **psy;
2958
      asection **psecs, **p;
2959
 
2960
      if (ibfd->xvec != &bfd_elf32_spu_vec)
2961
        continue;
2962
 
2963
      /* Read all the symbols.  */
2964
      symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2965
      symcount = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
2966
      if (symcount == 0)
2967
        {
2968
          if (!gaps)
2969
            for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
2970
              if (interesting_section (sec))
2971
                {
2972
                  gaps = TRUE;
2973
                  break;
2974
                }
2975
          continue;
2976
        }
2977
 
2978
      if (symtab_hdr->contents != NULL)
2979
        {
2980
          /* Don't use cached symbols since the generic ELF linker
2981
             code only reads local symbols, and we need globals too.  */
2982
          free (symtab_hdr->contents);
2983
          symtab_hdr->contents = NULL;
2984
        }
2985
      syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, symcount, 0,
2986
                                   NULL, NULL, NULL);
2987
      symtab_hdr->contents = (void *) syms;
2988
      if (syms == NULL)
2989
        return FALSE;
2990
 
2991
      /* Select defined function symbols that are going to be output.  */
2992
      psyms = bfd_malloc ((symcount + 1) * sizeof (*psyms));
2993
      if (psyms == NULL)
2994
        return FALSE;
2995
      psym_arr[bfd_idx] = psyms;
2996
      psecs = bfd_malloc (symcount * sizeof (*psecs));
2997
      if (psecs == NULL)
2998
        return FALSE;
2999
      sec_arr[bfd_idx] = psecs;
3000
      for (psy = psyms, p = psecs, sy = syms; sy < syms + symcount; ++p, ++sy)
3001
        if (ELF_ST_TYPE (sy->st_info) == STT_NOTYPE
3002
            || ELF_ST_TYPE (sy->st_info) == STT_FUNC)
3003
          {
3004
            asection *s;
3005
 
3006
            *p = s = bfd_section_from_elf_index (ibfd, sy->st_shndx);
3007
            if (s != NULL && interesting_section (s))
3008
              *psy++ = sy;
3009
          }
3010
      symcount = psy - psyms;
3011
      *psy = NULL;
3012
 
3013
      /* Sort them by section and offset within section.  */
3014
      sort_syms_syms = syms;
3015
      sort_syms_psecs = psecs;
3016
      qsort (psyms, symcount, sizeof (*psyms), sort_syms);
3017
 
3018
      /* Now inspect the function symbols.  */
3019
      for (psy = psyms; psy < psyms + symcount; )
3020
        {
3021
          asection *s = psecs[*psy - syms];
3022
          Elf_Internal_Sym **psy2;
3023
 
3024
          for (psy2 = psy; ++psy2 < psyms + symcount; )
3025
            if (psecs[*psy2 - syms] != s)
3026
              break;
3027
 
3028
          if (!alloc_stack_info (s, psy2 - psy))
3029
            return FALSE;
3030
          psy = psy2;
3031
        }
3032
 
3033
      /* First install info about properly typed and sized functions.
3034
         In an ideal world this will cover all code sections, except
3035
         when partitioning functions into hot and cold sections,
3036
         and the horrible pasted together .init and .fini functions.  */
3037
      for (psy = psyms; psy < psyms + symcount; ++psy)
3038
        {
3039
          sy = *psy;
3040
          if (ELF_ST_TYPE (sy->st_info) == STT_FUNC)
3041
            {
3042
              asection *s = psecs[sy - syms];
3043
              if (!maybe_insert_function (s, sy, FALSE, TRUE))
3044
                return FALSE;
3045
            }
3046
        }
3047
 
3048
      for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
3049
        if (interesting_section (sec))
3050
          gaps |= check_function_ranges (sec, info);
3051
    }
3052
 
3053
  if (gaps)
3054
    {
3055
      /* See if we can discover more function symbols by looking at
3056
         relocations.  */
3057
      for (ibfd = info->input_bfds, bfd_idx = 0;
3058
           ibfd != NULL;
3059
           ibfd = ibfd->link_next, bfd_idx++)
3060
        {
3061
          asection *sec;
3062
 
3063
          if (psym_arr[bfd_idx] == NULL)
3064
            continue;
3065
 
3066
          for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3067
            if (!mark_functions_via_relocs (sec, info, FALSE))
3068
              return FALSE;
3069
        }
3070
 
3071
      for (ibfd = info->input_bfds, bfd_idx = 0;
3072
           ibfd != NULL;
3073
           ibfd = ibfd->link_next, bfd_idx++)
3074
        {
3075
          Elf_Internal_Shdr *symtab_hdr;
3076
          asection *sec;
3077
          Elf_Internal_Sym *syms, *sy, **psyms, **psy;
3078
          asection **psecs;
3079
 
3080
          if ((psyms = psym_arr[bfd_idx]) == NULL)
3081
            continue;
3082
 
3083
          psecs = sec_arr[bfd_idx];
3084
 
3085
          symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3086
          syms = (Elf_Internal_Sym *) symtab_hdr->contents;
3087
 
3088
          gaps = FALSE;
3089
          for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
3090
            if (interesting_section (sec))
3091
              gaps |= check_function_ranges (sec, info);
3092
          if (!gaps)
3093
            continue;
3094
 
3095
          /* Finally, install all globals.  */
3096
          for (psy = psyms; (sy = *psy) != NULL; ++psy)
3097
            {
3098
              asection *s;
3099
 
3100
              s = psecs[sy - syms];
3101
 
3102
              /* Global syms might be improperly typed functions.  */
3103
              if (ELF_ST_TYPE (sy->st_info) != STT_FUNC
3104
                  && ELF_ST_BIND (sy->st_info) == STB_GLOBAL)
3105
                {
3106
                  if (!maybe_insert_function (s, sy, FALSE, FALSE))
3107
                    return FALSE;
3108
                }
3109
            }
3110
        }
3111
 
3112
      for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3113
        {
3114
          extern const bfd_target bfd_elf32_spu_vec;
3115
          asection *sec;
3116
 
3117
          if (ibfd->xvec != &bfd_elf32_spu_vec)
3118
            continue;
3119
 
3120
          /* Some of the symbols we've installed as marking the
3121
             beginning of functions may have a size of zero.  Extend
3122
             the range of such functions to the beginning of the
3123
             next symbol of interest.  */
3124
          for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3125
            if (interesting_section (sec))
3126
              {
3127
                struct _spu_elf_section_data *sec_data;
3128
                struct spu_elf_stack_info *sinfo;
3129
 
3130
                sec_data = spu_elf_section_data (sec);
3131
                sinfo = sec_data->u.i.stack_info;
3132
                if (sinfo != NULL && sinfo->num_fun != 0)
3133
                  {
3134
                    int fun_idx;
3135
                    bfd_vma hi = sec->size;
3136
 
3137
                    for (fun_idx = sinfo->num_fun; --fun_idx >= 0; )
3138
                      {
3139
                        sinfo->fun[fun_idx].hi = hi;
3140
                        hi = sinfo->fun[fun_idx].lo;
3141
                      }
3142
 
3143
                    sinfo->fun[0].lo = 0;
3144
                  }
3145
                /* No symbols in this section.  Must be .init or .fini
3146
                   or something similar.  */
3147
                else if (!pasted_function (sec))
3148
                  return FALSE;
3149
              }
3150
        }
3151
    }
3152
 
3153
  for (ibfd = info->input_bfds, bfd_idx = 0;
3154
       ibfd != NULL;
3155
       ibfd = ibfd->link_next, bfd_idx++)
3156
    {
3157
      if (psym_arr[bfd_idx] == NULL)
3158
        continue;
3159
 
3160
      free (psym_arr[bfd_idx]);
3161
      free (sec_arr[bfd_idx]);
3162
    }
3163
 
3164
  free (psym_arr);
3165
  free (sec_arr);
3166
 
3167
  return TRUE;
3168
}
3169
 
3170
/* Iterate over all function_info we have collected, calling DOIT on
3171
   each node if ROOT_ONLY is false.  Only call DOIT on root nodes
3172
   if ROOT_ONLY.  */
3173
 
3174
static bfd_boolean
3175
for_each_node (bfd_boolean (*doit) (struct function_info *,
3176
                                    struct bfd_link_info *,
3177
                                    void *),
3178
               struct bfd_link_info *info,
3179
               void *param,
3180
               int root_only)
3181
{
3182
  bfd *ibfd;
3183
 
3184
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3185
    {
3186
      extern const bfd_target bfd_elf32_spu_vec;
3187
      asection *sec;
3188
 
3189
      if (ibfd->xvec != &bfd_elf32_spu_vec)
3190
        continue;
3191
 
3192
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3193
        {
3194
          struct _spu_elf_section_data *sec_data;
3195
          struct spu_elf_stack_info *sinfo;
3196
 
3197
          if ((sec_data = spu_elf_section_data (sec)) != NULL
3198
              && (sinfo = sec_data->u.i.stack_info) != NULL)
3199
            {
3200
              int i;
3201
              for (i = 0; i < sinfo->num_fun; ++i)
3202
                if (!root_only || !sinfo->fun[i].non_root)
3203
                  if (!doit (&sinfo->fun[i], info, param))
3204
                    return FALSE;
3205
            }
3206
        }
3207
    }
3208
  return TRUE;
3209
}
3210
 
3211
/* Transfer call info attached to struct function_info entries for
3212
   all of a given function's sections to the first entry.  */
3213
 
3214
static bfd_boolean
3215
transfer_calls (struct function_info *fun,
3216
                struct bfd_link_info *info ATTRIBUTE_UNUSED,
3217
                void *param ATTRIBUTE_UNUSED)
3218
{
3219
  struct function_info *start = fun->start;
3220
 
3221
  if (start != NULL)
3222
    {
3223
      struct call_info *call, *call_next;
3224
 
3225
      while (start->start != NULL)
3226
        start = start->start;
3227
      for (call = fun->call_list; call != NULL; call = call_next)
3228
        {
3229
          call_next = call->next;
3230
          if (!insert_callee (start, call))
3231
            free (call);
3232
        }
3233
      fun->call_list = NULL;
3234
    }
3235
  return TRUE;
3236
}
3237
 
3238
/* Mark nodes in the call graph that are called by some other node.  */
3239
 
3240
static bfd_boolean
3241
mark_non_root (struct function_info *fun,
3242
               struct bfd_link_info *info ATTRIBUTE_UNUSED,
3243
               void *param ATTRIBUTE_UNUSED)
3244
{
3245
  struct call_info *call;
3246
 
3247
  if (fun->visit1)
3248
    return TRUE;
3249
  fun->visit1 = TRUE;
3250
  for (call = fun->call_list; call; call = call->next)
3251
    {
3252
      call->fun->non_root = TRUE;
3253
      mark_non_root (call->fun, 0, 0);
3254
    }
3255
  return TRUE;
3256
}
3257
 
3258
/* Remove cycles from the call graph.  Set depth of nodes.  */
3259
 
3260
static bfd_boolean
3261
remove_cycles (struct function_info *fun,
3262
               struct bfd_link_info *info,
3263
               void *param)
3264
{
3265
  struct call_info **callp, *call;
3266
  unsigned int depth = *(unsigned int *) param;
3267
  unsigned int max_depth = depth;
3268
 
3269
  fun->depth = depth;
3270
  fun->visit2 = TRUE;
3271
  fun->marking = TRUE;
3272
 
3273
  callp = &fun->call_list;
3274
  while ((call = *callp) != NULL)
3275
    {
3276
      call->max_depth = depth + !call->is_pasted;
3277
      if (!call->fun->visit2)
3278
        {
3279
          if (!remove_cycles (call->fun, info, &call->max_depth))
3280
            return FALSE;
3281
          if (max_depth < call->max_depth)
3282
            max_depth = call->max_depth;
3283
        }
3284
      else if (call->fun->marking)
3285
        {
3286
          struct spu_link_hash_table *htab = spu_hash_table (info);
3287
 
3288
          if (!htab->params->auto_overlay
3289
              && htab->params->stack_analysis)
3290
            {
3291
              const char *f1 = func_name (fun);
3292
              const char *f2 = func_name (call->fun);
3293
 
3294
              info->callbacks->info (_("Stack analysis will ignore the call "
3295
                                       "from %s to %s\n"),
3296
                                     f1, f2);
3297
            }
3298
 
3299
          call->broken_cycle = TRUE;
3300
        }
3301
      callp = &call->next;
3302
    }
3303
  fun->marking = FALSE;
3304
  *(unsigned int *) param = max_depth;
3305
  return TRUE;
3306
}
3307
 
3308
/* Check that we actually visited all nodes in remove_cycles.  If we
3309
   didn't, then there is some cycle in the call graph not attached to
3310
   any root node.  Arbitrarily choose a node in the cycle as a new
3311
   root and break the cycle.  */
3312
 
3313
static bfd_boolean
3314
mark_detached_root (struct function_info *fun,
3315
                    struct bfd_link_info *info,
3316
                    void *param)
3317
{
3318
  if (fun->visit2)
3319
    return TRUE;
3320
  fun->non_root = FALSE;
3321
  *(unsigned int *) param = 0;
3322
  return remove_cycles (fun, info, param);
3323
}
3324
 
3325
/* Populate call_list for each function.  */
3326
 
3327
static bfd_boolean
3328
build_call_tree (struct bfd_link_info *info)
3329
{
3330
  bfd *ibfd;
3331
  unsigned int depth;
3332
 
3333
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3334
    {
3335
      extern const bfd_target bfd_elf32_spu_vec;
3336
      asection *sec;
3337
 
3338
      if (ibfd->xvec != &bfd_elf32_spu_vec)
3339
        continue;
3340
 
3341
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3342
        if (!mark_functions_via_relocs (sec, info, TRUE))
3343
          return FALSE;
3344
    }
3345
 
3346
  /* Transfer call info from hot/cold section part of function
3347
     to main entry.  */
3348
  if (!spu_hash_table (info)->params->auto_overlay
3349
      && !for_each_node (transfer_calls, info, 0, FALSE))
3350
    return FALSE;
3351
 
3352
  /* Find the call graph root(s).  */
3353
  if (!for_each_node (mark_non_root, info, 0, FALSE))
3354
    return FALSE;
3355
 
3356
  /* Remove cycles from the call graph.  We start from the root node(s)
3357
     so that we break cycles in a reasonable place.  */
3358
  depth = 0;
3359
  if (!for_each_node (remove_cycles, info, &depth, TRUE))
3360
    return FALSE;
3361
 
3362
  return for_each_node (mark_detached_root, info, &depth, FALSE);
3363
}
3364
 
3365
/* qsort predicate to sort calls by priority, max_depth then count.  */
3366
 
3367
static int
3368
sort_calls (const void *a, const void *b)
3369
{
3370
  struct call_info *const *c1 = a;
3371
  struct call_info *const *c2 = b;
3372
  int delta;
3373
 
3374
  delta = (*c2)->priority - (*c1)->priority;
3375
  if (delta != 0)
3376
    return delta;
3377
 
3378
  delta = (*c2)->max_depth - (*c1)->max_depth;
3379
  if (delta != 0)
3380
    return delta;
3381
 
3382
  delta = (*c2)->count - (*c1)->count;
3383
  if (delta != 0)
3384
    return delta;
3385
 
3386
  return (char *) c1 - (char *) c2;
3387
}
3388
 
3389
struct _mos_param {
3390
  unsigned int max_overlay_size;
3391
};
3392
 
3393
/* Set linker_mark and gc_mark on any sections that we will put in
3394
   overlays.  These flags are used by the generic ELF linker, but we
3395
   won't be continuing on to bfd_elf_final_link so it is OK to use
3396
   them.  linker_mark is clear before we get here.  Set segment_mark
3397
   on sections that are part of a pasted function (excluding the last
3398
   section).
3399
 
3400
   Set up function rodata section if --overlay-rodata.  We don't
3401
   currently include merged string constant rodata sections since
3402
 
3403
   Sort the call graph so that the deepest nodes will be visited
3404
   first.  */
3405
 
3406
static bfd_boolean
3407
mark_overlay_section (struct function_info *fun,
3408
                      struct bfd_link_info *info,
3409
                      void *param)
3410
{
3411
  struct call_info *call;
3412
  unsigned int count;
3413
  struct _mos_param *mos_param = param;
3414
  struct spu_link_hash_table *htab = spu_hash_table (info);
3415
 
3416
  if (fun->visit4)
3417
    return TRUE;
3418
 
3419
  fun->visit4 = TRUE;
3420
  if (!fun->sec->linker_mark
3421
      && (htab->params->ovly_flavour != ovly_soft_icache
3422
          || htab->params->non_ia_text
3423
          || strncmp (fun->sec->name, ".text.ia.", 9) == 0
3424
          || strcmp (fun->sec->name, ".init") == 0
3425
          || strcmp (fun->sec->name, ".fini") == 0))
3426
    {
3427
      unsigned int size;
3428
 
3429
      fun->sec->linker_mark = 1;
3430
      fun->sec->gc_mark = 1;
3431
      fun->sec->segment_mark = 0;
3432
      /* Ensure SEC_CODE is set on this text section (it ought to
3433
         be!), and SEC_CODE is clear on rodata sections.  We use
3434
         this flag to differentiate the two overlay section types.  */
3435
      fun->sec->flags |= SEC_CODE;
3436
 
3437
      size = fun->sec->size;
3438
      if (htab->params->auto_overlay & OVERLAY_RODATA)
3439
        {
3440
          char *name = NULL;
3441
 
3442
          /* Find the rodata section corresponding to this function's
3443
             text section.  */
3444
          if (strcmp (fun->sec->name, ".text") == 0)
3445
            {
3446
              name = bfd_malloc (sizeof (".rodata"));
3447
              if (name == NULL)
3448
                return FALSE;
3449
              memcpy (name, ".rodata", sizeof (".rodata"));
3450
            }
3451
          else if (strncmp (fun->sec->name, ".text.", 6) == 0)
3452
            {
3453
              size_t len = strlen (fun->sec->name);
3454
              name = bfd_malloc (len + 3);
3455
              if (name == NULL)
3456
                return FALSE;
3457
              memcpy (name, ".rodata", sizeof (".rodata"));
3458
              memcpy (name + 7, fun->sec->name + 5, len - 4);
3459
            }
3460
          else if (strncmp (fun->sec->name, ".gnu.linkonce.t.", 16) == 0)
3461
            {
3462
              size_t len = strlen (fun->sec->name) + 1;
3463
              name = bfd_malloc (len);
3464
              if (name == NULL)
3465
                return FALSE;
3466
              memcpy (name, fun->sec->name, len);
3467
              name[14] = 'r';
3468
            }
3469
 
3470
          if (name != NULL)
3471
            {
3472
              asection *rodata = NULL;
3473
              asection *group_sec = elf_section_data (fun->sec)->next_in_group;
3474
              if (group_sec == NULL)
3475
                rodata = bfd_get_section_by_name (fun->sec->owner, name);
3476
              else
3477
                while (group_sec != NULL && group_sec != fun->sec)
3478
                  {
3479
                    if (strcmp (group_sec->name, name) == 0)
3480
                      {
3481
                        rodata = group_sec;
3482
                        break;
3483
                      }
3484
                    group_sec = elf_section_data (group_sec)->next_in_group;
3485
                  }
3486
              fun->rodata = rodata;
3487
              if (fun->rodata)
3488
                {
3489
                  size += fun->rodata->size;
3490
                  if (htab->params->line_size != 0
3491
                      && size > htab->params->line_size)
3492
                    {
3493
                      size -= fun->rodata->size;
3494
                      fun->rodata = NULL;
3495
                    }
3496
                  else
3497
                    {
3498
                      fun->rodata->linker_mark = 1;
3499
                      fun->rodata->gc_mark = 1;
3500
                      fun->rodata->flags &= ~SEC_CODE;
3501
                    }
3502
                }
3503
              free (name);
3504
            }
3505
        }
3506
      if (mos_param->max_overlay_size < size)
3507
        mos_param->max_overlay_size = size;
3508
    }
3509
 
3510
  for (count = 0, call = fun->call_list; call != NULL; call = call->next)
3511
    count += 1;
3512
 
3513
  if (count > 1)
3514
    {
3515
      struct call_info **calls = bfd_malloc (count * sizeof (*calls));
3516
      if (calls == NULL)
3517
        return FALSE;
3518
 
3519
      for (count = 0, call = fun->call_list; call != NULL; call = call->next)
3520
        calls[count++] = call;
3521
 
3522
      qsort (calls, count, sizeof (*calls), sort_calls);
3523
 
3524
      fun->call_list = NULL;
3525
      while (count != 0)
3526
        {
3527
          --count;
3528
          calls[count]->next = fun->call_list;
3529
          fun->call_list = calls[count];
3530
        }
3531
      free (calls);
3532
    }
3533
 
3534
  for (call = fun->call_list; call != NULL; call = call->next)
3535
    {
3536
      if (call->is_pasted)
3537
        {
3538
          /* There can only be one is_pasted call per function_info.  */
3539
          BFD_ASSERT (!fun->sec->segment_mark);
3540
          fun->sec->segment_mark = 1;
3541
        }
3542
      if (!call->broken_cycle
3543
          && !mark_overlay_section (call->fun, info, param))
3544
        return FALSE;
3545
    }
3546
 
3547
  /* Don't put entry code into an overlay.  The overlay manager needs
3548
     a stack!  Also, don't mark .ovl.init as an overlay.  */
3549
  if (fun->lo + fun->sec->output_offset + fun->sec->output_section->vma
3550
      == info->output_bfd->start_address
3551
      || strncmp (fun->sec->output_section->name, ".ovl.init", 9) == 0)
3552
    {
3553
      fun->sec->linker_mark = 0;
3554
      if (fun->rodata != NULL)
3555
        fun->rodata->linker_mark = 0;
3556
    }
3557
  return TRUE;
3558
}
3559
 
3560
/* If non-zero then unmark functions called from those within sections
3561
   that we need to unmark.  Unfortunately this isn't reliable since the
3562
   call graph cannot know the destination of function pointer calls.  */
3563
#define RECURSE_UNMARK 0
3564
 
3565
struct _uos_param {
3566
  asection *exclude_input_section;
3567
  asection *exclude_output_section;
3568
  unsigned long clearing;
3569
};
3570
 
3571
/* Undo some of mark_overlay_section's work.  */
3572
 
3573
static bfd_boolean
3574
unmark_overlay_section (struct function_info *fun,
3575
                        struct bfd_link_info *info,
3576
                        void *param)
3577
{
3578
  struct call_info *call;
3579
  struct _uos_param *uos_param = param;
3580
  unsigned int excluded = 0;
3581
 
3582
  if (fun->visit5)
3583
    return TRUE;
3584
 
3585
  fun->visit5 = TRUE;
3586
 
3587
  excluded = 0;
3588
  if (fun->sec == uos_param->exclude_input_section
3589
      || fun->sec->output_section == uos_param->exclude_output_section)
3590
    excluded = 1;
3591
 
3592
  if (RECURSE_UNMARK)
3593
    uos_param->clearing += excluded;
3594
 
3595
  if (RECURSE_UNMARK ? uos_param->clearing : excluded)
3596
    {
3597
      fun->sec->linker_mark = 0;
3598
      if (fun->rodata)
3599
        fun->rodata->linker_mark = 0;
3600
    }
3601
 
3602
  for (call = fun->call_list; call != NULL; call = call->next)
3603
    if (!call->broken_cycle
3604
        && !unmark_overlay_section (call->fun, info, param))
3605
      return FALSE;
3606
 
3607
  if (RECURSE_UNMARK)
3608
    uos_param->clearing -= excluded;
3609
  return TRUE;
3610
}
3611
 
3612
struct _cl_param {
3613
  unsigned int lib_size;
3614
  asection **lib_sections;
3615
};
3616
 
3617
/* Add sections we have marked as belonging to overlays to an array
3618
   for consideration as non-overlay sections.  The array consist of
3619
   pairs of sections, (text,rodata), for functions in the call graph.  */
3620
 
3621
static bfd_boolean
3622
collect_lib_sections (struct function_info *fun,
3623
                      struct bfd_link_info *info,
3624
                      void *param)
3625
{
3626
  struct _cl_param *lib_param = param;
3627
  struct call_info *call;
3628
  unsigned int size;
3629
 
3630
  if (fun->visit6)
3631
    return TRUE;
3632
 
3633
  fun->visit6 = TRUE;
3634
  if (!fun->sec->linker_mark || !fun->sec->gc_mark || fun->sec->segment_mark)
3635
    return TRUE;
3636
 
3637
  size = fun->sec->size;
3638
  if (fun->rodata)
3639
    size += fun->rodata->size;
3640
 
3641
  if (size <= lib_param->lib_size)
3642
    {
3643
      *lib_param->lib_sections++ = fun->sec;
3644
      fun->sec->gc_mark = 0;
3645
      if (fun->rodata && fun->rodata->linker_mark && fun->rodata->gc_mark)
3646
        {
3647
          *lib_param->lib_sections++ = fun->rodata;
3648
          fun->rodata->gc_mark = 0;
3649
        }
3650
      else
3651
        *lib_param->lib_sections++ = NULL;
3652
    }
3653
 
3654
  for (call = fun->call_list; call != NULL; call = call->next)
3655
    if (!call->broken_cycle)
3656
      collect_lib_sections (call->fun, info, param);
3657
 
3658
  return TRUE;
3659
}
3660
 
3661
/* qsort predicate to sort sections by call count.  */
3662
 
3663
static int
3664
sort_lib (const void *a, const void *b)
3665
{
3666
  asection *const *s1 = a;
3667
  asection *const *s2 = b;
3668
  struct _spu_elf_section_data *sec_data;
3669
  struct spu_elf_stack_info *sinfo;
3670
  int delta;
3671
 
3672
  delta = 0;
3673
  if ((sec_data = spu_elf_section_data (*s1)) != NULL
3674
      && (sinfo = sec_data->u.i.stack_info) != NULL)
3675
    {
3676
      int i;
3677
      for (i = 0; i < sinfo->num_fun; ++i)
3678
        delta -= sinfo->fun[i].call_count;
3679
    }
3680
 
3681
  if ((sec_data = spu_elf_section_data (*s2)) != NULL
3682
      && (sinfo = sec_data->u.i.stack_info) != NULL)
3683
    {
3684
      int i;
3685
      for (i = 0; i < sinfo->num_fun; ++i)
3686
        delta += sinfo->fun[i].call_count;
3687
    }
3688
 
3689
  if (delta != 0)
3690
    return delta;
3691
 
3692
  return s1 - s2;
3693
}
3694
 
3695
/* Remove some sections from those marked to be in overlays.  Choose
3696
   those that are called from many places, likely library functions.  */
3697
 
3698
static unsigned int
3699
auto_ovl_lib_functions (struct bfd_link_info *info, unsigned int lib_size)
3700
{
3701
  bfd *ibfd;
3702
  asection **lib_sections;
3703
  unsigned int i, lib_count;
3704
  struct _cl_param collect_lib_param;
3705
  struct function_info dummy_caller;
3706
  struct spu_link_hash_table *htab;
3707
 
3708
  memset (&dummy_caller, 0, sizeof (dummy_caller));
3709
  lib_count = 0;
3710
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3711
    {
3712
      extern const bfd_target bfd_elf32_spu_vec;
3713
      asection *sec;
3714
 
3715
      if (ibfd->xvec != &bfd_elf32_spu_vec)
3716
        continue;
3717
 
3718
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3719
        if (sec->linker_mark
3720
            && sec->size < lib_size
3721
            && (sec->flags & SEC_CODE) != 0)
3722
          lib_count += 1;
3723
    }
3724
  lib_sections = bfd_malloc (lib_count * 2 * sizeof (*lib_sections));
3725
  if (lib_sections == NULL)
3726
    return (unsigned int) -1;
3727
  collect_lib_param.lib_size = lib_size;
3728
  collect_lib_param.lib_sections = lib_sections;
3729
  if (!for_each_node (collect_lib_sections, info, &collect_lib_param,
3730
                      TRUE))
3731
    return (unsigned int) -1;
3732
  lib_count = (collect_lib_param.lib_sections - lib_sections) / 2;
3733
 
3734
  /* Sort sections so that those with the most calls are first.  */
3735
  if (lib_count > 1)
3736
    qsort (lib_sections, lib_count, 2 * sizeof (*lib_sections), sort_lib);
3737
 
3738
  htab = spu_hash_table (info);
3739
  for (i = 0; i < lib_count; i++)
3740
    {
3741
      unsigned int tmp, stub_size;
3742
      asection *sec;
3743
      struct _spu_elf_section_data *sec_data;
3744
      struct spu_elf_stack_info *sinfo;
3745
 
3746
      sec = lib_sections[2 * i];
3747
      /* If this section is OK, its size must be less than lib_size.  */
3748
      tmp = sec->size;
3749
      /* If it has a rodata section, then add that too.  */
3750
      if (lib_sections[2 * i + 1])
3751
        tmp += lib_sections[2 * i + 1]->size;
3752
      /* Add any new overlay call stubs needed by the section.  */
3753
      stub_size = 0;
3754
      if (tmp < lib_size
3755
          && (sec_data = spu_elf_section_data (sec)) != NULL
3756
          && (sinfo = sec_data->u.i.stack_info) != NULL)
3757
        {
3758
          int k;
3759
          struct call_info *call;
3760
 
3761
          for (k = 0; k < sinfo->num_fun; ++k)
3762
            for (call = sinfo->fun[k].call_list; call; call = call->next)
3763
              if (call->fun->sec->linker_mark)
3764
                {
3765
                  struct call_info *p;
3766
                  for (p = dummy_caller.call_list; p; p = p->next)
3767
                    if (p->fun == call->fun)
3768
                      break;
3769
                  if (!p)
3770
                    stub_size += ovl_stub_size (htab->params);
3771
                }
3772
        }
3773
      if (tmp + stub_size < lib_size)
3774
        {
3775
          struct call_info **pp, *p;
3776
 
3777
          /* This section fits.  Mark it as non-overlay.  */
3778
          lib_sections[2 * i]->linker_mark = 0;
3779
          if (lib_sections[2 * i + 1])
3780
            lib_sections[2 * i + 1]->linker_mark = 0;
3781
          lib_size -= tmp + stub_size;
3782
          /* Call stubs to the section we just added are no longer
3783
             needed.  */
3784
          pp = &dummy_caller.call_list;
3785
          while ((p = *pp) != NULL)
3786
            if (!p->fun->sec->linker_mark)
3787
              {
3788
                lib_size += ovl_stub_size (htab->params);
3789
                *pp = p->next;
3790
                free (p);
3791
              }
3792
            else
3793
              pp = &p->next;
3794
          /* Add new call stubs to dummy_caller.  */
3795
          if ((sec_data = spu_elf_section_data (sec)) != NULL
3796
              && (sinfo = sec_data->u.i.stack_info) != NULL)
3797
            {
3798
              int k;
3799
              struct call_info *call;
3800
 
3801
              for (k = 0; k < sinfo->num_fun; ++k)
3802
                for (call = sinfo->fun[k].call_list;
3803
                     call;
3804
                     call = call->next)
3805
                  if (call->fun->sec->linker_mark)
3806
                    {
3807
                      struct call_info *callee;
3808
                      callee = bfd_malloc (sizeof (*callee));
3809
                      if (callee == NULL)
3810
                        return (unsigned int) -1;
3811
                      *callee = *call;
3812
                      if (!insert_callee (&dummy_caller, callee))
3813
                        free (callee);
3814
                    }
3815
            }
3816
        }
3817
    }
3818
  while (dummy_caller.call_list != NULL)
3819
    {
3820
      struct call_info *call = dummy_caller.call_list;
3821
      dummy_caller.call_list = call->next;
3822
      free (call);
3823
    }
3824
  for (i = 0; i < 2 * lib_count; i++)
3825
    if (lib_sections[i])
3826
      lib_sections[i]->gc_mark = 1;
3827
  free (lib_sections);
3828
  return lib_size;
3829
}
3830
 
3831
/* Build an array of overlay sections.  The deepest node's section is
3832
   added first, then its parent node's section, then everything called
3833
   from the parent section.  The idea being to group sections to
3834
   minimise calls between different overlays.  */
3835
 
3836
static bfd_boolean
3837
collect_overlays (struct function_info *fun,
3838
                  struct bfd_link_info *info,
3839
                  void *param)
3840
{
3841
  struct call_info *call;
3842
  bfd_boolean added_fun;
3843
  asection ***ovly_sections = param;
3844
 
3845
  if (fun->visit7)
3846
    return TRUE;
3847
 
3848
  fun->visit7 = TRUE;
3849
  for (call = fun->call_list; call != NULL; call = call->next)
3850
    if (!call->is_pasted && !call->broken_cycle)
3851
      {
3852
        if (!collect_overlays (call->fun, info, ovly_sections))
3853
          return FALSE;
3854
        break;
3855
      }
3856
 
3857
  added_fun = FALSE;
3858
  if (fun->sec->linker_mark && fun->sec->gc_mark)
3859
    {
3860
      fun->sec->gc_mark = 0;
3861
      *(*ovly_sections)++ = fun->sec;
3862
      if (fun->rodata && fun->rodata->linker_mark && fun->rodata->gc_mark)
3863
        {
3864
          fun->rodata->gc_mark = 0;
3865
          *(*ovly_sections)++ = fun->rodata;
3866
        }
3867
      else
3868
        *(*ovly_sections)++ = NULL;
3869
      added_fun = TRUE;
3870
 
3871
      /* Pasted sections must stay with the first section.  We don't
3872
         put pasted sections in the array, just the first section.
3873
         Mark subsequent sections as already considered.  */
3874
      if (fun->sec->segment_mark)
3875
        {
3876
          struct function_info *call_fun = fun;
3877
          do
3878
            {
3879
              for (call = call_fun->call_list; call != NULL; call = call->next)
3880
                if (call->is_pasted)
3881
                  {
3882
                    call_fun = call->fun;
3883
                    call_fun->sec->gc_mark = 0;
3884
                    if (call_fun->rodata)
3885
                      call_fun->rodata->gc_mark = 0;
3886
                    break;
3887
                  }
3888
              if (call == NULL)
3889
                abort ();
3890
            }
3891
          while (call_fun->sec->segment_mark);
3892
        }
3893
    }
3894
 
3895
  for (call = fun->call_list; call != NULL; call = call->next)
3896
    if (!call->broken_cycle
3897
        && !collect_overlays (call->fun, info, ovly_sections))
3898
      return FALSE;
3899
 
3900
  if (added_fun)
3901
    {
3902
      struct _spu_elf_section_data *sec_data;
3903
      struct spu_elf_stack_info *sinfo;
3904
 
3905
      if ((sec_data = spu_elf_section_data (fun->sec)) != NULL
3906
          && (sinfo = sec_data->u.i.stack_info) != NULL)
3907
        {
3908
          int i;
3909
          for (i = 0; i < sinfo->num_fun; ++i)
3910
            if (!collect_overlays (&sinfo->fun[i], info, ovly_sections))
3911
              return FALSE;
3912
        }
3913
    }
3914
 
3915
  return TRUE;
3916
}
3917
 
3918
struct _sum_stack_param {
3919
  size_t cum_stack;
3920
  size_t overall_stack;
3921
  bfd_boolean emit_stack_syms;
3922
};
3923
 
3924
/* Descend the call graph for FUN, accumulating total stack required.  */
3925
 
3926
static bfd_boolean
3927
sum_stack (struct function_info *fun,
3928
           struct bfd_link_info *info,
3929
           void *param)
3930
{
3931
  struct call_info *call;
3932
  struct function_info *max;
3933
  size_t stack, cum_stack;
3934
  const char *f1;
3935
  bfd_boolean has_call;
3936
  struct _sum_stack_param *sum_stack_param = param;
3937
  struct spu_link_hash_table *htab;
3938
 
3939
  cum_stack = fun->stack;
3940
  sum_stack_param->cum_stack = cum_stack;
3941
  if (fun->visit3)
3942
    return TRUE;
3943
 
3944
  has_call = FALSE;
3945
  max = NULL;
3946
  for (call = fun->call_list; call; call = call->next)
3947
    {
3948
      if (call->broken_cycle)
3949
        continue;
3950
      if (!call->is_pasted)
3951
        has_call = TRUE;
3952
      if (!sum_stack (call->fun, info, sum_stack_param))
3953
        return FALSE;
3954
      stack = sum_stack_param->cum_stack;
3955
      /* Include caller stack for normal calls, don't do so for
3956
         tail calls.  fun->stack here is local stack usage for
3957
         this function.  */
3958
      if (!call->is_tail || call->is_pasted || call->fun->start != NULL)
3959
        stack += fun->stack;
3960
      if (cum_stack < stack)
3961
        {
3962
          cum_stack = stack;
3963
          max = call->fun;
3964
        }
3965
    }
3966
 
3967
  sum_stack_param->cum_stack = cum_stack;
3968
  stack = fun->stack;
3969
  /* Now fun->stack holds cumulative stack.  */
3970
  fun->stack = cum_stack;
3971
  fun->visit3 = TRUE;
3972
 
3973
  if (!fun->non_root
3974
      && sum_stack_param->overall_stack < cum_stack)
3975
    sum_stack_param->overall_stack = cum_stack;
3976
 
3977
  htab = spu_hash_table (info);
3978
  if (htab->params->auto_overlay)
3979
    return TRUE;
3980
 
3981
  f1 = func_name (fun);
3982
  if (htab->params->stack_analysis)
3983
    {
3984
      if (!fun->non_root)
3985
        info->callbacks->info (_("  %s: 0x%v\n"), f1, (bfd_vma) cum_stack);
3986
      info->callbacks->minfo (_("%s: 0x%v 0x%v\n"),
3987
                              f1, (bfd_vma) stack, (bfd_vma) cum_stack);
3988
 
3989
      if (has_call)
3990
        {
3991
          info->callbacks->minfo (_("  calls:\n"));
3992
          for (call = fun->call_list; call; call = call->next)
3993
            if (!call->is_pasted && !call->broken_cycle)
3994
              {
3995
                const char *f2 = func_name (call->fun);
3996
                const char *ann1 = call->fun == max ? "*" : " ";
3997
                const char *ann2 = call->is_tail ? "t" : " ";
3998
 
3999
                info->callbacks->minfo (_("   %s%s %s\n"), ann1, ann2, f2);
4000
              }
4001
        }
4002
    }
4003
 
4004
  if (sum_stack_param->emit_stack_syms)
4005
    {
4006
      char *name = bfd_malloc (18 + strlen (f1));
4007
      struct elf_link_hash_entry *h;
4008
 
4009
      if (name == NULL)
4010
        return FALSE;
4011
 
4012
      if (fun->global || ELF_ST_BIND (fun->u.sym->st_info) == STB_GLOBAL)
4013
        sprintf (name, "__stack_%s", f1);
4014
      else
4015
        sprintf (name, "__stack_%x_%s", fun->sec->id & 0xffffffff, f1);
4016
 
4017
      h = elf_link_hash_lookup (&htab->elf, name, TRUE, TRUE, FALSE);
4018
      free (name);
4019
      if (h != NULL
4020
          && (h->root.type == bfd_link_hash_new
4021
              || h->root.type == bfd_link_hash_undefined
4022
              || h->root.type == bfd_link_hash_undefweak))
4023
        {
4024
          h->root.type = bfd_link_hash_defined;
4025
          h->root.u.def.section = bfd_abs_section_ptr;
4026
          h->root.u.def.value = cum_stack;
4027
          h->size = 0;
4028
          h->type = 0;
4029
          h->ref_regular = 1;
4030
          h->def_regular = 1;
4031
          h->ref_regular_nonweak = 1;
4032
          h->forced_local = 1;
4033
          h->non_elf = 0;
4034
        }
4035
    }
4036
 
4037
  return TRUE;
4038
}
4039
 
4040
/* SEC is part of a pasted function.  Return the call_info for the
4041
   next section of this function.  */
4042
 
4043
static struct call_info *
4044
find_pasted_call (asection *sec)
4045
{
4046
  struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
4047
  struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
4048
  struct call_info *call;
4049
  int k;
4050
 
4051
  for (k = 0; k < sinfo->num_fun; ++k)
4052
    for (call = sinfo->fun[k].call_list; call != NULL; call = call->next)
4053
      if (call->is_pasted)
4054
        return call;
4055
  abort ();
4056
  return 0;
4057
}
4058
 
4059
/* qsort predicate to sort bfds by file name.  */
4060
 
4061
static int
4062
sort_bfds (const void *a, const void *b)
4063
{
4064
  bfd *const *abfd1 = a;
4065
  bfd *const *abfd2 = b;
4066
 
4067
  return strcmp ((*abfd1)->filename, (*abfd2)->filename);
4068
}
4069
 
4070
static unsigned int
4071
print_one_overlay_section (FILE *script,
4072
                           unsigned int base,
4073
                           unsigned int count,
4074
                           unsigned int ovlynum,
4075
                           unsigned int *ovly_map,
4076
                           asection **ovly_sections,
4077
                           struct bfd_link_info *info)
4078
{
4079
  unsigned int j;
4080
 
4081
  for (j = base; j < count && ovly_map[j] == ovlynum; j++)
4082
    {
4083
      asection *sec = ovly_sections[2 * j];
4084
 
4085
      if (fprintf (script, "   %s%c%s (%s)\n",
4086
                   (sec->owner->my_archive != NULL
4087
                    ? sec->owner->my_archive->filename : ""),
4088
                   info->path_separator,
4089
                   sec->owner->filename,
4090
                   sec->name) <= 0)
4091
        return -1;
4092
      if (sec->segment_mark)
4093
        {
4094
          struct call_info *call = find_pasted_call (sec);
4095
          while (call != NULL)
4096
            {
4097
              struct function_info *call_fun = call->fun;
4098
              sec = call_fun->sec;
4099
              if (fprintf (script, "   %s%c%s (%s)\n",
4100
                           (sec->owner->my_archive != NULL
4101
                            ? sec->owner->my_archive->filename : ""),
4102
                           info->path_separator,
4103
                           sec->owner->filename,
4104
                           sec->name) <= 0)
4105
                return -1;
4106
              for (call = call_fun->call_list; call; call = call->next)
4107
                if (call->is_pasted)
4108
                  break;
4109
            }
4110
        }
4111
    }
4112
 
4113
  for (j = base; j < count && ovly_map[j] == ovlynum; j++)
4114
    {
4115
      asection *sec = ovly_sections[2 * j + 1];
4116
      if (sec != NULL
4117
          && fprintf (script, "   %s%c%s (%s)\n",
4118
                      (sec->owner->my_archive != NULL
4119
                       ? sec->owner->my_archive->filename : ""),
4120
                      info->path_separator,
4121
                      sec->owner->filename,
4122
                      sec->name) <= 0)
4123
        return -1;
4124
 
4125
      sec = ovly_sections[2 * j];
4126
      if (sec->segment_mark)
4127
        {
4128
          struct call_info *call = find_pasted_call (sec);
4129
          while (call != NULL)
4130
            {
4131
              struct function_info *call_fun = call->fun;
4132
              sec = call_fun->rodata;
4133
              if (sec != NULL
4134
                  && fprintf (script, "   %s%c%s (%s)\n",
4135
                              (sec->owner->my_archive != NULL
4136
                               ? sec->owner->my_archive->filename : ""),
4137
                              info->path_separator,
4138
                              sec->owner->filename,
4139
                              sec->name) <= 0)
4140
                return -1;
4141
              for (call = call_fun->call_list; call; call = call->next)
4142
                if (call->is_pasted)
4143
                  break;
4144
            }
4145
        }
4146
    }
4147
 
4148
  return j;
4149
}
4150
 
4151
/* Handle --auto-overlay.  */
4152
 
4153
static void
4154
spu_elf_auto_overlay (struct bfd_link_info *info)
4155
{
4156
  bfd *ibfd;
4157
  bfd **bfd_arr;
4158
  struct elf_segment_map *m;
4159
  unsigned int fixed_size, lo, hi;
4160
  unsigned int reserved;
4161
  struct spu_link_hash_table *htab;
4162
  unsigned int base, i, count, bfd_count;
4163
  unsigned int region, ovlynum;
4164
  asection **ovly_sections, **ovly_p;
4165
  unsigned int *ovly_map;
4166
  FILE *script;
4167
  unsigned int total_overlay_size, overlay_size;
4168
  const char *ovly_mgr_entry;
4169
  struct elf_link_hash_entry *h;
4170
  struct _mos_param mos_param;
4171
  struct _uos_param uos_param;
4172
  struct function_info dummy_caller;
4173
 
4174
  /* Find the extents of our loadable image.  */
4175
  lo = (unsigned int) -1;
4176
  hi = 0;
4177
  for (m = elf_tdata (info->output_bfd)->segment_map; m != NULL; m = m->next)
4178
    if (m->p_type == PT_LOAD)
4179
      for (i = 0; i < m->count; i++)
4180
        if (m->sections[i]->size != 0)
4181
          {
4182
            if (m->sections[i]->vma < lo)
4183
              lo = m->sections[i]->vma;
4184
            if (m->sections[i]->vma + m->sections[i]->size - 1 > hi)
4185
              hi = m->sections[i]->vma + m->sections[i]->size - 1;
4186
          }
4187
  fixed_size = hi + 1 - lo;
4188
 
4189
  if (!discover_functions (info))
4190
    goto err_exit;
4191
 
4192
  if (!build_call_tree (info))
4193
    goto err_exit;
4194
 
4195
  htab = spu_hash_table (info);
4196
  reserved = htab->params->auto_overlay_reserved;
4197
  if (reserved == 0)
4198
    {
4199
      struct _sum_stack_param sum_stack_param;
4200
 
4201
      sum_stack_param.emit_stack_syms = 0;
4202
      sum_stack_param.overall_stack = 0;
4203
      if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
4204
        goto err_exit;
4205
      reserved = (sum_stack_param.overall_stack
4206
                  + htab->params->extra_stack_space);
4207
    }
4208
 
4209
  /* No need for overlays if everything already fits.  */
4210
  if (fixed_size + reserved <= htab->local_store
4211
      && htab->params->ovly_flavour != ovly_soft_icache)
4212
    {
4213
      htab->params->auto_overlay = 0;
4214
      return;
4215
    }
4216
 
4217
  uos_param.exclude_input_section = 0;
4218
  uos_param.exclude_output_section
4219
    = bfd_get_section_by_name (info->output_bfd, ".interrupt");
4220
 
4221
  ovly_mgr_entry = "__ovly_load";
4222
  if (htab->params->ovly_flavour == ovly_soft_icache)
4223
    ovly_mgr_entry = "__icache_br_handler";
4224
  h = elf_link_hash_lookup (&htab->elf, ovly_mgr_entry,
4225
                            FALSE, FALSE, FALSE);
4226
  if (h != NULL
4227
      && (h->root.type == bfd_link_hash_defined
4228
          || h->root.type == bfd_link_hash_defweak)
4229
      && h->def_regular)
4230
    {
4231
      /* We have a user supplied overlay manager.  */
4232
      uos_param.exclude_input_section = h->root.u.def.section;
4233
    }
4234
  else
4235
    {
4236
      /* If no user overlay manager, spu_elf_load_ovl_mgr will add our
4237
         builtin version to .text, and will adjust .text size.  */
4238
      fixed_size += (*htab->params->spu_elf_load_ovl_mgr) ();
4239
    }
4240
 
4241
  /* Mark overlay sections, and find max overlay section size.  */
4242
  mos_param.max_overlay_size = 0;
4243
  if (!for_each_node (mark_overlay_section, info, &mos_param, TRUE))
4244
    goto err_exit;
4245
 
4246
  /* We can't put the overlay manager or interrupt routines in
4247
     overlays.  */
4248
  uos_param.clearing = 0;
4249
  if ((uos_param.exclude_input_section
4250
       || uos_param.exclude_output_section)
4251
      && !for_each_node (unmark_overlay_section, info, &uos_param, TRUE))
4252
    goto err_exit;
4253
 
4254
  bfd_count = 0;
4255
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4256
    ++bfd_count;
4257
  bfd_arr = bfd_malloc (bfd_count * sizeof (*bfd_arr));
4258
  if (bfd_arr == NULL)
4259
    goto err_exit;
4260
 
4261
  /* Count overlay sections, and subtract their sizes from "fixed_size".  */
4262
  count = 0;
4263
  bfd_count = 0;
4264
  total_overlay_size = 0;
4265
  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4266
    {
4267
      extern const bfd_target bfd_elf32_spu_vec;
4268
      asection *sec;
4269
      unsigned int old_count;
4270
 
4271
      if (ibfd->xvec != &bfd_elf32_spu_vec)
4272
        continue;
4273
 
4274
      old_count = count;
4275
      for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4276
        if (sec->linker_mark)
4277
          {
4278
            if ((sec->flags & SEC_CODE) != 0)
4279
              count += 1;
4280
            fixed_size -= sec->size;
4281
            total_overlay_size += sec->size;
4282
          }
4283
        else if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)
4284
                 && sec->output_section->owner == info->output_bfd
4285
                 && strncmp (sec->output_section->name, ".ovl.init", 9) == 0)
4286
          fixed_size -= sec->size;
4287
      if (count != old_count)
4288
        bfd_arr[bfd_count++] = ibfd;
4289
    }
4290
 
4291
  /* Since the overlay link script selects sections by file name and
4292
     section name, ensure that file names are unique.  */
4293
  if (bfd_count > 1)
4294
    {
4295
      bfd_boolean ok = TRUE;
4296
 
4297
      qsort (bfd_arr, bfd_count, sizeof (*bfd_arr), sort_bfds);
4298
      for (i = 1; i < bfd_count; ++i)
4299
        if (strcmp (bfd_arr[i - 1]->filename, bfd_arr[i]->filename) == 0)
4300
          {
4301
            if (bfd_arr[i - 1]->my_archive == bfd_arr[i]->my_archive)
4302
              {
4303
                if (bfd_arr[i - 1]->my_archive && bfd_arr[i]->my_archive)
4304
                  info->callbacks->einfo (_("%s duplicated in %s\n"),
4305
                                          bfd_arr[i]->filename,
4306
                                          bfd_arr[i]->my_archive->filename);
4307
                else
4308
                  info->callbacks->einfo (_("%s duplicated\n"),
4309
                                          bfd_arr[i]->filename);
4310
                ok = FALSE;
4311
              }
4312
          }
4313
      if (!ok)
4314
        {
4315
          info->callbacks->einfo (_("sorry, no support for duplicate "
4316
                                    "object files in auto-overlay script\n"));
4317
          bfd_set_error (bfd_error_bad_value);
4318
          goto err_exit;
4319
        }
4320
    }
4321
  free (bfd_arr);
4322
 
4323
  fixed_size += reserved;
4324
  fixed_size += htab->non_ovly_stub * ovl_stub_size (htab->params);
4325
  if (fixed_size + mos_param.max_overlay_size <= htab->local_store)
4326
    {
4327
      if (htab->params->ovly_flavour == ovly_soft_icache)
4328
        {
4329
          /* Stubs in the non-icache area are bigger.  */
4330
          fixed_size += htab->non_ovly_stub * 16;
4331
          /* Space for icache manager tables.
4332
             a) Tag array, one quadword per cache line.
4333
             - word 0: ia address of present line, init to zero.  */
4334
          fixed_size += 16 << htab->num_lines_log2;
4335
          /* b) Rewrite "to" list, one quadword per cache line.  */
4336
          fixed_size += 16 << htab->num_lines_log2;
4337
          /* c) Rewrite "from" list, one byte per outgoing branch (rounded up
4338
                to a power-of-two number of full quadwords) per cache line.  */
4339
          fixed_size += 16 << (htab->fromelem_size_log2
4340
                               + htab->num_lines_log2);
4341
          /* d) Pointer to __ea backing store (toe), 1 quadword.  */
4342
          fixed_size += 16;
4343
        }
4344
      else
4345
        {
4346
          /* Guess number of overlays.  Assuming overlay buffer is on
4347
             average only half full should be conservative.  */
4348
          ovlynum = (total_overlay_size * 2 * htab->params->num_lines
4349
                     / (htab->local_store - fixed_size));
4350
          /* Space for _ovly_table[], _ovly_buf_table[] and toe.  */
4351
          fixed_size += ovlynum * 16 + 16 + 4 + 16;
4352
        }
4353
    }
4354
 
4355
  if (fixed_size + mos_param.max_overlay_size > htab->local_store)
4356
    info->callbacks->einfo (_("non-overlay size of 0x%v plus maximum overlay "
4357
                              "size of 0x%v exceeds local store\n"),
4358
                            (bfd_vma) fixed_size,
4359
                            (bfd_vma) mos_param.max_overlay_size);
4360
 
4361
  /* Now see if we should put some functions in the non-overlay area.  */
4362
  else if (fixed_size < htab->params->auto_overlay_fixed)
4363
    {
4364
      unsigned int max_fixed, lib_size;
4365
 
4366
      max_fixed = htab->local_store - mos_param.max_overlay_size;
4367
      if (max_fixed > htab->params->auto_overlay_fixed)
4368
        max_fixed = htab->params->auto_overlay_fixed;
4369
      lib_size = max_fixed - fixed_size;
4370
      lib_size = auto_ovl_lib_functions (info, lib_size);
4371
      if (lib_size == (unsigned int) -1)
4372
        goto err_exit;
4373
      fixed_size = max_fixed - lib_size;
4374
    }
4375
 
4376
  /* Build an array of sections, suitably sorted to place into
4377
     overlays.  */
4378
  ovly_sections = bfd_malloc (2 * count * sizeof (*ovly_sections));
4379
  if (ovly_sections == NULL)
4380
    goto err_exit;
4381
  ovly_p = ovly_sections;
4382
  if (!for_each_node (collect_overlays, info, &ovly_p, TRUE))
4383
    goto err_exit;
4384
  count = (size_t) (ovly_p - ovly_sections) / 2;
4385
  ovly_map = bfd_malloc (count * sizeof (*ovly_map));
4386
  if (ovly_map == NULL)
4387
    goto err_exit;
4388
 
4389
  memset (&dummy_caller, 0, sizeof (dummy_caller));
4390
  overlay_size = (htab->local_store - fixed_size) / htab->params->num_lines;
4391
  if (htab->params->line_size != 0)
4392
    overlay_size = htab->params->line_size;
4393
  base = 0;
4394
  ovlynum = 0;
4395
  while (base < count)
4396
    {
4397
      unsigned int size = 0, rosize = 0, roalign = 0;
4398
 
4399
      for (i = base; i < count; i++)
4400
        {
4401
          asection *sec, *rosec;
4402
          unsigned int tmp, rotmp;
4403
          unsigned int num_stubs;
4404
          struct call_info *call, *pasty;
4405
          struct _spu_elf_section_data *sec_data;
4406
          struct spu_elf_stack_info *sinfo;
4407
          unsigned int k;
4408
 
4409
          /* See whether we can add this section to the current
4410
             overlay without overflowing our overlay buffer.  */
4411
          sec = ovly_sections[2 * i];
4412
          tmp = align_power (size, sec->alignment_power) + sec->size;
4413
          rotmp = rosize;
4414
          rosec = ovly_sections[2 * i + 1];
4415
          if (rosec != NULL)
4416
            {
4417
              rotmp = align_power (rotmp, rosec->alignment_power) + rosec->size;
4418
              if (roalign < rosec->alignment_power)
4419
                roalign = rosec->alignment_power;
4420
            }
4421
          if (align_power (tmp, roalign) + rotmp > overlay_size)
4422
            break;
4423
          if (sec->segment_mark)
4424
            {
4425
              /* Pasted sections must stay together, so add their
4426
                 sizes too.  */
4427
              pasty = find_pasted_call (sec);
4428
              while (pasty != NULL)
4429
                {
4430
                  struct function_info *call_fun = pasty->fun;
4431
                  tmp = (align_power (tmp, call_fun->sec->alignment_power)
4432
                         + call_fun->sec->size);
4433
                  if (call_fun->rodata)
4434
                    {
4435
                      rotmp = (align_power (rotmp,
4436
                                            call_fun->rodata->alignment_power)
4437
                               + call_fun->rodata->size);
4438
                      if (roalign < rosec->alignment_power)
4439
                        roalign = rosec->alignment_power;
4440
                    }
4441
                  for (pasty = call_fun->call_list; pasty; pasty = pasty->next)
4442
                    if (pasty->is_pasted)
4443
                      break;
4444
                }
4445
            }
4446
          if (align_power (tmp, roalign) + rotmp > overlay_size)
4447
            break;
4448
 
4449
          /* If we add this section, we might need new overlay call
4450
             stubs.  Add any overlay section calls to dummy_call.  */
4451
          pasty = NULL;
4452
          sec_data = spu_elf_section_data (sec);
4453
          sinfo = sec_data->u.i.stack_info;
4454
          for (k = 0; k < (unsigned) sinfo->num_fun; ++k)
4455
            for (call = sinfo->fun[k].call_list; call; call = call->next)
4456
              if (call->is_pasted)
4457
                {
4458
                  BFD_ASSERT (pasty == NULL);
4459
                  pasty = call;
4460
                }
4461
              else if (call->fun->sec->linker_mark)
4462
                {
4463
                  if (!copy_callee (&dummy_caller, call))
4464
                    goto err_exit;
4465
                }
4466
          while (pasty != NULL)
4467
            {
4468
              struct function_info *call_fun = pasty->fun;
4469
              pasty = NULL;
4470
              for (call = call_fun->call_list; call; call = call->next)
4471
                if (call->is_pasted)
4472
                  {
4473
                    BFD_ASSERT (pasty == NULL);
4474
                    pasty = call;
4475
                  }
4476
                else if (!copy_callee (&dummy_caller, call))
4477
                  goto err_exit;
4478
            }
4479
 
4480
          /* Calculate call stub size.  */
4481
          num_stubs = 0;
4482
          for (call = dummy_caller.call_list; call; call = call->next)
4483
            {
4484
              unsigned int stub_delta = 1;
4485
 
4486
              if (htab->params->ovly_flavour == ovly_soft_icache)
4487
                stub_delta = call->count;
4488
              num_stubs += stub_delta;
4489
 
4490
              /* If the call is within this overlay, we won't need a
4491
                 stub.  */
4492
              for (k = base; k < i + 1; k++)
4493
                if (call->fun->sec == ovly_sections[2 * k])
4494
                  {
4495
                    num_stubs -= stub_delta;
4496
                    break;
4497
                  }
4498
            }
4499
          if (htab->params->ovly_flavour == ovly_soft_icache
4500
              && num_stubs > htab->params->max_branch)
4501
            break;
4502
          if (align_power (tmp, roalign) + rotmp
4503
              + num_stubs * ovl_stub_size (htab->params) > overlay_size)
4504
            break;
4505
          size = tmp;
4506
          rosize = rotmp;
4507
        }
4508
 
4509
      if (i == base)
4510
        {
4511
          info->callbacks->einfo (_("%B:%A%s exceeds overlay size\n"),
4512
                                  ovly_sections[2 * i]->owner,
4513
                                  ovly_sections[2 * i],
4514
                                  ovly_sections[2 * i + 1] ? " + rodata" : "");
4515
          bfd_set_error (bfd_error_bad_value);
4516
          goto err_exit;
4517
        }
4518
 
4519
      while (dummy_caller.call_list != NULL)
4520
        {
4521
          struct call_info *call = dummy_caller.call_list;
4522
          dummy_caller.call_list = call->next;
4523
          free (call);
4524
        }
4525
 
4526
      ++ovlynum;
4527
      while (base < i)
4528
        ovly_map[base++] = ovlynum;
4529
    }
4530
 
4531
  script = htab->params->spu_elf_open_overlay_script ();
4532
 
4533
  if (htab->params->ovly_flavour == ovly_soft_icache)
4534
    {
4535
      if (fprintf (script, "SECTIONS\n{\n") <= 0)
4536
        goto file_err;
4537
 
4538
      if (fprintf (script,
4539
                   " . = ALIGN (%u);\n"
4540
                   " .ovl.init : { *(.ovl.init) }\n"
4541
                   " . = ABSOLUTE (ADDR (.ovl.init));\n",
4542
                   htab->params->line_size) <= 0)
4543
        goto file_err;
4544
 
4545
      base = 0;
4546
      ovlynum = 1;
4547
      while (base < count)
4548
        {
4549
          unsigned int indx = ovlynum - 1;
4550
          unsigned int vma, lma;
4551
 
4552
          vma = (indx & (htab->params->num_lines - 1)) << htab->line_size_log2;
4553
          lma = vma + (((indx >> htab->num_lines_log2) + 1) << 18);
4554
 
4555
          if (fprintf (script, " .ovly%u ABSOLUTE (ADDR (.ovl.init)) + %u "
4556
                               ": AT (LOADADDR (.ovl.init) + %u) {\n",
4557
                       ovlynum, vma, lma) <= 0)
4558
            goto file_err;
4559
 
4560
          base = print_one_overlay_section (script, base, count, ovlynum,
4561
                                            ovly_map, ovly_sections, info);
4562
          if (base == (unsigned) -1)
4563
            goto file_err;
4564
 
4565
          if (fprintf (script, "  }\n") <= 0)
4566
            goto file_err;
4567
 
4568
          ovlynum++;
4569
        }
4570
 
4571
      if (fprintf (script, " . = ABSOLUTE (ADDR (.ovl.init)) + %u;\n",
4572
                   1 << (htab->num_lines_log2 + htab->line_size_log2)) <= 0)
4573
        goto file_err;
4574
 
4575
      if (fprintf (script, "}\nINSERT AFTER .toe;\n") <= 0)
4576
        goto file_err;
4577
    }
4578
  else
4579
    {
4580
      if (fprintf (script, "SECTIONS\n{\n") <= 0)
4581
        goto file_err;
4582
 
4583
      if (fprintf (script,
4584
                   " . = ALIGN (16);\n"
4585
                   " .ovl.init : { *(.ovl.init) }\n"
4586
                   " . = ABSOLUTE (ADDR (.ovl.init));\n") <= 0)
4587
        goto file_err;
4588
 
4589
      for (region = 1; region <= htab->params->num_lines; region++)
4590
        {
4591
          ovlynum = region;
4592
          base = 0;
4593
          while (base < count && ovly_map[base] < ovlynum)
4594
            base++;
4595
 
4596
          if (base == count)
4597
            break;
4598
 
4599
          if (region == 1)
4600
            {
4601
              /* We need to set lma since we are overlaying .ovl.init.  */
4602
              if (fprintf (script,
4603
                           " OVERLAY : AT (ALIGN (LOADADDR (.ovl.init) + SIZEOF (.ovl.init), 16))\n {\n") <= 0)
4604
                goto file_err;
4605
            }
4606
          else
4607
            {
4608
              if (fprintf (script, " OVERLAY :\n {\n") <= 0)
4609
                goto file_err;
4610
            }
4611
 
4612
          while (base < count)
4613
            {
4614
              if (fprintf (script, "  .ovly%u {\n", ovlynum) <= 0)
4615
                goto file_err;
4616
 
4617
              base = print_one_overlay_section (script, base, count, ovlynum,
4618
                                                ovly_map, ovly_sections, info);
4619
              if (base == (unsigned) -1)
4620
                goto file_err;
4621
 
4622
              if (fprintf (script, "  }\n") <= 0)
4623
                goto file_err;
4624
 
4625
              ovlynum += htab->params->num_lines;
4626
              while (base < count && ovly_map[base] < ovlynum)
4627
                base++;
4628
            }
4629
 
4630
          if (fprintf (script, " }\n") <= 0)
4631
            goto file_err;
4632
        }
4633
 
4634
      if (fprintf (script, "}\nINSERT BEFORE .text;\n") <= 0)
4635
        goto file_err;
4636
    }
4637
 
4638
  free (ovly_map);
4639
  free (ovly_sections);
4640
 
4641
  if (fclose (script) != 0)
4642
    goto file_err;
4643
 
4644
  if (htab->params->auto_overlay & AUTO_RELINK)
4645
    (*htab->params->spu_elf_relink) ();
4646
 
4647
  xexit (0);
4648
 
4649
 file_err:
4650
  bfd_set_error (bfd_error_system_call);
4651
 err_exit:
4652
  info->callbacks->einfo ("%F%P: auto overlay error: %E\n");
4653
  xexit (1);
4654
}
4655
 
4656
/* Provide an estimate of total stack required.  */
4657
 
4658
static bfd_boolean
4659
spu_elf_stack_analysis (struct bfd_link_info *info)
4660
{
4661
  struct spu_link_hash_table *htab;
4662
  struct _sum_stack_param sum_stack_param;
4663
 
4664
  if (!discover_functions (info))
4665
    return FALSE;
4666
 
4667
  if (!build_call_tree (info))
4668
    return FALSE;
4669
 
4670
  htab = spu_hash_table (info);
4671
  if (htab->params->stack_analysis)
4672
    {
4673
      info->callbacks->info (_("Stack size for call graph root nodes.\n"));
4674
      info->callbacks->minfo (_("\nStack size for functions.  "
4675
                                "Annotations: '*' max stack, 't' tail call\n"));
4676
    }
4677
 
4678
  sum_stack_param.emit_stack_syms = htab->params->emit_stack_syms;
4679
  sum_stack_param.overall_stack = 0;
4680
  if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
4681
    return FALSE;
4682
 
4683
  if (htab->params->stack_analysis)
4684
    info->callbacks->info (_("Maximum stack required is 0x%v\n"),
4685
                           (bfd_vma) sum_stack_param.overall_stack);
4686
  return TRUE;
4687
}
4688
 
4689
/* Perform a final link.  */
4690
 
4691
static bfd_boolean
4692
spu_elf_final_link (bfd *output_bfd, struct bfd_link_info *info)
4693
{
4694
  struct spu_link_hash_table *htab = spu_hash_table (info);
4695
 
4696
  if (htab->params->auto_overlay)
4697
    spu_elf_auto_overlay (info);
4698
 
4699
  if ((htab->params->stack_analysis
4700
       || (htab->params->ovly_flavour == ovly_soft_icache
4701
           && htab->params->lrlive_analysis))
4702
      && !spu_elf_stack_analysis (info))
4703
    info->callbacks->einfo ("%X%P: stack/lrlive analysis error: %E\n");
4704
 
4705
  if (!spu_elf_build_stubs (info))
4706
    info->callbacks->einfo ("%F%P: can not build overlay stubs: %E\n");
4707
 
4708
  return bfd_elf_final_link (output_bfd, info);
4709
}
4710
 
4711
/* Called when not normally emitting relocs, ie. !info->relocatable
4712
   and !info->emitrelocations.  Returns a count of special relocs
4713
   that need to be emitted.  */
4714
 
4715
static unsigned int
4716
spu_elf_count_relocs (struct bfd_link_info *info, asection *sec)
4717
{
4718
  Elf_Internal_Rela *relocs;
4719
  unsigned int count = 0;
4720
 
4721
  relocs = _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL,
4722
                                      info->keep_memory);
4723
  if (relocs != NULL)
4724
    {
4725
      Elf_Internal_Rela *rel;
4726
      Elf_Internal_Rela *relend = relocs + sec->reloc_count;
4727
 
4728
      for (rel = relocs; rel < relend; rel++)
4729
        {
4730
          int r_type = ELF32_R_TYPE (rel->r_info);
4731
          if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
4732
            ++count;
4733
        }
4734
 
4735
      if (elf_section_data (sec)->relocs != relocs)
4736
        free (relocs);
4737
    }
4738
 
4739
  return count;
4740
}
4741
 
4742
/* Functions for adding fixup records to .fixup */
4743
 
4744
#define FIXUP_RECORD_SIZE 4
4745
 
4746
#define FIXUP_PUT(output_bfd,htab,index,addr) \
4747
          bfd_put_32 (output_bfd, addr, \
4748
                      htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4749
#define FIXUP_GET(output_bfd,htab,index) \
4750
          bfd_get_32 (output_bfd, \
4751
                      htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4752
 
4753
/* Store OFFSET in .fixup.  This assumes it will be called with an
4754
   increasing OFFSET.  When this OFFSET fits with the last base offset,
4755
   it just sets a bit, otherwise it adds a new fixup record.  */
4756
static void
4757
spu_elf_emit_fixup (bfd * output_bfd, struct bfd_link_info *info,
4758
                    bfd_vma offset)
4759
{
4760
  struct spu_link_hash_table *htab = spu_hash_table (info);
4761
  asection *sfixup = htab->sfixup;
4762
  bfd_vma qaddr = offset & ~(bfd_vma) 15;
4763
  bfd_vma bit = ((bfd_vma) 8) >> ((offset & 15) >> 2);
4764
  if (sfixup->reloc_count == 0)
4765
    {
4766
      FIXUP_PUT (output_bfd, htab, 0, qaddr | bit);
4767
      sfixup->reloc_count++;
4768
    }
4769
  else
4770
    {
4771
      bfd_vma base = FIXUP_GET (output_bfd, htab, sfixup->reloc_count - 1);
4772
      if (qaddr != (base & ~(bfd_vma) 15))
4773
        {
4774
          if ((sfixup->reloc_count + 1) * FIXUP_RECORD_SIZE > sfixup->size)
4775
            (*_bfd_error_handler) (_("fatal error while creating .fixup"));
4776
          FIXUP_PUT (output_bfd, htab, sfixup->reloc_count, qaddr | bit);
4777
          sfixup->reloc_count++;
4778
        }
4779
      else
4780
        FIXUP_PUT (output_bfd, htab, sfixup->reloc_count - 1, base | bit);
4781
    }
4782
}
4783
 
4784
/* Apply RELOCS to CONTENTS of INPUT_SECTION from INPUT_BFD.  */
4785
 
4786
static int
4787
spu_elf_relocate_section (bfd *output_bfd,
4788
                          struct bfd_link_info *info,
4789
                          bfd *input_bfd,
4790
                          asection *input_section,
4791
                          bfd_byte *contents,
4792
                          Elf_Internal_Rela *relocs,
4793
                          Elf_Internal_Sym *local_syms,
4794
                          asection **local_sections)
4795
{
4796
  Elf_Internal_Shdr *symtab_hdr;
4797
  struct elf_link_hash_entry **sym_hashes;
4798
  Elf_Internal_Rela *rel, *relend;
4799
  struct spu_link_hash_table *htab;
4800
  asection *ea;
4801
  int ret = TRUE;
4802
  bfd_boolean emit_these_relocs = FALSE;
4803
  bfd_boolean is_ea_sym;
4804
  bfd_boolean stubs;
4805
  unsigned int iovl = 0;
4806
 
4807
  htab = spu_hash_table (info);
4808
  stubs = (htab->stub_sec != NULL
4809
           && maybe_needs_stubs (input_section));
4810
  iovl = overlay_index (input_section);
4811
  ea = bfd_get_section_by_name (output_bfd, "._ea");
4812
  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4813
  sym_hashes = (struct elf_link_hash_entry **) (elf_sym_hashes (input_bfd));
4814
 
4815
  rel = relocs;
4816
  relend = relocs + input_section->reloc_count;
4817
  for (; rel < relend; rel++)
4818
    {
4819
      int r_type;
4820
      reloc_howto_type *howto;
4821
      unsigned int r_symndx;
4822
      Elf_Internal_Sym *sym;
4823
      asection *sec;
4824
      struct elf_link_hash_entry *h;
4825
      const char *sym_name;
4826
      bfd_vma relocation;
4827
      bfd_vma addend;
4828
      bfd_reloc_status_type r;
4829
      bfd_boolean unresolved_reloc;
4830
      enum _stub_type stub_type;
4831
 
4832
      r_symndx = ELF32_R_SYM (rel->r_info);
4833
      r_type = ELF32_R_TYPE (rel->r_info);
4834
      howto = elf_howto_table + r_type;
4835
      unresolved_reloc = FALSE;
4836
      h = NULL;
4837
      sym = NULL;
4838
      sec = NULL;
4839
      if (r_symndx < symtab_hdr->sh_info)
4840
        {
4841
          sym = local_syms + r_symndx;
4842
          sec = local_sections[r_symndx];
4843
          sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
4844
          relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4845
        }
4846
      else
4847
        {
4848
          if (sym_hashes == NULL)
4849
            return FALSE;
4850
 
4851
          h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4852
 
4853
          while (h->root.type == bfd_link_hash_indirect
4854
                 || h->root.type == bfd_link_hash_warning)
4855
            h = (struct elf_link_hash_entry *) h->root.u.i.link;
4856
 
4857
          relocation = 0;
4858
          if (h->root.type == bfd_link_hash_defined
4859
              || h->root.type == bfd_link_hash_defweak)
4860
            {
4861
              sec = h->root.u.def.section;
4862
              if (sec == NULL
4863
                  || sec->output_section == NULL)
4864
                /* Set a flag that will be cleared later if we find a
4865
                   relocation value for this symbol.  output_section
4866
                   is typically NULL for symbols satisfied by a shared
4867
                   library.  */
4868
                unresolved_reloc = TRUE;
4869
              else
4870
                relocation = (h->root.u.def.value
4871
                              + sec->output_section->vma
4872
                              + sec->output_offset);
4873
            }
4874
          else if (h->root.type == bfd_link_hash_undefweak)
4875
            ;
4876
          else if (info->unresolved_syms_in_objects == RM_IGNORE
4877
                   && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
4878
            ;
4879
          else if (!info->relocatable
4880
                   && !(r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64))
4881
            {
4882
              bfd_boolean err;
4883
              err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
4884
                     || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);
4885
              if (!info->callbacks->undefined_symbol (info,
4886
                                                      h->root.root.string,
4887
                                                      input_bfd,
4888
                                                      input_section,
4889
                                                      rel->r_offset, err))
4890
                return FALSE;
4891
            }
4892
          sym_name = h->root.root.string;
4893
        }
4894
 
4895
      if (sec != NULL && elf_discarded_section (sec))
4896
        {
4897
          /* For relocs against symbols from removed linkonce sections,
4898
             or sections discarded by a linker script, we just want the
4899
             section contents zeroed.  Avoid any special processing.  */
4900
          _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
4901
          rel->r_info = 0;
4902
          rel->r_addend = 0;
4903
          continue;
4904
        }
4905
 
4906
      if (info->relocatable)
4907
        continue;
4908
 
4909
      /* Change "a rt,ra,rb" to "ai rt,ra,0". */
4910
      if (r_type == R_SPU_ADD_PIC
4911
          && h != NULL
4912
          && !(h->def_regular || ELF_COMMON_DEF_P (h)))
4913
        {
4914
          bfd_byte *loc = contents + rel->r_offset;
4915
          loc[0] = 0x1c;
4916
          loc[1] = 0x00;
4917
          loc[2] &= 0x3f;
4918
        }
4919
 
4920
      is_ea_sym = (ea != NULL
4921
                   && sec != NULL
4922
                   && sec->output_section == ea);
4923
 
4924
      /* If this symbol is in an overlay area, we may need to relocate
4925
         to the overlay stub.  */
4926
      addend = rel->r_addend;
4927
      if (stubs
4928
          && !is_ea_sym
4929
          && (stub_type = needs_ovl_stub (h, sym, sec, input_section, rel,
4930
                                          contents, info)) != no_stub)
4931
        {
4932
          unsigned int ovl = 0;
4933
          struct got_entry *g, **head;
4934
 
4935
          if (stub_type != nonovl_stub)
4936
            ovl = iovl;
4937
 
4938
          if (h != NULL)
4939
            head = &h->got.glist;
4940
          else
4941
            head = elf_local_got_ents (input_bfd) + r_symndx;
4942
 
4943
          for (g = *head; g != NULL; g = g->next)
4944
            if (htab->params->ovly_flavour == ovly_soft_icache
4945
                ? (g->ovl == ovl
4946
                   && g->br_addr == (rel->r_offset
4947
                                     + input_section->output_offset
4948
                                     + input_section->output_section->vma))
4949
                : g->addend == addend && (g->ovl == ovl || g->ovl == 0))
4950
              break;
4951
          if (g == NULL)
4952
            abort ();
4953
 
4954
          relocation = g->stub_addr;
4955
          addend = 0;
4956
        }
4957
      else
4958
        {
4959
          /* For soft icache, encode the overlay index into addresses.  */
4960
          if (htab->params->ovly_flavour == ovly_soft_icache
4961
              && (r_type == R_SPU_ADDR16_HI
4962
                  || r_type == R_SPU_ADDR32 || r_type == R_SPU_REL32)
4963
              && !is_ea_sym)
4964
            {
4965
              unsigned int ovl = overlay_index (sec);
4966
              if (ovl != 0)
4967
                {
4968
                  unsigned int set_id = ((ovl - 1) >> htab->num_lines_log2) + 1;
4969
                  relocation += set_id << 18;
4970
                }
4971
            }
4972
        }
4973
 
4974
      if (htab->params->emit_fixups && !info->relocatable
4975
          && (input_section->flags & SEC_ALLOC) != 0
4976
          && r_type == R_SPU_ADDR32)
4977
        {
4978
          bfd_vma offset;
4979
          offset = rel->r_offset + input_section->output_section->vma
4980
                   + input_section->output_offset;
4981
          spu_elf_emit_fixup (output_bfd, info, offset);
4982
        }
4983
 
4984
      if (unresolved_reloc)
4985
        ;
4986
      else if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
4987
        {
4988
          if (is_ea_sym)
4989
            {
4990
              /* ._ea is a special section that isn't allocated in SPU
4991
                 memory, but rather occupies space in PPU memory as
4992
                 part of an embedded ELF image.  If this reloc is
4993
                 against a symbol defined in ._ea, then transform the
4994
                 reloc into an equivalent one without a symbol
4995
                 relative to the start of the ELF image.  */
4996
              rel->r_addend += (relocation
4997
                                - ea->vma
4998
                                + elf_section_data (ea)->this_hdr.sh_offset);
4999
              rel->r_info = ELF32_R_INFO (0, r_type);
5000
            }
5001
          emit_these_relocs = TRUE;
5002
          continue;
5003
        }
5004
      else if (is_ea_sym)
5005
        unresolved_reloc = TRUE;
5006
 
5007
      if (unresolved_reloc)
5008
        {
5009
          (*_bfd_error_handler)
5010
            (_("%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
5011
             input_bfd,
5012
             bfd_get_section_name (input_bfd, input_section),
5013
             (long) rel->r_offset,
5014
             howto->name,
5015
             sym_name);
5016
          ret = FALSE;
5017
        }
5018
 
5019
      r = _bfd_final_link_relocate (howto,
5020
                                    input_bfd,
5021
                                    input_section,
5022
                                    contents,
5023
                                    rel->r_offset, relocation, addend);
5024
 
5025
      if (r != bfd_reloc_ok)
5026
        {
5027
          const char *msg = (const char *) 0;
5028
 
5029
          switch (r)
5030
            {
5031
            case bfd_reloc_overflow:
5032
              if (!((*info->callbacks->reloc_overflow)
5033
                    (info, (h ? &h->root : NULL), sym_name, howto->name,
5034
                     (bfd_vma) 0, input_bfd, input_section, rel->r_offset)))
5035
                return FALSE;
5036
              break;
5037
 
5038
            case bfd_reloc_undefined:
5039
              if (!((*info->callbacks->undefined_symbol)
5040
                    (info, sym_name, input_bfd, input_section,
5041
                     rel->r_offset, TRUE)))
5042
                return FALSE;
5043
              break;
5044
 
5045
            case bfd_reloc_outofrange:
5046
              msg = _("internal error: out of range error");
5047
              goto common_error;
5048
 
5049
            case bfd_reloc_notsupported:
5050
              msg = _("internal error: unsupported relocation error");
5051
              goto common_error;
5052
 
5053
            case bfd_reloc_dangerous:
5054
              msg = _("internal error: dangerous error");
5055
              goto common_error;
5056
 
5057
            default:
5058
              msg = _("internal error: unknown error");
5059
              /* fall through */
5060
 
5061
            common_error:
5062
              ret = FALSE;
5063
              if (!((*info->callbacks->warning)
5064
                    (info, msg, sym_name, input_bfd, input_section,
5065
                     rel->r_offset)))
5066
                return FALSE;
5067
              break;
5068
            }
5069
        }
5070
    }
5071
 
5072
  if (ret
5073
      && emit_these_relocs
5074
      && !info->emitrelocations)
5075
    {
5076
      Elf_Internal_Rela *wrel;
5077
      Elf_Internal_Shdr *rel_hdr;
5078
 
5079
      wrel = rel = relocs;
5080
      relend = relocs + input_section->reloc_count;
5081
      for (; rel < relend; rel++)
5082
        {
5083
          int r_type;
5084
 
5085
          r_type = ELF32_R_TYPE (rel->r_info);
5086
          if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
5087
            *wrel++ = *rel;
5088
        }
5089
      input_section->reloc_count = wrel - relocs;
5090
      /* Backflips for _bfd_elf_link_output_relocs.  */
5091
      rel_hdr = &elf_section_data (input_section)->rel_hdr;
5092
      rel_hdr->sh_size = input_section->reloc_count * rel_hdr->sh_entsize;
5093
      ret = 2;
5094
    }
5095
 
5096
  return ret;
5097
}
5098
 
5099
/* Adjust _SPUEAR_ syms to point at their overlay stubs.  */
5100
 
5101
static int
5102
spu_elf_output_symbol_hook (struct bfd_link_info *info,
5103
                            const char *sym_name ATTRIBUTE_UNUSED,
5104
                            Elf_Internal_Sym *sym,
5105
                            asection *sym_sec ATTRIBUTE_UNUSED,
5106
                            struct elf_link_hash_entry *h)
5107
{
5108
  struct spu_link_hash_table *htab = spu_hash_table (info);
5109
 
5110
  if (!info->relocatable
5111
      && htab->stub_sec != NULL
5112
      && h != NULL
5113
      && (h->root.type == bfd_link_hash_defined
5114
          || h->root.type == bfd_link_hash_defweak)
5115
      && h->def_regular
5116
      && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0)
5117
    {
5118
      struct got_entry *g;
5119
 
5120
      for (g = h->got.glist; g != NULL; g = g->next)
5121
        if (htab->params->ovly_flavour == ovly_soft_icache
5122
            ? g->br_addr == g->stub_addr
5123
            : g->addend == 0 && g->ovl == 0)
5124
          {
5125
            sym->st_shndx = (_bfd_elf_section_from_bfd_section
5126
                             (htab->stub_sec[0]->output_section->owner,
5127
                              htab->stub_sec[0]->output_section));
5128
            sym->st_value = g->stub_addr;
5129
            break;
5130
          }
5131
    }
5132
 
5133
  return 1;
5134
}
5135
 
5136
static int spu_plugin = 0;
5137
 
5138
void
5139
spu_elf_plugin (int val)
5140
{
5141
  spu_plugin = val;
5142
}
5143
 
5144
/* Set ELF header e_type for plugins.  */
5145
 
5146
static void
5147
spu_elf_post_process_headers (bfd *abfd,
5148
                              struct bfd_link_info *info ATTRIBUTE_UNUSED)
5149
{
5150
  if (spu_plugin)
5151
    {
5152
      Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5153
 
5154
      i_ehdrp->e_type = ET_DYN;
5155
    }
5156
}
5157
 
5158
/* We may add an extra PT_LOAD segment for .toe.  We also need extra
5159
   segments for overlays.  */
5160
 
5161
static int
5162
spu_elf_additional_program_headers (bfd *abfd, struct bfd_link_info *info)
5163
{
5164
  int extra = 0;
5165
  asection *sec;
5166
 
5167
  if (info != NULL)
5168
    {
5169
      struct spu_link_hash_table *htab = spu_hash_table (info);
5170
      extra = htab->num_overlays;
5171
    }
5172
 
5173
  if (extra)
5174
    ++extra;
5175
 
5176
  sec = bfd_get_section_by_name (abfd, ".toe");
5177
  if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
5178
    ++extra;
5179
 
5180
  return extra;
5181
}
5182
 
5183
/* Remove .toe section from other PT_LOAD segments and put it in
5184
   a segment of its own.  Put overlays in separate segments too.  */
5185
 
5186
static bfd_boolean
5187
spu_elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
5188
{
5189
  asection *toe, *s;
5190
  struct elf_segment_map *m, *m_overlay;
5191
  struct elf_segment_map **p, **p_overlay;
5192
  unsigned int i;
5193
 
5194
  if (info == NULL)
5195
    return TRUE;
5196
 
5197
  toe = bfd_get_section_by_name (abfd, ".toe");
5198
  for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
5199
    if (m->p_type == PT_LOAD && m->count > 1)
5200
      for (i = 0; i < m->count; i++)
5201
        if ((s = m->sections[i]) == toe
5202
            || spu_elf_section_data (s)->u.o.ovl_index != 0)
5203
          {
5204
            struct elf_segment_map *m2;
5205
            bfd_vma amt;
5206
 
5207
            if (i + 1 < m->count)
5208
              {
5209
                amt = sizeof (struct elf_segment_map);
5210
                amt += (m->count - (i + 2)) * sizeof (m->sections[0]);
5211
                m2 = bfd_zalloc (abfd, amt);
5212
                if (m2 == NULL)
5213
                  return FALSE;
5214
                m2->count = m->count - (i + 1);
5215
                memcpy (m2->sections, m->sections + i + 1,
5216
                        m2->count * sizeof (m->sections[0]));
5217
                m2->p_type = PT_LOAD;
5218
                m2->next = m->next;
5219
                m->next = m2;
5220
              }
5221
            m->count = 1;
5222
            if (i != 0)
5223
              {
5224
                m->count = i;
5225
                amt = sizeof (struct elf_segment_map);
5226
                m2 = bfd_zalloc (abfd, amt);
5227
                if (m2 == NULL)
5228
                  return FALSE;
5229
                m2->p_type = PT_LOAD;
5230
                m2->count = 1;
5231
                m2->sections[0] = s;
5232
                m2->next = m->next;
5233
                m->next = m2;
5234
              }
5235
            break;
5236
          }
5237
 
5238
 
5239
  /* Some SPU ELF loaders ignore the PF_OVERLAY flag and just load all
5240
     PT_LOAD segments.  This can cause the .ovl.init section to be
5241
     overwritten with the contents of some overlay segment.  To work
5242
     around this issue, we ensure that all PF_OVERLAY segments are
5243
     sorted first amongst the program headers; this ensures that even
5244
     with a broken loader, the .ovl.init section (which is not marked
5245
     as PF_OVERLAY) will be placed into SPU local store on startup.  */
5246
 
5247
  /* Move all overlay segments onto a separate list.  */
5248
  p = &elf_tdata (abfd)->segment_map;
5249
  p_overlay = &m_overlay;
5250
  while (*p != NULL)
5251
    {
5252
      if ((*p)->p_type == PT_LOAD && (*p)->count == 1
5253
          && spu_elf_section_data ((*p)->sections[0])->u.o.ovl_index != 0)
5254
        {
5255
          m = *p;
5256
          *p = m->next;
5257
          *p_overlay = m;
5258
          p_overlay = &m->next;
5259
          continue;
5260
        }
5261
 
5262
      p = &((*p)->next);
5263
    }
5264
 
5265
  /* Re-insert overlay segments at the head of the segment map.  */
5266
  *p_overlay = elf_tdata (abfd)->segment_map;
5267
  elf_tdata (abfd)->segment_map = m_overlay;
5268
 
5269
  return TRUE;
5270
}
5271
 
5272
/* Tweak the section type of .note.spu_name.  */
5273
 
5274
static bfd_boolean
5275
spu_elf_fake_sections (bfd *obfd ATTRIBUTE_UNUSED,
5276
                       Elf_Internal_Shdr *hdr,
5277
                       asection *sec)
5278
{
5279
  if (strcmp (sec->name, SPU_PTNOTE_SPUNAME) == 0)
5280
    hdr->sh_type = SHT_NOTE;
5281
  return TRUE;
5282
}
5283
 
5284
/* Tweak phdrs before writing them out.  */
5285
 
5286
static int
5287
spu_elf_modify_program_headers (bfd *abfd, struct bfd_link_info *info)
5288
{
5289
  const struct elf_backend_data *bed;
5290
  struct elf_obj_tdata *tdata;
5291
  Elf_Internal_Phdr *phdr, *last;
5292
  struct spu_link_hash_table *htab;
5293
  unsigned int count;
5294
  unsigned int i;
5295
 
5296
  if (info == NULL)
5297
    return TRUE;
5298
 
5299
  bed = get_elf_backend_data (abfd);
5300
  tdata = elf_tdata (abfd);
5301
  phdr = tdata->phdr;
5302
  count = tdata->program_header_size / bed->s->sizeof_phdr;
5303
  htab = spu_hash_table (info);
5304
  if (htab->num_overlays != 0)
5305
    {
5306
      struct elf_segment_map *m;
5307
      unsigned int o;
5308
 
5309
      for (i = 0, m = elf_tdata (abfd)->segment_map; m; ++i, m = m->next)
5310
        if (m->count != 0
5311
            && (o = spu_elf_section_data (m->sections[0])->u.o.ovl_index) != 0)
5312
          {
5313
            /* Mark this as an overlay header.  */
5314
            phdr[i].p_flags |= PF_OVERLAY;
5315
 
5316
            if (htab->ovtab != NULL && htab->ovtab->size != 0
5317
                && htab->params->ovly_flavour != ovly_soft_icache)
5318
              {
5319
                bfd_byte *p = htab->ovtab->contents;
5320
                unsigned int off = o * 16 + 8;
5321
 
5322
                /* Write file_off into _ovly_table.  */
5323
                bfd_put_32 (htab->ovtab->owner, phdr[i].p_offset, p + off);
5324
              }
5325
          }
5326
      /* Soft-icache has its file offset put in .ovl.init.  */
5327
      if (htab->init != NULL && htab->init->size != 0)
5328
        {
5329
          bfd_vma val = elf_section_data (htab->ovl_sec[0])->this_hdr.sh_offset;
5330
 
5331
          bfd_put_32 (htab->init->owner, val, htab->init->contents + 4);
5332
        }
5333
    }
5334
 
5335
  /* Round up p_filesz and p_memsz of PT_LOAD segments to multiples
5336
     of 16.  This should always be possible when using the standard
5337
     linker scripts, but don't create overlapping segments if
5338
     someone is playing games with linker scripts.  */
5339
  last = NULL;
5340
  for (i = count; i-- != 0; )
5341
    if (phdr[i].p_type == PT_LOAD)
5342
      {
5343
        unsigned adjust;
5344
 
5345
        adjust = -phdr[i].p_filesz & 15;
5346
        if (adjust != 0
5347
            && last != NULL
5348
            && phdr[i].p_offset + phdr[i].p_filesz > last->p_offset - adjust)
5349
          break;
5350
 
5351
        adjust = -phdr[i].p_memsz & 15;
5352
        if (adjust != 0
5353
            && last != NULL
5354
            && phdr[i].p_filesz != 0
5355
            && phdr[i].p_vaddr + phdr[i].p_memsz > last->p_vaddr - adjust
5356
            && phdr[i].p_vaddr + phdr[i].p_memsz <= last->p_vaddr)
5357
          break;
5358
 
5359
        if (phdr[i].p_filesz != 0)
5360
          last = &phdr[i];
5361
      }
5362
 
5363
  if (i == (unsigned int) -1)
5364
    for (i = count; i-- != 0; )
5365
      if (phdr[i].p_type == PT_LOAD)
5366
        {
5367
        unsigned adjust;
5368
 
5369
        adjust = -phdr[i].p_filesz & 15;
5370
        phdr[i].p_filesz += adjust;
5371
 
5372
        adjust = -phdr[i].p_memsz & 15;
5373
        phdr[i].p_memsz += adjust;
5374
      }
5375
 
5376
  return TRUE;
5377
}
5378
 
5379
bfd_boolean
5380
spu_elf_size_sections (bfd * output_bfd, struct bfd_link_info *info)
5381
{
5382
  struct spu_link_hash_table *htab = spu_hash_table (info);
5383
  if (htab->params->emit_fixups)
5384
    {
5385
      asection *sfixup = htab->sfixup;
5386
      int fixup_count = 0;
5387
      bfd *ibfd;
5388
      size_t size;
5389
 
5390
      for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5391
        {
5392
          asection *isec;
5393
 
5394
          if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5395
            continue;
5396
 
5397
          /* Walk over each section attached to the input bfd.  */
5398
          for (isec = ibfd->sections; isec != NULL; isec = isec->next)
5399
            {
5400
              Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
5401
              bfd_vma base_end;
5402
 
5403
              /* If there aren't any relocs, then there's nothing more
5404
                 to do.  */
5405
              if ((isec->flags & SEC_RELOC) == 0
5406
                  || isec->reloc_count == 0)
5407
                continue;
5408
 
5409
              /* Get the relocs.  */
5410
              internal_relocs =
5411
                _bfd_elf_link_read_relocs (ibfd, isec, NULL, NULL,
5412
                                           info->keep_memory);
5413
              if (internal_relocs == NULL)
5414
                return FALSE;
5415
 
5416
              /* 1 quadword can contain up to 4 R_SPU_ADDR32
5417
                 relocations.  They are stored in a single word by
5418
                 saving the upper 28 bits of the address and setting the
5419
                 lower 4 bits to a bit mask of the words that have the
5420
                 relocation.  BASE_END keeps track of the next quadword. */
5421
              irela = internal_relocs;
5422
              irelaend = irela + isec->reloc_count;
5423
              base_end = 0;
5424
              for (; irela < irelaend; irela++)
5425
                if (ELF32_R_TYPE (irela->r_info) == R_SPU_ADDR32
5426
                    && irela->r_offset >= base_end)
5427
                  {
5428
                    base_end = (irela->r_offset & ~(bfd_vma) 15) + 16;
5429
                    fixup_count++;
5430
                  }
5431
            }
5432
        }
5433
 
5434
      /* We always have a NULL fixup as a sentinel */
5435
      size = (fixup_count + 1) * FIXUP_RECORD_SIZE;
5436
      if (!bfd_set_section_size (output_bfd, sfixup, size))
5437
        return FALSE;
5438
      sfixup->contents = (bfd_byte *) bfd_zalloc (info->input_bfds, size);
5439
      if (sfixup->contents == NULL)
5440
        return FALSE;
5441
    }
5442
  return TRUE;
5443
}
5444
 
5445
#define TARGET_BIG_SYM          bfd_elf32_spu_vec
5446
#define TARGET_BIG_NAME         "elf32-spu"
5447
#define ELF_ARCH                bfd_arch_spu
5448
#define ELF_MACHINE_CODE        EM_SPU
5449
/* This matches the alignment need for DMA.  */
5450
#define ELF_MAXPAGESIZE         0x80
5451
#define elf_backend_rela_normal         1
5452
#define elf_backend_can_gc_sections     1
5453
 
5454
#define bfd_elf32_bfd_reloc_type_lookup         spu_elf_reloc_type_lookup
5455
#define bfd_elf32_bfd_reloc_name_lookup         spu_elf_reloc_name_lookup
5456
#define elf_info_to_howto                       spu_elf_info_to_howto
5457
#define elf_backend_count_relocs                spu_elf_count_relocs
5458
#define elf_backend_relocate_section            spu_elf_relocate_section
5459
#define elf_backend_symbol_processing           spu_elf_backend_symbol_processing
5460
#define elf_backend_link_output_symbol_hook     spu_elf_output_symbol_hook
5461
#define elf_backend_object_p                    spu_elf_object_p
5462
#define bfd_elf32_new_section_hook              spu_elf_new_section_hook
5463
#define bfd_elf32_bfd_link_hash_table_create    spu_elf_link_hash_table_create
5464
 
5465
#define elf_backend_additional_program_headers  spu_elf_additional_program_headers
5466
#define elf_backend_modify_segment_map          spu_elf_modify_segment_map
5467
#define elf_backend_modify_program_headers      spu_elf_modify_program_headers
5468
#define elf_backend_post_process_headers        spu_elf_post_process_headers
5469
#define elf_backend_fake_sections               spu_elf_fake_sections
5470
#define elf_backend_special_sections            spu_elf_special_sections
5471
#define bfd_elf32_bfd_final_link                spu_elf_final_link
5472
 
5473
#include "elf32-target.h"

powered by: WebSVN 2.1.0

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