[sim/rx]
[binutils.git] / bfd / elf32-spu.c
blobfb3a4faa411509acf46c18f377fe45fe03b218b4
1 /* SPU specific support for 32-bit ELF
3 Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
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"
30 /* We use RELA style relocs. Don't define USE_REL. */
32 static bfd_reloc_status_type spu_elf_rel9 (bfd *, arelent *, asymbol *,
33 void *, asection *,
34 bfd *, char **);
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. */
39 static reloc_howto_type elf_howto_table[] = {
40 HOWTO (R_SPU_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
41 bfd_elf_generic_reloc, "SPU_NONE",
42 FALSE, 0, 0x00000000, FALSE),
43 HOWTO (R_SPU_ADDR10, 4, 2, 10, FALSE, 14, complain_overflow_bitfield,
44 bfd_elf_generic_reloc, "SPU_ADDR10",
45 FALSE, 0, 0x00ffc000, FALSE),
46 HOWTO (R_SPU_ADDR16, 2, 2, 16, FALSE, 7, complain_overflow_bitfield,
47 bfd_elf_generic_reloc, "SPU_ADDR16",
48 FALSE, 0, 0x007fff80, FALSE),
49 HOWTO (R_SPU_ADDR16_HI, 16, 2, 16, FALSE, 7, complain_overflow_bitfield,
50 bfd_elf_generic_reloc, "SPU_ADDR16_HI",
51 FALSE, 0, 0x007fff80, FALSE),
52 HOWTO (R_SPU_ADDR16_LO, 0, 2, 16, FALSE, 7, complain_overflow_dont,
53 bfd_elf_generic_reloc, "SPU_ADDR16_LO",
54 FALSE, 0, 0x007fff80, FALSE),
55 HOWTO (R_SPU_ADDR18, 0, 2, 18, FALSE, 7, complain_overflow_bitfield,
56 bfd_elf_generic_reloc, "SPU_ADDR18",
57 FALSE, 0, 0x01ffff80, FALSE),
58 HOWTO (R_SPU_ADDR32, 0, 2, 32, FALSE, 0, complain_overflow_dont,
59 bfd_elf_generic_reloc, "SPU_ADDR32",
60 FALSE, 0, 0xffffffff, FALSE),
61 HOWTO (R_SPU_REL16, 2, 2, 16, TRUE, 7, complain_overflow_bitfield,
62 bfd_elf_generic_reloc, "SPU_REL16",
63 FALSE, 0, 0x007fff80, TRUE),
64 HOWTO (R_SPU_ADDR7, 0, 2, 7, FALSE, 14, complain_overflow_dont,
65 bfd_elf_generic_reloc, "SPU_ADDR7",
66 FALSE, 0, 0x001fc000, FALSE),
67 HOWTO (R_SPU_REL9, 2, 2, 9, TRUE, 0, complain_overflow_signed,
68 spu_elf_rel9, "SPU_REL9",
69 FALSE, 0, 0x0180007f, TRUE),
70 HOWTO (R_SPU_REL9I, 2, 2, 9, TRUE, 0, complain_overflow_signed,
71 spu_elf_rel9, "SPU_REL9I",
72 FALSE, 0, 0x0000c07f, TRUE),
73 HOWTO (R_SPU_ADDR10I, 0, 2, 10, FALSE, 14, complain_overflow_signed,
74 bfd_elf_generic_reloc, "SPU_ADDR10I",
75 FALSE, 0, 0x00ffc000, FALSE),
76 HOWTO (R_SPU_ADDR16I, 0, 2, 16, FALSE, 7, complain_overflow_signed,
77 bfd_elf_generic_reloc, "SPU_ADDR16I",
78 FALSE, 0, 0x007fff80, FALSE),
79 HOWTO (R_SPU_REL32, 0, 2, 32, TRUE, 0, complain_overflow_dont,
80 bfd_elf_generic_reloc, "SPU_REL32",
81 FALSE, 0, 0xffffffff, TRUE),
82 HOWTO (R_SPU_ADDR16X, 0, 2, 16, FALSE, 7, complain_overflow_bitfield,
83 bfd_elf_generic_reloc, "SPU_ADDR16X",
84 FALSE, 0, 0x007fff80, FALSE),
85 HOWTO (R_SPU_PPU32, 0, 2, 32, FALSE, 0, complain_overflow_dont,
86 bfd_elf_generic_reloc, "SPU_PPU32",
87 FALSE, 0, 0xffffffff, FALSE),
88 HOWTO (R_SPU_PPU64, 0, 4, 64, FALSE, 0, complain_overflow_dont,
89 bfd_elf_generic_reloc, "SPU_PPU64",
90 FALSE, 0, -1, FALSE),
91 HOWTO (R_SPU_ADD_PIC, 0, 0, 0, FALSE, 0, complain_overflow_dont,
92 bfd_elf_generic_reloc, "SPU_ADD_PIC",
93 FALSE, 0, 0x00000000, FALSE),
96 static struct bfd_elf_special_section const spu_elf_special_sections[] = {
97 { "._ea", 4, 0, SHT_PROGBITS, SHF_WRITE },
98 { ".toe", 4, 0, SHT_NOBITS, SHF_ALLOC },
99 { NULL, 0, 0, 0, 0 }
102 static enum elf_spu_reloc_type
103 spu_elf_bfd_to_reloc_type (bfd_reloc_code_real_type code)
105 switch (code)
107 default:
108 return R_SPU_NONE;
109 case BFD_RELOC_SPU_IMM10W:
110 return R_SPU_ADDR10;
111 case BFD_RELOC_SPU_IMM16W:
112 return R_SPU_ADDR16;
113 case BFD_RELOC_SPU_LO16:
114 return R_SPU_ADDR16_LO;
115 case BFD_RELOC_SPU_HI16:
116 return R_SPU_ADDR16_HI;
117 case BFD_RELOC_SPU_IMM18:
118 return R_SPU_ADDR18;
119 case BFD_RELOC_SPU_PCREL16:
120 return R_SPU_REL16;
121 case BFD_RELOC_SPU_IMM7:
122 return R_SPU_ADDR7;
123 case BFD_RELOC_SPU_IMM8:
124 return R_SPU_NONE;
125 case BFD_RELOC_SPU_PCREL9a:
126 return R_SPU_REL9;
127 case BFD_RELOC_SPU_PCREL9b:
128 return R_SPU_REL9I;
129 case BFD_RELOC_SPU_IMM10:
130 return R_SPU_ADDR10I;
131 case BFD_RELOC_SPU_IMM16:
132 return R_SPU_ADDR16I;
133 case BFD_RELOC_32:
134 return R_SPU_ADDR32;
135 case BFD_RELOC_32_PCREL:
136 return R_SPU_REL32;
137 case BFD_RELOC_SPU_PPU32:
138 return R_SPU_PPU32;
139 case BFD_RELOC_SPU_PPU64:
140 return R_SPU_PPU64;
141 case BFD_RELOC_SPU_ADD_PIC:
142 return R_SPU_ADD_PIC;
146 static void
147 spu_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
148 arelent *cache_ptr,
149 Elf_Internal_Rela *dst)
151 enum elf_spu_reloc_type r_type;
153 r_type = (enum elf_spu_reloc_type) ELF32_R_TYPE (dst->r_info);
154 BFD_ASSERT (r_type < R_SPU_max);
155 cache_ptr->howto = &elf_howto_table[(int) r_type];
158 static reloc_howto_type *
159 spu_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
160 bfd_reloc_code_real_type code)
162 enum elf_spu_reloc_type r_type = spu_elf_bfd_to_reloc_type (code);
164 if (r_type == R_SPU_NONE)
165 return NULL;
167 return elf_howto_table + r_type;
170 static reloc_howto_type *
171 spu_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
172 const char *r_name)
174 unsigned int i;
176 for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
177 if (elf_howto_table[i].name != NULL
178 && strcasecmp (elf_howto_table[i].name, r_name) == 0)
179 return &elf_howto_table[i];
181 return NULL;
184 /* Apply R_SPU_REL9 and R_SPU_REL9I relocs. */
186 static bfd_reloc_status_type
187 spu_elf_rel9 (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
188 void *data, asection *input_section,
189 bfd *output_bfd, char **error_message)
191 bfd_size_type octets;
192 bfd_vma val;
193 long insn;
195 /* If this is a relocatable link (output_bfd test tells us), just
196 call the generic function. Any adjustment will be done at final
197 link time. */
198 if (output_bfd != NULL)
199 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
200 input_section, output_bfd, error_message);
202 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
203 return bfd_reloc_outofrange;
204 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
206 /* Get symbol value. */
207 val = 0;
208 if (!bfd_is_com_section (symbol->section))
209 val = symbol->value;
210 if (symbol->section->output_section)
211 val += symbol->section->output_section->vma;
213 val += reloc_entry->addend;
215 /* Make it pc-relative. */
216 val -= input_section->output_section->vma + input_section->output_offset;
218 val >>= 2;
219 if (val + 256 >= 512)
220 return bfd_reloc_overflow;
222 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
224 /* Move two high bits of value to REL9I and REL9 position.
225 The mask will take care of selecting the right field. */
226 val = (val & 0x7f) | ((val & 0x180) << 7) | ((val & 0x180) << 16);
227 insn &= ~reloc_entry->howto->dst_mask;
228 insn |= val & reloc_entry->howto->dst_mask;
229 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
230 return bfd_reloc_ok;
233 static bfd_boolean
234 spu_elf_new_section_hook (bfd *abfd, asection *sec)
236 if (!sec->used_by_bfd)
238 struct _spu_elf_section_data *sdata;
240 sdata = bfd_zalloc (abfd, sizeof (*sdata));
241 if (sdata == NULL)
242 return FALSE;
243 sec->used_by_bfd = sdata;
246 return _bfd_elf_new_section_hook (abfd, sec);
249 /* Set up overlay info for executables. */
251 static bfd_boolean
252 spu_elf_object_p (bfd *abfd)
254 if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
256 unsigned int i, num_ovl, num_buf;
257 Elf_Internal_Phdr *phdr = elf_tdata (abfd)->phdr;
258 Elf_Internal_Ehdr *ehdr = elf_elfheader (abfd);
259 Elf_Internal_Phdr *last_phdr = NULL;
261 for (num_buf = 0, num_ovl = 0, i = 0; i < ehdr->e_phnum; i++, phdr++)
262 if (phdr->p_type == PT_LOAD && (phdr->p_flags & PF_OVERLAY) != 0)
264 unsigned int j;
266 ++num_ovl;
267 if (last_phdr == NULL
268 || ((last_phdr->p_vaddr ^ phdr->p_vaddr) & 0x3ffff) != 0)
269 ++num_buf;
270 last_phdr = phdr;
271 for (j = 1; j < elf_numsections (abfd); j++)
273 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[j];
275 if (ELF_SECTION_SIZE (shdr, phdr) != 0
276 && ELF_SECTION_IN_SEGMENT (shdr, phdr))
278 asection *sec = shdr->bfd_section;
279 spu_elf_section_data (sec)->u.o.ovl_index = num_ovl;
280 spu_elf_section_data (sec)->u.o.ovl_buf = num_buf;
285 return TRUE;
288 /* Specially mark defined symbols named _EAR_* with BSF_KEEP so that
289 strip --strip-unneeded will not remove them. */
291 static void
292 spu_elf_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
294 if (sym->name != NULL
295 && sym->section != bfd_abs_section_ptr
296 && strncmp (sym->name, "_EAR_", 5) == 0)
297 sym->flags |= BSF_KEEP;
300 /* SPU ELF linker hash table. */
302 struct spu_link_hash_table
304 struct elf_link_hash_table elf;
306 struct spu_elf_params *params;
308 /* Shortcuts to overlay sections. */
309 asection *ovtab;
310 asection *init;
311 asection *toe;
312 asection **ovl_sec;
314 /* Count of stubs in each overlay section. */
315 unsigned int *stub_count;
317 /* The stub section for each overlay section. */
318 asection **stub_sec;
320 struct elf_link_hash_entry *ovly_entry[2];
322 /* Number of overlay buffers. */
323 unsigned int num_buf;
325 /* Total number of overlays. */
326 unsigned int num_overlays;
328 /* For soft icache. */
329 unsigned int line_size_log2;
330 unsigned int num_lines_log2;
331 unsigned int fromelem_size_log2;
333 /* How much memory we have. */
334 unsigned int local_store;
336 /* Count of overlay stubs needed in non-overlay area. */
337 unsigned int non_ovly_stub;
339 /* Pointer to the fixup section */
340 asection *sfixup;
342 /* Set on error. */
343 unsigned int stub_err : 1;
346 /* Hijack the generic got fields for overlay stub accounting. */
348 struct got_entry
350 struct got_entry *next;
351 unsigned int ovl;
352 union {
353 bfd_vma addend;
354 bfd_vma br_addr;
356 bfd_vma stub_addr;
359 #define spu_hash_table(p) \
360 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
361 == SPU_ELF_DATA ? ((struct spu_link_hash_table *) ((p)->hash)) : NULL)
363 struct call_info
365 struct function_info *fun;
366 struct call_info *next;
367 unsigned int count;
368 unsigned int max_depth;
369 unsigned int is_tail : 1;
370 unsigned int is_pasted : 1;
371 unsigned int broken_cycle : 1;
372 unsigned int priority : 13;
375 struct function_info
377 /* List of functions called. Also branches to hot/cold part of
378 function. */
379 struct call_info *call_list;
380 /* For hot/cold part of function, point to owner. */
381 struct function_info *start;
382 /* Symbol at start of function. */
383 union {
384 Elf_Internal_Sym *sym;
385 struct elf_link_hash_entry *h;
386 } u;
387 /* Function section. */
388 asection *sec;
389 asection *rodata;
390 /* Where last called from, and number of sections called from. */
391 asection *last_caller;
392 unsigned int call_count;
393 /* Address range of (this part of) function. */
394 bfd_vma lo, hi;
395 /* Offset where we found a store of lr, or -1 if none found. */
396 bfd_vma lr_store;
397 /* Offset where we found the stack adjustment insn. */
398 bfd_vma sp_adjust;
399 /* Stack usage. */
400 int stack;
401 /* Distance from root of call tree. Tail and hot/cold branches
402 count as one deeper. We aren't counting stack frames here. */
403 unsigned int depth;
404 /* Set if global symbol. */
405 unsigned int global : 1;
406 /* Set if known to be start of function (as distinct from a hunk
407 in hot/cold section. */
408 unsigned int is_func : 1;
409 /* Set if not a root node. */
410 unsigned int non_root : 1;
411 /* Flags used during call tree traversal. It's cheaper to replicate
412 the visit flags than have one which needs clearing after a traversal. */
413 unsigned int visit1 : 1;
414 unsigned int visit2 : 1;
415 unsigned int marking : 1;
416 unsigned int visit3 : 1;
417 unsigned int visit4 : 1;
418 unsigned int visit5 : 1;
419 unsigned int visit6 : 1;
420 unsigned int visit7 : 1;
423 struct spu_elf_stack_info
425 int num_fun;
426 int max_fun;
427 /* Variable size array describing functions, one per contiguous
428 address range belonging to a function. */
429 struct function_info fun[1];
432 static struct function_info *find_function (asection *, bfd_vma,
433 struct bfd_link_info *);
435 /* Create a spu ELF linker hash table. */
437 static struct bfd_link_hash_table *
438 spu_elf_link_hash_table_create (bfd *abfd)
440 struct spu_link_hash_table *htab;
442 htab = bfd_malloc (sizeof (*htab));
443 if (htab == NULL)
444 return NULL;
446 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd,
447 _bfd_elf_link_hash_newfunc,
448 sizeof (struct elf_link_hash_entry),
449 SPU_ELF_DATA))
451 free (htab);
452 return NULL;
455 memset (&htab->ovtab, 0,
456 sizeof (*htab) - offsetof (struct spu_link_hash_table, ovtab));
458 htab->elf.init_got_refcount.refcount = 0;
459 htab->elf.init_got_refcount.glist = NULL;
460 htab->elf.init_got_offset.offset = 0;
461 htab->elf.init_got_offset.glist = NULL;
462 return &htab->elf.root;
465 void
466 spu_elf_setup (struct bfd_link_info *info, struct spu_elf_params *params)
468 bfd_vma max_branch_log2;
470 struct spu_link_hash_table *htab = spu_hash_table (info);
471 htab->params = params;
472 htab->line_size_log2 = bfd_log2 (htab->params->line_size);
473 htab->num_lines_log2 = bfd_log2 (htab->params->num_lines);
475 /* For the software i-cache, we provide a "from" list whose size
476 is a power-of-two number of quadwords, big enough to hold one
477 byte per outgoing branch. Compute this number here. */
478 max_branch_log2 = bfd_log2 (htab->params->max_branch);
479 htab->fromelem_size_log2 = max_branch_log2 > 4 ? max_branch_log2 - 4 : 0;
482 /* Find the symbol for the given R_SYMNDX in IBFD and set *HP and *SYMP
483 to (hash, NULL) for global symbols, and (NULL, sym) for locals. Set
484 *SYMSECP to the symbol's section. *LOCSYMSP caches local syms. */
486 static bfd_boolean
487 get_sym_h (struct elf_link_hash_entry **hp,
488 Elf_Internal_Sym **symp,
489 asection **symsecp,
490 Elf_Internal_Sym **locsymsp,
491 unsigned long r_symndx,
492 bfd *ibfd)
494 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
496 if (r_symndx >= symtab_hdr->sh_info)
498 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
499 struct elf_link_hash_entry *h;
501 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
502 while (h->root.type == bfd_link_hash_indirect
503 || h->root.type == bfd_link_hash_warning)
504 h = (struct elf_link_hash_entry *) h->root.u.i.link;
506 if (hp != NULL)
507 *hp = h;
509 if (symp != NULL)
510 *symp = NULL;
512 if (symsecp != NULL)
514 asection *symsec = NULL;
515 if (h->root.type == bfd_link_hash_defined
516 || h->root.type == bfd_link_hash_defweak)
517 symsec = h->root.u.def.section;
518 *symsecp = symsec;
521 else
523 Elf_Internal_Sym *sym;
524 Elf_Internal_Sym *locsyms = *locsymsp;
526 if (locsyms == NULL)
528 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
529 if (locsyms == NULL)
530 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
531 symtab_hdr->sh_info,
532 0, NULL, NULL, NULL);
533 if (locsyms == NULL)
534 return FALSE;
535 *locsymsp = locsyms;
537 sym = locsyms + r_symndx;
539 if (hp != NULL)
540 *hp = NULL;
542 if (symp != NULL)
543 *symp = sym;
545 if (symsecp != NULL)
546 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
549 return TRUE;
552 /* Create the note section if not already present. This is done early so
553 that the linker maps the sections to the right place in the output. */
555 bfd_boolean
556 spu_elf_create_sections (struct bfd_link_info *info)
558 struct spu_link_hash_table *htab = spu_hash_table (info);
559 bfd *ibfd;
561 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
562 if (bfd_get_section_by_name (ibfd, SPU_PTNOTE_SPUNAME) != NULL)
563 break;
565 if (ibfd == NULL)
567 /* Make SPU_PTNOTE_SPUNAME section. */
568 asection *s;
569 size_t name_len;
570 size_t size;
571 bfd_byte *data;
572 flagword flags;
574 ibfd = info->input_bfds;
575 flags = SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
576 s = bfd_make_section_anyway_with_flags (ibfd, SPU_PTNOTE_SPUNAME, flags);
577 if (s == NULL
578 || !bfd_set_section_alignment (ibfd, s, 4))
579 return FALSE;
581 name_len = strlen (bfd_get_filename (info->output_bfd)) + 1;
582 size = 12 + ((sizeof (SPU_PLUGIN_NAME) + 3) & -4);
583 size += (name_len + 3) & -4;
585 if (!bfd_set_section_size (ibfd, s, size))
586 return FALSE;
588 data = bfd_zalloc (ibfd, size);
589 if (data == NULL)
590 return FALSE;
592 bfd_put_32 (ibfd, sizeof (SPU_PLUGIN_NAME), data + 0);
593 bfd_put_32 (ibfd, name_len, data + 4);
594 bfd_put_32 (ibfd, 1, data + 8);
595 memcpy (data + 12, SPU_PLUGIN_NAME, sizeof (SPU_PLUGIN_NAME));
596 memcpy (data + 12 + ((sizeof (SPU_PLUGIN_NAME) + 3) & -4),
597 bfd_get_filename (info->output_bfd), name_len);
598 s->contents = data;
601 if (htab->params->emit_fixups)
603 asection *s;
604 flagword flags;
605 ibfd = info->input_bfds;
606 flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY | SEC_HAS_CONTENTS
607 | SEC_IN_MEMORY;
608 s = bfd_make_section_anyway_with_flags (ibfd, ".fixup", flags);
609 if (s == NULL || !bfd_set_section_alignment (ibfd, s, 2))
610 return FALSE;
611 htab->sfixup = s;
614 return TRUE;
617 /* qsort predicate to sort sections by vma. */
619 static int
620 sort_sections (const void *a, const void *b)
622 const asection *const *s1 = a;
623 const asection *const *s2 = b;
624 bfd_signed_vma delta = (*s1)->vma - (*s2)->vma;
626 if (delta != 0)
627 return delta < 0 ? -1 : 1;
629 return (*s1)->index - (*s2)->index;
632 /* Identify overlays in the output bfd, and number them.
633 Returns 0 on error, 1 if no overlays, 2 if overlays. */
636 spu_elf_find_overlays (struct bfd_link_info *info)
638 struct spu_link_hash_table *htab = spu_hash_table (info);
639 asection **alloc_sec;
640 unsigned int i, n, ovl_index, num_buf;
641 asection *s;
642 bfd_vma ovl_end;
643 static const char *const entry_names[2][2] = {
644 { "__ovly_load", "__icache_br_handler" },
645 { "__ovly_return", "__icache_call_handler" }
648 if (info->output_bfd->section_count < 2)
649 return 1;
651 alloc_sec
652 = bfd_malloc (info->output_bfd->section_count * sizeof (*alloc_sec));
653 if (alloc_sec == NULL)
654 return 0;
656 /* Pick out all the alloced sections. */
657 for (n = 0, s = info->output_bfd->sections; s != NULL; s = s->next)
658 if ((s->flags & SEC_ALLOC) != 0
659 && (s->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != SEC_THREAD_LOCAL
660 && s->size != 0)
661 alloc_sec[n++] = s;
663 if (n == 0)
665 free (alloc_sec);
666 return 1;
669 /* Sort them by vma. */
670 qsort (alloc_sec, n, sizeof (*alloc_sec), sort_sections);
672 ovl_end = alloc_sec[0]->vma + alloc_sec[0]->size;
673 if (htab->params->ovly_flavour == ovly_soft_icache)
675 unsigned int prev_buf = 0, set_id = 0;
677 /* Look for an overlapping vma to find the first overlay section. */
678 bfd_vma vma_start = 0;
680 for (i = 1; i < n; i++)
682 s = alloc_sec[i];
683 if (s->vma < ovl_end)
685 asection *s0 = alloc_sec[i - 1];
686 vma_start = s0->vma;
687 ovl_end = (s0->vma
688 + ((bfd_vma) 1
689 << (htab->num_lines_log2 + htab->line_size_log2)));
690 --i;
691 break;
693 else
694 ovl_end = s->vma + s->size;
697 /* Now find any sections within the cache area. */
698 for (ovl_index = 0, num_buf = 0; i < n; i++)
700 s = alloc_sec[i];
701 if (s->vma >= ovl_end)
702 break;
704 /* A section in an overlay area called .ovl.init is not
705 an overlay, in the sense that it might be loaded in
706 by the overlay manager, but rather the initial
707 section contents for the overlay buffer. */
708 if (strncmp (s->name, ".ovl.init", 9) != 0)
710 num_buf = ((s->vma - vma_start) >> htab->line_size_log2) + 1;
711 set_id = (num_buf == prev_buf)? set_id + 1 : 0;
712 prev_buf = num_buf;
714 if ((s->vma - vma_start) & (htab->params->line_size - 1))
716 info->callbacks->einfo (_("%X%P: overlay section %A "
717 "does not start on a cache line.\n"),
719 bfd_set_error (bfd_error_bad_value);
720 return 0;
722 else if (s->size > htab->params->line_size)
724 info->callbacks->einfo (_("%X%P: overlay section %A "
725 "is larger than a cache line.\n"),
727 bfd_set_error (bfd_error_bad_value);
728 return 0;
731 alloc_sec[ovl_index++] = s;
732 spu_elf_section_data (s)->u.o.ovl_index
733 = (set_id << htab->num_lines_log2) + num_buf;
734 spu_elf_section_data (s)->u.o.ovl_buf = num_buf;
738 /* Ensure there are no more overlay sections. */
739 for ( ; i < n; i++)
741 s = alloc_sec[i];
742 if (s->vma < ovl_end)
744 info->callbacks->einfo (_("%X%P: overlay section %A "
745 "is not in cache area.\n"),
746 alloc_sec[i-1]);
747 bfd_set_error (bfd_error_bad_value);
748 return 0;
750 else
751 ovl_end = s->vma + s->size;
754 else
756 /* Look for overlapping vmas. Any with overlap must be overlays.
757 Count them. Also count the number of overlay regions. */
758 for (ovl_index = 0, num_buf = 0, i = 1; i < n; i++)
760 s = alloc_sec[i];
761 if (s->vma < ovl_end)
763 asection *s0 = alloc_sec[i - 1];
765 if (spu_elf_section_data (s0)->u.o.ovl_index == 0)
767 ++num_buf;
768 if (strncmp (s0->name, ".ovl.init", 9) != 0)
770 alloc_sec[ovl_index] = s0;
771 spu_elf_section_data (s0)->u.o.ovl_index = ++ovl_index;
772 spu_elf_section_data (s0)->u.o.ovl_buf = num_buf;
774 else
775 ovl_end = s->vma + s->size;
777 if (strncmp (s->name, ".ovl.init", 9) != 0)
779 alloc_sec[ovl_index] = s;
780 spu_elf_section_data (s)->u.o.ovl_index = ++ovl_index;
781 spu_elf_section_data (s)->u.o.ovl_buf = num_buf;
782 if (s0->vma != s->vma)
784 info->callbacks->einfo (_("%X%P: overlay sections %A "
785 "and %A do not start at the "
786 "same address.\n"),
787 s0, s);
788 bfd_set_error (bfd_error_bad_value);
789 return 0;
791 if (ovl_end < s->vma + s->size)
792 ovl_end = s->vma + s->size;
795 else
796 ovl_end = s->vma + s->size;
800 htab->num_overlays = ovl_index;
801 htab->num_buf = num_buf;
802 htab->ovl_sec = alloc_sec;
804 if (ovl_index == 0)
805 return 1;
807 for (i = 0; i < 2; i++)
809 const char *name;
810 struct elf_link_hash_entry *h;
812 name = entry_names[i][htab->params->ovly_flavour];
813 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
814 if (h == NULL)
815 return 0;
817 if (h->root.type == bfd_link_hash_new)
819 h->root.type = bfd_link_hash_undefined;
820 h->ref_regular = 1;
821 h->ref_regular_nonweak = 1;
822 h->non_elf = 0;
824 htab->ovly_entry[i] = h;
827 return 2;
830 /* Non-zero to use bra in overlay stubs rather than br. */
831 #define BRA_STUBS 0
833 #define BRA 0x30000000
834 #define BRASL 0x31000000
835 #define BR 0x32000000
836 #define BRSL 0x33000000
837 #define NOP 0x40200000
838 #define LNOP 0x00200000
839 #define ILA 0x42000000
841 /* Return true for all relative and absolute branch instructions.
842 bra 00110000 0..
843 brasl 00110001 0..
844 br 00110010 0..
845 brsl 00110011 0..
846 brz 00100000 0..
847 brnz 00100001 0..
848 brhz 00100010 0..
849 brhnz 00100011 0.. */
851 static bfd_boolean
852 is_branch (const unsigned char *insn)
854 return (insn[0] & 0xec) == 0x20 && (insn[1] & 0x80) == 0;
857 /* Return true for all indirect branch instructions.
858 bi 00110101 000
859 bisl 00110101 001
860 iret 00110101 010
861 bisled 00110101 011
862 biz 00100101 000
863 binz 00100101 001
864 bihz 00100101 010
865 bihnz 00100101 011 */
867 static bfd_boolean
868 is_indirect_branch (const unsigned char *insn)
870 return (insn[0] & 0xef) == 0x25 && (insn[1] & 0x80) == 0;
873 /* Return true for branch hint instructions.
874 hbra 0001000..
875 hbrr 0001001.. */
877 static bfd_boolean
878 is_hint (const unsigned char *insn)
880 return (insn[0] & 0xfc) == 0x10;
883 /* True if INPUT_SECTION might need overlay stubs. */
885 static bfd_boolean
886 maybe_needs_stubs (asection *input_section)
888 /* No stubs for debug sections and suchlike. */
889 if ((input_section->flags & SEC_ALLOC) == 0)
890 return FALSE;
892 /* No stubs for link-once sections that will be discarded. */
893 if (input_section->output_section == bfd_abs_section_ptr)
894 return FALSE;
896 /* Don't create stubs for .eh_frame references. */
897 if (strcmp (input_section->name, ".eh_frame") == 0)
898 return FALSE;
900 return TRUE;
903 enum _stub_type
905 no_stub,
906 call_ovl_stub,
907 br000_ovl_stub,
908 br001_ovl_stub,
909 br010_ovl_stub,
910 br011_ovl_stub,
911 br100_ovl_stub,
912 br101_ovl_stub,
913 br110_ovl_stub,
914 br111_ovl_stub,
915 nonovl_stub,
916 stub_error
919 /* Return non-zero if this reloc symbol should go via an overlay stub.
920 Return 2 if the stub must be in non-overlay area. */
922 static enum _stub_type
923 needs_ovl_stub (struct elf_link_hash_entry *h,
924 Elf_Internal_Sym *sym,
925 asection *sym_sec,
926 asection *input_section,
927 Elf_Internal_Rela *irela,
928 bfd_byte *contents,
929 struct bfd_link_info *info)
931 struct spu_link_hash_table *htab = spu_hash_table (info);
932 enum elf_spu_reloc_type r_type;
933 unsigned int sym_type;
934 bfd_boolean branch, hint, call;
935 enum _stub_type ret = no_stub;
936 bfd_byte insn[4];
938 if (sym_sec == NULL
939 || sym_sec->output_section == bfd_abs_section_ptr
940 || spu_elf_section_data (sym_sec->output_section) == NULL)
941 return ret;
943 if (h != NULL)
945 /* Ensure no stubs for user supplied overlay manager syms. */
946 if (h == htab->ovly_entry[0] || h == htab->ovly_entry[1])
947 return ret;
949 /* setjmp always goes via an overlay stub, because then the return
950 and hence the longjmp goes via __ovly_return. That magically
951 makes setjmp/longjmp between overlays work. */
952 if (strncmp (h->root.root.string, "setjmp", 6) == 0
953 && (h->root.root.string[6] == '\0' || h->root.root.string[6] == '@'))
954 ret = call_ovl_stub;
957 if (h != NULL)
958 sym_type = h->type;
959 else
960 sym_type = ELF_ST_TYPE (sym->st_info);
962 r_type = ELF32_R_TYPE (irela->r_info);
963 branch = FALSE;
964 hint = FALSE;
965 call = FALSE;
966 if (r_type == R_SPU_REL16 || r_type == R_SPU_ADDR16)
968 if (contents == NULL)
970 contents = insn;
971 if (!bfd_get_section_contents (input_section->owner,
972 input_section,
973 contents,
974 irela->r_offset, 4))
975 return stub_error;
977 else
978 contents += irela->r_offset;
980 branch = is_branch (contents);
981 hint = is_hint (contents);
982 if (branch || hint)
984 call = (contents[0] & 0xfd) == 0x31;
985 if (call
986 && sym_type != STT_FUNC
987 && contents != insn)
989 /* It's common for people to write assembly and forget
990 to give function symbols the right type. Handle
991 calls to such symbols, but warn so that (hopefully)
992 people will fix their code. We need the symbol
993 type to be correct to distinguish function pointer
994 initialisation from other pointer initialisations. */
995 const char *sym_name;
997 if (h != NULL)
998 sym_name = h->root.root.string;
999 else
1001 Elf_Internal_Shdr *symtab_hdr;
1002 symtab_hdr = &elf_tdata (input_section->owner)->symtab_hdr;
1003 sym_name = bfd_elf_sym_name (input_section->owner,
1004 symtab_hdr,
1005 sym,
1006 sym_sec);
1008 (*_bfd_error_handler) (_("warning: call to non-function"
1009 " symbol %s defined in %B"),
1010 sym_sec->owner, sym_name);
1016 if ((!branch && htab->params->ovly_flavour == ovly_soft_icache)
1017 || (sym_type != STT_FUNC
1018 && !(branch || hint)
1019 && (sym_sec->flags & SEC_CODE) == 0))
1020 return no_stub;
1022 /* Usually, symbols in non-overlay sections don't need stubs. */
1023 if (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index == 0
1024 && !htab->params->non_overlay_stubs)
1025 return ret;
1027 /* A reference from some other section to a symbol in an overlay
1028 section needs a stub. */
1029 if (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index
1030 != spu_elf_section_data (input_section->output_section)->u.o.ovl_index)
1032 unsigned int lrlive = 0;
1033 if (branch)
1034 lrlive = (contents[1] & 0x70) >> 4;
1036 if (!lrlive && (call || sym_type == STT_FUNC))
1037 ret = call_ovl_stub;
1038 else
1039 ret = br000_ovl_stub + lrlive;
1042 /* If this insn isn't a branch then we are possibly taking the
1043 address of a function and passing it out somehow. Soft-icache code
1044 always generates inline code to do indirect branches. */
1045 if (!(branch || hint)
1046 && sym_type == STT_FUNC
1047 && htab->params->ovly_flavour != ovly_soft_icache)
1048 ret = nonovl_stub;
1050 return ret;
1053 static bfd_boolean
1054 count_stub (struct spu_link_hash_table *htab,
1055 bfd *ibfd,
1056 asection *isec,
1057 enum _stub_type stub_type,
1058 struct elf_link_hash_entry *h,
1059 const Elf_Internal_Rela *irela)
1061 unsigned int ovl = 0;
1062 struct got_entry *g, **head;
1063 bfd_vma addend;
1065 /* If this instruction is a branch or call, we need a stub
1066 for it. One stub per function per overlay.
1067 If it isn't a branch, then we are taking the address of
1068 this function so need a stub in the non-overlay area
1069 for it. One stub per function. */
1070 if (stub_type != nonovl_stub)
1071 ovl = spu_elf_section_data (isec->output_section)->u.o.ovl_index;
1073 if (h != NULL)
1074 head = &h->got.glist;
1075 else
1077 if (elf_local_got_ents (ibfd) == NULL)
1079 bfd_size_type amt = (elf_tdata (ibfd)->symtab_hdr.sh_info
1080 * sizeof (*elf_local_got_ents (ibfd)));
1081 elf_local_got_ents (ibfd) = bfd_zmalloc (amt);
1082 if (elf_local_got_ents (ibfd) == NULL)
1083 return FALSE;
1085 head = elf_local_got_ents (ibfd) + ELF32_R_SYM (irela->r_info);
1088 if (htab->params->ovly_flavour == ovly_soft_icache)
1090 htab->stub_count[ovl] += 1;
1091 return TRUE;
1094 addend = 0;
1095 if (irela != NULL)
1096 addend = irela->r_addend;
1098 if (ovl == 0)
1100 struct got_entry *gnext;
1102 for (g = *head; g != NULL; g = g->next)
1103 if (g->addend == addend && g->ovl == 0)
1104 break;
1106 if (g == NULL)
1108 /* Need a new non-overlay area stub. Zap other stubs. */
1109 for (g = *head; g != NULL; g = gnext)
1111 gnext = g->next;
1112 if (g->addend == addend)
1114 htab->stub_count[g->ovl] -= 1;
1115 free (g);
1120 else
1122 for (g = *head; g != NULL; g = g->next)
1123 if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
1124 break;
1127 if (g == NULL)
1129 g = bfd_malloc (sizeof *g);
1130 if (g == NULL)
1131 return FALSE;
1132 g->ovl = ovl;
1133 g->addend = addend;
1134 g->stub_addr = (bfd_vma) -1;
1135 g->next = *head;
1136 *head = g;
1138 htab->stub_count[ovl] += 1;
1141 return TRUE;
1144 /* Support two sizes of overlay stubs, a slower more compact stub of two
1145 intructions, and a faster stub of four instructions.
1146 Soft-icache stubs are four or eight words. */
1148 static unsigned int
1149 ovl_stub_size (struct spu_elf_params *params)
1151 return 16 << params->ovly_flavour >> params->compact_stub;
1154 static unsigned int
1155 ovl_stub_size_log2 (struct spu_elf_params *params)
1157 return 4 + params->ovly_flavour - params->compact_stub;
1160 /* Two instruction overlay stubs look like:
1162 brsl $75,__ovly_load
1163 .word target_ovl_and_address
1165 ovl_and_address is a word with the overlay number in the top 14 bits
1166 and local store address in the bottom 18 bits.
1168 Four instruction overlay stubs look like:
1170 ila $78,ovl_number
1171 lnop
1172 ila $79,target_address
1173 br __ovly_load
1175 Software icache stubs are:
1177 .word target_index
1178 .word target_ia;
1179 .word lrlive_branchlocalstoreaddr;
1180 brasl $75,__icache_br_handler
1181 .quad xor_pattern
1184 static bfd_boolean
1185 build_stub (struct bfd_link_info *info,
1186 bfd *ibfd,
1187 asection *isec,
1188 enum _stub_type stub_type,
1189 struct elf_link_hash_entry *h,
1190 const Elf_Internal_Rela *irela,
1191 bfd_vma dest,
1192 asection *dest_sec)
1194 struct spu_link_hash_table *htab = spu_hash_table (info);
1195 unsigned int ovl, dest_ovl, set_id;
1196 struct got_entry *g, **head;
1197 asection *sec;
1198 bfd_vma addend, from, to, br_dest, patt;
1199 unsigned int lrlive;
1201 ovl = 0;
1202 if (stub_type != nonovl_stub)
1203 ovl = spu_elf_section_data (isec->output_section)->u.o.ovl_index;
1205 if (h != NULL)
1206 head = &h->got.glist;
1207 else
1208 head = elf_local_got_ents (ibfd) + ELF32_R_SYM (irela->r_info);
1210 addend = 0;
1211 if (irela != NULL)
1212 addend = irela->r_addend;
1214 if (htab->params->ovly_flavour == ovly_soft_icache)
1216 g = bfd_malloc (sizeof *g);
1217 if (g == NULL)
1218 return FALSE;
1219 g->ovl = ovl;
1220 g->br_addr = 0;
1221 if (irela != NULL)
1222 g->br_addr = (irela->r_offset
1223 + isec->output_offset
1224 + isec->output_section->vma);
1225 g->next = *head;
1226 *head = g;
1228 else
1230 for (g = *head; g != NULL; g = g->next)
1231 if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
1232 break;
1233 if (g == NULL)
1234 abort ();
1236 if (g->ovl == 0 && ovl != 0)
1237 return TRUE;
1239 if (g->stub_addr != (bfd_vma) -1)
1240 return TRUE;
1243 sec = htab->stub_sec[ovl];
1244 dest += dest_sec->output_offset + dest_sec->output_section->vma;
1245 from = sec->size + sec->output_offset + sec->output_section->vma;
1246 g->stub_addr = from;
1247 to = (htab->ovly_entry[0]->root.u.def.value
1248 + htab->ovly_entry[0]->root.u.def.section->output_offset
1249 + htab->ovly_entry[0]->root.u.def.section->output_section->vma);
1251 if (((dest | to | from) & 3) != 0)
1253 htab->stub_err = 1;
1254 return FALSE;
1256 dest_ovl = spu_elf_section_data (dest_sec->output_section)->u.o.ovl_index;
1258 if (htab->params->ovly_flavour == ovly_normal
1259 && !htab->params->compact_stub)
1261 bfd_put_32 (sec->owner, ILA + ((dest_ovl << 7) & 0x01ffff80) + 78,
1262 sec->contents + sec->size);
1263 bfd_put_32 (sec->owner, LNOP,
1264 sec->contents + sec->size + 4);
1265 bfd_put_32 (sec->owner, ILA + ((dest << 7) & 0x01ffff80) + 79,
1266 sec->contents + sec->size + 8);
1267 if (!BRA_STUBS)
1268 bfd_put_32 (sec->owner, BR + (((to - (from + 12)) << 5) & 0x007fff80),
1269 sec->contents + sec->size + 12);
1270 else
1271 bfd_put_32 (sec->owner, BRA + ((to << 5) & 0x007fff80),
1272 sec->contents + sec->size + 12);
1274 else if (htab->params->ovly_flavour == ovly_normal
1275 && htab->params->compact_stub)
1277 if (!BRA_STUBS)
1278 bfd_put_32 (sec->owner, BRSL + (((to - from) << 5) & 0x007fff80) + 75,
1279 sec->contents + sec->size);
1280 else
1281 bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
1282 sec->contents + sec->size);
1283 bfd_put_32 (sec->owner, (dest & 0x3ffff) | (dest_ovl << 18),
1284 sec->contents + sec->size + 4);
1286 else if (htab->params->ovly_flavour == ovly_soft_icache
1287 && htab->params->compact_stub)
1289 lrlive = 0;
1290 if (stub_type == nonovl_stub)
1292 else if (stub_type == call_ovl_stub)
1293 /* A brsl makes lr live and *(*sp+16) is live.
1294 Tail calls have the same liveness. */
1295 lrlive = 5;
1296 else if (!htab->params->lrlive_analysis)
1297 /* Assume stack frame and lr save. */
1298 lrlive = 1;
1299 else if (irela != NULL)
1301 /* Analyse branch instructions. */
1302 struct function_info *caller;
1303 bfd_vma off;
1305 caller = find_function (isec, irela->r_offset, info);
1306 if (caller->start == NULL)
1307 off = irela->r_offset;
1308 else
1310 struct function_info *found = NULL;
1312 /* Find the earliest piece of this function that
1313 has frame adjusting instructions. We might
1314 see dynamic frame adjustment (eg. for alloca)
1315 in some later piece, but functions using
1316 alloca always set up a frame earlier. Frame
1317 setup instructions are always in one piece. */
1318 if (caller->lr_store != (bfd_vma) -1
1319 || caller->sp_adjust != (bfd_vma) -1)
1320 found = caller;
1321 while (caller->start != NULL)
1323 caller = caller->start;
1324 if (caller->lr_store != (bfd_vma) -1
1325 || caller->sp_adjust != (bfd_vma) -1)
1326 found = caller;
1328 if (found != NULL)
1329 caller = found;
1330 off = (bfd_vma) -1;
1333 if (off > caller->sp_adjust)
1335 if (off > caller->lr_store)
1336 /* Only *(*sp+16) is live. */
1337 lrlive = 1;
1338 else
1339 /* If no lr save, then we must be in a
1340 leaf function with a frame.
1341 lr is still live. */
1342 lrlive = 4;
1344 else if (off > caller->lr_store)
1346 /* Between lr save and stack adjust. */
1347 lrlive = 3;
1348 /* This should never happen since prologues won't
1349 be split here. */
1350 BFD_ASSERT (0);
1352 else
1353 /* On entry to function. */
1354 lrlive = 5;
1356 if (stub_type != br000_ovl_stub
1357 && lrlive != stub_type - br000_ovl_stub)
1358 info->callbacks->einfo (_("%A:0x%v lrlive .brinfo (%u) differs "
1359 "from analysis (%u)\n"),
1360 isec, irela->r_offset, lrlive,
1361 stub_type - br000_ovl_stub);
1364 /* If given lrlive info via .brinfo, use it. */
1365 if (stub_type > br000_ovl_stub)
1366 lrlive = stub_type - br000_ovl_stub;
1368 if (ovl == 0)
1369 to = (htab->ovly_entry[1]->root.u.def.value
1370 + htab->ovly_entry[1]->root.u.def.section->output_offset
1371 + htab->ovly_entry[1]->root.u.def.section->output_section->vma);
1373 /* The branch that uses this stub goes to stub_addr + 4. We'll
1374 set up an xor pattern that can be used by the icache manager
1375 to modify this branch to go directly to its destination. */
1376 g->stub_addr += 4;
1377 br_dest = g->stub_addr;
1378 if (irela == NULL)
1380 /* Except in the case of _SPUEAR_ stubs, the branch in
1381 question is the one in the stub itself. */
1382 BFD_ASSERT (stub_type == nonovl_stub);
1383 g->br_addr = g->stub_addr;
1384 br_dest = to;
1387 set_id = ((dest_ovl - 1) >> htab->num_lines_log2) + 1;
1388 bfd_put_32 (sec->owner, (set_id << 18) | (dest & 0x3ffff),
1389 sec->contents + sec->size);
1390 bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
1391 sec->contents + sec->size + 4);
1392 bfd_put_32 (sec->owner, (lrlive << 29) | (g->br_addr & 0x3ffff),
1393 sec->contents + sec->size + 8);
1394 patt = dest ^ br_dest;
1395 if (irela != NULL && ELF32_R_TYPE (irela->r_info) == R_SPU_REL16)
1396 patt = (dest - g->br_addr) ^ (br_dest - g->br_addr);
1397 bfd_put_32 (sec->owner, (patt << 5) & 0x007fff80,
1398 sec->contents + sec->size + 12);
1400 if (ovl == 0)
1401 /* Extra space for linked list entries. */
1402 sec->size += 16;
1404 else
1405 abort ();
1407 sec->size += ovl_stub_size (htab->params);
1409 if (htab->params->emit_stub_syms)
1411 size_t len;
1412 char *name;
1413 int add;
1415 len = 8 + sizeof (".ovl_call.") - 1;
1416 if (h != NULL)
1417 len += strlen (h->root.root.string);
1418 else
1419 len += 8 + 1 + 8;
1420 add = 0;
1421 if (irela != NULL)
1422 add = (int) irela->r_addend & 0xffffffff;
1423 if (add != 0)
1424 len += 1 + 8;
1425 name = bfd_malloc (len);
1426 if (name == NULL)
1427 return FALSE;
1429 sprintf (name, "%08x.ovl_call.", g->ovl);
1430 if (h != NULL)
1431 strcpy (name + 8 + sizeof (".ovl_call.") - 1, h->root.root.string);
1432 else
1433 sprintf (name + 8 + sizeof (".ovl_call.") - 1, "%x:%x",
1434 dest_sec->id & 0xffffffff,
1435 (int) ELF32_R_SYM (irela->r_info) & 0xffffffff);
1436 if (add != 0)
1437 sprintf (name + len - 9, "+%x", add);
1439 h = elf_link_hash_lookup (&htab->elf, name, TRUE, TRUE, FALSE);
1440 free (name);
1441 if (h == NULL)
1442 return FALSE;
1443 if (h->root.type == bfd_link_hash_new)
1445 h->root.type = bfd_link_hash_defined;
1446 h->root.u.def.section = sec;
1447 h->size = ovl_stub_size (htab->params);
1448 h->root.u.def.value = sec->size - h->size;
1449 h->type = STT_FUNC;
1450 h->ref_regular = 1;
1451 h->def_regular = 1;
1452 h->ref_regular_nonweak = 1;
1453 h->forced_local = 1;
1454 h->non_elf = 0;
1458 return TRUE;
1461 /* Called via elf_link_hash_traverse to allocate stubs for any _SPUEAR_
1462 symbols. */
1464 static bfd_boolean
1465 allocate_spuear_stubs (struct elf_link_hash_entry *h, void *inf)
1467 /* Symbols starting with _SPUEAR_ need a stub because they may be
1468 invoked by the PPU. */
1469 struct bfd_link_info *info = inf;
1470 struct spu_link_hash_table *htab = spu_hash_table (info);
1471 asection *sym_sec;
1473 if ((h->root.type == bfd_link_hash_defined
1474 || h->root.type == bfd_link_hash_defweak)
1475 && h->def_regular
1476 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0
1477 && (sym_sec = h->root.u.def.section) != NULL
1478 && sym_sec->output_section != bfd_abs_section_ptr
1479 && spu_elf_section_data (sym_sec->output_section) != NULL
1480 && (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index != 0
1481 || htab->params->non_overlay_stubs))
1483 return count_stub (htab, NULL, NULL, nonovl_stub, h, NULL);
1486 return TRUE;
1489 static bfd_boolean
1490 build_spuear_stubs (struct elf_link_hash_entry *h, void *inf)
1492 /* Symbols starting with _SPUEAR_ need a stub because they may be
1493 invoked by the PPU. */
1494 struct bfd_link_info *info = inf;
1495 struct spu_link_hash_table *htab = spu_hash_table (info);
1496 asection *sym_sec;
1498 if ((h->root.type == bfd_link_hash_defined
1499 || h->root.type == bfd_link_hash_defweak)
1500 && h->def_regular
1501 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0
1502 && (sym_sec = h->root.u.def.section) != NULL
1503 && sym_sec->output_section != bfd_abs_section_ptr
1504 && spu_elf_section_data (sym_sec->output_section) != NULL
1505 && (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index != 0
1506 || htab->params->non_overlay_stubs))
1508 return build_stub (info, NULL, NULL, nonovl_stub, h, NULL,
1509 h->root.u.def.value, sym_sec);
1512 return TRUE;
1515 /* Size or build stubs. */
1517 static bfd_boolean
1518 process_stubs (struct bfd_link_info *info, bfd_boolean build)
1520 struct spu_link_hash_table *htab = spu_hash_table (info);
1521 bfd *ibfd;
1523 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1525 extern const bfd_target bfd_elf32_spu_vec;
1526 Elf_Internal_Shdr *symtab_hdr;
1527 asection *isec;
1528 Elf_Internal_Sym *local_syms = NULL;
1530 if (ibfd->xvec != &bfd_elf32_spu_vec)
1531 continue;
1533 /* We'll need the symbol table in a second. */
1534 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1535 if (symtab_hdr->sh_info == 0)
1536 continue;
1538 /* Walk over each section attached to the input bfd. */
1539 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
1541 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1543 /* If there aren't any relocs, then there's nothing more to do. */
1544 if ((isec->flags & SEC_RELOC) == 0
1545 || isec->reloc_count == 0)
1546 continue;
1548 if (!maybe_needs_stubs (isec))
1549 continue;
1551 /* Get the relocs. */
1552 internal_relocs = _bfd_elf_link_read_relocs (ibfd, isec, NULL, NULL,
1553 info->keep_memory);
1554 if (internal_relocs == NULL)
1555 goto error_ret_free_local;
1557 /* Now examine each relocation. */
1558 irela = internal_relocs;
1559 irelaend = irela + isec->reloc_count;
1560 for (; irela < irelaend; irela++)
1562 enum elf_spu_reloc_type r_type;
1563 unsigned int r_indx;
1564 asection *sym_sec;
1565 Elf_Internal_Sym *sym;
1566 struct elf_link_hash_entry *h;
1567 enum _stub_type stub_type;
1569 r_type = ELF32_R_TYPE (irela->r_info);
1570 r_indx = ELF32_R_SYM (irela->r_info);
1572 if (r_type >= R_SPU_max)
1574 bfd_set_error (bfd_error_bad_value);
1575 error_ret_free_internal:
1576 if (elf_section_data (isec)->relocs != internal_relocs)
1577 free (internal_relocs);
1578 error_ret_free_local:
1579 if (local_syms != NULL
1580 && (symtab_hdr->contents
1581 != (unsigned char *) local_syms))
1582 free (local_syms);
1583 return FALSE;
1586 /* Determine the reloc target section. */
1587 if (!get_sym_h (&h, &sym, &sym_sec, &local_syms, r_indx, ibfd))
1588 goto error_ret_free_internal;
1590 stub_type = needs_ovl_stub (h, sym, sym_sec, isec, irela,
1591 NULL, info);
1592 if (stub_type == no_stub)
1593 continue;
1594 else if (stub_type == stub_error)
1595 goto error_ret_free_internal;
1597 if (htab->stub_count == NULL)
1599 bfd_size_type amt;
1600 amt = (htab->num_overlays + 1) * sizeof (*htab->stub_count);
1601 htab->stub_count = bfd_zmalloc (amt);
1602 if (htab->stub_count == NULL)
1603 goto error_ret_free_internal;
1606 if (!build)
1608 if (!count_stub (htab, ibfd, isec, stub_type, h, irela))
1609 goto error_ret_free_internal;
1611 else
1613 bfd_vma dest;
1615 if (h != NULL)
1616 dest = h->root.u.def.value;
1617 else
1618 dest = sym->st_value;
1619 dest += irela->r_addend;
1620 if (!build_stub (info, ibfd, isec, stub_type, h, irela,
1621 dest, sym_sec))
1622 goto error_ret_free_internal;
1626 /* We're done with the internal relocs, free them. */
1627 if (elf_section_data (isec)->relocs != internal_relocs)
1628 free (internal_relocs);
1631 if (local_syms != NULL
1632 && symtab_hdr->contents != (unsigned char *) local_syms)
1634 if (!info->keep_memory)
1635 free (local_syms);
1636 else
1637 symtab_hdr->contents = (unsigned char *) local_syms;
1641 return TRUE;
1644 /* Allocate space for overlay call and return stubs.
1645 Return 0 on error, 1 if no overlays, 2 otherwise. */
1648 spu_elf_size_stubs (struct bfd_link_info *info)
1650 struct spu_link_hash_table *htab;
1651 bfd *ibfd;
1652 bfd_size_type amt;
1653 flagword flags;
1654 unsigned int i;
1655 asection *stub;
1657 if (!process_stubs (info, FALSE))
1658 return 0;
1660 htab = spu_hash_table (info);
1661 elf_link_hash_traverse (&htab->elf, allocate_spuear_stubs, info);
1662 if (htab->stub_err)
1663 return 0;
1665 ibfd = info->input_bfds;
1666 if (htab->stub_count != NULL)
1668 amt = (htab->num_overlays + 1) * sizeof (*htab->stub_sec);
1669 htab->stub_sec = bfd_zmalloc (amt);
1670 if (htab->stub_sec == NULL)
1671 return 0;
1673 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
1674 | SEC_HAS_CONTENTS | SEC_IN_MEMORY);
1675 stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
1676 htab->stub_sec[0] = stub;
1677 if (stub == NULL
1678 || !bfd_set_section_alignment (ibfd, stub,
1679 ovl_stub_size_log2 (htab->params)))
1680 return 0;
1681 stub->size = htab->stub_count[0] * ovl_stub_size (htab->params);
1682 if (htab->params->ovly_flavour == ovly_soft_icache)
1683 /* Extra space for linked list entries. */
1684 stub->size += htab->stub_count[0] * 16;
1686 for (i = 0; i < htab->num_overlays; ++i)
1688 asection *osec = htab->ovl_sec[i];
1689 unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
1690 stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
1691 htab->stub_sec[ovl] = stub;
1692 if (stub == NULL
1693 || !bfd_set_section_alignment (ibfd, stub,
1694 ovl_stub_size_log2 (htab->params)))
1695 return 0;
1696 stub->size = htab->stub_count[ovl] * ovl_stub_size (htab->params);
1700 if (htab->params->ovly_flavour == ovly_soft_icache)
1702 /* Space for icache manager tables.
1703 a) Tag array, one quadword per cache line.
1704 b) Rewrite "to" list, one quadword per cache line.
1705 c) Rewrite "from" list, one byte per outgoing branch (rounded up to
1706 a power-of-two number of full quadwords) per cache line. */
1708 flags = SEC_ALLOC;
1709 htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
1710 if (htab->ovtab == NULL
1711 || !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
1712 return 0;
1714 htab->ovtab->size = (16 + 16 + (16 << htab->fromelem_size_log2))
1715 << htab->num_lines_log2;
1717 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1718 htab->init = bfd_make_section_anyway_with_flags (ibfd, ".ovini", flags);
1719 if (htab->init == NULL
1720 || !bfd_set_section_alignment (ibfd, htab->init, 4))
1721 return 0;
1723 htab->init->size = 16;
1725 else if (htab->stub_count == NULL)
1726 return 1;
1727 else
1729 /* htab->ovtab consists of two arrays.
1730 . struct {
1731 . u32 vma;
1732 . u32 size;
1733 . u32 file_off;
1734 . u32 buf;
1735 . } _ovly_table[];
1737 . struct {
1738 . u32 mapped;
1739 . } _ovly_buf_table[];
1740 . */
1742 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1743 htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
1744 if (htab->ovtab == NULL
1745 || !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
1746 return 0;
1748 htab->ovtab->size = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
1751 htab->toe = bfd_make_section_anyway_with_flags (ibfd, ".toe", SEC_ALLOC);
1752 if (htab->toe == NULL
1753 || !bfd_set_section_alignment (ibfd, htab->toe, 4))
1754 return 0;
1755 htab->toe->size = 16;
1757 return 2;
1760 /* Called from ld to place overlay manager data sections. This is done
1761 after the overlay manager itself is loaded, mainly so that the
1762 linker's htab->init section is placed after any other .ovl.init
1763 sections. */
1765 void
1766 spu_elf_place_overlay_data (struct bfd_link_info *info)
1768 struct spu_link_hash_table *htab = spu_hash_table (info);
1769 unsigned int i;
1771 if (htab->stub_sec != NULL)
1773 (*htab->params->place_spu_section) (htab->stub_sec[0], NULL, ".text");
1775 for (i = 0; i < htab->num_overlays; ++i)
1777 asection *osec = htab->ovl_sec[i];
1778 unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
1779 (*htab->params->place_spu_section) (htab->stub_sec[ovl], osec, NULL);
1783 if (htab->params->ovly_flavour == ovly_soft_icache)
1784 (*htab->params->place_spu_section) (htab->init, NULL, ".ovl.init");
1786 if (htab->ovtab != NULL)
1788 const char *ovout = ".data";
1789 if (htab->params->ovly_flavour == ovly_soft_icache)
1790 ovout = ".bss";
1791 (*htab->params->place_spu_section) (htab->ovtab, NULL, ovout);
1794 if (htab->toe != NULL)
1795 (*htab->params->place_spu_section) (htab->toe, NULL, ".toe");
1798 /* Functions to handle embedded spu_ovl.o object. */
1800 static void *
1801 ovl_mgr_open (struct bfd *nbfd ATTRIBUTE_UNUSED, void *stream)
1803 return stream;
1806 static file_ptr
1807 ovl_mgr_pread (struct bfd *abfd ATTRIBUTE_UNUSED,
1808 void *stream,
1809 void *buf,
1810 file_ptr nbytes,
1811 file_ptr offset)
1813 struct _ovl_stream *os;
1814 size_t count;
1815 size_t max;
1817 os = (struct _ovl_stream *) stream;
1818 max = (const char *) os->end - (const char *) os->start;
1820 if ((ufile_ptr) offset >= max)
1821 return 0;
1823 count = nbytes;
1824 if (count > max - offset)
1825 count = max - offset;
1827 memcpy (buf, (const char *) os->start + offset, count);
1828 return count;
1831 bfd_boolean
1832 spu_elf_open_builtin_lib (bfd **ovl_bfd, const struct _ovl_stream *stream)
1834 *ovl_bfd = bfd_openr_iovec ("builtin ovl_mgr",
1835 "elf32-spu",
1836 ovl_mgr_open,
1837 (void *) stream,
1838 ovl_mgr_pread,
1839 NULL,
1840 NULL);
1841 return *ovl_bfd != NULL;
1844 static unsigned int
1845 overlay_index (asection *sec)
1847 if (sec == NULL
1848 || sec->output_section == bfd_abs_section_ptr)
1849 return 0;
1850 return spu_elf_section_data (sec->output_section)->u.o.ovl_index;
1853 /* Define an STT_OBJECT symbol. */
1855 static struct elf_link_hash_entry *
1856 define_ovtab_symbol (struct spu_link_hash_table *htab, const char *name)
1858 struct elf_link_hash_entry *h;
1860 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
1861 if (h == NULL)
1862 return NULL;
1864 if (h->root.type != bfd_link_hash_defined
1865 || !h->def_regular)
1867 h->root.type = bfd_link_hash_defined;
1868 h->root.u.def.section = htab->ovtab;
1869 h->type = STT_OBJECT;
1870 h->ref_regular = 1;
1871 h->def_regular = 1;
1872 h->ref_regular_nonweak = 1;
1873 h->non_elf = 0;
1875 else if (h->root.u.def.section->owner != NULL)
1877 (*_bfd_error_handler) (_("%B is not allowed to define %s"),
1878 h->root.u.def.section->owner,
1879 h->root.root.string);
1880 bfd_set_error (bfd_error_bad_value);
1881 return NULL;
1883 else
1885 (*_bfd_error_handler) (_("you are not allowed to define %s in a script"),
1886 h->root.root.string);
1887 bfd_set_error (bfd_error_bad_value);
1888 return NULL;
1891 return h;
1894 /* Fill in all stubs and the overlay tables. */
1896 static bfd_boolean
1897 spu_elf_build_stubs (struct bfd_link_info *info)
1899 struct spu_link_hash_table *htab = spu_hash_table (info);
1900 struct elf_link_hash_entry *h;
1901 bfd_byte *p;
1902 asection *s;
1903 bfd *obfd;
1904 unsigned int i;
1906 if (htab->num_overlays != 0)
1908 for (i = 0; i < 2; i++)
1910 h = htab->ovly_entry[i];
1911 if (h != NULL
1912 && (h->root.type == bfd_link_hash_defined
1913 || h->root.type == bfd_link_hash_defweak)
1914 && h->def_regular)
1916 s = h->root.u.def.section->output_section;
1917 if (spu_elf_section_data (s)->u.o.ovl_index)
1919 (*_bfd_error_handler) (_("%s in overlay section"),
1920 h->root.root.string);
1921 bfd_set_error (bfd_error_bad_value);
1922 return FALSE;
1928 if (htab->stub_sec != NULL)
1930 for (i = 0; i <= htab->num_overlays; i++)
1931 if (htab->stub_sec[i]->size != 0)
1933 htab->stub_sec[i]->contents = bfd_zalloc (htab->stub_sec[i]->owner,
1934 htab->stub_sec[i]->size);
1935 if (htab->stub_sec[i]->contents == NULL)
1936 return FALSE;
1937 htab->stub_sec[i]->rawsize = htab->stub_sec[i]->size;
1938 htab->stub_sec[i]->size = 0;
1941 /* Fill in all the stubs. */
1942 process_stubs (info, TRUE);
1943 if (!htab->stub_err)
1944 elf_link_hash_traverse (&htab->elf, build_spuear_stubs, info);
1946 if (htab->stub_err)
1948 (*_bfd_error_handler) (_("overlay stub relocation overflow"));
1949 bfd_set_error (bfd_error_bad_value);
1950 return FALSE;
1953 for (i = 0; i <= htab->num_overlays; i++)
1955 if (htab->stub_sec[i]->size != htab->stub_sec[i]->rawsize)
1957 (*_bfd_error_handler) (_("stubs don't match calculated size"));
1958 bfd_set_error (bfd_error_bad_value);
1959 return FALSE;
1961 htab->stub_sec[i]->rawsize = 0;
1965 if (htab->ovtab == NULL || htab->ovtab->size == 0)
1966 return TRUE;
1968 htab->ovtab->contents = bfd_zalloc (htab->ovtab->owner, htab->ovtab->size);
1969 if (htab->ovtab->contents == NULL)
1970 return FALSE;
1972 p = htab->ovtab->contents;
1973 if (htab->params->ovly_flavour == ovly_soft_icache)
1975 bfd_vma off;
1977 h = define_ovtab_symbol (htab, "__icache_tag_array");
1978 if (h == NULL)
1979 return FALSE;
1980 h->root.u.def.value = 0;
1981 h->size = 16 << htab->num_lines_log2;
1982 off = h->size;
1984 h = define_ovtab_symbol (htab, "__icache_tag_array_size");
1985 if (h == NULL)
1986 return FALSE;
1987 h->root.u.def.value = 16 << htab->num_lines_log2;
1988 h->root.u.def.section = bfd_abs_section_ptr;
1990 h = define_ovtab_symbol (htab, "__icache_rewrite_to");
1991 if (h == NULL)
1992 return FALSE;
1993 h->root.u.def.value = off;
1994 h->size = 16 << htab->num_lines_log2;
1995 off += h->size;
1997 h = define_ovtab_symbol (htab, "__icache_rewrite_to_size");
1998 if (h == NULL)
1999 return FALSE;
2000 h->root.u.def.value = 16 << htab->num_lines_log2;
2001 h->root.u.def.section = bfd_abs_section_ptr;
2003 h = define_ovtab_symbol (htab, "__icache_rewrite_from");
2004 if (h == NULL)
2005 return FALSE;
2006 h->root.u.def.value = off;
2007 h->size = 16 << (htab->fromelem_size_log2 + htab->num_lines_log2);
2008 off += h->size;
2010 h = define_ovtab_symbol (htab, "__icache_rewrite_from_size");
2011 if (h == NULL)
2012 return FALSE;
2013 h->root.u.def.value = 16 << (htab->fromelem_size_log2
2014 + htab->num_lines_log2);
2015 h->root.u.def.section = bfd_abs_section_ptr;
2017 h = define_ovtab_symbol (htab, "__icache_log2_fromelemsize");
2018 if (h == NULL)
2019 return FALSE;
2020 h->root.u.def.value = htab->fromelem_size_log2;
2021 h->root.u.def.section = bfd_abs_section_ptr;
2023 h = define_ovtab_symbol (htab, "__icache_base");
2024 if (h == NULL)
2025 return FALSE;
2026 h->root.u.def.value = htab->ovl_sec[0]->vma;
2027 h->root.u.def.section = bfd_abs_section_ptr;
2028 h->size = htab->num_buf << htab->line_size_log2;
2030 h = define_ovtab_symbol (htab, "__icache_linesize");
2031 if (h == NULL)
2032 return FALSE;
2033 h->root.u.def.value = 1 << htab->line_size_log2;
2034 h->root.u.def.section = bfd_abs_section_ptr;
2036 h = define_ovtab_symbol (htab, "__icache_log2_linesize");
2037 if (h == NULL)
2038 return FALSE;
2039 h->root.u.def.value = htab->line_size_log2;
2040 h->root.u.def.section = bfd_abs_section_ptr;
2042 h = define_ovtab_symbol (htab, "__icache_neg_log2_linesize");
2043 if (h == NULL)
2044 return FALSE;
2045 h->root.u.def.value = -htab->line_size_log2;
2046 h->root.u.def.section = bfd_abs_section_ptr;
2048 h = define_ovtab_symbol (htab, "__icache_cachesize");
2049 if (h == NULL)
2050 return FALSE;
2051 h->root.u.def.value = 1 << (htab->num_lines_log2 + htab->line_size_log2);
2052 h->root.u.def.section = bfd_abs_section_ptr;
2054 h = define_ovtab_symbol (htab, "__icache_log2_cachesize");
2055 if (h == NULL)
2056 return FALSE;
2057 h->root.u.def.value = htab->num_lines_log2 + htab->line_size_log2;
2058 h->root.u.def.section = bfd_abs_section_ptr;
2060 h = define_ovtab_symbol (htab, "__icache_neg_log2_cachesize");
2061 if (h == NULL)
2062 return FALSE;
2063 h->root.u.def.value = -(htab->num_lines_log2 + htab->line_size_log2);
2064 h->root.u.def.section = bfd_abs_section_ptr;
2066 if (htab->init != NULL && htab->init->size != 0)
2068 htab->init->contents = bfd_zalloc (htab->init->owner,
2069 htab->init->size);
2070 if (htab->init->contents == NULL)
2071 return FALSE;
2073 h = define_ovtab_symbol (htab, "__icache_fileoff");
2074 if (h == NULL)
2075 return FALSE;
2076 h->root.u.def.value = 0;
2077 h->root.u.def.section = htab->init;
2078 h->size = 8;
2081 else
2083 /* Write out _ovly_table. */
2084 /* set low bit of .size to mark non-overlay area as present. */
2085 p[7] = 1;
2086 obfd = htab->ovtab->output_section->owner;
2087 for (s = obfd->sections; s != NULL; s = s->next)
2089 unsigned int ovl_index = spu_elf_section_data (s)->u.o.ovl_index;
2091 if (ovl_index != 0)
2093 unsigned long off = ovl_index * 16;
2094 unsigned int ovl_buf = spu_elf_section_data (s)->u.o.ovl_buf;
2096 bfd_put_32 (htab->ovtab->owner, s->vma, p + off);
2097 bfd_put_32 (htab->ovtab->owner, (s->size + 15) & -16,
2098 p + off + 4);
2099 /* file_off written later in spu_elf_modify_program_headers. */
2100 bfd_put_32 (htab->ovtab->owner, ovl_buf, p + off + 12);
2104 h = define_ovtab_symbol (htab, "_ovly_table");
2105 if (h == NULL)
2106 return FALSE;
2107 h->root.u.def.value = 16;
2108 h->size = htab->num_overlays * 16;
2110 h = define_ovtab_symbol (htab, "_ovly_table_end");
2111 if (h == NULL)
2112 return FALSE;
2113 h->root.u.def.value = htab->num_overlays * 16 + 16;
2114 h->size = 0;
2116 h = define_ovtab_symbol (htab, "_ovly_buf_table");
2117 if (h == NULL)
2118 return FALSE;
2119 h->root.u.def.value = htab->num_overlays * 16 + 16;
2120 h->size = htab->num_buf * 4;
2122 h = define_ovtab_symbol (htab, "_ovly_buf_table_end");
2123 if (h == NULL)
2124 return FALSE;
2125 h->root.u.def.value = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
2126 h->size = 0;
2129 h = define_ovtab_symbol (htab, "_EAR_");
2130 if (h == NULL)
2131 return FALSE;
2132 h->root.u.def.section = htab->toe;
2133 h->root.u.def.value = 0;
2134 h->size = 16;
2136 return TRUE;
2139 /* Check that all loadable section VMAs lie in the range
2140 LO .. HI inclusive, and stash some parameters for --auto-overlay. */
2142 asection *
2143 spu_elf_check_vma (struct bfd_link_info *info)
2145 struct elf_segment_map *m;
2146 unsigned int i;
2147 struct spu_link_hash_table *htab = spu_hash_table (info);
2148 bfd *abfd = info->output_bfd;
2149 bfd_vma hi = htab->params->local_store_hi;
2150 bfd_vma lo = htab->params->local_store_lo;
2152 htab->local_store = hi + 1 - lo;
2154 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2155 if (m->p_type == PT_LOAD)
2156 for (i = 0; i < m->count; i++)
2157 if (m->sections[i]->size != 0
2158 && (m->sections[i]->vma < lo
2159 || m->sections[i]->vma > hi
2160 || m->sections[i]->vma + m->sections[i]->size - 1 > hi))
2161 return m->sections[i];
2163 return NULL;
2166 /* OFFSET in SEC (presumably) is the beginning of a function prologue.
2167 Search for stack adjusting insns, and return the sp delta.
2168 If a store of lr is found save the instruction offset to *LR_STORE.
2169 If a stack adjusting instruction is found, save that offset to
2170 *SP_ADJUST. */
2172 static int
2173 find_function_stack_adjust (asection *sec,
2174 bfd_vma offset,
2175 bfd_vma *lr_store,
2176 bfd_vma *sp_adjust)
2178 int reg[128];
2180 memset (reg, 0, sizeof (reg));
2181 for ( ; offset + 4 <= sec->size; offset += 4)
2183 unsigned char buf[4];
2184 int rt, ra;
2185 int imm;
2187 /* Assume no relocs on stack adjusing insns. */
2188 if (!bfd_get_section_contents (sec->owner, sec, buf, offset, 4))
2189 break;
2191 rt = buf[3] & 0x7f;
2192 ra = ((buf[2] & 0x3f) << 1) | (buf[3] >> 7);
2194 if (buf[0] == 0x24 /* stqd */)
2196 if (rt == 0 /* lr */ && ra == 1 /* sp */)
2197 *lr_store = offset;
2198 continue;
2201 /* Partly decoded immediate field. */
2202 imm = (buf[1] << 9) | (buf[2] << 1) | (buf[3] >> 7);
2204 if (buf[0] == 0x1c /* ai */)
2206 imm >>= 7;
2207 imm = (imm ^ 0x200) - 0x200;
2208 reg[rt] = reg[ra] + imm;
2210 if (rt == 1 /* sp */)
2212 if (reg[rt] > 0)
2213 break;
2214 *sp_adjust = offset;
2215 return reg[rt];
2218 else if (buf[0] == 0x18 && (buf[1] & 0xe0) == 0 /* a */)
2220 int rb = ((buf[1] & 0x1f) << 2) | ((buf[2] & 0xc0) >> 6);
2222 reg[rt] = reg[ra] + reg[rb];
2223 if (rt == 1)
2225 if (reg[rt] > 0)
2226 break;
2227 *sp_adjust = offset;
2228 return reg[rt];
2231 else if (buf[0] == 0x08 && (buf[1] & 0xe0) == 0 /* sf */)
2233 int rb = ((buf[1] & 0x1f) << 2) | ((buf[2] & 0xc0) >> 6);
2235 reg[rt] = reg[rb] - reg[ra];
2236 if (rt == 1)
2238 if (reg[rt] > 0)
2239 break;
2240 *sp_adjust = offset;
2241 return reg[rt];
2244 else if ((buf[0] & 0xfc) == 0x40 /* il, ilh, ilhu, ila */)
2246 if (buf[0] >= 0x42 /* ila */)
2247 imm |= (buf[0] & 1) << 17;
2248 else
2250 imm &= 0xffff;
2252 if (buf[0] == 0x40 /* il */)
2254 if ((buf[1] & 0x80) == 0)
2255 continue;
2256 imm = (imm ^ 0x8000) - 0x8000;
2258 else if ((buf[1] & 0x80) == 0 /* ilhu */)
2259 imm <<= 16;
2261 reg[rt] = imm;
2262 continue;
2264 else if (buf[0] == 0x60 && (buf[1] & 0x80) != 0 /* iohl */)
2266 reg[rt] |= imm & 0xffff;
2267 continue;
2269 else if (buf[0] == 0x04 /* ori */)
2271 imm >>= 7;
2272 imm = (imm ^ 0x200) - 0x200;
2273 reg[rt] = reg[ra] | imm;
2274 continue;
2276 else if (buf[0] == 0x32 && (buf[1] & 0x80) != 0 /* fsmbi */)
2278 reg[rt] = ( ((imm & 0x8000) ? 0xff000000 : 0)
2279 | ((imm & 0x4000) ? 0x00ff0000 : 0)
2280 | ((imm & 0x2000) ? 0x0000ff00 : 0)
2281 | ((imm & 0x1000) ? 0x000000ff : 0));
2282 continue;
2284 else if (buf[0] == 0x16 /* andbi */)
2286 imm >>= 7;
2287 imm &= 0xff;
2288 imm |= imm << 8;
2289 imm |= imm << 16;
2290 reg[rt] = reg[ra] & imm;
2291 continue;
2293 else if (buf[0] == 0x33 && imm == 1 /* brsl .+4 */)
2295 /* Used in pic reg load. Say rt is trashed. Won't be used
2296 in stack adjust, but we need to continue past this branch. */
2297 reg[rt] = 0;
2298 continue;
2300 else if (is_branch (buf) || is_indirect_branch (buf))
2301 /* If we hit a branch then we must be out of the prologue. */
2302 break;
2305 return 0;
2308 /* qsort predicate to sort symbols by section and value. */
2310 static Elf_Internal_Sym *sort_syms_syms;
2311 static asection **sort_syms_psecs;
2313 static int
2314 sort_syms (const void *a, const void *b)
2316 Elf_Internal_Sym *const *s1 = a;
2317 Elf_Internal_Sym *const *s2 = b;
2318 asection *sec1,*sec2;
2319 bfd_signed_vma delta;
2321 sec1 = sort_syms_psecs[*s1 - sort_syms_syms];
2322 sec2 = sort_syms_psecs[*s2 - sort_syms_syms];
2324 if (sec1 != sec2)
2325 return sec1->index - sec2->index;
2327 delta = (*s1)->st_value - (*s2)->st_value;
2328 if (delta != 0)
2329 return delta < 0 ? -1 : 1;
2331 delta = (*s2)->st_size - (*s1)->st_size;
2332 if (delta != 0)
2333 return delta < 0 ? -1 : 1;
2335 return *s1 < *s2 ? -1 : 1;
2338 /* Allocate a struct spu_elf_stack_info with MAX_FUN struct function_info
2339 entries for section SEC. */
2341 static struct spu_elf_stack_info *
2342 alloc_stack_info (asection *sec, int max_fun)
2344 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2345 bfd_size_type amt;
2347 amt = sizeof (struct spu_elf_stack_info);
2348 amt += (max_fun - 1) * sizeof (struct function_info);
2349 sec_data->u.i.stack_info = bfd_zmalloc (amt);
2350 if (sec_data->u.i.stack_info != NULL)
2351 sec_data->u.i.stack_info->max_fun = max_fun;
2352 return sec_data->u.i.stack_info;
2355 /* Add a new struct function_info describing a (part of a) function
2356 starting at SYM_H. Keep the array sorted by address. */
2358 static struct function_info *
2359 maybe_insert_function (asection *sec,
2360 void *sym_h,
2361 bfd_boolean global,
2362 bfd_boolean is_func)
2364 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2365 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2366 int i;
2367 bfd_vma off, size;
2369 if (sinfo == NULL)
2371 sinfo = alloc_stack_info (sec, 20);
2372 if (sinfo == NULL)
2373 return NULL;
2376 if (!global)
2378 Elf_Internal_Sym *sym = sym_h;
2379 off = sym->st_value;
2380 size = sym->st_size;
2382 else
2384 struct elf_link_hash_entry *h = sym_h;
2385 off = h->root.u.def.value;
2386 size = h->size;
2389 for (i = sinfo->num_fun; --i >= 0; )
2390 if (sinfo->fun[i].lo <= off)
2391 break;
2393 if (i >= 0)
2395 /* Don't add another entry for an alias, but do update some
2396 info. */
2397 if (sinfo->fun[i].lo == off)
2399 /* Prefer globals over local syms. */
2400 if (global && !sinfo->fun[i].global)
2402 sinfo->fun[i].global = TRUE;
2403 sinfo->fun[i].u.h = sym_h;
2405 if (is_func)
2406 sinfo->fun[i].is_func = TRUE;
2407 return &sinfo->fun[i];
2409 /* Ignore a zero-size symbol inside an existing function. */
2410 else if (sinfo->fun[i].hi > off && size == 0)
2411 return &sinfo->fun[i];
2414 if (sinfo->num_fun >= sinfo->max_fun)
2416 bfd_size_type amt = sizeof (struct spu_elf_stack_info);
2417 bfd_size_type old = amt;
2419 old += (sinfo->max_fun - 1) * sizeof (struct function_info);
2420 sinfo->max_fun += 20 + (sinfo->max_fun >> 1);
2421 amt += (sinfo->max_fun - 1) * sizeof (struct function_info);
2422 sinfo = bfd_realloc (sinfo, amt);
2423 if (sinfo == NULL)
2424 return NULL;
2425 memset ((char *) sinfo + old, 0, amt - old);
2426 sec_data->u.i.stack_info = sinfo;
2429 if (++i < sinfo->num_fun)
2430 memmove (&sinfo->fun[i + 1], &sinfo->fun[i],
2431 (sinfo->num_fun - i) * sizeof (sinfo->fun[i]));
2432 sinfo->fun[i].is_func = is_func;
2433 sinfo->fun[i].global = global;
2434 sinfo->fun[i].sec = sec;
2435 if (global)
2436 sinfo->fun[i].u.h = sym_h;
2437 else
2438 sinfo->fun[i].u.sym = sym_h;
2439 sinfo->fun[i].lo = off;
2440 sinfo->fun[i].hi = off + size;
2441 sinfo->fun[i].lr_store = -1;
2442 sinfo->fun[i].sp_adjust = -1;
2443 sinfo->fun[i].stack = -find_function_stack_adjust (sec, off,
2444 &sinfo->fun[i].lr_store,
2445 &sinfo->fun[i].sp_adjust);
2446 sinfo->num_fun += 1;
2447 return &sinfo->fun[i];
2450 /* Return the name of FUN. */
2452 static const char *
2453 func_name (struct function_info *fun)
2455 asection *sec;
2456 bfd *ibfd;
2457 Elf_Internal_Shdr *symtab_hdr;
2459 while (fun->start != NULL)
2460 fun = fun->start;
2462 if (fun->global)
2463 return fun->u.h->root.root.string;
2465 sec = fun->sec;
2466 if (fun->u.sym->st_name == 0)
2468 size_t len = strlen (sec->name);
2469 char *name = bfd_malloc (len + 10);
2470 if (name == NULL)
2471 return "(null)";
2472 sprintf (name, "%s+%lx", sec->name,
2473 (unsigned long) fun->u.sym->st_value & 0xffffffff);
2474 return name;
2476 ibfd = sec->owner;
2477 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2478 return bfd_elf_sym_name (ibfd, symtab_hdr, fun->u.sym, sec);
2481 /* Read the instruction at OFF in SEC. Return true iff the instruction
2482 is a nop, lnop, or stop 0 (all zero insn). */
2484 static bfd_boolean
2485 is_nop (asection *sec, bfd_vma off)
2487 unsigned char insn[4];
2489 if (off + 4 > sec->size
2490 || !bfd_get_section_contents (sec->owner, sec, insn, off, 4))
2491 return FALSE;
2492 if ((insn[0] & 0xbf) == 0 && (insn[1] & 0xe0) == 0x20)
2493 return TRUE;
2494 if (insn[0] == 0 && insn[1] == 0 && insn[2] == 0 && insn[3] == 0)
2495 return TRUE;
2496 return FALSE;
2499 /* Extend the range of FUN to cover nop padding up to LIMIT.
2500 Return TRUE iff some instruction other than a NOP was found. */
2502 static bfd_boolean
2503 insns_at_end (struct function_info *fun, bfd_vma limit)
2505 bfd_vma off = (fun->hi + 3) & -4;
2507 while (off < limit && is_nop (fun->sec, off))
2508 off += 4;
2509 if (off < limit)
2511 fun->hi = off;
2512 return TRUE;
2514 fun->hi = limit;
2515 return FALSE;
2518 /* Check and fix overlapping function ranges. Return TRUE iff there
2519 are gaps in the current info we have about functions in SEC. */
2521 static bfd_boolean
2522 check_function_ranges (asection *sec, struct bfd_link_info *info)
2524 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2525 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2526 int i;
2527 bfd_boolean gaps = FALSE;
2529 if (sinfo == NULL)
2530 return FALSE;
2532 for (i = 1; i < sinfo->num_fun; i++)
2533 if (sinfo->fun[i - 1].hi > sinfo->fun[i].lo)
2535 /* Fix overlapping symbols. */
2536 const char *f1 = func_name (&sinfo->fun[i - 1]);
2537 const char *f2 = func_name (&sinfo->fun[i]);
2539 info->callbacks->einfo (_("warning: %s overlaps %s\n"), f1, f2);
2540 sinfo->fun[i - 1].hi = sinfo->fun[i].lo;
2542 else if (insns_at_end (&sinfo->fun[i - 1], sinfo->fun[i].lo))
2543 gaps = TRUE;
2545 if (sinfo->num_fun == 0)
2546 gaps = TRUE;
2547 else
2549 if (sinfo->fun[0].lo != 0)
2550 gaps = TRUE;
2551 if (sinfo->fun[sinfo->num_fun - 1].hi > sec->size)
2553 const char *f1 = func_name (&sinfo->fun[sinfo->num_fun - 1]);
2555 info->callbacks->einfo (_("warning: %s exceeds section size\n"), f1);
2556 sinfo->fun[sinfo->num_fun - 1].hi = sec->size;
2558 else if (insns_at_end (&sinfo->fun[sinfo->num_fun - 1], sec->size))
2559 gaps = TRUE;
2561 return gaps;
2564 /* Search current function info for a function that contains address
2565 OFFSET in section SEC. */
2567 static struct function_info *
2568 find_function (asection *sec, bfd_vma offset, struct bfd_link_info *info)
2570 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2571 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2572 int lo, hi, mid;
2574 lo = 0;
2575 hi = sinfo->num_fun;
2576 while (lo < hi)
2578 mid = (lo + hi) / 2;
2579 if (offset < sinfo->fun[mid].lo)
2580 hi = mid;
2581 else if (offset >= sinfo->fun[mid].hi)
2582 lo = mid + 1;
2583 else
2584 return &sinfo->fun[mid];
2586 info->callbacks->einfo (_("%A:0x%v not found in function table\n"),
2587 sec, offset);
2588 bfd_set_error (bfd_error_bad_value);
2589 return NULL;
2592 /* Add CALLEE to CALLER call list if not already present. Return TRUE
2593 if CALLEE was new. If this function return FALSE, CALLEE should
2594 be freed. */
2596 static bfd_boolean
2597 insert_callee (struct function_info *caller, struct call_info *callee)
2599 struct call_info **pp, *p;
2601 for (pp = &caller->call_list; (p = *pp) != NULL; pp = &p->next)
2602 if (p->fun == callee->fun)
2604 /* Tail calls use less stack than normal calls. Retain entry
2605 for normal call over one for tail call. */
2606 p->is_tail &= callee->is_tail;
2607 if (!p->is_tail)
2609 p->fun->start = NULL;
2610 p->fun->is_func = TRUE;
2612 p->count += callee->count;
2613 /* Reorder list so most recent call is first. */
2614 *pp = p->next;
2615 p->next = caller->call_list;
2616 caller->call_list = p;
2617 return FALSE;
2619 callee->next = caller->call_list;
2620 caller->call_list = callee;
2621 return TRUE;
2624 /* Copy CALL and insert the copy into CALLER. */
2626 static bfd_boolean
2627 copy_callee (struct function_info *caller, const struct call_info *call)
2629 struct call_info *callee;
2630 callee = bfd_malloc (sizeof (*callee));
2631 if (callee == NULL)
2632 return FALSE;
2633 *callee = *call;
2634 if (!insert_callee (caller, callee))
2635 free (callee);
2636 return TRUE;
2639 /* We're only interested in code sections. Testing SEC_IN_MEMORY excludes
2640 overlay stub sections. */
2642 static bfd_boolean
2643 interesting_section (asection *s)
2645 return (s->output_section != bfd_abs_section_ptr
2646 && ((s->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_IN_MEMORY))
2647 == (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2648 && s->size != 0);
2651 /* Rummage through the relocs for SEC, looking for function calls.
2652 If CALL_TREE is true, fill in call graph. If CALL_TREE is false,
2653 mark destination symbols on calls as being functions. Also
2654 look at branches, which may be tail calls or go to hot/cold
2655 section part of same function. */
2657 static bfd_boolean
2658 mark_functions_via_relocs (asection *sec,
2659 struct bfd_link_info *info,
2660 int call_tree)
2662 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2663 Elf_Internal_Shdr *symtab_hdr;
2664 void *psyms;
2665 unsigned int priority = 0;
2666 static bfd_boolean warned;
2668 if (!interesting_section (sec)
2669 || sec->reloc_count == 0)
2670 return TRUE;
2672 internal_relocs = _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL,
2673 info->keep_memory);
2674 if (internal_relocs == NULL)
2675 return FALSE;
2677 symtab_hdr = &elf_tdata (sec->owner)->symtab_hdr;
2678 psyms = &symtab_hdr->contents;
2679 irela = internal_relocs;
2680 irelaend = irela + sec->reloc_count;
2681 for (; irela < irelaend; irela++)
2683 enum elf_spu_reloc_type r_type;
2684 unsigned int r_indx;
2685 asection *sym_sec;
2686 Elf_Internal_Sym *sym;
2687 struct elf_link_hash_entry *h;
2688 bfd_vma val;
2689 bfd_boolean nonbranch, is_call;
2690 struct function_info *caller;
2691 struct call_info *callee;
2693 r_type = ELF32_R_TYPE (irela->r_info);
2694 nonbranch = r_type != R_SPU_REL16 && r_type != R_SPU_ADDR16;
2696 r_indx = ELF32_R_SYM (irela->r_info);
2697 if (!get_sym_h (&h, &sym, &sym_sec, psyms, r_indx, sec->owner))
2698 return FALSE;
2700 if (sym_sec == NULL
2701 || sym_sec->output_section == bfd_abs_section_ptr)
2702 continue;
2704 is_call = FALSE;
2705 if (!nonbranch)
2707 unsigned char insn[4];
2709 if (!bfd_get_section_contents (sec->owner, sec, insn,
2710 irela->r_offset, 4))
2711 return FALSE;
2712 if (is_branch (insn))
2714 is_call = (insn[0] & 0xfd) == 0x31;
2715 priority = insn[1] & 0x0f;
2716 priority <<= 8;
2717 priority |= insn[2];
2718 priority <<= 8;
2719 priority |= insn[3];
2720 priority >>= 7;
2721 if ((sym_sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2722 != (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2724 if (!warned)
2725 info->callbacks->einfo
2726 (_("%B(%A+0x%v): call to non-code section"
2727 " %B(%A), analysis incomplete\n"),
2728 sec->owner, sec, irela->r_offset,
2729 sym_sec->owner, sym_sec);
2730 warned = TRUE;
2731 continue;
2734 else
2736 nonbranch = TRUE;
2737 if (is_hint (insn))
2738 continue;
2742 if (nonbranch)
2744 /* For --auto-overlay, count possible stubs we need for
2745 function pointer references. */
2746 unsigned int sym_type;
2747 if (h)
2748 sym_type = h->type;
2749 else
2750 sym_type = ELF_ST_TYPE (sym->st_info);
2751 if (sym_type == STT_FUNC)
2753 if (call_tree && spu_hash_table (info)->params->auto_overlay)
2754 spu_hash_table (info)->non_ovly_stub += 1;
2755 /* If the symbol type is STT_FUNC then this must be a
2756 function pointer initialisation. */
2757 continue;
2759 /* Ignore data references. */
2760 if ((sym_sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2761 != (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2762 continue;
2763 /* Otherwise we probably have a jump table reloc for
2764 a switch statement or some other reference to a
2765 code label. */
2768 if (h)
2769 val = h->root.u.def.value;
2770 else
2771 val = sym->st_value;
2772 val += irela->r_addend;
2774 if (!call_tree)
2776 struct function_info *fun;
2778 if (irela->r_addend != 0)
2780 Elf_Internal_Sym *fake = bfd_zmalloc (sizeof (*fake));
2781 if (fake == NULL)
2782 return FALSE;
2783 fake->st_value = val;
2784 fake->st_shndx
2785 = _bfd_elf_section_from_bfd_section (sym_sec->owner, sym_sec);
2786 sym = fake;
2788 if (sym)
2789 fun = maybe_insert_function (sym_sec, sym, FALSE, is_call);
2790 else
2791 fun = maybe_insert_function (sym_sec, h, TRUE, is_call);
2792 if (fun == NULL)
2793 return FALSE;
2794 if (irela->r_addend != 0
2795 && fun->u.sym != sym)
2796 free (sym);
2797 continue;
2800 caller = find_function (sec, irela->r_offset, info);
2801 if (caller == NULL)
2802 return FALSE;
2803 callee = bfd_malloc (sizeof *callee);
2804 if (callee == NULL)
2805 return FALSE;
2807 callee->fun = find_function (sym_sec, val, info);
2808 if (callee->fun == NULL)
2809 return FALSE;
2810 callee->is_tail = !is_call;
2811 callee->is_pasted = FALSE;
2812 callee->broken_cycle = FALSE;
2813 callee->priority = priority;
2814 callee->count = nonbranch? 0 : 1;
2815 if (callee->fun->last_caller != sec)
2817 callee->fun->last_caller = sec;
2818 callee->fun->call_count += 1;
2820 if (!insert_callee (caller, callee))
2821 free (callee);
2822 else if (!is_call
2823 && !callee->fun->is_func
2824 && callee->fun->stack == 0)
2826 /* This is either a tail call or a branch from one part of
2827 the function to another, ie. hot/cold section. If the
2828 destination has been called by some other function then
2829 it is a separate function. We also assume that functions
2830 are not split across input files. */
2831 if (sec->owner != sym_sec->owner)
2833 callee->fun->start = NULL;
2834 callee->fun->is_func = TRUE;
2836 else if (callee->fun->start == NULL)
2838 struct function_info *caller_start = caller;
2839 while (caller_start->start)
2840 caller_start = caller_start->start;
2842 if (caller_start != callee->fun)
2843 callee->fun->start = caller_start;
2845 else
2847 struct function_info *callee_start;
2848 struct function_info *caller_start;
2849 callee_start = callee->fun;
2850 while (callee_start->start)
2851 callee_start = callee_start->start;
2852 caller_start = caller;
2853 while (caller_start->start)
2854 caller_start = caller_start->start;
2855 if (caller_start != callee_start)
2857 callee->fun->start = NULL;
2858 callee->fun->is_func = TRUE;
2864 return TRUE;
2867 /* Handle something like .init or .fini, which has a piece of a function.
2868 These sections are pasted together to form a single function. */
2870 static bfd_boolean
2871 pasted_function (asection *sec)
2873 struct bfd_link_order *l;
2874 struct _spu_elf_section_data *sec_data;
2875 struct spu_elf_stack_info *sinfo;
2876 Elf_Internal_Sym *fake;
2877 struct function_info *fun, *fun_start;
2879 fake = bfd_zmalloc (sizeof (*fake));
2880 if (fake == NULL)
2881 return FALSE;
2882 fake->st_value = 0;
2883 fake->st_size = sec->size;
2884 fake->st_shndx
2885 = _bfd_elf_section_from_bfd_section (sec->owner, sec);
2886 fun = maybe_insert_function (sec, fake, FALSE, FALSE);
2887 if (!fun)
2888 return FALSE;
2890 /* Find a function immediately preceding this section. */
2891 fun_start = NULL;
2892 for (l = sec->output_section->map_head.link_order; l != NULL; l = l->next)
2894 if (l->u.indirect.section == sec)
2896 if (fun_start != NULL)
2898 struct call_info *callee = bfd_malloc (sizeof *callee);
2899 if (callee == NULL)
2900 return FALSE;
2902 fun->start = fun_start;
2903 callee->fun = fun;
2904 callee->is_tail = TRUE;
2905 callee->is_pasted = TRUE;
2906 callee->broken_cycle = FALSE;
2907 callee->priority = 0;
2908 callee->count = 1;
2909 if (!insert_callee (fun_start, callee))
2910 free (callee);
2911 return TRUE;
2913 break;
2915 if (l->type == bfd_indirect_link_order
2916 && (sec_data = spu_elf_section_data (l->u.indirect.section)) != NULL
2917 && (sinfo = sec_data->u.i.stack_info) != NULL
2918 && sinfo->num_fun != 0)
2919 fun_start = &sinfo->fun[sinfo->num_fun - 1];
2922 /* Don't return an error if we did not find a function preceding this
2923 section. The section may have incorrect flags. */
2924 return TRUE;
2927 /* Map address ranges in code sections to functions. */
2929 static bfd_boolean
2930 discover_functions (struct bfd_link_info *info)
2932 bfd *ibfd;
2933 int bfd_idx;
2934 Elf_Internal_Sym ***psym_arr;
2935 asection ***sec_arr;
2936 bfd_boolean gaps = FALSE;
2938 bfd_idx = 0;
2939 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2940 bfd_idx++;
2942 psym_arr = bfd_zmalloc (bfd_idx * sizeof (*psym_arr));
2943 if (psym_arr == NULL)
2944 return FALSE;
2945 sec_arr = bfd_zmalloc (bfd_idx * sizeof (*sec_arr));
2946 if (sec_arr == NULL)
2947 return FALSE;
2949 for (ibfd = info->input_bfds, bfd_idx = 0;
2950 ibfd != NULL;
2951 ibfd = ibfd->link_next, bfd_idx++)
2953 extern const bfd_target bfd_elf32_spu_vec;
2954 Elf_Internal_Shdr *symtab_hdr;
2955 asection *sec;
2956 size_t symcount;
2957 Elf_Internal_Sym *syms, *sy, **psyms, **psy;
2958 asection **psecs, **p;
2960 if (ibfd->xvec != &bfd_elf32_spu_vec)
2961 continue;
2963 /* Read all the symbols. */
2964 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2965 symcount = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
2966 if (symcount == 0)
2968 if (!gaps)
2969 for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
2970 if (interesting_section (sec))
2972 gaps = TRUE;
2973 break;
2975 continue;
2978 if (symtab_hdr->contents != NULL)
2980 /* Don't use cached symbols since the generic ELF linker
2981 code only reads local symbols, and we need globals too. */
2982 free (symtab_hdr->contents);
2983 symtab_hdr->contents = NULL;
2985 syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, symcount, 0,
2986 NULL, NULL, NULL);
2987 symtab_hdr->contents = (void *) syms;
2988 if (syms == NULL)
2989 return FALSE;
2991 /* Select defined function symbols that are going to be output. */
2992 psyms = bfd_malloc ((symcount + 1) * sizeof (*psyms));
2993 if (psyms == NULL)
2994 return FALSE;
2995 psym_arr[bfd_idx] = psyms;
2996 psecs = bfd_malloc (symcount * sizeof (*psecs));
2997 if (psecs == NULL)
2998 return FALSE;
2999 sec_arr[bfd_idx] = psecs;
3000 for (psy = psyms, p = psecs, sy = syms; sy < syms + symcount; ++p, ++sy)
3001 if (ELF_ST_TYPE (sy->st_info) == STT_NOTYPE
3002 || ELF_ST_TYPE (sy->st_info) == STT_FUNC)
3004 asection *s;
3006 *p = s = bfd_section_from_elf_index (ibfd, sy->st_shndx);
3007 if (s != NULL && interesting_section (s))
3008 *psy++ = sy;
3010 symcount = psy - psyms;
3011 *psy = NULL;
3013 /* Sort them by section and offset within section. */
3014 sort_syms_syms = syms;
3015 sort_syms_psecs = psecs;
3016 qsort (psyms, symcount, sizeof (*psyms), sort_syms);
3018 /* Now inspect the function symbols. */
3019 for (psy = psyms; psy < psyms + symcount; )
3021 asection *s = psecs[*psy - syms];
3022 Elf_Internal_Sym **psy2;
3024 for (psy2 = psy; ++psy2 < psyms + symcount; )
3025 if (psecs[*psy2 - syms] != s)
3026 break;
3028 if (!alloc_stack_info (s, psy2 - psy))
3029 return FALSE;
3030 psy = psy2;
3033 /* First install info about properly typed and sized functions.
3034 In an ideal world this will cover all code sections, except
3035 when partitioning functions into hot and cold sections,
3036 and the horrible pasted together .init and .fini functions. */
3037 for (psy = psyms; psy < psyms + symcount; ++psy)
3039 sy = *psy;
3040 if (ELF_ST_TYPE (sy->st_info) == STT_FUNC)
3042 asection *s = psecs[sy - syms];
3043 if (!maybe_insert_function (s, sy, FALSE, TRUE))
3044 return FALSE;
3048 for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
3049 if (interesting_section (sec))
3050 gaps |= check_function_ranges (sec, info);
3053 if (gaps)
3055 /* See if we can discover more function symbols by looking at
3056 relocations. */
3057 for (ibfd = info->input_bfds, bfd_idx = 0;
3058 ibfd != NULL;
3059 ibfd = ibfd->link_next, bfd_idx++)
3061 asection *sec;
3063 if (psym_arr[bfd_idx] == NULL)
3064 continue;
3066 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3067 if (!mark_functions_via_relocs (sec, info, FALSE))
3068 return FALSE;
3071 for (ibfd = info->input_bfds, bfd_idx = 0;
3072 ibfd != NULL;
3073 ibfd = ibfd->link_next, bfd_idx++)
3075 Elf_Internal_Shdr *symtab_hdr;
3076 asection *sec;
3077 Elf_Internal_Sym *syms, *sy, **psyms, **psy;
3078 asection **psecs;
3080 if ((psyms = psym_arr[bfd_idx]) == NULL)
3081 continue;
3083 psecs = sec_arr[bfd_idx];
3085 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3086 syms = (Elf_Internal_Sym *) symtab_hdr->contents;
3088 gaps = FALSE;
3089 for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
3090 if (interesting_section (sec))
3091 gaps |= check_function_ranges (sec, info);
3092 if (!gaps)
3093 continue;
3095 /* Finally, install all globals. */
3096 for (psy = psyms; (sy = *psy) != NULL; ++psy)
3098 asection *s;
3100 s = psecs[sy - syms];
3102 /* Global syms might be improperly typed functions. */
3103 if (ELF_ST_TYPE (sy->st_info) != STT_FUNC
3104 && ELF_ST_BIND (sy->st_info) == STB_GLOBAL)
3106 if (!maybe_insert_function (s, sy, FALSE, FALSE))
3107 return FALSE;
3112 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3114 extern const bfd_target bfd_elf32_spu_vec;
3115 asection *sec;
3117 if (ibfd->xvec != &bfd_elf32_spu_vec)
3118 continue;
3120 /* Some of the symbols we've installed as marking the
3121 beginning of functions may have a size of zero. Extend
3122 the range of such functions to the beginning of the
3123 next symbol of interest. */
3124 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3125 if (interesting_section (sec))
3127 struct _spu_elf_section_data *sec_data;
3128 struct spu_elf_stack_info *sinfo;
3130 sec_data = spu_elf_section_data (sec);
3131 sinfo = sec_data->u.i.stack_info;
3132 if (sinfo != NULL && sinfo->num_fun != 0)
3134 int fun_idx;
3135 bfd_vma hi = sec->size;
3137 for (fun_idx = sinfo->num_fun; --fun_idx >= 0; )
3139 sinfo->fun[fun_idx].hi = hi;
3140 hi = sinfo->fun[fun_idx].lo;
3143 sinfo->fun[0].lo = 0;
3145 /* No symbols in this section. Must be .init or .fini
3146 or something similar. */
3147 else if (!pasted_function (sec))
3148 return FALSE;
3153 for (ibfd = info->input_bfds, bfd_idx = 0;
3154 ibfd != NULL;
3155 ibfd = ibfd->link_next, bfd_idx++)
3157 if (psym_arr[bfd_idx] == NULL)
3158 continue;
3160 free (psym_arr[bfd_idx]);
3161 free (sec_arr[bfd_idx]);
3164 free (psym_arr);
3165 free (sec_arr);
3167 return TRUE;
3170 /* Iterate over all function_info we have collected, calling DOIT on
3171 each node if ROOT_ONLY is false. Only call DOIT on root nodes
3172 if ROOT_ONLY. */
3174 static bfd_boolean
3175 for_each_node (bfd_boolean (*doit) (struct function_info *,
3176 struct bfd_link_info *,
3177 void *),
3178 struct bfd_link_info *info,
3179 void *param,
3180 int root_only)
3182 bfd *ibfd;
3184 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3186 extern const bfd_target bfd_elf32_spu_vec;
3187 asection *sec;
3189 if (ibfd->xvec != &bfd_elf32_spu_vec)
3190 continue;
3192 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3194 struct _spu_elf_section_data *sec_data;
3195 struct spu_elf_stack_info *sinfo;
3197 if ((sec_data = spu_elf_section_data (sec)) != NULL
3198 && (sinfo = sec_data->u.i.stack_info) != NULL)
3200 int i;
3201 for (i = 0; i < sinfo->num_fun; ++i)
3202 if (!root_only || !sinfo->fun[i].non_root)
3203 if (!doit (&sinfo->fun[i], info, param))
3204 return FALSE;
3208 return TRUE;
3211 /* Transfer call info attached to struct function_info entries for
3212 all of a given function's sections to the first entry. */
3214 static bfd_boolean
3215 transfer_calls (struct function_info *fun,
3216 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3217 void *param ATTRIBUTE_UNUSED)
3219 struct function_info *start = fun->start;
3221 if (start != NULL)
3223 struct call_info *call, *call_next;
3225 while (start->start != NULL)
3226 start = start->start;
3227 for (call = fun->call_list; call != NULL; call = call_next)
3229 call_next = call->next;
3230 if (!insert_callee (start, call))
3231 free (call);
3233 fun->call_list = NULL;
3235 return TRUE;
3238 /* Mark nodes in the call graph that are called by some other node. */
3240 static bfd_boolean
3241 mark_non_root (struct function_info *fun,
3242 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3243 void *param ATTRIBUTE_UNUSED)
3245 struct call_info *call;
3247 if (fun->visit1)
3248 return TRUE;
3249 fun->visit1 = TRUE;
3250 for (call = fun->call_list; call; call = call->next)
3252 call->fun->non_root = TRUE;
3253 mark_non_root (call->fun, 0, 0);
3255 return TRUE;
3258 /* Remove cycles from the call graph. Set depth of nodes. */
3260 static bfd_boolean
3261 remove_cycles (struct function_info *fun,
3262 struct bfd_link_info *info,
3263 void *param)
3265 struct call_info **callp, *call;
3266 unsigned int depth = *(unsigned int *) param;
3267 unsigned int max_depth = depth;
3269 fun->depth = depth;
3270 fun->visit2 = TRUE;
3271 fun->marking = TRUE;
3273 callp = &fun->call_list;
3274 while ((call = *callp) != NULL)
3276 call->max_depth = depth + !call->is_pasted;
3277 if (!call->fun->visit2)
3279 if (!remove_cycles (call->fun, info, &call->max_depth))
3280 return FALSE;
3281 if (max_depth < call->max_depth)
3282 max_depth = call->max_depth;
3284 else if (call->fun->marking)
3286 struct spu_link_hash_table *htab = spu_hash_table (info);
3288 if (!htab->params->auto_overlay
3289 && htab->params->stack_analysis)
3291 const char *f1 = func_name (fun);
3292 const char *f2 = func_name (call->fun);
3294 info->callbacks->info (_("Stack analysis will ignore the call "
3295 "from %s to %s\n"),
3296 f1, f2);
3299 call->broken_cycle = TRUE;
3301 callp = &call->next;
3303 fun->marking = FALSE;
3304 *(unsigned int *) param = max_depth;
3305 return TRUE;
3308 /* Check that we actually visited all nodes in remove_cycles. If we
3309 didn't, then there is some cycle in the call graph not attached to
3310 any root node. Arbitrarily choose a node in the cycle as a new
3311 root and break the cycle. */
3313 static bfd_boolean
3314 mark_detached_root (struct function_info *fun,
3315 struct bfd_link_info *info,
3316 void *param)
3318 if (fun->visit2)
3319 return TRUE;
3320 fun->non_root = FALSE;
3321 *(unsigned int *) param = 0;
3322 return remove_cycles (fun, info, param);
3325 /* Populate call_list for each function. */
3327 static bfd_boolean
3328 build_call_tree (struct bfd_link_info *info)
3330 bfd *ibfd;
3331 unsigned int depth;
3333 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3335 extern const bfd_target bfd_elf32_spu_vec;
3336 asection *sec;
3338 if (ibfd->xvec != &bfd_elf32_spu_vec)
3339 continue;
3341 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3342 if (!mark_functions_via_relocs (sec, info, TRUE))
3343 return FALSE;
3346 /* Transfer call info from hot/cold section part of function
3347 to main entry. */
3348 if (!spu_hash_table (info)->params->auto_overlay
3349 && !for_each_node (transfer_calls, info, 0, FALSE))
3350 return FALSE;
3352 /* Find the call graph root(s). */
3353 if (!for_each_node (mark_non_root, info, 0, FALSE))
3354 return FALSE;
3356 /* Remove cycles from the call graph. We start from the root node(s)
3357 so that we break cycles in a reasonable place. */
3358 depth = 0;
3359 if (!for_each_node (remove_cycles, info, &depth, TRUE))
3360 return FALSE;
3362 return for_each_node (mark_detached_root, info, &depth, FALSE);
3365 /* qsort predicate to sort calls by priority, max_depth then count. */
3367 static int
3368 sort_calls (const void *a, const void *b)
3370 struct call_info *const *c1 = a;
3371 struct call_info *const *c2 = b;
3372 int delta;
3374 delta = (*c2)->priority - (*c1)->priority;
3375 if (delta != 0)
3376 return delta;
3378 delta = (*c2)->max_depth - (*c1)->max_depth;
3379 if (delta != 0)
3380 return delta;
3382 delta = (*c2)->count - (*c1)->count;
3383 if (delta != 0)
3384 return delta;
3386 return (char *) c1 - (char *) c2;
3389 struct _mos_param {
3390 unsigned int max_overlay_size;
3393 /* Set linker_mark and gc_mark on any sections that we will put in
3394 overlays. These flags are used by the generic ELF linker, but we
3395 won't be continuing on to bfd_elf_final_link so it is OK to use
3396 them. linker_mark is clear before we get here. Set segment_mark
3397 on sections that are part of a pasted function (excluding the last
3398 section).
3400 Set up function rodata section if --overlay-rodata. We don't
3401 currently include merged string constant rodata sections since
3403 Sort the call graph so that the deepest nodes will be visited
3404 first. */
3406 static bfd_boolean
3407 mark_overlay_section (struct function_info *fun,
3408 struct bfd_link_info *info,
3409 void *param)
3411 struct call_info *call;
3412 unsigned int count;
3413 struct _mos_param *mos_param = param;
3414 struct spu_link_hash_table *htab = spu_hash_table (info);
3416 if (fun->visit4)
3417 return TRUE;
3419 fun->visit4 = TRUE;
3420 if (!fun->sec->linker_mark
3421 && (htab->params->ovly_flavour != ovly_soft_icache
3422 || htab->params->non_ia_text
3423 || strncmp (fun->sec->name, ".text.ia.", 9) == 0
3424 || strcmp (fun->sec->name, ".init") == 0
3425 || strcmp (fun->sec->name, ".fini") == 0))
3427 unsigned int size;
3429 fun->sec->linker_mark = 1;
3430 fun->sec->gc_mark = 1;
3431 fun->sec->segment_mark = 0;
3432 /* Ensure SEC_CODE is set on this text section (it ought to
3433 be!), and SEC_CODE is clear on rodata sections. We use
3434 this flag to differentiate the two overlay section types. */
3435 fun->sec->flags |= SEC_CODE;
3437 size = fun->sec->size;
3438 if (htab->params->auto_overlay & OVERLAY_RODATA)
3440 char *name = NULL;
3442 /* Find the rodata section corresponding to this function's
3443 text section. */
3444 if (strcmp (fun->sec->name, ".text") == 0)
3446 name = bfd_malloc (sizeof (".rodata"));
3447 if (name == NULL)
3448 return FALSE;
3449 memcpy (name, ".rodata", sizeof (".rodata"));
3451 else if (strncmp (fun->sec->name, ".text.", 6) == 0)
3453 size_t len = strlen (fun->sec->name);
3454 name = bfd_malloc (len + 3);
3455 if (name == NULL)
3456 return FALSE;
3457 memcpy (name, ".rodata", sizeof (".rodata"));
3458 memcpy (name + 7, fun->sec->name + 5, len - 4);
3460 else if (strncmp (fun->sec->name, ".gnu.linkonce.t.", 16) == 0)
3462 size_t len = strlen (fun->sec->name) + 1;
3463 name = bfd_malloc (len);
3464 if (name == NULL)
3465 return FALSE;
3466 memcpy (name, fun->sec->name, len);
3467 name[14] = 'r';
3470 if (name != NULL)
3472 asection *rodata = NULL;
3473 asection *group_sec = elf_section_data (fun->sec)->next_in_group;
3474 if (group_sec == NULL)
3475 rodata = bfd_get_section_by_name (fun->sec->owner, name);
3476 else
3477 while (group_sec != NULL && group_sec != fun->sec)
3479 if (strcmp (group_sec->name, name) == 0)
3481 rodata = group_sec;
3482 break;
3484 group_sec = elf_section_data (group_sec)->next_in_group;
3486 fun->rodata = rodata;
3487 if (fun->rodata)
3489 size += fun->rodata->size;
3490 if (htab->params->line_size != 0
3491 && size > htab->params->line_size)
3493 size -= fun->rodata->size;
3494 fun->rodata = NULL;
3496 else
3498 fun->rodata->linker_mark = 1;
3499 fun->rodata->gc_mark = 1;
3500 fun->rodata->flags &= ~SEC_CODE;
3503 free (name);
3506 if (mos_param->max_overlay_size < size)
3507 mos_param->max_overlay_size = size;
3510 for (count = 0, call = fun->call_list; call != NULL; call = call->next)
3511 count += 1;
3513 if (count > 1)
3515 struct call_info **calls = bfd_malloc (count * sizeof (*calls));
3516 if (calls == NULL)
3517 return FALSE;
3519 for (count = 0, call = fun->call_list; call != NULL; call = call->next)
3520 calls[count++] = call;
3522 qsort (calls, count, sizeof (*calls), sort_calls);
3524 fun->call_list = NULL;
3525 while (count != 0)
3527 --count;
3528 calls[count]->next = fun->call_list;
3529 fun->call_list = calls[count];
3531 free (calls);
3534 for (call = fun->call_list; call != NULL; call = call->next)
3536 if (call->is_pasted)
3538 /* There can only be one is_pasted call per function_info. */
3539 BFD_ASSERT (!fun->sec->segment_mark);
3540 fun->sec->segment_mark = 1;
3542 if (!call->broken_cycle
3543 && !mark_overlay_section (call->fun, info, param))
3544 return FALSE;
3547 /* Don't put entry code into an overlay. The overlay manager needs
3548 a stack! Also, don't mark .ovl.init as an overlay. */
3549 if (fun->lo + fun->sec->output_offset + fun->sec->output_section->vma
3550 == info->output_bfd->start_address
3551 || strncmp (fun->sec->output_section->name, ".ovl.init", 9) == 0)
3553 fun->sec->linker_mark = 0;
3554 if (fun->rodata != NULL)
3555 fun->rodata->linker_mark = 0;
3557 return TRUE;
3560 /* If non-zero then unmark functions called from those within sections
3561 that we need to unmark. Unfortunately this isn't reliable since the
3562 call graph cannot know the destination of function pointer calls. */
3563 #define RECURSE_UNMARK 0
3565 struct _uos_param {
3566 asection *exclude_input_section;
3567 asection *exclude_output_section;
3568 unsigned long clearing;
3571 /* Undo some of mark_overlay_section's work. */
3573 static bfd_boolean
3574 unmark_overlay_section (struct function_info *fun,
3575 struct bfd_link_info *info,
3576 void *param)
3578 struct call_info *call;
3579 struct _uos_param *uos_param = param;
3580 unsigned int excluded = 0;
3582 if (fun->visit5)
3583 return TRUE;
3585 fun->visit5 = TRUE;
3587 excluded = 0;
3588 if (fun->sec == uos_param->exclude_input_section
3589 || fun->sec->output_section == uos_param->exclude_output_section)
3590 excluded = 1;
3592 if (RECURSE_UNMARK)
3593 uos_param->clearing += excluded;
3595 if (RECURSE_UNMARK ? uos_param->clearing : excluded)
3597 fun->sec->linker_mark = 0;
3598 if (fun->rodata)
3599 fun->rodata->linker_mark = 0;
3602 for (call = fun->call_list; call != NULL; call = call->next)
3603 if (!call->broken_cycle
3604 && !unmark_overlay_section (call->fun, info, param))
3605 return FALSE;
3607 if (RECURSE_UNMARK)
3608 uos_param->clearing -= excluded;
3609 return TRUE;
3612 struct _cl_param {
3613 unsigned int lib_size;
3614 asection **lib_sections;
3617 /* Add sections we have marked as belonging to overlays to an array
3618 for consideration as non-overlay sections. The array consist of
3619 pairs of sections, (text,rodata), for functions in the call graph. */
3621 static bfd_boolean
3622 collect_lib_sections (struct function_info *fun,
3623 struct bfd_link_info *info,
3624 void *param)
3626 struct _cl_param *lib_param = param;
3627 struct call_info *call;
3628 unsigned int size;
3630 if (fun->visit6)
3631 return TRUE;
3633 fun->visit6 = TRUE;
3634 if (!fun->sec->linker_mark || !fun->sec->gc_mark || fun->sec->segment_mark)
3635 return TRUE;
3637 size = fun->sec->size;
3638 if (fun->rodata)
3639 size += fun->rodata->size;
3641 if (size <= lib_param->lib_size)
3643 *lib_param->lib_sections++ = fun->sec;
3644 fun->sec->gc_mark = 0;
3645 if (fun->rodata && fun->rodata->linker_mark && fun->rodata->gc_mark)
3647 *lib_param->lib_sections++ = fun->rodata;
3648 fun->rodata->gc_mark = 0;
3650 else
3651 *lib_param->lib_sections++ = NULL;
3654 for (call = fun->call_list; call != NULL; call = call->next)
3655 if (!call->broken_cycle)
3656 collect_lib_sections (call->fun, info, param);
3658 return TRUE;
3661 /* qsort predicate to sort sections by call count. */
3663 static int
3664 sort_lib (const void *a, const void *b)
3666 asection *const *s1 = a;
3667 asection *const *s2 = b;
3668 struct _spu_elf_section_data *sec_data;
3669 struct spu_elf_stack_info *sinfo;
3670 int delta;
3672 delta = 0;
3673 if ((sec_data = spu_elf_section_data (*s1)) != NULL
3674 && (sinfo = sec_data->u.i.stack_info) != NULL)
3676 int i;
3677 for (i = 0; i < sinfo->num_fun; ++i)
3678 delta -= sinfo->fun[i].call_count;
3681 if ((sec_data = spu_elf_section_data (*s2)) != NULL
3682 && (sinfo = sec_data->u.i.stack_info) != NULL)
3684 int i;
3685 for (i = 0; i < sinfo->num_fun; ++i)
3686 delta += sinfo->fun[i].call_count;
3689 if (delta != 0)
3690 return delta;
3692 return s1 - s2;
3695 /* Remove some sections from those marked to be in overlays. Choose
3696 those that are called from many places, likely library functions. */
3698 static unsigned int
3699 auto_ovl_lib_functions (struct bfd_link_info *info, unsigned int lib_size)
3701 bfd *ibfd;
3702 asection **lib_sections;
3703 unsigned int i, lib_count;
3704 struct _cl_param collect_lib_param;
3705 struct function_info dummy_caller;
3706 struct spu_link_hash_table *htab;
3708 memset (&dummy_caller, 0, sizeof (dummy_caller));
3709 lib_count = 0;
3710 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3712 extern const bfd_target bfd_elf32_spu_vec;
3713 asection *sec;
3715 if (ibfd->xvec != &bfd_elf32_spu_vec)
3716 continue;
3718 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3719 if (sec->linker_mark
3720 && sec->size < lib_size
3721 && (sec->flags & SEC_CODE) != 0)
3722 lib_count += 1;
3724 lib_sections = bfd_malloc (lib_count * 2 * sizeof (*lib_sections));
3725 if (lib_sections == NULL)
3726 return (unsigned int) -1;
3727 collect_lib_param.lib_size = lib_size;
3728 collect_lib_param.lib_sections = lib_sections;
3729 if (!for_each_node (collect_lib_sections, info, &collect_lib_param,
3730 TRUE))
3731 return (unsigned int) -1;
3732 lib_count = (collect_lib_param.lib_sections - lib_sections) / 2;
3734 /* Sort sections so that those with the most calls are first. */
3735 if (lib_count > 1)
3736 qsort (lib_sections, lib_count, 2 * sizeof (*lib_sections), sort_lib);
3738 htab = spu_hash_table (info);
3739 for (i = 0; i < lib_count; i++)
3741 unsigned int tmp, stub_size;
3742 asection *sec;
3743 struct _spu_elf_section_data *sec_data;
3744 struct spu_elf_stack_info *sinfo;
3746 sec = lib_sections[2 * i];
3747 /* If this section is OK, its size must be less than lib_size. */
3748 tmp = sec->size;
3749 /* If it has a rodata section, then add that too. */
3750 if (lib_sections[2 * i + 1])
3751 tmp += lib_sections[2 * i + 1]->size;
3752 /* Add any new overlay call stubs needed by the section. */
3753 stub_size = 0;
3754 if (tmp < lib_size
3755 && (sec_data = spu_elf_section_data (sec)) != NULL
3756 && (sinfo = sec_data->u.i.stack_info) != NULL)
3758 int k;
3759 struct call_info *call;
3761 for (k = 0; k < sinfo->num_fun; ++k)
3762 for (call = sinfo->fun[k].call_list; call; call = call->next)
3763 if (call->fun->sec->linker_mark)
3765 struct call_info *p;
3766 for (p = dummy_caller.call_list; p; p = p->next)
3767 if (p->fun == call->fun)
3768 break;
3769 if (!p)
3770 stub_size += ovl_stub_size (htab->params);
3773 if (tmp + stub_size < lib_size)
3775 struct call_info **pp, *p;
3777 /* This section fits. Mark it as non-overlay. */
3778 lib_sections[2 * i]->linker_mark = 0;
3779 if (lib_sections[2 * i + 1])
3780 lib_sections[2 * i + 1]->linker_mark = 0;
3781 lib_size -= tmp + stub_size;
3782 /* Call stubs to the section we just added are no longer
3783 needed. */
3784 pp = &dummy_caller.call_list;
3785 while ((p = *pp) != NULL)
3786 if (!p->fun->sec->linker_mark)
3788 lib_size += ovl_stub_size (htab->params);
3789 *pp = p->next;
3790 free (p);
3792 else
3793 pp = &p->next;
3794 /* Add new call stubs to dummy_caller. */
3795 if ((sec_data = spu_elf_section_data (sec)) != NULL
3796 && (sinfo = sec_data->u.i.stack_info) != NULL)
3798 int k;
3799 struct call_info *call;
3801 for (k = 0; k < sinfo->num_fun; ++k)
3802 for (call = sinfo->fun[k].call_list;
3803 call;
3804 call = call->next)
3805 if (call->fun->sec->linker_mark)
3807 struct call_info *callee;
3808 callee = bfd_malloc (sizeof (*callee));
3809 if (callee == NULL)
3810 return (unsigned int) -1;
3811 *callee = *call;
3812 if (!insert_callee (&dummy_caller, callee))
3813 free (callee);
3818 while (dummy_caller.call_list != NULL)
3820 struct call_info *call = dummy_caller.call_list;
3821 dummy_caller.call_list = call->next;
3822 free (call);
3824 for (i = 0; i < 2 * lib_count; i++)
3825 if (lib_sections[i])
3826 lib_sections[i]->gc_mark = 1;
3827 free (lib_sections);
3828 return lib_size;
3831 /* Build an array of overlay sections. The deepest node's section is
3832 added first, then its parent node's section, then everything called
3833 from the parent section. The idea being to group sections to
3834 minimise calls between different overlays. */
3836 static bfd_boolean
3837 collect_overlays (struct function_info *fun,
3838 struct bfd_link_info *info,
3839 void *param)
3841 struct call_info *call;
3842 bfd_boolean added_fun;
3843 asection ***ovly_sections = param;
3845 if (fun->visit7)
3846 return TRUE;
3848 fun->visit7 = TRUE;
3849 for (call = fun->call_list; call != NULL; call = call->next)
3850 if (!call->is_pasted && !call->broken_cycle)
3852 if (!collect_overlays (call->fun, info, ovly_sections))
3853 return FALSE;
3854 break;
3857 added_fun = FALSE;
3858 if (fun->sec->linker_mark && fun->sec->gc_mark)
3860 fun->sec->gc_mark = 0;
3861 *(*ovly_sections)++ = fun->sec;
3862 if (fun->rodata && fun->rodata->linker_mark && fun->rodata->gc_mark)
3864 fun->rodata->gc_mark = 0;
3865 *(*ovly_sections)++ = fun->rodata;
3867 else
3868 *(*ovly_sections)++ = NULL;
3869 added_fun = TRUE;
3871 /* Pasted sections must stay with the first section. We don't
3872 put pasted sections in the array, just the first section.
3873 Mark subsequent sections as already considered. */
3874 if (fun->sec->segment_mark)
3876 struct function_info *call_fun = fun;
3879 for (call = call_fun->call_list; call != NULL; call = call->next)
3880 if (call->is_pasted)
3882 call_fun = call->fun;
3883 call_fun->sec->gc_mark = 0;
3884 if (call_fun->rodata)
3885 call_fun->rodata->gc_mark = 0;
3886 break;
3888 if (call == NULL)
3889 abort ();
3891 while (call_fun->sec->segment_mark);
3895 for (call = fun->call_list; call != NULL; call = call->next)
3896 if (!call->broken_cycle
3897 && !collect_overlays (call->fun, info, ovly_sections))
3898 return FALSE;
3900 if (added_fun)
3902 struct _spu_elf_section_data *sec_data;
3903 struct spu_elf_stack_info *sinfo;
3905 if ((sec_data = spu_elf_section_data (fun->sec)) != NULL
3906 && (sinfo = sec_data->u.i.stack_info) != NULL)
3908 int i;
3909 for (i = 0; i < sinfo->num_fun; ++i)
3910 if (!collect_overlays (&sinfo->fun[i], info, ovly_sections))
3911 return FALSE;
3915 return TRUE;
3918 struct _sum_stack_param {
3919 size_t cum_stack;
3920 size_t overall_stack;
3921 bfd_boolean emit_stack_syms;
3924 /* Descend the call graph for FUN, accumulating total stack required. */
3926 static bfd_boolean
3927 sum_stack (struct function_info *fun,
3928 struct bfd_link_info *info,
3929 void *param)
3931 struct call_info *call;
3932 struct function_info *max;
3933 size_t stack, cum_stack;
3934 const char *f1;
3935 bfd_boolean has_call;
3936 struct _sum_stack_param *sum_stack_param = param;
3937 struct spu_link_hash_table *htab;
3939 cum_stack = fun->stack;
3940 sum_stack_param->cum_stack = cum_stack;
3941 if (fun->visit3)
3942 return TRUE;
3944 has_call = FALSE;
3945 max = NULL;
3946 for (call = fun->call_list; call; call = call->next)
3948 if (call->broken_cycle)
3949 continue;
3950 if (!call->is_pasted)
3951 has_call = TRUE;
3952 if (!sum_stack (call->fun, info, sum_stack_param))
3953 return FALSE;
3954 stack = sum_stack_param->cum_stack;
3955 /* Include caller stack for normal calls, don't do so for
3956 tail calls. fun->stack here is local stack usage for
3957 this function. */
3958 if (!call->is_tail || call->is_pasted || call->fun->start != NULL)
3959 stack += fun->stack;
3960 if (cum_stack < stack)
3962 cum_stack = stack;
3963 max = call->fun;
3967 sum_stack_param->cum_stack = cum_stack;
3968 stack = fun->stack;
3969 /* Now fun->stack holds cumulative stack. */
3970 fun->stack = cum_stack;
3971 fun->visit3 = TRUE;
3973 if (!fun->non_root
3974 && sum_stack_param->overall_stack < cum_stack)
3975 sum_stack_param->overall_stack = cum_stack;
3977 htab = spu_hash_table (info);
3978 if (htab->params->auto_overlay)
3979 return TRUE;
3981 f1 = func_name (fun);
3982 if (htab->params->stack_analysis)
3984 if (!fun->non_root)
3985 info->callbacks->info (_(" %s: 0x%v\n"), f1, (bfd_vma) cum_stack);
3986 info->callbacks->minfo (_("%s: 0x%v 0x%v\n"),
3987 f1, (bfd_vma) stack, (bfd_vma) cum_stack);
3989 if (has_call)
3991 info->callbacks->minfo (_(" calls:\n"));
3992 for (call = fun->call_list; call; call = call->next)
3993 if (!call->is_pasted && !call->broken_cycle)
3995 const char *f2 = func_name (call->fun);
3996 const char *ann1 = call->fun == max ? "*" : " ";
3997 const char *ann2 = call->is_tail ? "t" : " ";
3999 info->callbacks->minfo (_(" %s%s %s\n"), ann1, ann2, f2);
4004 if (sum_stack_param->emit_stack_syms)
4006 char *name = bfd_malloc (18 + strlen (f1));
4007 struct elf_link_hash_entry *h;
4009 if (name == NULL)
4010 return FALSE;
4012 if (fun->global || ELF_ST_BIND (fun->u.sym->st_info) == STB_GLOBAL)
4013 sprintf (name, "__stack_%s", f1);
4014 else
4015 sprintf (name, "__stack_%x_%s", fun->sec->id & 0xffffffff, f1);
4017 h = elf_link_hash_lookup (&htab->elf, name, TRUE, TRUE, FALSE);
4018 free (name);
4019 if (h != NULL
4020 && (h->root.type == bfd_link_hash_new
4021 || h->root.type == bfd_link_hash_undefined
4022 || h->root.type == bfd_link_hash_undefweak))
4024 h->root.type = bfd_link_hash_defined;
4025 h->root.u.def.section = bfd_abs_section_ptr;
4026 h->root.u.def.value = cum_stack;
4027 h->size = 0;
4028 h->type = 0;
4029 h->ref_regular = 1;
4030 h->def_regular = 1;
4031 h->ref_regular_nonweak = 1;
4032 h->forced_local = 1;
4033 h->non_elf = 0;
4037 return TRUE;
4040 /* SEC is part of a pasted function. Return the call_info for the
4041 next section of this function. */
4043 static struct call_info *
4044 find_pasted_call (asection *sec)
4046 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
4047 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
4048 struct call_info *call;
4049 int k;
4051 for (k = 0; k < sinfo->num_fun; ++k)
4052 for (call = sinfo->fun[k].call_list; call != NULL; call = call->next)
4053 if (call->is_pasted)
4054 return call;
4055 abort ();
4056 return 0;
4059 /* qsort predicate to sort bfds by file name. */
4061 static int
4062 sort_bfds (const void *a, const void *b)
4064 bfd *const *abfd1 = a;
4065 bfd *const *abfd2 = b;
4067 return strcmp ((*abfd1)->filename, (*abfd2)->filename);
4070 static unsigned int
4071 print_one_overlay_section (FILE *script,
4072 unsigned int base,
4073 unsigned int count,
4074 unsigned int ovlynum,
4075 unsigned int *ovly_map,
4076 asection **ovly_sections,
4077 struct bfd_link_info *info)
4079 unsigned int j;
4081 for (j = base; j < count && ovly_map[j] == ovlynum; j++)
4083 asection *sec = ovly_sections[2 * j];
4085 if (fprintf (script, " %s%c%s (%s)\n",
4086 (sec->owner->my_archive != NULL
4087 ? sec->owner->my_archive->filename : ""),
4088 info->path_separator,
4089 sec->owner->filename,
4090 sec->name) <= 0)
4091 return -1;
4092 if (sec->segment_mark)
4094 struct call_info *call = find_pasted_call (sec);
4095 while (call != NULL)
4097 struct function_info *call_fun = call->fun;
4098 sec = call_fun->sec;
4099 if (fprintf (script, " %s%c%s (%s)\n",
4100 (sec->owner->my_archive != NULL
4101 ? sec->owner->my_archive->filename : ""),
4102 info->path_separator,
4103 sec->owner->filename,
4104 sec->name) <= 0)
4105 return -1;
4106 for (call = call_fun->call_list; call; call = call->next)
4107 if (call->is_pasted)
4108 break;
4113 for (j = base; j < count && ovly_map[j] == ovlynum; j++)
4115 asection *sec = ovly_sections[2 * j + 1];
4116 if (sec != NULL
4117 && fprintf (script, " %s%c%s (%s)\n",
4118 (sec->owner->my_archive != NULL
4119 ? sec->owner->my_archive->filename : ""),
4120 info->path_separator,
4121 sec->owner->filename,
4122 sec->name) <= 0)
4123 return -1;
4125 sec = ovly_sections[2 * j];
4126 if (sec->segment_mark)
4128 struct call_info *call = find_pasted_call (sec);
4129 while (call != NULL)
4131 struct function_info *call_fun = call->fun;
4132 sec = call_fun->rodata;
4133 if (sec != NULL
4134 && fprintf (script, " %s%c%s (%s)\n",
4135 (sec->owner->my_archive != NULL
4136 ? sec->owner->my_archive->filename : ""),
4137 info->path_separator,
4138 sec->owner->filename,
4139 sec->name) <= 0)
4140 return -1;
4141 for (call = call_fun->call_list; call; call = call->next)
4142 if (call->is_pasted)
4143 break;
4148 return j;
4151 /* Handle --auto-overlay. */
4153 static void
4154 spu_elf_auto_overlay (struct bfd_link_info *info)
4156 bfd *ibfd;
4157 bfd **bfd_arr;
4158 struct elf_segment_map *m;
4159 unsigned int fixed_size, lo, hi;
4160 unsigned int reserved;
4161 struct spu_link_hash_table *htab;
4162 unsigned int base, i, count, bfd_count;
4163 unsigned int region, ovlynum;
4164 asection **ovly_sections, **ovly_p;
4165 unsigned int *ovly_map;
4166 FILE *script;
4167 unsigned int total_overlay_size, overlay_size;
4168 const char *ovly_mgr_entry;
4169 struct elf_link_hash_entry *h;
4170 struct _mos_param mos_param;
4171 struct _uos_param uos_param;
4172 struct function_info dummy_caller;
4174 /* Find the extents of our loadable image. */
4175 lo = (unsigned int) -1;
4176 hi = 0;
4177 for (m = elf_tdata (info->output_bfd)->segment_map; m != NULL; m = m->next)
4178 if (m->p_type == PT_LOAD)
4179 for (i = 0; i < m->count; i++)
4180 if (m->sections[i]->size != 0)
4182 if (m->sections[i]->vma < lo)
4183 lo = m->sections[i]->vma;
4184 if (m->sections[i]->vma + m->sections[i]->size - 1 > hi)
4185 hi = m->sections[i]->vma + m->sections[i]->size - 1;
4187 fixed_size = hi + 1 - lo;
4189 if (!discover_functions (info))
4190 goto err_exit;
4192 if (!build_call_tree (info))
4193 goto err_exit;
4195 htab = spu_hash_table (info);
4196 reserved = htab->params->auto_overlay_reserved;
4197 if (reserved == 0)
4199 struct _sum_stack_param sum_stack_param;
4201 sum_stack_param.emit_stack_syms = 0;
4202 sum_stack_param.overall_stack = 0;
4203 if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
4204 goto err_exit;
4205 reserved = (sum_stack_param.overall_stack
4206 + htab->params->extra_stack_space);
4209 /* No need for overlays if everything already fits. */
4210 if (fixed_size + reserved <= htab->local_store
4211 && htab->params->ovly_flavour != ovly_soft_icache)
4213 htab->params->auto_overlay = 0;
4214 return;
4217 uos_param.exclude_input_section = 0;
4218 uos_param.exclude_output_section
4219 = bfd_get_section_by_name (info->output_bfd, ".interrupt");
4221 ovly_mgr_entry = "__ovly_load";
4222 if (htab->params->ovly_flavour == ovly_soft_icache)
4223 ovly_mgr_entry = "__icache_br_handler";
4224 h = elf_link_hash_lookup (&htab->elf, ovly_mgr_entry,
4225 FALSE, FALSE, FALSE);
4226 if (h != NULL
4227 && (h->root.type == bfd_link_hash_defined
4228 || h->root.type == bfd_link_hash_defweak)
4229 && h->def_regular)
4231 /* We have a user supplied overlay manager. */
4232 uos_param.exclude_input_section = h->root.u.def.section;
4234 else
4236 /* If no user overlay manager, spu_elf_load_ovl_mgr will add our
4237 builtin version to .text, and will adjust .text size. */
4238 fixed_size += (*htab->params->spu_elf_load_ovl_mgr) ();
4241 /* Mark overlay sections, and find max overlay section size. */
4242 mos_param.max_overlay_size = 0;
4243 if (!for_each_node (mark_overlay_section, info, &mos_param, TRUE))
4244 goto err_exit;
4246 /* We can't put the overlay manager or interrupt routines in
4247 overlays. */
4248 uos_param.clearing = 0;
4249 if ((uos_param.exclude_input_section
4250 || uos_param.exclude_output_section)
4251 && !for_each_node (unmark_overlay_section, info, &uos_param, TRUE))
4252 goto err_exit;
4254 bfd_count = 0;
4255 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4256 ++bfd_count;
4257 bfd_arr = bfd_malloc (bfd_count * sizeof (*bfd_arr));
4258 if (bfd_arr == NULL)
4259 goto err_exit;
4261 /* Count overlay sections, and subtract their sizes from "fixed_size". */
4262 count = 0;
4263 bfd_count = 0;
4264 total_overlay_size = 0;
4265 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4267 extern const bfd_target bfd_elf32_spu_vec;
4268 asection *sec;
4269 unsigned int old_count;
4271 if (ibfd->xvec != &bfd_elf32_spu_vec)
4272 continue;
4274 old_count = count;
4275 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4276 if (sec->linker_mark)
4278 if ((sec->flags & SEC_CODE) != 0)
4279 count += 1;
4280 fixed_size -= sec->size;
4281 total_overlay_size += sec->size;
4283 else if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == (SEC_ALLOC | SEC_LOAD)
4284 && sec->output_section->owner == info->output_bfd
4285 && strncmp (sec->output_section->name, ".ovl.init", 9) == 0)
4286 fixed_size -= sec->size;
4287 if (count != old_count)
4288 bfd_arr[bfd_count++] = ibfd;
4291 /* Since the overlay link script selects sections by file name and
4292 section name, ensure that file names are unique. */
4293 if (bfd_count > 1)
4295 bfd_boolean ok = TRUE;
4297 qsort (bfd_arr, bfd_count, sizeof (*bfd_arr), sort_bfds);
4298 for (i = 1; i < bfd_count; ++i)
4299 if (strcmp (bfd_arr[i - 1]->filename, bfd_arr[i]->filename) == 0)
4301 if (bfd_arr[i - 1]->my_archive == bfd_arr[i]->my_archive)
4303 if (bfd_arr[i - 1]->my_archive && bfd_arr[i]->my_archive)
4304 info->callbacks->einfo (_("%s duplicated in %s\n"),
4305 bfd_arr[i]->filename,
4306 bfd_arr[i]->my_archive->filename);
4307 else
4308 info->callbacks->einfo (_("%s duplicated\n"),
4309 bfd_arr[i]->filename);
4310 ok = FALSE;
4313 if (!ok)
4315 info->callbacks->einfo (_("sorry, no support for duplicate "
4316 "object files in auto-overlay script\n"));
4317 bfd_set_error (bfd_error_bad_value);
4318 goto err_exit;
4321 free (bfd_arr);
4323 fixed_size += reserved;
4324 fixed_size += htab->non_ovly_stub * ovl_stub_size (htab->params);
4325 if (fixed_size + mos_param.max_overlay_size <= htab->local_store)
4327 if (htab->params->ovly_flavour == ovly_soft_icache)
4329 /* Stubs in the non-icache area are bigger. */
4330 fixed_size += htab->non_ovly_stub * 16;
4331 /* Space for icache manager tables.
4332 a) Tag array, one quadword per cache line.
4333 - word 0: ia address of present line, init to zero. */
4334 fixed_size += 16 << htab->num_lines_log2;
4335 /* b) Rewrite "to" list, one quadword per cache line. */
4336 fixed_size += 16 << htab->num_lines_log2;
4337 /* c) Rewrite "from" list, one byte per outgoing branch (rounded up
4338 to a power-of-two number of full quadwords) per cache line. */
4339 fixed_size += 16 << (htab->fromelem_size_log2
4340 + htab->num_lines_log2);
4341 /* d) Pointer to __ea backing store (toe), 1 quadword. */
4342 fixed_size += 16;
4344 else
4346 /* Guess number of overlays. Assuming overlay buffer is on
4347 average only half full should be conservative. */
4348 ovlynum = (total_overlay_size * 2 * htab->params->num_lines
4349 / (htab->local_store - fixed_size));
4350 /* Space for _ovly_table[], _ovly_buf_table[] and toe. */
4351 fixed_size += ovlynum * 16 + 16 + 4 + 16;
4355 if (fixed_size + mos_param.max_overlay_size > htab->local_store)
4356 info->callbacks->einfo (_("non-overlay size of 0x%v plus maximum overlay "
4357 "size of 0x%v exceeds local store\n"),
4358 (bfd_vma) fixed_size,
4359 (bfd_vma) mos_param.max_overlay_size);
4361 /* Now see if we should put some functions in the non-overlay area. */
4362 else if (fixed_size < htab->params->auto_overlay_fixed)
4364 unsigned int max_fixed, lib_size;
4366 max_fixed = htab->local_store - mos_param.max_overlay_size;
4367 if (max_fixed > htab->params->auto_overlay_fixed)
4368 max_fixed = htab->params->auto_overlay_fixed;
4369 lib_size = max_fixed - fixed_size;
4370 lib_size = auto_ovl_lib_functions (info, lib_size);
4371 if (lib_size == (unsigned int) -1)
4372 goto err_exit;
4373 fixed_size = max_fixed - lib_size;
4376 /* Build an array of sections, suitably sorted to place into
4377 overlays. */
4378 ovly_sections = bfd_malloc (2 * count * sizeof (*ovly_sections));
4379 if (ovly_sections == NULL)
4380 goto err_exit;
4381 ovly_p = ovly_sections;
4382 if (!for_each_node (collect_overlays, info, &ovly_p, TRUE))
4383 goto err_exit;
4384 count = (size_t) (ovly_p - ovly_sections) / 2;
4385 ovly_map = bfd_malloc (count * sizeof (*ovly_map));
4386 if (ovly_map == NULL)
4387 goto err_exit;
4389 memset (&dummy_caller, 0, sizeof (dummy_caller));
4390 overlay_size = (htab->local_store - fixed_size) / htab->params->num_lines;
4391 if (htab->params->line_size != 0)
4392 overlay_size = htab->params->line_size;
4393 base = 0;
4394 ovlynum = 0;
4395 while (base < count)
4397 unsigned int size = 0, rosize = 0, roalign = 0;
4399 for (i = base; i < count; i++)
4401 asection *sec, *rosec;
4402 unsigned int tmp, rotmp;
4403 unsigned int num_stubs;
4404 struct call_info *call, *pasty;
4405 struct _spu_elf_section_data *sec_data;
4406 struct spu_elf_stack_info *sinfo;
4407 unsigned int k;
4409 /* See whether we can add this section to the current
4410 overlay without overflowing our overlay buffer. */
4411 sec = ovly_sections[2 * i];
4412 tmp = align_power (size, sec->alignment_power) + sec->size;
4413 rotmp = rosize;
4414 rosec = ovly_sections[2 * i + 1];
4415 if (rosec != NULL)
4417 rotmp = align_power (rotmp, rosec->alignment_power) + rosec->size;
4418 if (roalign < rosec->alignment_power)
4419 roalign = rosec->alignment_power;
4421 if (align_power (tmp, roalign) + rotmp > overlay_size)
4422 break;
4423 if (sec->segment_mark)
4425 /* Pasted sections must stay together, so add their
4426 sizes too. */
4427 pasty = find_pasted_call (sec);
4428 while (pasty != NULL)
4430 struct function_info *call_fun = pasty->fun;
4431 tmp = (align_power (tmp, call_fun->sec->alignment_power)
4432 + call_fun->sec->size);
4433 if (call_fun->rodata)
4435 rotmp = (align_power (rotmp,
4436 call_fun->rodata->alignment_power)
4437 + call_fun->rodata->size);
4438 if (roalign < rosec->alignment_power)
4439 roalign = rosec->alignment_power;
4441 for (pasty = call_fun->call_list; pasty; pasty = pasty->next)
4442 if (pasty->is_pasted)
4443 break;
4446 if (align_power (tmp, roalign) + rotmp > overlay_size)
4447 break;
4449 /* If we add this section, we might need new overlay call
4450 stubs. Add any overlay section calls to dummy_call. */
4451 pasty = NULL;
4452 sec_data = spu_elf_section_data (sec);
4453 sinfo = sec_data->u.i.stack_info;
4454 for (k = 0; k < (unsigned) sinfo->num_fun; ++k)
4455 for (call = sinfo->fun[k].call_list; call; call = call->next)
4456 if (call->is_pasted)
4458 BFD_ASSERT (pasty == NULL);
4459 pasty = call;
4461 else if (call->fun->sec->linker_mark)
4463 if (!copy_callee (&dummy_caller, call))
4464 goto err_exit;
4466 while (pasty != NULL)
4468 struct function_info *call_fun = pasty->fun;
4469 pasty = NULL;
4470 for (call = call_fun->call_list; call; call = call->next)
4471 if (call->is_pasted)
4473 BFD_ASSERT (pasty == NULL);
4474 pasty = call;
4476 else if (!copy_callee (&dummy_caller, call))
4477 goto err_exit;
4480 /* Calculate call stub size. */
4481 num_stubs = 0;
4482 for (call = dummy_caller.call_list; call; call = call->next)
4484 unsigned int stub_delta = 1;
4486 if (htab->params->ovly_flavour == ovly_soft_icache)
4487 stub_delta = call->count;
4488 num_stubs += stub_delta;
4490 /* If the call is within this overlay, we won't need a
4491 stub. */
4492 for (k = base; k < i + 1; k++)
4493 if (call->fun->sec == ovly_sections[2 * k])
4495 num_stubs -= stub_delta;
4496 break;
4499 if (htab->params->ovly_flavour == ovly_soft_icache
4500 && num_stubs > htab->params->max_branch)
4501 break;
4502 if (align_power (tmp, roalign) + rotmp
4503 + num_stubs * ovl_stub_size (htab->params) > overlay_size)
4504 break;
4505 size = tmp;
4506 rosize = rotmp;
4509 if (i == base)
4511 info->callbacks->einfo (_("%B:%A%s exceeds overlay size\n"),
4512 ovly_sections[2 * i]->owner,
4513 ovly_sections[2 * i],
4514 ovly_sections[2 * i + 1] ? " + rodata" : "");
4515 bfd_set_error (bfd_error_bad_value);
4516 goto err_exit;
4519 while (dummy_caller.call_list != NULL)
4521 struct call_info *call = dummy_caller.call_list;
4522 dummy_caller.call_list = call->next;
4523 free (call);
4526 ++ovlynum;
4527 while (base < i)
4528 ovly_map[base++] = ovlynum;
4531 script = htab->params->spu_elf_open_overlay_script ();
4533 if (htab->params->ovly_flavour == ovly_soft_icache)
4535 if (fprintf (script, "SECTIONS\n{\n") <= 0)
4536 goto file_err;
4538 if (fprintf (script,
4539 " . = ALIGN (%u);\n"
4540 " .ovl.init : { *(.ovl.init) }\n"
4541 " . = ABSOLUTE (ADDR (.ovl.init));\n",
4542 htab->params->line_size) <= 0)
4543 goto file_err;
4545 base = 0;
4546 ovlynum = 1;
4547 while (base < count)
4549 unsigned int indx = ovlynum - 1;
4550 unsigned int vma, lma;
4552 vma = (indx & (htab->params->num_lines - 1)) << htab->line_size_log2;
4553 lma = vma + (((indx >> htab->num_lines_log2) + 1) << 18);
4555 if (fprintf (script, " .ovly%u ABSOLUTE (ADDR (.ovl.init)) + %u "
4556 ": AT (LOADADDR (.ovl.init) + %u) {\n",
4557 ovlynum, vma, lma) <= 0)
4558 goto file_err;
4560 base = print_one_overlay_section (script, base, count, ovlynum,
4561 ovly_map, ovly_sections, info);
4562 if (base == (unsigned) -1)
4563 goto file_err;
4565 if (fprintf (script, " }\n") <= 0)
4566 goto file_err;
4568 ovlynum++;
4571 if (fprintf (script, " . = ABSOLUTE (ADDR (.ovl.init)) + %u;\n",
4572 1 << (htab->num_lines_log2 + htab->line_size_log2)) <= 0)
4573 goto file_err;
4575 if (fprintf (script, "}\nINSERT AFTER .toe;\n") <= 0)
4576 goto file_err;
4578 else
4580 if (fprintf (script, "SECTIONS\n{\n") <= 0)
4581 goto file_err;
4583 if (fprintf (script,
4584 " . = ALIGN (16);\n"
4585 " .ovl.init : { *(.ovl.init) }\n"
4586 " . = ABSOLUTE (ADDR (.ovl.init));\n") <= 0)
4587 goto file_err;
4589 for (region = 1; region <= htab->params->num_lines; region++)
4591 ovlynum = region;
4592 base = 0;
4593 while (base < count && ovly_map[base] < ovlynum)
4594 base++;
4596 if (base == count)
4597 break;
4599 if (region == 1)
4601 /* We need to set lma since we are overlaying .ovl.init. */
4602 if (fprintf (script,
4603 " OVERLAY : AT (ALIGN (LOADADDR (.ovl.init) + SIZEOF (.ovl.init), 16))\n {\n") <= 0)
4604 goto file_err;
4606 else
4608 if (fprintf (script, " OVERLAY :\n {\n") <= 0)
4609 goto file_err;
4612 while (base < count)
4614 if (fprintf (script, " .ovly%u {\n", ovlynum) <= 0)
4615 goto file_err;
4617 base = print_one_overlay_section (script, base, count, ovlynum,
4618 ovly_map, ovly_sections, info);
4619 if (base == (unsigned) -1)
4620 goto file_err;
4622 if (fprintf (script, " }\n") <= 0)
4623 goto file_err;
4625 ovlynum += htab->params->num_lines;
4626 while (base < count && ovly_map[base] < ovlynum)
4627 base++;
4630 if (fprintf (script, " }\n") <= 0)
4631 goto file_err;
4634 if (fprintf (script, "}\nINSERT BEFORE .text;\n") <= 0)
4635 goto file_err;
4638 free (ovly_map);
4639 free (ovly_sections);
4641 if (fclose (script) != 0)
4642 goto file_err;
4644 if (htab->params->auto_overlay & AUTO_RELINK)
4645 (*htab->params->spu_elf_relink) ();
4647 xexit (0);
4649 file_err:
4650 bfd_set_error (bfd_error_system_call);
4651 err_exit:
4652 info->callbacks->einfo ("%F%P: auto overlay error: %E\n");
4653 xexit (1);
4656 /* Provide an estimate of total stack required. */
4658 static bfd_boolean
4659 spu_elf_stack_analysis (struct bfd_link_info *info)
4661 struct spu_link_hash_table *htab;
4662 struct _sum_stack_param sum_stack_param;
4664 if (!discover_functions (info))
4665 return FALSE;
4667 if (!build_call_tree (info))
4668 return FALSE;
4670 htab = spu_hash_table (info);
4671 if (htab->params->stack_analysis)
4673 info->callbacks->info (_("Stack size for call graph root nodes.\n"));
4674 info->callbacks->minfo (_("\nStack size for functions. "
4675 "Annotations: '*' max stack, 't' tail call\n"));
4678 sum_stack_param.emit_stack_syms = htab->params->emit_stack_syms;
4679 sum_stack_param.overall_stack = 0;
4680 if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
4681 return FALSE;
4683 if (htab->params->stack_analysis)
4684 info->callbacks->info (_("Maximum stack required is 0x%v\n"),
4685 (bfd_vma) sum_stack_param.overall_stack);
4686 return TRUE;
4689 /* Perform a final link. */
4691 static bfd_boolean
4692 spu_elf_final_link (bfd *output_bfd, struct bfd_link_info *info)
4694 struct spu_link_hash_table *htab = spu_hash_table (info);
4696 if (htab->params->auto_overlay)
4697 spu_elf_auto_overlay (info);
4699 if ((htab->params->stack_analysis
4700 || (htab->params->ovly_flavour == ovly_soft_icache
4701 && htab->params->lrlive_analysis))
4702 && !spu_elf_stack_analysis (info))
4703 info->callbacks->einfo ("%X%P: stack/lrlive analysis error: %E\n");
4705 if (!spu_elf_build_stubs (info))
4706 info->callbacks->einfo ("%F%P: can not build overlay stubs: %E\n");
4708 return bfd_elf_final_link (output_bfd, info);
4711 /* Called when not normally emitting relocs, ie. !info->relocatable
4712 and !info->emitrelocations. Returns a count of special relocs
4713 that need to be emitted. */
4715 static unsigned int
4716 spu_elf_count_relocs (struct bfd_link_info *info, asection *sec)
4718 Elf_Internal_Rela *relocs;
4719 unsigned int count = 0;
4721 relocs = _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL,
4722 info->keep_memory);
4723 if (relocs != NULL)
4725 Elf_Internal_Rela *rel;
4726 Elf_Internal_Rela *relend = relocs + sec->reloc_count;
4728 for (rel = relocs; rel < relend; rel++)
4730 int r_type = ELF32_R_TYPE (rel->r_info);
4731 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
4732 ++count;
4735 if (elf_section_data (sec)->relocs != relocs)
4736 free (relocs);
4739 return count;
4742 /* Functions for adding fixup records to .fixup */
4744 #define FIXUP_RECORD_SIZE 4
4746 #define FIXUP_PUT(output_bfd,htab,index,addr) \
4747 bfd_put_32 (output_bfd, addr, \
4748 htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4749 #define FIXUP_GET(output_bfd,htab,index) \
4750 bfd_get_32 (output_bfd, \
4751 htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4753 /* Store OFFSET in .fixup. This assumes it will be called with an
4754 increasing OFFSET. When this OFFSET fits with the last base offset,
4755 it just sets a bit, otherwise it adds a new fixup record. */
4756 static void
4757 spu_elf_emit_fixup (bfd * output_bfd, struct bfd_link_info *info,
4758 bfd_vma offset)
4760 struct spu_link_hash_table *htab = spu_hash_table (info);
4761 asection *sfixup = htab->sfixup;
4762 bfd_vma qaddr = offset & ~(bfd_vma) 15;
4763 bfd_vma bit = ((bfd_vma) 8) >> ((offset & 15) >> 2);
4764 if (sfixup->reloc_count == 0)
4766 FIXUP_PUT (output_bfd, htab, 0, qaddr | bit);
4767 sfixup->reloc_count++;
4769 else
4771 bfd_vma base = FIXUP_GET (output_bfd, htab, sfixup->reloc_count - 1);
4772 if (qaddr != (base & ~(bfd_vma) 15))
4774 if ((sfixup->reloc_count + 1) * FIXUP_RECORD_SIZE > sfixup->size)
4775 (*_bfd_error_handler) (_("fatal error while creating .fixup"));
4776 FIXUP_PUT (output_bfd, htab, sfixup->reloc_count, qaddr | bit);
4777 sfixup->reloc_count++;
4779 else
4780 FIXUP_PUT (output_bfd, htab, sfixup->reloc_count - 1, base | bit);
4784 /* Apply RELOCS to CONTENTS of INPUT_SECTION from INPUT_BFD. */
4786 static int
4787 spu_elf_relocate_section (bfd *output_bfd,
4788 struct bfd_link_info *info,
4789 bfd *input_bfd,
4790 asection *input_section,
4791 bfd_byte *contents,
4792 Elf_Internal_Rela *relocs,
4793 Elf_Internal_Sym *local_syms,
4794 asection **local_sections)
4796 Elf_Internal_Shdr *symtab_hdr;
4797 struct elf_link_hash_entry **sym_hashes;
4798 Elf_Internal_Rela *rel, *relend;
4799 struct spu_link_hash_table *htab;
4800 asection *ea;
4801 int ret = TRUE;
4802 bfd_boolean emit_these_relocs = FALSE;
4803 bfd_boolean is_ea_sym;
4804 bfd_boolean stubs;
4805 unsigned int iovl = 0;
4807 htab = spu_hash_table (info);
4808 stubs = (htab->stub_sec != NULL
4809 && maybe_needs_stubs (input_section));
4810 iovl = overlay_index (input_section);
4811 ea = bfd_get_section_by_name (output_bfd, "._ea");
4812 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4813 sym_hashes = (struct elf_link_hash_entry **) (elf_sym_hashes (input_bfd));
4815 rel = relocs;
4816 relend = relocs + input_section->reloc_count;
4817 for (; rel < relend; rel++)
4819 int r_type;
4820 reloc_howto_type *howto;
4821 unsigned int r_symndx;
4822 Elf_Internal_Sym *sym;
4823 asection *sec;
4824 struct elf_link_hash_entry *h;
4825 const char *sym_name;
4826 bfd_vma relocation;
4827 bfd_vma addend;
4828 bfd_reloc_status_type r;
4829 bfd_boolean unresolved_reloc;
4830 enum _stub_type stub_type;
4832 r_symndx = ELF32_R_SYM (rel->r_info);
4833 r_type = ELF32_R_TYPE (rel->r_info);
4834 howto = elf_howto_table + r_type;
4835 unresolved_reloc = FALSE;
4836 h = NULL;
4837 sym = NULL;
4838 sec = NULL;
4839 if (r_symndx < symtab_hdr->sh_info)
4841 sym = local_syms + r_symndx;
4842 sec = local_sections[r_symndx];
4843 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
4844 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4846 else
4848 if (sym_hashes == NULL)
4849 return FALSE;
4851 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4853 while (h->root.type == bfd_link_hash_indirect
4854 || h->root.type == bfd_link_hash_warning)
4855 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4857 relocation = 0;
4858 if (h->root.type == bfd_link_hash_defined
4859 || h->root.type == bfd_link_hash_defweak)
4861 sec = h->root.u.def.section;
4862 if (sec == NULL
4863 || sec->output_section == NULL)
4864 /* Set a flag that will be cleared later if we find a
4865 relocation value for this symbol. output_section
4866 is typically NULL for symbols satisfied by a shared
4867 library. */
4868 unresolved_reloc = TRUE;
4869 else
4870 relocation = (h->root.u.def.value
4871 + sec->output_section->vma
4872 + sec->output_offset);
4874 else if (h->root.type == bfd_link_hash_undefweak)
4876 else if (info->unresolved_syms_in_objects == RM_IGNORE
4877 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
4879 else if (!info->relocatable
4880 && !(r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64))
4882 bfd_boolean err;
4883 err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
4884 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);
4885 if (!info->callbacks->undefined_symbol (info,
4886 h->root.root.string,
4887 input_bfd,
4888 input_section,
4889 rel->r_offset, err))
4890 return FALSE;
4892 sym_name = h->root.root.string;
4895 if (sec != NULL && elf_discarded_section (sec))
4897 /* For relocs against symbols from removed linkonce sections,
4898 or sections discarded by a linker script, we just want the
4899 section contents zeroed. Avoid any special processing. */
4900 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
4901 rel->r_info = 0;
4902 rel->r_addend = 0;
4903 continue;
4906 if (info->relocatable)
4907 continue;
4909 /* Change "a rt,ra,rb" to "ai rt,ra,0". */
4910 if (r_type == R_SPU_ADD_PIC
4911 && h != NULL
4912 && !(h->def_regular || ELF_COMMON_DEF_P (h)))
4914 bfd_byte *loc = contents + rel->r_offset;
4915 loc[0] = 0x1c;
4916 loc[1] = 0x00;
4917 loc[2] &= 0x3f;
4920 is_ea_sym = (ea != NULL
4921 && sec != NULL
4922 && sec->output_section == ea);
4924 /* If this symbol is in an overlay area, we may need to relocate
4925 to the overlay stub. */
4926 addend = rel->r_addend;
4927 if (stubs
4928 && !is_ea_sym
4929 && (stub_type = needs_ovl_stub (h, sym, sec, input_section, rel,
4930 contents, info)) != no_stub)
4932 unsigned int ovl = 0;
4933 struct got_entry *g, **head;
4935 if (stub_type != nonovl_stub)
4936 ovl = iovl;
4938 if (h != NULL)
4939 head = &h->got.glist;
4940 else
4941 head = elf_local_got_ents (input_bfd) + r_symndx;
4943 for (g = *head; g != NULL; g = g->next)
4944 if (htab->params->ovly_flavour == ovly_soft_icache
4945 ? (g->ovl == ovl
4946 && g->br_addr == (rel->r_offset
4947 + input_section->output_offset
4948 + input_section->output_section->vma))
4949 : g->addend == addend && (g->ovl == ovl || g->ovl == 0))
4950 break;
4951 if (g == NULL)
4952 abort ();
4954 relocation = g->stub_addr;
4955 addend = 0;
4957 else
4959 /* For soft icache, encode the overlay index into addresses. */
4960 if (htab->params->ovly_flavour == ovly_soft_icache
4961 && (r_type == R_SPU_ADDR16_HI
4962 || r_type == R_SPU_ADDR32 || r_type == R_SPU_REL32)
4963 && !is_ea_sym)
4965 unsigned int ovl = overlay_index (sec);
4966 if (ovl != 0)
4968 unsigned int set_id = ((ovl - 1) >> htab->num_lines_log2) + 1;
4969 relocation += set_id << 18;
4974 if (htab->params->emit_fixups && !info->relocatable
4975 && (input_section->flags & SEC_ALLOC) != 0
4976 && r_type == R_SPU_ADDR32)
4978 bfd_vma offset;
4979 offset = rel->r_offset + input_section->output_section->vma
4980 + input_section->output_offset;
4981 spu_elf_emit_fixup (output_bfd, info, offset);
4984 if (unresolved_reloc)
4986 else if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
4988 if (is_ea_sym)
4990 /* ._ea is a special section that isn't allocated in SPU
4991 memory, but rather occupies space in PPU memory as
4992 part of an embedded ELF image. If this reloc is
4993 against a symbol defined in ._ea, then transform the
4994 reloc into an equivalent one without a symbol
4995 relative to the start of the ELF image. */
4996 rel->r_addend += (relocation
4997 - ea->vma
4998 + elf_section_data (ea)->this_hdr.sh_offset);
4999 rel->r_info = ELF32_R_INFO (0, r_type);
5001 emit_these_relocs = TRUE;
5002 continue;
5004 else if (is_ea_sym)
5005 unresolved_reloc = TRUE;
5007 if (unresolved_reloc)
5009 (*_bfd_error_handler)
5010 (_("%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
5011 input_bfd,
5012 bfd_get_section_name (input_bfd, input_section),
5013 (long) rel->r_offset,
5014 howto->name,
5015 sym_name);
5016 ret = FALSE;
5019 r = _bfd_final_link_relocate (howto,
5020 input_bfd,
5021 input_section,
5022 contents,
5023 rel->r_offset, relocation, addend);
5025 if (r != bfd_reloc_ok)
5027 const char *msg = (const char *) 0;
5029 switch (r)
5031 case bfd_reloc_overflow:
5032 if (!((*info->callbacks->reloc_overflow)
5033 (info, (h ? &h->root : NULL), sym_name, howto->name,
5034 (bfd_vma) 0, input_bfd, input_section, rel->r_offset)))
5035 return FALSE;
5036 break;
5038 case bfd_reloc_undefined:
5039 if (!((*info->callbacks->undefined_symbol)
5040 (info, sym_name, input_bfd, input_section,
5041 rel->r_offset, TRUE)))
5042 return FALSE;
5043 break;
5045 case bfd_reloc_outofrange:
5046 msg = _("internal error: out of range error");
5047 goto common_error;
5049 case bfd_reloc_notsupported:
5050 msg = _("internal error: unsupported relocation error");
5051 goto common_error;
5053 case bfd_reloc_dangerous:
5054 msg = _("internal error: dangerous error");
5055 goto common_error;
5057 default:
5058 msg = _("internal error: unknown error");
5059 /* fall through */
5061 common_error:
5062 ret = FALSE;
5063 if (!((*info->callbacks->warning)
5064 (info, msg, sym_name, input_bfd, input_section,
5065 rel->r_offset)))
5066 return FALSE;
5067 break;
5072 if (ret
5073 && emit_these_relocs
5074 && !info->emitrelocations)
5076 Elf_Internal_Rela *wrel;
5077 Elf_Internal_Shdr *rel_hdr;
5079 wrel = rel = relocs;
5080 relend = relocs + input_section->reloc_count;
5081 for (; rel < relend; rel++)
5083 int r_type;
5085 r_type = ELF32_R_TYPE (rel->r_info);
5086 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
5087 *wrel++ = *rel;
5089 input_section->reloc_count = wrel - relocs;
5090 /* Backflips for _bfd_elf_link_output_relocs. */
5091 rel_hdr = &elf_section_data (input_section)->rel_hdr;
5092 rel_hdr->sh_size = input_section->reloc_count * rel_hdr->sh_entsize;
5093 ret = 2;
5096 return ret;
5099 /* Adjust _SPUEAR_ syms to point at their overlay stubs. */
5101 static int
5102 spu_elf_output_symbol_hook (struct bfd_link_info *info,
5103 const char *sym_name ATTRIBUTE_UNUSED,
5104 Elf_Internal_Sym *sym,
5105 asection *sym_sec ATTRIBUTE_UNUSED,
5106 struct elf_link_hash_entry *h)
5108 struct spu_link_hash_table *htab = spu_hash_table (info);
5110 if (!info->relocatable
5111 && htab->stub_sec != NULL
5112 && h != NULL
5113 && (h->root.type == bfd_link_hash_defined
5114 || h->root.type == bfd_link_hash_defweak)
5115 && h->def_regular
5116 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0)
5118 struct got_entry *g;
5120 for (g = h->got.glist; g != NULL; g = g->next)
5121 if (htab->params->ovly_flavour == ovly_soft_icache
5122 ? g->br_addr == g->stub_addr
5123 : g->addend == 0 && g->ovl == 0)
5125 sym->st_shndx = (_bfd_elf_section_from_bfd_section
5126 (htab->stub_sec[0]->output_section->owner,
5127 htab->stub_sec[0]->output_section));
5128 sym->st_value = g->stub_addr;
5129 break;
5133 return 1;
5136 static int spu_plugin = 0;
5138 void
5139 spu_elf_plugin (int val)
5141 spu_plugin = val;
5144 /* Set ELF header e_type for plugins. */
5146 static void
5147 spu_elf_post_process_headers (bfd *abfd,
5148 struct bfd_link_info *info ATTRIBUTE_UNUSED)
5150 if (spu_plugin)
5152 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5154 i_ehdrp->e_type = ET_DYN;
5158 /* We may add an extra PT_LOAD segment for .toe. We also need extra
5159 segments for overlays. */
5161 static int
5162 spu_elf_additional_program_headers (bfd *abfd, struct bfd_link_info *info)
5164 int extra = 0;
5165 asection *sec;
5167 if (info != NULL)
5169 struct spu_link_hash_table *htab = spu_hash_table (info);
5170 extra = htab->num_overlays;
5173 if (extra)
5174 ++extra;
5176 sec = bfd_get_section_by_name (abfd, ".toe");
5177 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
5178 ++extra;
5180 return extra;
5183 /* Remove .toe section from other PT_LOAD segments and put it in
5184 a segment of its own. Put overlays in separate segments too. */
5186 static bfd_boolean
5187 spu_elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
5189 asection *toe, *s;
5190 struct elf_segment_map *m, *m_overlay;
5191 struct elf_segment_map **p, **p_overlay;
5192 unsigned int i;
5194 if (info == NULL)
5195 return TRUE;
5197 toe = bfd_get_section_by_name (abfd, ".toe");
5198 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
5199 if (m->p_type == PT_LOAD && m->count > 1)
5200 for (i = 0; i < m->count; i++)
5201 if ((s = m->sections[i]) == toe
5202 || spu_elf_section_data (s)->u.o.ovl_index != 0)
5204 struct elf_segment_map *m2;
5205 bfd_vma amt;
5207 if (i + 1 < m->count)
5209 amt = sizeof (struct elf_segment_map);
5210 amt += (m->count - (i + 2)) * sizeof (m->sections[0]);
5211 m2 = bfd_zalloc (abfd, amt);
5212 if (m2 == NULL)
5213 return FALSE;
5214 m2->count = m->count - (i + 1);
5215 memcpy (m2->sections, m->sections + i + 1,
5216 m2->count * sizeof (m->sections[0]));
5217 m2->p_type = PT_LOAD;
5218 m2->next = m->next;
5219 m->next = m2;
5221 m->count = 1;
5222 if (i != 0)
5224 m->count = i;
5225 amt = sizeof (struct elf_segment_map);
5226 m2 = bfd_zalloc (abfd, amt);
5227 if (m2 == NULL)
5228 return FALSE;
5229 m2->p_type = PT_LOAD;
5230 m2->count = 1;
5231 m2->sections[0] = s;
5232 m2->next = m->next;
5233 m->next = m2;
5235 break;
5239 /* Some SPU ELF loaders ignore the PF_OVERLAY flag and just load all
5240 PT_LOAD segments. This can cause the .ovl.init section to be
5241 overwritten with the contents of some overlay segment. To work
5242 around this issue, we ensure that all PF_OVERLAY segments are
5243 sorted first amongst the program headers; this ensures that even
5244 with a broken loader, the .ovl.init section (which is not marked
5245 as PF_OVERLAY) will be placed into SPU local store on startup. */
5247 /* Move all overlay segments onto a separate list. */
5248 p = &elf_tdata (abfd)->segment_map;
5249 p_overlay = &m_overlay;
5250 while (*p != NULL)
5252 if ((*p)->p_type == PT_LOAD && (*p)->count == 1
5253 && spu_elf_section_data ((*p)->sections[0])->u.o.ovl_index != 0)
5255 m = *p;
5256 *p = m->next;
5257 *p_overlay = m;
5258 p_overlay = &m->next;
5259 continue;
5262 p = &((*p)->next);
5265 /* Re-insert overlay segments at the head of the segment map. */
5266 *p_overlay = elf_tdata (abfd)->segment_map;
5267 elf_tdata (abfd)->segment_map = m_overlay;
5269 return TRUE;
5272 /* Tweak the section type of .note.spu_name. */
5274 static bfd_boolean
5275 spu_elf_fake_sections (bfd *obfd ATTRIBUTE_UNUSED,
5276 Elf_Internal_Shdr *hdr,
5277 asection *sec)
5279 if (strcmp (sec->name, SPU_PTNOTE_SPUNAME) == 0)
5280 hdr->sh_type = SHT_NOTE;
5281 return TRUE;
5284 /* Tweak phdrs before writing them out. */
5286 static int
5287 spu_elf_modify_program_headers (bfd *abfd, struct bfd_link_info *info)
5289 const struct elf_backend_data *bed;
5290 struct elf_obj_tdata *tdata;
5291 Elf_Internal_Phdr *phdr, *last;
5292 struct spu_link_hash_table *htab;
5293 unsigned int count;
5294 unsigned int i;
5296 if (info == NULL)
5297 return TRUE;
5299 bed = get_elf_backend_data (abfd);
5300 tdata = elf_tdata (abfd);
5301 phdr = tdata->phdr;
5302 count = tdata->program_header_size / bed->s->sizeof_phdr;
5303 htab = spu_hash_table (info);
5304 if (htab->num_overlays != 0)
5306 struct elf_segment_map *m;
5307 unsigned int o;
5309 for (i = 0, m = elf_tdata (abfd)->segment_map; m; ++i, m = m->next)
5310 if (m->count != 0
5311 && (o = spu_elf_section_data (m->sections[0])->u.o.ovl_index) != 0)
5313 /* Mark this as an overlay header. */
5314 phdr[i].p_flags |= PF_OVERLAY;
5316 if (htab->ovtab != NULL && htab->ovtab->size != 0
5317 && htab->params->ovly_flavour != ovly_soft_icache)
5319 bfd_byte *p = htab->ovtab->contents;
5320 unsigned int off = o * 16 + 8;
5322 /* Write file_off into _ovly_table. */
5323 bfd_put_32 (htab->ovtab->owner, phdr[i].p_offset, p + off);
5326 /* Soft-icache has its file offset put in .ovl.init. */
5327 if (htab->init != NULL && htab->init->size != 0)
5329 bfd_vma val = elf_section_data (htab->ovl_sec[0])->this_hdr.sh_offset;
5331 bfd_put_32 (htab->init->owner, val, htab->init->contents + 4);
5335 /* Round up p_filesz and p_memsz of PT_LOAD segments to multiples
5336 of 16. This should always be possible when using the standard
5337 linker scripts, but don't create overlapping segments if
5338 someone is playing games with linker scripts. */
5339 last = NULL;
5340 for (i = count; i-- != 0; )
5341 if (phdr[i].p_type == PT_LOAD)
5343 unsigned adjust;
5345 adjust = -phdr[i].p_filesz & 15;
5346 if (adjust != 0
5347 && last != NULL
5348 && phdr[i].p_offset + phdr[i].p_filesz > last->p_offset - adjust)
5349 break;
5351 adjust = -phdr[i].p_memsz & 15;
5352 if (adjust != 0
5353 && last != NULL
5354 && phdr[i].p_filesz != 0
5355 && phdr[i].p_vaddr + phdr[i].p_memsz > last->p_vaddr - adjust
5356 && phdr[i].p_vaddr + phdr[i].p_memsz <= last->p_vaddr)
5357 break;
5359 if (phdr[i].p_filesz != 0)
5360 last = &phdr[i];
5363 if (i == (unsigned int) -1)
5364 for (i = count; i-- != 0; )
5365 if (phdr[i].p_type == PT_LOAD)
5367 unsigned adjust;
5369 adjust = -phdr[i].p_filesz & 15;
5370 phdr[i].p_filesz += adjust;
5372 adjust = -phdr[i].p_memsz & 15;
5373 phdr[i].p_memsz += adjust;
5376 return TRUE;
5379 bfd_boolean
5380 spu_elf_size_sections (bfd * output_bfd, struct bfd_link_info *info)
5382 struct spu_link_hash_table *htab = spu_hash_table (info);
5383 if (htab->params->emit_fixups)
5385 asection *sfixup = htab->sfixup;
5386 int fixup_count = 0;
5387 bfd *ibfd;
5388 size_t size;
5390 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5392 asection *isec;
5394 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5395 continue;
5397 /* Walk over each section attached to the input bfd. */
5398 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
5400 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
5401 bfd_vma base_end;
5403 /* If there aren't any relocs, then there's nothing more
5404 to do. */
5405 if ((isec->flags & SEC_RELOC) == 0
5406 || isec->reloc_count == 0)
5407 continue;
5409 /* Get the relocs. */
5410 internal_relocs =
5411 _bfd_elf_link_read_relocs (ibfd, isec, NULL, NULL,
5412 info->keep_memory);
5413 if (internal_relocs == NULL)
5414 return FALSE;
5416 /* 1 quadword can contain up to 4 R_SPU_ADDR32
5417 relocations. They are stored in a single word by
5418 saving the upper 28 bits of the address and setting the
5419 lower 4 bits to a bit mask of the words that have the
5420 relocation. BASE_END keeps track of the next quadword. */
5421 irela = internal_relocs;
5422 irelaend = irela + isec->reloc_count;
5423 base_end = 0;
5424 for (; irela < irelaend; irela++)
5425 if (ELF32_R_TYPE (irela->r_info) == R_SPU_ADDR32
5426 && irela->r_offset >= base_end)
5428 base_end = (irela->r_offset & ~(bfd_vma) 15) + 16;
5429 fixup_count++;
5434 /* We always have a NULL fixup as a sentinel */
5435 size = (fixup_count + 1) * FIXUP_RECORD_SIZE;
5436 if (!bfd_set_section_size (output_bfd, sfixup, size))
5437 return FALSE;
5438 sfixup->contents = (bfd_byte *) bfd_zalloc (info->input_bfds, size);
5439 if (sfixup->contents == NULL)
5440 return FALSE;
5442 return TRUE;
5445 #define TARGET_BIG_SYM bfd_elf32_spu_vec
5446 #define TARGET_BIG_NAME "elf32-spu"
5447 #define ELF_ARCH bfd_arch_spu
5448 #define ELF_MACHINE_CODE EM_SPU
5449 /* This matches the alignment need for DMA. */
5450 #define ELF_MAXPAGESIZE 0x80
5451 #define elf_backend_rela_normal 1
5452 #define elf_backend_can_gc_sections 1
5454 #define bfd_elf32_bfd_reloc_type_lookup spu_elf_reloc_type_lookup
5455 #define bfd_elf32_bfd_reloc_name_lookup spu_elf_reloc_name_lookup
5456 #define elf_info_to_howto spu_elf_info_to_howto
5457 #define elf_backend_count_relocs spu_elf_count_relocs
5458 #define elf_backend_relocate_section spu_elf_relocate_section
5459 #define elf_backend_symbol_processing spu_elf_backend_symbol_processing
5460 #define elf_backend_link_output_symbol_hook spu_elf_output_symbol_hook
5461 #define elf_backend_object_p spu_elf_object_p
5462 #define bfd_elf32_new_section_hook spu_elf_new_section_hook
5463 #define bfd_elf32_bfd_link_hash_table_create spu_elf_link_hash_table_create
5465 #define elf_backend_additional_program_headers spu_elf_additional_program_headers
5466 #define elf_backend_modify_segment_map spu_elf_modify_segment_map
5467 #define elf_backend_modify_program_headers spu_elf_modify_program_headers
5468 #define elf_backend_post_process_headers spu_elf_post_process_headers
5469 #define elf_backend_fake_sections spu_elf_fake_sections
5470 #define elf_backend_special_sections spu_elf_special_sections
5471 #define bfd_elf32_bfd_final_link spu_elf_final_link
5473 #include "elf32-target.h"