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