~ubuntu-branches/ubuntu/utopic/binutils-arm64-cross/utopic

« back to all changes in this revision

Viewing changes to binutils-2.23.52.20130611/bfd/elf32-spu.c

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-06-20 17:38:09 UTC
  • Revision ID: package-import@ubuntu.com-20130620173809-app8lzgvymy5fg6c
Tags: 0.7
Build-depend on binutils-source (>= 2.23.52.20130620-1~).

Show diffs side-by-side

added added

removed removed

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