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