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