1 /* SPU specific support for 32-bit ELF
3 Copyright 2006, 2007, 2008, 2009 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. */
22 #include "libiberty.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 *,
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",
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 },
102 static enum elf_spu_reloc_type
103 spu_elf_bfd_to_reloc_type (bfd_reloc_code_real_type code)
109 case BFD_RELOC_SPU_IMM10W:
111 case BFD_RELOC_SPU_IMM16W:
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:
119 case BFD_RELOC_SPU_PCREL16:
121 case BFD_RELOC_SPU_IMM7:
123 case BFD_RELOC_SPU_IMM8:
125 case BFD_RELOC_SPU_PCREL9a:
127 case BFD_RELOC_SPU_PCREL9b:
129 case BFD_RELOC_SPU_IMM10:
130 return R_SPU_ADDR10I;
131 case BFD_RELOC_SPU_IMM16:
132 return R_SPU_ADDR16I;
135 case BFD_RELOC_32_PCREL:
137 case BFD_RELOC_SPU_PPU32:
139 case BFD_RELOC_SPU_PPU64:
141 case BFD_RELOC_SPU_ADD_PIC:
142 return R_SPU_ADD_PIC;
147 spu_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
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)
167 return elf_howto_table + r_type;
170 static reloc_howto_type *
171 spu_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
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];
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;
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
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. */
208 if (!bfd_is_com_section (symbol->section))
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;
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);
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));
243 sec->used_by_bfd = sdata;
246 return _bfd_elf_new_section_hook (abfd, sec);
249 /* Set up overlay info for executables. */
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)
267 if (last_phdr == NULL
268 || ((last_phdr->p_vaddr ^ phdr->p_vaddr) & 0x3ffff) != 0)
271 for (j = 1; j < elf_numsections (abfd); j++)
273 Elf_Internal_Shdr *shdr = elf_elfsections (abfd)[j];
275 if (ELF_IS_SECTION_IN_SEGMENT_MEMORY (shdr, phdr))
277 asection *sec = shdr->bfd_section;
278 spu_elf_section_data (sec)->u.o.ovl_index = num_ovl;
279 spu_elf_section_data (sec)->u.o.ovl_buf = num_buf;
287 /* Specially mark defined symbols named _EAR_* with BSF_KEEP so that
288 strip --strip-unneeded will not remove them. */
291 spu_elf_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
293 if (sym->name != NULL
294 && sym->section != bfd_abs_section_ptr
295 && strncmp (sym->name, "_EAR_", 5) == 0)
296 sym->flags |= BSF_KEEP;
299 /* SPU ELF linker hash table. */
301 struct spu_link_hash_table
303 struct elf_link_hash_table elf;
305 struct spu_elf_params *params;
307 /* Shortcuts to overlay sections. */
313 /* Count of stubs in each overlay section. */
314 unsigned int *stub_count;
316 /* The stub section for each overlay section. */
319 struct elf_link_hash_entry *ovly_entry[2];
321 /* Number of overlay buffers. */
322 unsigned int num_buf;
324 /* Total number of overlays. */
325 unsigned int num_overlays;
327 /* For soft icache. */
328 unsigned int line_size_log2;
329 unsigned int num_lines_log2;
330 unsigned int fromelem_size_log2;
332 /* How much memory we have. */
333 unsigned int local_store;
334 /* Local store --auto-overlay should reserve for non-overlay
335 functions and data. */
336 unsigned int overlay_fixed;
337 /* Local store --auto-overlay should reserve for stack and heap. */
338 unsigned int reserved;
339 /* If reserved is not specified, stack analysis will calculate a value
340 for the stack. This parameter adjusts that value to allow for
341 negative sp access (the ABI says 2000 bytes below sp are valid,
342 and the overlay manager uses some of this area). */
343 int extra_stack_space;
344 /* Count of overlay stubs needed in non-overlay area. */
345 unsigned int non_ovly_stub;
347 /* Pointer to the fixup section */
351 unsigned int stub_err : 1;
354 /* Hijack the generic got fields for overlay stub accounting. */
358 struct got_entry *next;
367 #define spu_hash_table(p) \
368 ((struct spu_link_hash_table *) ((p)->hash))
372 struct function_info *fun;
373 struct call_info *next;
375 unsigned int max_depth;
376 unsigned int is_tail : 1;
377 unsigned int is_pasted : 1;
378 unsigned int broken_cycle : 1;
379 unsigned int priority : 13;
384 /* List of functions called. Also branches to hot/cold part of
386 struct call_info *call_list;
387 /* For hot/cold part of function, point to owner. */
388 struct function_info *start;
389 /* Symbol at start of function. */
391 Elf_Internal_Sym *sym;
392 struct elf_link_hash_entry *h;
394 /* Function section. */
397 /* Where last called from, and number of sections called from. */
398 asection *last_caller;
399 unsigned int call_count;
400 /* Address range of (this part of) function. */
402 /* Offset where we found a store of lr, or -1 if none found. */
404 /* Offset where we found the stack adjustment insn. */
408 /* Distance from root of call tree. Tail and hot/cold branches
409 count as one deeper. We aren't counting stack frames here. */
411 /* Set if global symbol. */
412 unsigned int global : 1;
413 /* Set if known to be start of function (as distinct from a hunk
414 in hot/cold section. */
415 unsigned int is_func : 1;
416 /* Set if not a root node. */
417 unsigned int non_root : 1;
418 /* Flags used during call tree traversal. It's cheaper to replicate
419 the visit flags than have one which needs clearing after a traversal. */
420 unsigned int visit1 : 1;
421 unsigned int visit2 : 1;
422 unsigned int marking : 1;
423 unsigned int visit3 : 1;
424 unsigned int visit4 : 1;
425 unsigned int visit5 : 1;
426 unsigned int visit6 : 1;
427 unsigned int visit7 : 1;
430 struct spu_elf_stack_info
434 /* Variable size array describing functions, one per contiguous
435 address range belonging to a function. */
436 struct function_info fun[1];
439 static struct function_info *find_function (asection *, bfd_vma,
440 struct bfd_link_info *);
442 /* Create a spu ELF linker hash table. */
444 static struct bfd_link_hash_table *
445 spu_elf_link_hash_table_create (bfd *abfd)
447 struct spu_link_hash_table *htab;
449 htab = bfd_malloc (sizeof (*htab));
453 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd,
454 _bfd_elf_link_hash_newfunc,
455 sizeof (struct elf_link_hash_entry)))
461 memset (&htab->ovtab, 0,
462 sizeof (*htab) - offsetof (struct spu_link_hash_table, ovtab));
464 htab->elf.init_got_refcount.refcount = 0;
465 htab->elf.init_got_refcount.glist = NULL;
466 htab->elf.init_got_offset.offset = 0;
467 htab->elf.init_got_offset.glist = NULL;
468 return &htab->elf.root;
472 spu_elf_setup (struct bfd_link_info *info, struct spu_elf_params *params)
474 bfd_vma max_branch_log2;
476 struct spu_link_hash_table *htab = spu_hash_table (info);
477 htab->params = params;
478 htab->line_size_log2 = bfd_log2 (htab->params->line_size);
479 htab->num_lines_log2 = bfd_log2 (htab->params->num_lines);
481 /* For the software i-cache, we provide a "from" list whose size
482 is a power-of-two number of quadwords, big enough to hold one
483 byte per outgoing branch. Compute this number here. */
484 max_branch_log2 = bfd_log2 (htab->params->max_branch);
485 htab->fromelem_size_log2 = max_branch_log2 > 4 ? max_branch_log2 - 4 : 0;
488 /* Find the symbol for the given R_SYMNDX in IBFD and set *HP and *SYMP
489 to (hash, NULL) for global symbols, and (NULL, sym) for locals. Set
490 *SYMSECP to the symbol's section. *LOCSYMSP caches local syms. */
493 get_sym_h (struct elf_link_hash_entry **hp,
494 Elf_Internal_Sym **symp,
496 Elf_Internal_Sym **locsymsp,
497 unsigned long r_symndx,
500 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
502 if (r_symndx >= symtab_hdr->sh_info)
504 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
505 struct elf_link_hash_entry *h;
507 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
508 while (h->root.type == bfd_link_hash_indirect
509 || h->root.type == bfd_link_hash_warning)
510 h = (struct elf_link_hash_entry *) h->root.u.i.link;
520 asection *symsec = NULL;
521 if (h->root.type == bfd_link_hash_defined
522 || h->root.type == bfd_link_hash_defweak)
523 symsec = h->root.u.def.section;
529 Elf_Internal_Sym *sym;
530 Elf_Internal_Sym *locsyms = *locsymsp;
534 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
536 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
538 0, NULL, NULL, NULL);
543 sym = locsyms + r_symndx;
552 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
558 /* Create the note section if not already present. This is done early so
559 that the linker maps the sections to the right place in the output. */
562 spu_elf_create_sections (struct bfd_link_info *info)
564 struct spu_link_hash_table *htab = spu_hash_table (info);
567 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
568 if (bfd_get_section_by_name (ibfd, SPU_PTNOTE_SPUNAME) != NULL)
573 /* Make SPU_PTNOTE_SPUNAME section. */
580 ibfd = info->input_bfds;
581 flags = SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
582 s = bfd_make_section_anyway_with_flags (ibfd, SPU_PTNOTE_SPUNAME, flags);
584 || !bfd_set_section_alignment (ibfd, s, 4))
587 name_len = strlen (bfd_get_filename (info->output_bfd)) + 1;
588 size = 12 + ((sizeof (SPU_PLUGIN_NAME) + 3) & -4);
589 size += (name_len + 3) & -4;
591 if (!bfd_set_section_size (ibfd, s, size))
594 data = bfd_zalloc (ibfd, size);
598 bfd_put_32 (ibfd, sizeof (SPU_PLUGIN_NAME), data + 0);
599 bfd_put_32 (ibfd, name_len, data + 4);
600 bfd_put_32 (ibfd, 1, data + 8);
601 memcpy (data + 12, SPU_PLUGIN_NAME, sizeof (SPU_PLUGIN_NAME));
602 memcpy (data + 12 + ((sizeof (SPU_PLUGIN_NAME) + 3) & -4),
603 bfd_get_filename (info->output_bfd), name_len);
607 if (htab->params->emit_fixups)
611 ibfd = info->input_bfds;
612 flags = SEC_LOAD | SEC_ALLOC | SEC_READONLY | SEC_HAS_CONTENTS
614 s = bfd_make_section_anyway_with_flags (ibfd, ".fixup", flags);
615 if (s == NULL || !bfd_set_section_alignment (ibfd, s, 2))
623 /* qsort predicate to sort sections by vma. */
626 sort_sections (const void *a, const void *b)
628 const asection *const *s1 = a;
629 const asection *const *s2 = b;
630 bfd_signed_vma delta = (*s1)->vma - (*s2)->vma;
633 return delta < 0 ? -1 : 1;
635 return (*s1)->index - (*s2)->index;
638 /* Identify overlays in the output bfd, and number them.
639 Returns 0 on error, 1 if no overlays, 2 if overlays. */
642 spu_elf_find_overlays (struct bfd_link_info *info)
644 struct spu_link_hash_table *htab = spu_hash_table (info);
645 asection **alloc_sec;
646 unsigned int i, n, ovl_index, num_buf;
649 static const char *const entry_names[2][2] = {
650 { "__ovly_load", "__icache_br_handler" },
651 { "__ovly_return", "__icache_call_handler" }
654 if (info->output_bfd->section_count < 2)
658 = bfd_malloc (info->output_bfd->section_count * sizeof (*alloc_sec));
659 if (alloc_sec == NULL)
662 /* Pick out all the alloced sections. */
663 for (n = 0, s = info->output_bfd->sections; s != NULL; s = s->next)
664 if ((s->flags & SEC_ALLOC) != 0
665 && (s->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != SEC_THREAD_LOCAL
675 /* Sort them by vma. */
676 qsort (alloc_sec, n, sizeof (*alloc_sec), sort_sections);
678 ovl_end = alloc_sec[0]->vma + alloc_sec[0]->size;
679 if (htab->params->ovly_flavour == ovly_soft_icache)
681 /* Look for an overlapping vma to find the first overlay section. */
682 bfd_vma vma_start = 0;
683 bfd_vma lma_start = 0;
685 for (i = 1; i < n; i++)
688 if (s->vma < ovl_end)
690 asection *s0 = alloc_sec[i - 1];
692 if (strncmp (s0->name, ".ovl.init", 9) != 0)
698 << (htab->num_lines_log2 + htab->line_size_log2)));
703 ovl_end = s->vma + s->size;
706 /* Now find any sections within the cache area. */
707 for (ovl_index = 0, num_buf = 0; i < n; i++)
710 if (s->vma >= ovl_end)
713 /* A section in an overlay area called .ovl.init is not
714 an overlay, in the sense that it might be loaded in
715 by the overlay manager, but rather the initial
716 section contents for the overlay buffer. */
717 if (strncmp (s->name, ".ovl.init", 9) != 0)
719 num_buf = ((s->vma - vma_start) >> htab->line_size_log2) + 1;
720 if (((s->vma - vma_start) & (htab->params->line_size - 1))
721 || ((s->lma - lma_start) & (htab->params->line_size - 1)))
723 info->callbacks->einfo (_("%X%P: overlay section %A "
724 "does not start on a cache line.\n"),
726 bfd_set_error (bfd_error_bad_value);
729 else if (s->size > htab->params->line_size)
731 info->callbacks->einfo (_("%X%P: overlay section %A "
732 "is larger than a cache line.\n"),
734 bfd_set_error (bfd_error_bad_value);
738 alloc_sec[ovl_index++] = s;
739 spu_elf_section_data (s)->u.o.ovl_index
740 = ((s->lma - lma_start) >> htab->line_size_log2) + 1;
741 spu_elf_section_data (s)->u.o.ovl_buf = num_buf;
745 /* Ensure there are no more overlay sections. */
749 if (s->vma < ovl_end)
751 info->callbacks->einfo (_("%X%P: overlay section %A "
752 "is not in cache area.\n"),
754 bfd_set_error (bfd_error_bad_value);
758 ovl_end = s->vma + s->size;
763 /* Look for overlapping vmas. Any with overlap must be overlays.
764 Count them. Also count the number of overlay regions. */
765 for (ovl_index = 0, num_buf = 0, i = 1; i < n; i++)
768 if (s->vma < ovl_end)
770 asection *s0 = alloc_sec[i - 1];
772 if (spu_elf_section_data (s0)->u.o.ovl_index == 0)
775 if (strncmp (s0->name, ".ovl.init", 9) != 0)
777 alloc_sec[ovl_index] = s0;
778 spu_elf_section_data (s0)->u.o.ovl_index = ++ovl_index;
779 spu_elf_section_data (s0)->u.o.ovl_buf = num_buf;
782 ovl_end = s->vma + s->size;
784 if (strncmp (s->name, ".ovl.init", 9) != 0)
786 alloc_sec[ovl_index] = s;
787 spu_elf_section_data (s)->u.o.ovl_index = ++ovl_index;
788 spu_elf_section_data (s)->u.o.ovl_buf = num_buf;
789 if (s0->vma != s->vma)
791 info->callbacks->einfo (_("%X%P: overlay sections %A "
792 "and %A do not start at the "
795 bfd_set_error (bfd_error_bad_value);
798 if (ovl_end < s->vma + s->size)
799 ovl_end = s->vma + s->size;
803 ovl_end = s->vma + s->size;
807 htab->num_overlays = ovl_index;
808 htab->num_buf = num_buf;
809 htab->ovl_sec = alloc_sec;
814 for (i = 0; i < 2; i++)
817 struct elf_link_hash_entry *h;
819 name = entry_names[i][htab->params->ovly_flavour];
820 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
824 if (h->root.type == bfd_link_hash_new)
826 h->root.type = bfd_link_hash_undefined;
828 h->ref_regular_nonweak = 1;
831 htab->ovly_entry[i] = h;
837 /* Non-zero to use bra in overlay stubs rather than br. */
840 #define BRA 0x30000000
841 #define BRASL 0x31000000
842 #define BR 0x32000000
843 #define BRSL 0x33000000
844 #define NOP 0x40200000
845 #define LNOP 0x00200000
846 #define ILA 0x42000000
848 /* Return true for all relative and absolute branch instructions.
856 brhnz 00100011 0.. */
859 is_branch (const unsigned char *insn)
861 return (insn[0] & 0xec) == 0x20 && (insn[1] & 0x80) == 0;
864 /* Return true for all indirect branch instructions.
872 bihnz 00100101 011 */
875 is_indirect_branch (const unsigned char *insn)
877 return (insn[0] & 0xef) == 0x25 && (insn[1] & 0x80) == 0;
880 /* Return true for branch hint instructions.
885 is_hint (const unsigned char *insn)
887 return (insn[0] & 0xfc) == 0x10;
890 /* True if INPUT_SECTION might need overlay stubs. */
893 maybe_needs_stubs (asection *input_section)
895 /* No stubs for debug sections and suchlike. */
896 if ((input_section->flags & SEC_ALLOC) == 0)
899 /* No stubs for link-once sections that will be discarded. */
900 if (input_section->output_section == bfd_abs_section_ptr)
903 /* Don't create stubs for .eh_frame references. */
904 if (strcmp (input_section->name, ".eh_frame") == 0)
926 /* Return non-zero if this reloc symbol should go via an overlay stub.
927 Return 2 if the stub must be in non-overlay area. */
929 static enum _stub_type
930 needs_ovl_stub (struct elf_link_hash_entry *h,
931 Elf_Internal_Sym *sym,
933 asection *input_section,
934 Elf_Internal_Rela *irela,
936 struct bfd_link_info *info)
938 struct spu_link_hash_table *htab = spu_hash_table (info);
939 enum elf_spu_reloc_type r_type;
940 unsigned int sym_type;
941 bfd_boolean branch, hint, call;
942 enum _stub_type ret = no_stub;
946 || sym_sec->output_section == bfd_abs_section_ptr
947 || spu_elf_section_data (sym_sec->output_section) == NULL)
952 /* Ensure no stubs for user supplied overlay manager syms. */
953 if (h == htab->ovly_entry[0] || h == htab->ovly_entry[1])
956 /* setjmp always goes via an overlay stub, because then the return
957 and hence the longjmp goes via __ovly_return. That magically
958 makes setjmp/longjmp between overlays work. */
959 if (strncmp (h->root.root.string, "setjmp", 6) == 0
960 && (h->root.root.string[6] == '\0' || h->root.root.string[6] == '@'))
967 sym_type = ELF_ST_TYPE (sym->st_info);
969 r_type = ELF32_R_TYPE (irela->r_info);
973 if (r_type == R_SPU_REL16 || r_type == R_SPU_ADDR16)
975 if (contents == NULL)
978 if (!bfd_get_section_contents (input_section->owner,
985 contents += irela->r_offset;
987 branch = is_branch (contents);
988 hint = is_hint (contents);
991 call = (contents[0] & 0xfd) == 0x31;
993 && sym_type != STT_FUNC
996 /* It's common for people to write assembly and forget
997 to give function symbols the right type. Handle
998 calls to such symbols, but warn so that (hopefully)
999 people will fix their code. We need the symbol
1000 type to be correct to distinguish function pointer
1001 initialisation from other pointer initialisations. */
1002 const char *sym_name;
1005 sym_name = h->root.root.string;
1008 Elf_Internal_Shdr *symtab_hdr;
1009 symtab_hdr = &elf_tdata (input_section->owner)->symtab_hdr;
1010 sym_name = bfd_elf_sym_name (input_section->owner,
1015 (*_bfd_error_handler) (_("warning: call to non-function"
1016 " symbol %s defined in %B"),
1017 sym_sec->owner, sym_name);
1023 if ((!branch && htab->params->ovly_flavour == ovly_soft_icache)
1024 || (sym_type != STT_FUNC
1025 && !(branch || hint)
1026 && (sym_sec->flags & SEC_CODE) == 0))
1029 /* Usually, symbols in non-overlay sections don't need stubs. */
1030 if (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index == 0
1031 && !htab->params->non_overlay_stubs)
1034 /* A reference from some other section to a symbol in an overlay
1035 section needs a stub. */
1036 if (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index
1037 != spu_elf_section_data (input_section->output_section)->u.o.ovl_index)
1039 unsigned int lrlive = 0;
1041 lrlive = (contents[1] & 0x70) >> 4;
1043 if (!lrlive && (call || sym_type == STT_FUNC))
1044 ret = call_ovl_stub;
1046 ret = br000_ovl_stub + lrlive;
1049 /* If this insn isn't a branch then we are possibly taking the
1050 address of a function and passing it out somehow. Soft-icache code
1051 always generates inline code to do indirect branches. */
1052 if (!(branch || hint)
1053 && sym_type == STT_FUNC
1054 && htab->params->ovly_flavour != ovly_soft_icache)
1061 count_stub (struct spu_link_hash_table *htab,
1064 enum _stub_type stub_type,
1065 struct elf_link_hash_entry *h,
1066 const Elf_Internal_Rela *irela)
1068 unsigned int ovl = 0;
1069 struct got_entry *g, **head;
1072 /* If this instruction is a branch or call, we need a stub
1073 for it. One stub per function per overlay.
1074 If it isn't a branch, then we are taking the address of
1075 this function so need a stub in the non-overlay area
1076 for it. One stub per function. */
1077 if (stub_type != nonovl_stub)
1078 ovl = spu_elf_section_data (isec->output_section)->u.o.ovl_index;
1081 head = &h->got.glist;
1084 if (elf_local_got_ents (ibfd) == NULL)
1086 bfd_size_type amt = (elf_tdata (ibfd)->symtab_hdr.sh_info
1087 * sizeof (*elf_local_got_ents (ibfd)));
1088 elf_local_got_ents (ibfd) = bfd_zmalloc (amt);
1089 if (elf_local_got_ents (ibfd) == NULL)
1092 head = elf_local_got_ents (ibfd) + ELF32_R_SYM (irela->r_info);
1095 if (htab->params->ovly_flavour == ovly_soft_icache)
1097 htab->stub_count[ovl] += 1;
1103 addend = irela->r_addend;
1107 struct got_entry *gnext;
1109 for (g = *head; g != NULL; g = g->next)
1110 if (g->addend == addend && g->ovl == 0)
1115 /* Need a new non-overlay area stub. Zap other stubs. */
1116 for (g = *head; g != NULL; g = gnext)
1119 if (g->addend == addend)
1121 htab->stub_count[g->ovl] -= 1;
1129 for (g = *head; g != NULL; g = g->next)
1130 if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
1136 g = bfd_malloc (sizeof *g);
1141 g->stub_addr = (bfd_vma) -1;
1145 htab->stub_count[ovl] += 1;
1151 /* Support two sizes of overlay stubs, a slower more compact stub of two
1152 intructions, and a faster stub of four instructions.
1153 Soft-icache stubs are four or eight words. */
1156 ovl_stub_size (struct spu_elf_params *params)
1158 return 16 << params->ovly_flavour >> params->compact_stub;
1162 ovl_stub_size_log2 (struct spu_elf_params *params)
1164 return 4 + params->ovly_flavour - params->compact_stub;
1167 /* Two instruction overlay stubs look like:
1169 brsl $75,__ovly_load
1170 .word target_ovl_and_address
1172 ovl_and_address is a word with the overlay number in the top 14 bits
1173 and local store address in the bottom 18 bits.
1175 Four instruction overlay stubs look like:
1179 ila $79,target_address
1182 Software icache stubs are:
1186 .word lrlive_branchlocalstoreaddr;
1187 brasl $75,__icache_br_handler
1192 build_stub (struct bfd_link_info *info,
1195 enum _stub_type stub_type,
1196 struct elf_link_hash_entry *h,
1197 const Elf_Internal_Rela *irela,
1201 struct spu_link_hash_table *htab = spu_hash_table (info);
1202 unsigned int ovl, dest_ovl, set_id;
1203 struct got_entry *g, **head;
1205 bfd_vma addend, from, to, br_dest, patt;
1206 unsigned int lrlive;
1209 if (stub_type != nonovl_stub)
1210 ovl = spu_elf_section_data (isec->output_section)->u.o.ovl_index;
1213 head = &h->got.glist;
1215 head = elf_local_got_ents (ibfd) + ELF32_R_SYM (irela->r_info);
1219 addend = irela->r_addend;
1221 if (htab->params->ovly_flavour == ovly_soft_icache)
1223 g = bfd_malloc (sizeof *g);
1229 g->br_addr = (irela->r_offset
1230 + isec->output_offset
1231 + isec->output_section->vma);
1237 for (g = *head; g != NULL; g = g->next)
1238 if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
1243 if (g->ovl == 0 && ovl != 0)
1246 if (g->stub_addr != (bfd_vma) -1)
1250 sec = htab->stub_sec[ovl];
1251 dest += dest_sec->output_offset + dest_sec->output_section->vma;
1252 from = sec->size + sec->output_offset + sec->output_section->vma;
1253 g->stub_addr = from;
1254 to = (htab->ovly_entry[0]->root.u.def.value
1255 + htab->ovly_entry[0]->root.u.def.section->output_offset
1256 + htab->ovly_entry[0]->root.u.def.section->output_section->vma);
1258 if (((dest | to | from) & 3) != 0)
1263 dest_ovl = spu_elf_section_data (dest_sec->output_section)->u.o.ovl_index;
1265 if (htab->params->ovly_flavour == ovly_normal
1266 && !htab->params->compact_stub)
1268 bfd_put_32 (sec->owner, ILA + ((dest_ovl << 7) & 0x01ffff80) + 78,
1269 sec->contents + sec->size);
1270 bfd_put_32 (sec->owner, LNOP,
1271 sec->contents + sec->size + 4);
1272 bfd_put_32 (sec->owner, ILA + ((dest << 7) & 0x01ffff80) + 79,
1273 sec->contents + sec->size + 8);
1275 bfd_put_32 (sec->owner, BR + (((to - (from + 12)) << 5) & 0x007fff80),
1276 sec->contents + sec->size + 12);
1278 bfd_put_32 (sec->owner, BRA + ((to << 5) & 0x007fff80),
1279 sec->contents + sec->size + 12);
1281 else if (htab->params->ovly_flavour == ovly_normal
1282 && htab->params->compact_stub)
1285 bfd_put_32 (sec->owner, BRSL + (((to - from) << 5) & 0x007fff80) + 75,
1286 sec->contents + sec->size);
1288 bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
1289 sec->contents + sec->size);
1290 bfd_put_32 (sec->owner, (dest & 0x3ffff) | (dest_ovl << 18),
1291 sec->contents + sec->size + 4);
1293 else if (htab->params->ovly_flavour == ovly_soft_icache
1294 && htab->params->compact_stub)
1297 if (stub_type == nonovl_stub)
1299 else if (stub_type == call_ovl_stub)
1300 /* A brsl makes lr live and *(*sp+16) is live.
1301 Tail calls have the same liveness. */
1303 else if (!htab->params->lrlive_analysis)
1304 /* Assume stack frame and lr save. */
1306 else if (irela != NULL)
1308 /* Analyse branch instructions. */
1309 struct function_info *caller;
1312 caller = find_function (isec, irela->r_offset, info);
1313 if (caller->start == NULL)
1314 off = irela->r_offset;
1317 struct function_info *found = NULL;
1319 /* Find the earliest piece of this function that
1320 has frame adjusting instructions. We might
1321 see dynamic frame adjustment (eg. for alloca)
1322 in some later piece, but functions using
1323 alloca always set up a frame earlier. Frame
1324 setup instructions are always in one piece. */
1325 if (caller->lr_store != (bfd_vma) -1
1326 || caller->sp_adjust != (bfd_vma) -1)
1328 while (caller->start != NULL)
1330 caller = caller->start;
1331 if (caller->lr_store != (bfd_vma) -1
1332 || caller->sp_adjust != (bfd_vma) -1)
1340 if (off > caller->sp_adjust)
1342 if (off > caller->lr_store)
1343 /* Only *(*sp+16) is live. */
1346 /* If no lr save, then we must be in a
1347 leaf function with a frame.
1348 lr is still live. */
1351 else if (off > caller->lr_store)
1353 /* Between lr save and stack adjust. */
1355 /* This should never happen since prologues won't
1360 /* On entry to function. */
1363 if (stub_type != br000_ovl_stub
1364 && lrlive != stub_type - br000_ovl_stub)
1365 info->callbacks->einfo (_("%A:0x%v lrlive .brinfo (%u) differs "
1366 "from analysis (%u)\n"),
1367 isec, irela->r_offset, lrlive,
1368 stub_type - br000_ovl_stub);
1371 /* If given lrlive info via .brinfo, use it. */
1372 if (stub_type > br000_ovl_stub)
1373 lrlive = stub_type - br000_ovl_stub;
1376 to = (htab->ovly_entry[1]->root.u.def.value
1377 + htab->ovly_entry[1]->root.u.def.section->output_offset
1378 + htab->ovly_entry[1]->root.u.def.section->output_section->vma);
1380 /* The branch that uses this stub goes to stub_addr + 4. We'll
1381 set up an xor pattern that can be used by the icache manager
1382 to modify this branch to go directly to its destination. */
1384 br_dest = g->stub_addr;
1387 /* Except in the case of _SPUEAR_ stubs, the branch in
1388 question is the one in the stub itself. */
1389 BFD_ASSERT (stub_type == nonovl_stub);
1390 g->br_addr = g->stub_addr;
1394 set_id = ((dest_ovl - 1) >> htab->num_lines_log2) + 1;
1395 bfd_put_32 (sec->owner, (set_id << 18) | (dest & 0x3ffff),
1396 sec->contents + sec->size);
1397 bfd_put_32 (sec->owner, BRASL + ((to << 5) & 0x007fff80) + 75,
1398 sec->contents + sec->size + 4);
1399 bfd_put_32 (sec->owner, (lrlive << 29) | (g->br_addr & 0x3ffff),
1400 sec->contents + sec->size + 8);
1401 patt = dest ^ br_dest;
1402 if (irela != NULL && ELF32_R_TYPE (irela->r_info) == R_SPU_REL16)
1403 patt = (dest - g->br_addr) ^ (br_dest - g->br_addr);
1404 bfd_put_32 (sec->owner, (patt << 5) & 0x007fff80,
1405 sec->contents + sec->size + 12);
1408 /* Extra space for linked list entries. */
1414 sec->size += ovl_stub_size (htab->params);
1416 if (htab->params->emit_stub_syms)
1422 len = 8 + sizeof (".ovl_call.") - 1;
1424 len += strlen (h->root.root.string);
1429 add = (int) irela->r_addend & 0xffffffff;
1432 name = bfd_malloc (len);
1436 sprintf (name, "%08x.ovl_call.", g->ovl);
1438 strcpy (name + 8 + sizeof (".ovl_call.") - 1, h->root.root.string);
1440 sprintf (name + 8 + sizeof (".ovl_call.") - 1, "%x:%x",
1441 dest_sec->id & 0xffffffff,
1442 (int) ELF32_R_SYM (irela->r_info) & 0xffffffff);
1444 sprintf (name + len - 9, "+%x", add);
1446 h = elf_link_hash_lookup (&htab->elf, name, TRUE, TRUE, FALSE);
1450 if (h->root.type == bfd_link_hash_new)
1452 h->root.type = bfd_link_hash_defined;
1453 h->root.u.def.section = sec;
1454 h->size = ovl_stub_size (htab->params);
1455 h->root.u.def.value = sec->size - h->size;
1459 h->ref_regular_nonweak = 1;
1460 h->forced_local = 1;
1468 /* Called via elf_link_hash_traverse to allocate stubs for any _SPUEAR_
1472 allocate_spuear_stubs (struct elf_link_hash_entry *h, void *inf)
1474 /* Symbols starting with _SPUEAR_ need a stub because they may be
1475 invoked by the PPU. */
1476 struct bfd_link_info *info = inf;
1477 struct spu_link_hash_table *htab = spu_hash_table (info);
1480 if ((h->root.type == bfd_link_hash_defined
1481 || h->root.type == bfd_link_hash_defweak)
1483 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0
1484 && (sym_sec = h->root.u.def.section) != NULL
1485 && sym_sec->output_section != bfd_abs_section_ptr
1486 && spu_elf_section_data (sym_sec->output_section) != NULL
1487 && (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index != 0
1488 || htab->params->non_overlay_stubs))
1490 return count_stub (htab, NULL, NULL, nonovl_stub, h, NULL);
1497 build_spuear_stubs (struct elf_link_hash_entry *h, void *inf)
1499 /* Symbols starting with _SPUEAR_ need a stub because they may be
1500 invoked by the PPU. */
1501 struct bfd_link_info *info = inf;
1502 struct spu_link_hash_table *htab = spu_hash_table (info);
1505 if ((h->root.type == bfd_link_hash_defined
1506 || h->root.type == bfd_link_hash_defweak)
1508 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0
1509 && (sym_sec = h->root.u.def.section) != NULL
1510 && sym_sec->output_section != bfd_abs_section_ptr
1511 && spu_elf_section_data (sym_sec->output_section) != NULL
1512 && (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index != 0
1513 || htab->params->non_overlay_stubs))
1515 return build_stub (info, NULL, NULL, nonovl_stub, h, NULL,
1516 h->root.u.def.value, sym_sec);
1522 /* Size or build stubs. */
1525 process_stubs (struct bfd_link_info *info, bfd_boolean build)
1527 struct spu_link_hash_table *htab = spu_hash_table (info);
1530 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1532 extern const bfd_target bfd_elf32_spu_vec;
1533 Elf_Internal_Shdr *symtab_hdr;
1535 Elf_Internal_Sym *local_syms = NULL;
1537 if (ibfd->xvec != &bfd_elf32_spu_vec)
1540 /* We'll need the symbol table in a second. */
1541 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1542 if (symtab_hdr->sh_info == 0)
1545 /* Walk over each section attached to the input bfd. */
1546 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
1548 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1550 /* If there aren't any relocs, then there's nothing more to do. */
1551 if ((isec->flags & SEC_RELOC) == 0
1552 || isec->reloc_count == 0)
1555 if (!maybe_needs_stubs (isec))
1558 /* Get the relocs. */
1559 internal_relocs = _bfd_elf_link_read_relocs (ibfd, isec, NULL, NULL,
1561 if (internal_relocs == NULL)
1562 goto error_ret_free_local;
1564 /* Now examine each relocation. */
1565 irela = internal_relocs;
1566 irelaend = irela + isec->reloc_count;
1567 for (; irela < irelaend; irela++)
1569 enum elf_spu_reloc_type r_type;
1570 unsigned int r_indx;
1572 Elf_Internal_Sym *sym;
1573 struct elf_link_hash_entry *h;
1574 enum _stub_type stub_type;
1576 r_type = ELF32_R_TYPE (irela->r_info);
1577 r_indx = ELF32_R_SYM (irela->r_info);
1579 if (r_type >= R_SPU_max)
1581 bfd_set_error (bfd_error_bad_value);
1582 error_ret_free_internal:
1583 if (elf_section_data (isec)->relocs != internal_relocs)
1584 free (internal_relocs);
1585 error_ret_free_local:
1586 if (local_syms != NULL
1587 && (symtab_hdr->contents
1588 != (unsigned char *) local_syms))
1593 /* Determine the reloc target section. */
1594 if (!get_sym_h (&h, &sym, &sym_sec, &local_syms, r_indx, ibfd))
1595 goto error_ret_free_internal;
1597 stub_type = needs_ovl_stub (h, sym, sym_sec, isec, irela,
1599 if (stub_type == no_stub)
1601 else if (stub_type == stub_error)
1602 goto error_ret_free_internal;
1604 if (htab->stub_count == NULL)
1607 amt = (htab->num_overlays + 1) * sizeof (*htab->stub_count);
1608 htab->stub_count = bfd_zmalloc (amt);
1609 if (htab->stub_count == NULL)
1610 goto error_ret_free_internal;
1615 if (!count_stub (htab, ibfd, isec, stub_type, h, irela))
1616 goto error_ret_free_internal;
1623 dest = h->root.u.def.value;
1625 dest = sym->st_value;
1626 dest += irela->r_addend;
1627 if (!build_stub (info, ibfd, isec, stub_type, h, irela,
1629 goto error_ret_free_internal;
1633 /* We're done with the internal relocs, free them. */
1634 if (elf_section_data (isec)->relocs != internal_relocs)
1635 free (internal_relocs);
1638 if (local_syms != NULL
1639 && symtab_hdr->contents != (unsigned char *) local_syms)
1641 if (!info->keep_memory)
1644 symtab_hdr->contents = (unsigned char *) local_syms;
1651 /* Allocate space for overlay call and return stubs.
1652 Return 0 on error, 1 if no overlays, 2 otherwise. */
1655 spu_elf_size_stubs (struct bfd_link_info *info)
1657 struct spu_link_hash_table *htab;
1664 if (!process_stubs (info, FALSE))
1667 htab = spu_hash_table (info);
1668 elf_link_hash_traverse (&htab->elf, allocate_spuear_stubs, info);
1672 ibfd = info->input_bfds;
1673 if (htab->stub_count != NULL)
1675 amt = (htab->num_overlays + 1) * sizeof (*htab->stub_sec);
1676 htab->stub_sec = bfd_zmalloc (amt);
1677 if (htab->stub_sec == NULL)
1680 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
1681 | SEC_HAS_CONTENTS | SEC_IN_MEMORY);
1682 stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
1683 htab->stub_sec[0] = stub;
1685 || !bfd_set_section_alignment (ibfd, stub,
1686 ovl_stub_size_log2 (htab->params)))
1688 stub->size = htab->stub_count[0] * ovl_stub_size (htab->params);
1689 if (htab->params->ovly_flavour == ovly_soft_icache)
1690 /* Extra space for linked list entries. */
1691 stub->size += htab->stub_count[0] * 16;
1693 for (i = 0; i < htab->num_overlays; ++i)
1695 asection *osec = htab->ovl_sec[i];
1696 unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
1697 stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
1698 htab->stub_sec[ovl] = stub;
1700 || !bfd_set_section_alignment (ibfd, stub,
1701 ovl_stub_size_log2 (htab->params)))
1703 stub->size = htab->stub_count[ovl] * ovl_stub_size (htab->params);
1707 if (htab->params->ovly_flavour == ovly_soft_icache)
1709 /* Space for icache manager tables.
1710 a) Tag array, one quadword per cache line.
1711 b) Rewrite "to" list, one quadword per cache line.
1712 c) Rewrite "from" list, one byte per outgoing branch (rounded up to
1713 a power-of-two number of full quadwords) per cache line. */
1716 htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
1717 if (htab->ovtab == NULL
1718 || !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
1721 htab->ovtab->size = (16 + 16 + (16 << htab->fromelem_size_log2))
1722 << htab->num_lines_log2;
1724 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1725 htab->init = bfd_make_section_anyway_with_flags (ibfd, ".ovini", flags);
1726 if (htab->init == NULL
1727 || !bfd_set_section_alignment (ibfd, htab->init, 4))
1730 htab->init->size = 16;
1732 else if (htab->stub_count == NULL)
1736 /* htab->ovtab consists of two arrays.
1746 . } _ovly_buf_table[];
1749 flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
1750 htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
1751 if (htab->ovtab == NULL
1752 || !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
1755 htab->ovtab->size = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
1758 htab->toe = bfd_make_section_anyway_with_flags (ibfd, ".toe", SEC_ALLOC);
1759 if (htab->toe == NULL
1760 || !bfd_set_section_alignment (ibfd, htab->toe, 4))
1762 htab->toe->size = 16;
1767 /* Called from ld to place overlay manager data sections. This is done
1768 after the overlay manager itself is loaded, mainly so that the
1769 linker's htab->init section is placed after any other .ovl.init
1773 spu_elf_place_overlay_data (struct bfd_link_info *info)
1775 struct spu_link_hash_table *htab = spu_hash_table (info);
1778 if (htab->stub_sec != NULL)
1780 (*htab->params->place_spu_section) (htab->stub_sec[0], NULL, ".text");
1782 for (i = 0; i < htab->num_overlays; ++i)
1784 asection *osec = htab->ovl_sec[i];
1785 unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
1786 (*htab->params->place_spu_section) (htab->stub_sec[ovl], osec, NULL);
1790 if (htab->params->ovly_flavour == ovly_soft_icache)
1791 (*htab->params->place_spu_section) (htab->init, NULL, ".ovl.init");
1793 if (htab->ovtab != NULL)
1795 const char *ovout = ".data";
1796 if (htab->params->ovly_flavour == ovly_soft_icache)
1798 (*htab->params->place_spu_section) (htab->ovtab, NULL, ovout);
1801 if (htab->toe != NULL)
1802 (*htab->params->place_spu_section) (htab->toe, NULL, ".toe");
1805 /* Functions to handle embedded spu_ovl.o object. */
1808 ovl_mgr_open (struct bfd *nbfd ATTRIBUTE_UNUSED, void *stream)
1814 ovl_mgr_pread (struct bfd *abfd ATTRIBUTE_UNUSED,
1820 struct _ovl_stream *os;
1824 os = (struct _ovl_stream *) stream;
1825 max = (const char *) os->end - (const char *) os->start;
1827 if ((ufile_ptr) offset >= max)
1831 if (count > max - offset)
1832 count = max - offset;
1834 memcpy (buf, (const char *) os->start + offset, count);
1839 spu_elf_open_builtin_lib (bfd **ovl_bfd, const struct _ovl_stream *stream)
1841 *ovl_bfd = bfd_openr_iovec ("builtin ovl_mgr",
1848 return *ovl_bfd != NULL;
1852 overlay_index (asection *sec)
1855 || sec->output_section == bfd_abs_section_ptr)
1857 return spu_elf_section_data (sec->output_section)->u.o.ovl_index;
1860 /* Define an STT_OBJECT symbol. */
1862 static struct elf_link_hash_entry *
1863 define_ovtab_symbol (struct spu_link_hash_table *htab, const char *name)
1865 struct elf_link_hash_entry *h;
1867 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
1871 if (h->root.type != bfd_link_hash_defined
1874 h->root.type = bfd_link_hash_defined;
1875 h->root.u.def.section = htab->ovtab;
1876 h->type = STT_OBJECT;
1879 h->ref_regular_nonweak = 1;
1882 else if (h->root.u.def.section->owner != NULL)
1884 (*_bfd_error_handler) (_("%B is not allowed to define %s"),
1885 h->root.u.def.section->owner,
1886 h->root.root.string);
1887 bfd_set_error (bfd_error_bad_value);
1892 (*_bfd_error_handler) (_("you are not allowed to define %s in a script"),
1893 h->root.root.string);
1894 bfd_set_error (bfd_error_bad_value);
1901 /* Fill in all stubs and the overlay tables. */
1904 spu_elf_build_stubs (struct bfd_link_info *info)
1906 struct spu_link_hash_table *htab = spu_hash_table (info);
1907 struct elf_link_hash_entry *h;
1913 if (htab->num_overlays != 0)
1915 for (i = 0; i < 2; i++)
1917 h = htab->ovly_entry[i];
1919 && (h->root.type == bfd_link_hash_defined
1920 || h->root.type == bfd_link_hash_defweak)
1923 s = h->root.u.def.section->output_section;
1924 if (spu_elf_section_data (s)->u.o.ovl_index)
1926 (*_bfd_error_handler) (_("%s in overlay section"),
1927 h->root.root.string);
1928 bfd_set_error (bfd_error_bad_value);
1935 if (htab->stub_sec != NULL)
1937 for (i = 0; i <= htab->num_overlays; i++)
1938 if (htab->stub_sec[i]->size != 0)
1940 htab->stub_sec[i]->contents = bfd_zalloc (htab->stub_sec[i]->owner,
1941 htab->stub_sec[i]->size);
1942 if (htab->stub_sec[i]->contents == NULL)
1944 htab->stub_sec[i]->rawsize = htab->stub_sec[i]->size;
1945 htab->stub_sec[i]->size = 0;
1948 /* Fill in all the stubs. */
1949 process_stubs (info, TRUE);
1950 if (!htab->stub_err)
1951 elf_link_hash_traverse (&htab->elf, build_spuear_stubs, info);
1955 (*_bfd_error_handler) (_("overlay stub relocation overflow"));
1956 bfd_set_error (bfd_error_bad_value);
1960 for (i = 0; i <= htab->num_overlays; i++)
1962 if (htab->stub_sec[i]->size != htab->stub_sec[i]->rawsize)
1964 (*_bfd_error_handler) (_("stubs don't match calculated size"));
1965 bfd_set_error (bfd_error_bad_value);
1968 htab->stub_sec[i]->rawsize = 0;
1972 if (htab->ovtab == NULL || htab->ovtab->size == 0)
1975 htab->ovtab->contents = bfd_zalloc (htab->ovtab->owner, htab->ovtab->size);
1976 if (htab->ovtab->contents == NULL)
1979 p = htab->ovtab->contents;
1980 if (htab->params->ovly_flavour == ovly_soft_icache)
1984 h = define_ovtab_symbol (htab, "__icache_tag_array");
1987 h->root.u.def.value = 0;
1988 h->size = 16 << htab->num_lines_log2;
1991 h = define_ovtab_symbol (htab, "__icache_tag_array_size");
1994 h->root.u.def.value = 16 << htab->num_lines_log2;
1995 h->root.u.def.section = bfd_abs_section_ptr;
1997 h = define_ovtab_symbol (htab, "__icache_rewrite_to");
2000 h->root.u.def.value = off;
2001 h->size = 16 << htab->num_lines_log2;
2004 h = define_ovtab_symbol (htab, "__icache_rewrite_to_size");
2007 h->root.u.def.value = 16 << htab->num_lines_log2;
2008 h->root.u.def.section = bfd_abs_section_ptr;
2010 h = define_ovtab_symbol (htab, "__icache_rewrite_from");
2013 h->root.u.def.value = off;
2014 h->size = 16 << (htab->fromelem_size_log2 + htab->num_lines_log2);
2017 h = define_ovtab_symbol (htab, "__icache_rewrite_from_size");
2020 h->root.u.def.value = 16 << (htab->fromelem_size_log2
2021 + htab->num_lines_log2);
2022 h->root.u.def.section = bfd_abs_section_ptr;
2024 h = define_ovtab_symbol (htab, "__icache_log2_fromelemsize");
2027 h->root.u.def.value = htab->fromelem_size_log2;
2028 h->root.u.def.section = bfd_abs_section_ptr;
2030 h = define_ovtab_symbol (htab, "__icache_base");
2033 h->root.u.def.value = htab->ovl_sec[0]->vma;
2034 h->root.u.def.section = bfd_abs_section_ptr;
2035 h->size = htab->num_buf << htab->line_size_log2;
2037 h = define_ovtab_symbol (htab, "__icache_linesize");
2040 h->root.u.def.value = 1 << htab->line_size_log2;
2041 h->root.u.def.section = bfd_abs_section_ptr;
2043 h = define_ovtab_symbol (htab, "__icache_log2_linesize");
2046 h->root.u.def.value = htab->line_size_log2;
2047 h->root.u.def.section = bfd_abs_section_ptr;
2049 h = define_ovtab_symbol (htab, "__icache_neg_log2_linesize");
2052 h->root.u.def.value = -htab->line_size_log2;
2053 h->root.u.def.section = bfd_abs_section_ptr;
2055 h = define_ovtab_symbol (htab, "__icache_cachesize");
2058 h->root.u.def.value = 1 << (htab->num_lines_log2 + htab->line_size_log2);
2059 h->root.u.def.section = bfd_abs_section_ptr;
2061 h = define_ovtab_symbol (htab, "__icache_log2_cachesize");
2064 h->root.u.def.value = htab->num_lines_log2 + htab->line_size_log2;
2065 h->root.u.def.section = bfd_abs_section_ptr;
2067 h = define_ovtab_symbol (htab, "__icache_neg_log2_cachesize");
2070 h->root.u.def.value = -(htab->num_lines_log2 + htab->line_size_log2);
2071 h->root.u.def.section = bfd_abs_section_ptr;
2073 if (htab->init != NULL && htab->init->size != 0)
2075 htab->init->contents = bfd_zalloc (htab->init->owner,
2077 if (htab->init->contents == NULL)
2080 h = define_ovtab_symbol (htab, "__icache_fileoff");
2083 h->root.u.def.value = 0;
2084 h->root.u.def.section = htab->init;
2090 /* Write out _ovly_table. */
2091 /* set low bit of .size to mark non-overlay area as present. */
2093 obfd = htab->ovtab->output_section->owner;
2094 for (s = obfd->sections; s != NULL; s = s->next)
2096 unsigned int ovl_index = spu_elf_section_data (s)->u.o.ovl_index;
2100 unsigned long off = ovl_index * 16;
2101 unsigned int ovl_buf = spu_elf_section_data (s)->u.o.ovl_buf;
2103 bfd_put_32 (htab->ovtab->owner, s->vma, p + off);
2104 bfd_put_32 (htab->ovtab->owner, (s->size + 15) & -16,
2106 /* file_off written later in spu_elf_modify_program_headers. */
2107 bfd_put_32 (htab->ovtab->owner, ovl_buf, p + off + 12);
2111 h = define_ovtab_symbol (htab, "_ovly_table");
2114 h->root.u.def.value = 16;
2115 h->size = htab->num_overlays * 16;
2117 h = define_ovtab_symbol (htab, "_ovly_table_end");
2120 h->root.u.def.value = htab->num_overlays * 16 + 16;
2123 h = define_ovtab_symbol (htab, "_ovly_buf_table");
2126 h->root.u.def.value = htab->num_overlays * 16 + 16;
2127 h->size = htab->num_buf * 4;
2129 h = define_ovtab_symbol (htab, "_ovly_buf_table_end");
2132 h->root.u.def.value = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
2136 h = define_ovtab_symbol (htab, "_EAR_");
2139 h->root.u.def.section = htab->toe;
2140 h->root.u.def.value = 0;
2146 /* Check that all loadable section VMAs lie in the range
2147 LO .. HI inclusive, and stash some parameters for --auto-overlay. */
2150 spu_elf_check_vma (struct bfd_link_info *info)
2152 struct elf_segment_map *m;
2154 struct spu_link_hash_table *htab = spu_hash_table (info);
2155 bfd *abfd = info->output_bfd;
2156 bfd_vma hi = htab->params->local_store_hi;
2157 bfd_vma lo = htab->params->local_store_lo;
2159 htab->local_store = hi + 1 - lo;
2161 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2162 if (m->p_type == PT_LOAD)
2163 for (i = 0; i < m->count; i++)
2164 if (m->sections[i]->size != 0
2165 && (m->sections[i]->vma < lo
2166 || m->sections[i]->vma > hi
2167 || m->sections[i]->vma + m->sections[i]->size - 1 > hi))
2168 return m->sections[i];
2173 /* OFFSET in SEC (presumably) is the beginning of a function prologue.
2174 Search for stack adjusting insns, and return the sp delta.
2175 If a store of lr is found save the instruction offset to *LR_STORE.
2176 If a stack adjusting instruction is found, save that offset to
2180 find_function_stack_adjust (asection *sec,
2187 memset (reg, 0, sizeof (reg));
2188 for ( ; offset + 4 <= sec->size; offset += 4)
2190 unsigned char buf[4];
2194 /* Assume no relocs on stack adjusing insns. */
2195 if (!bfd_get_section_contents (sec->owner, sec, buf, offset, 4))
2199 ra = ((buf[2] & 0x3f) << 1) | (buf[3] >> 7);
2201 if (buf[0] == 0x24 /* stqd */)
2203 if (rt == 0 /* lr */ && ra == 1 /* sp */)
2208 /* Partly decoded immediate field. */
2209 imm = (buf[1] << 9) | (buf[2] << 1) | (buf[3] >> 7);
2211 if (buf[0] == 0x1c /* ai */)
2214 imm = (imm ^ 0x200) - 0x200;
2215 reg[rt] = reg[ra] + imm;
2217 if (rt == 1 /* sp */)
2221 *sp_adjust = offset;
2225 else if (buf[0] == 0x18 && (buf[1] & 0xe0) == 0 /* a */)
2227 int rb = ((buf[1] & 0x1f) << 2) | ((buf[2] & 0xc0) >> 6);
2229 reg[rt] = reg[ra] + reg[rb];
2234 *sp_adjust = offset;
2238 else if (buf[0] == 0x08 && (buf[1] & 0xe0) == 0 /* sf */)
2240 int rb = ((buf[1] & 0x1f) << 2) | ((buf[2] & 0xc0) >> 6);
2242 reg[rt] = reg[rb] - reg[ra];
2247 *sp_adjust = offset;
2251 else if ((buf[0] & 0xfc) == 0x40 /* il, ilh, ilhu, ila */)
2253 if (buf[0] >= 0x42 /* ila */)
2254 imm |= (buf[0] & 1) << 17;
2259 if (buf[0] == 0x40 /* il */)
2261 if ((buf[1] & 0x80) == 0)
2263 imm = (imm ^ 0x8000) - 0x8000;
2265 else if ((buf[1] & 0x80) == 0 /* ilhu */)
2271 else if (buf[0] == 0x60 && (buf[1] & 0x80) != 0 /* iohl */)
2273 reg[rt] |= imm & 0xffff;
2276 else if (buf[0] == 0x04 /* ori */)
2279 imm = (imm ^ 0x200) - 0x200;
2280 reg[rt] = reg[ra] | imm;
2283 else if (buf[0] == 0x32 && (buf[1] & 0x80) != 0 /* fsmbi */)
2285 reg[rt] = ( ((imm & 0x8000) ? 0xff000000 : 0)
2286 | ((imm & 0x4000) ? 0x00ff0000 : 0)
2287 | ((imm & 0x2000) ? 0x0000ff00 : 0)
2288 | ((imm & 0x1000) ? 0x000000ff : 0));
2291 else if (buf[0] == 0x16 /* andbi */)
2297 reg[rt] = reg[ra] & imm;
2300 else if (buf[0] == 0x33 && imm == 1 /* brsl .+4 */)
2302 /* Used in pic reg load. Say rt is trashed. Won't be used
2303 in stack adjust, but we need to continue past this branch. */
2307 else if (is_branch (buf) || is_indirect_branch (buf))
2308 /* If we hit a branch then we must be out of the prologue. */
2315 /* qsort predicate to sort symbols by section and value. */
2317 static Elf_Internal_Sym *sort_syms_syms;
2318 static asection **sort_syms_psecs;
2321 sort_syms (const void *a, const void *b)
2323 Elf_Internal_Sym *const *s1 = a;
2324 Elf_Internal_Sym *const *s2 = b;
2325 asection *sec1,*sec2;
2326 bfd_signed_vma delta;
2328 sec1 = sort_syms_psecs[*s1 - sort_syms_syms];
2329 sec2 = sort_syms_psecs[*s2 - sort_syms_syms];
2332 return sec1->index - sec2->index;
2334 delta = (*s1)->st_value - (*s2)->st_value;
2336 return delta < 0 ? -1 : 1;
2338 delta = (*s2)->st_size - (*s1)->st_size;
2340 return delta < 0 ? -1 : 1;
2342 return *s1 < *s2 ? -1 : 1;
2345 /* Allocate a struct spu_elf_stack_info with MAX_FUN struct function_info
2346 entries for section SEC. */
2348 static struct spu_elf_stack_info *
2349 alloc_stack_info (asection *sec, int max_fun)
2351 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2354 amt = sizeof (struct spu_elf_stack_info);
2355 amt += (max_fun - 1) * sizeof (struct function_info);
2356 sec_data->u.i.stack_info = bfd_zmalloc (amt);
2357 if (sec_data->u.i.stack_info != NULL)
2358 sec_data->u.i.stack_info->max_fun = max_fun;
2359 return sec_data->u.i.stack_info;
2362 /* Add a new struct function_info describing a (part of a) function
2363 starting at SYM_H. Keep the array sorted by address. */
2365 static struct function_info *
2366 maybe_insert_function (asection *sec,
2369 bfd_boolean is_func)
2371 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2372 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2378 sinfo = alloc_stack_info (sec, 20);
2385 Elf_Internal_Sym *sym = sym_h;
2386 off = sym->st_value;
2387 size = sym->st_size;
2391 struct elf_link_hash_entry *h = sym_h;
2392 off = h->root.u.def.value;
2396 for (i = sinfo->num_fun; --i >= 0; )
2397 if (sinfo->fun[i].lo <= off)
2402 /* Don't add another entry for an alias, but do update some
2404 if (sinfo->fun[i].lo == off)
2406 /* Prefer globals over local syms. */
2407 if (global && !sinfo->fun[i].global)
2409 sinfo->fun[i].global = TRUE;
2410 sinfo->fun[i].u.h = sym_h;
2413 sinfo->fun[i].is_func = TRUE;
2414 return &sinfo->fun[i];
2416 /* Ignore a zero-size symbol inside an existing function. */
2417 else if (sinfo->fun[i].hi > off && size == 0)
2418 return &sinfo->fun[i];
2421 if (sinfo->num_fun >= sinfo->max_fun)
2423 bfd_size_type amt = sizeof (struct spu_elf_stack_info);
2424 bfd_size_type old = amt;
2426 old += (sinfo->max_fun - 1) * sizeof (struct function_info);
2427 sinfo->max_fun += 20 + (sinfo->max_fun >> 1);
2428 amt += (sinfo->max_fun - 1) * sizeof (struct function_info);
2429 sinfo = bfd_realloc (sinfo, amt);
2432 memset ((char *) sinfo + old, 0, amt - old);
2433 sec_data->u.i.stack_info = sinfo;
2436 if (++i < sinfo->num_fun)
2437 memmove (&sinfo->fun[i + 1], &sinfo->fun[i],
2438 (sinfo->num_fun - i) * sizeof (sinfo->fun[i]));
2439 sinfo->fun[i].is_func = is_func;
2440 sinfo->fun[i].global = global;
2441 sinfo->fun[i].sec = sec;
2443 sinfo->fun[i].u.h = sym_h;
2445 sinfo->fun[i].u.sym = sym_h;
2446 sinfo->fun[i].lo = off;
2447 sinfo->fun[i].hi = off + size;
2448 sinfo->fun[i].lr_store = -1;
2449 sinfo->fun[i].sp_adjust = -1;
2450 sinfo->fun[i].stack = -find_function_stack_adjust (sec, off,
2451 &sinfo->fun[i].lr_store,
2452 &sinfo->fun[i].sp_adjust);
2453 sinfo->num_fun += 1;
2454 return &sinfo->fun[i];
2457 /* Return the name of FUN. */
2460 func_name (struct function_info *fun)
2464 Elf_Internal_Shdr *symtab_hdr;
2466 while (fun->start != NULL)
2470 return fun->u.h->root.root.string;
2473 if (fun->u.sym->st_name == 0)
2475 size_t len = strlen (sec->name);
2476 char *name = bfd_malloc (len + 10);
2479 sprintf (name, "%s+%lx", sec->name,
2480 (unsigned long) fun->u.sym->st_value & 0xffffffff);
2484 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2485 return bfd_elf_sym_name (ibfd, symtab_hdr, fun->u.sym, sec);
2488 /* Read the instruction at OFF in SEC. Return true iff the instruction
2489 is a nop, lnop, or stop 0 (all zero insn). */
2492 is_nop (asection *sec, bfd_vma off)
2494 unsigned char insn[4];
2496 if (off + 4 > sec->size
2497 || !bfd_get_section_contents (sec->owner, sec, insn, off, 4))
2499 if ((insn[0] & 0xbf) == 0 && (insn[1] & 0xe0) == 0x20)
2501 if (insn[0] == 0 && insn[1] == 0 && insn[2] == 0 && insn[3] == 0)
2506 /* Extend the range of FUN to cover nop padding up to LIMIT.
2507 Return TRUE iff some instruction other than a NOP was found. */
2510 insns_at_end (struct function_info *fun, bfd_vma limit)
2512 bfd_vma off = (fun->hi + 3) & -4;
2514 while (off < limit && is_nop (fun->sec, off))
2525 /* Check and fix overlapping function ranges. Return TRUE iff there
2526 are gaps in the current info we have about functions in SEC. */
2529 check_function_ranges (asection *sec, struct bfd_link_info *info)
2531 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2532 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2534 bfd_boolean gaps = FALSE;
2539 for (i = 1; i < sinfo->num_fun; i++)
2540 if (sinfo->fun[i - 1].hi > sinfo->fun[i].lo)
2542 /* Fix overlapping symbols. */
2543 const char *f1 = func_name (&sinfo->fun[i - 1]);
2544 const char *f2 = func_name (&sinfo->fun[i]);
2546 info->callbacks->einfo (_("warning: %s overlaps %s\n"), f1, f2);
2547 sinfo->fun[i - 1].hi = sinfo->fun[i].lo;
2549 else if (insns_at_end (&sinfo->fun[i - 1], sinfo->fun[i].lo))
2552 if (sinfo->num_fun == 0)
2556 if (sinfo->fun[0].lo != 0)
2558 if (sinfo->fun[sinfo->num_fun - 1].hi > sec->size)
2560 const char *f1 = func_name (&sinfo->fun[sinfo->num_fun - 1]);
2562 info->callbacks->einfo (_("warning: %s exceeds section size\n"), f1);
2563 sinfo->fun[sinfo->num_fun - 1].hi = sec->size;
2565 else if (insns_at_end (&sinfo->fun[sinfo->num_fun - 1], sec->size))
2571 /* Search current function info for a function that contains address
2572 OFFSET in section SEC. */
2574 static struct function_info *
2575 find_function (asection *sec, bfd_vma offset, struct bfd_link_info *info)
2577 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
2578 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
2582 hi = sinfo->num_fun;
2585 mid = (lo + hi) / 2;
2586 if (offset < sinfo->fun[mid].lo)
2588 else if (offset >= sinfo->fun[mid].hi)
2591 return &sinfo->fun[mid];
2593 info->callbacks->einfo (_("%A:0x%v not found in function table\n"),
2595 bfd_set_error (bfd_error_bad_value);
2599 /* Add CALLEE to CALLER call list if not already present. Return TRUE
2600 if CALLEE was new. If this function return FALSE, CALLEE should
2604 insert_callee (struct function_info *caller, struct call_info *callee)
2606 struct call_info **pp, *p;
2608 for (pp = &caller->call_list; (p = *pp) != NULL; pp = &p->next)
2609 if (p->fun == callee->fun)
2611 /* Tail calls use less stack than normal calls. Retain entry
2612 for normal call over one for tail call. */
2613 p->is_tail &= callee->is_tail;
2616 p->fun->start = NULL;
2617 p->fun->is_func = TRUE;
2619 p->count += callee->count;
2620 /* Reorder list so most recent call is first. */
2622 p->next = caller->call_list;
2623 caller->call_list = p;
2626 callee->next = caller->call_list;
2627 caller->call_list = callee;
2631 /* Copy CALL and insert the copy into CALLER. */
2634 copy_callee (struct function_info *caller, const struct call_info *call)
2636 struct call_info *callee;
2637 callee = bfd_malloc (sizeof (*callee));
2641 if (!insert_callee (caller, callee))
2646 /* We're only interested in code sections. Testing SEC_IN_MEMORY excludes
2647 overlay stub sections. */
2650 interesting_section (asection *s)
2652 return (s->output_section != bfd_abs_section_ptr
2653 && ((s->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_IN_MEMORY))
2654 == (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2658 /* Rummage through the relocs for SEC, looking for function calls.
2659 If CALL_TREE is true, fill in call graph. If CALL_TREE is false,
2660 mark destination symbols on calls as being functions. Also
2661 look at branches, which may be tail calls or go to hot/cold
2662 section part of same function. */
2665 mark_functions_via_relocs (asection *sec,
2666 struct bfd_link_info *info,
2669 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
2670 Elf_Internal_Shdr *symtab_hdr;
2672 unsigned int priority = 0;
2673 static bfd_boolean warned;
2675 if (!interesting_section (sec)
2676 || sec->reloc_count == 0)
2679 internal_relocs = _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL,
2681 if (internal_relocs == NULL)
2684 symtab_hdr = &elf_tdata (sec->owner)->symtab_hdr;
2685 psyms = &symtab_hdr->contents;
2686 irela = internal_relocs;
2687 irelaend = irela + sec->reloc_count;
2688 for (; irela < irelaend; irela++)
2690 enum elf_spu_reloc_type r_type;
2691 unsigned int r_indx;
2693 Elf_Internal_Sym *sym;
2694 struct elf_link_hash_entry *h;
2696 bfd_boolean reject, is_call;
2697 struct function_info *caller;
2698 struct call_info *callee;
2701 r_type = ELF32_R_TYPE (irela->r_info);
2702 if (r_type != R_SPU_REL16
2703 && r_type != R_SPU_ADDR16)
2706 if (!(call_tree && spu_hash_table (info)->params->auto_overlay))
2710 r_indx = ELF32_R_SYM (irela->r_info);
2711 if (!get_sym_h (&h, &sym, &sym_sec, psyms, r_indx, sec->owner))
2715 || sym_sec->output_section == bfd_abs_section_ptr)
2721 unsigned char insn[4];
2723 if (!bfd_get_section_contents (sec->owner, sec, insn,
2724 irela->r_offset, 4))
2726 if (is_branch (insn))
2728 is_call = (insn[0] & 0xfd) == 0x31;
2729 priority = insn[1] & 0x0f;
2731 priority |= insn[2];
2733 priority |= insn[3];
2735 if ((sym_sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2736 != (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2739 info->callbacks->einfo
2740 (_("%B(%A+0x%v): call to non-code section"
2741 " %B(%A), analysis incomplete\n"),
2742 sec->owner, sec, irela->r_offset,
2743 sym_sec->owner, sym_sec);
2751 if (!(call_tree && spu_hash_table (info)->params->auto_overlay)
2759 /* For --auto-overlay, count possible stubs we need for
2760 function pointer references. */
2761 unsigned int sym_type;
2765 sym_type = ELF_ST_TYPE (sym->st_info);
2766 if (sym_type == STT_FUNC)
2767 spu_hash_table (info)->non_ovly_stub += 1;
2772 val = h->root.u.def.value;
2774 val = sym->st_value;
2775 val += irela->r_addend;
2779 struct function_info *fun;
2781 if (irela->r_addend != 0)
2783 Elf_Internal_Sym *fake = bfd_zmalloc (sizeof (*fake));
2786 fake->st_value = val;
2788 = _bfd_elf_section_from_bfd_section (sym_sec->owner, sym_sec);
2792 fun = maybe_insert_function (sym_sec, sym, FALSE, is_call);
2794 fun = maybe_insert_function (sym_sec, h, TRUE, is_call);
2797 if (irela->r_addend != 0
2798 && fun->u.sym != sym)
2803 caller = find_function (sec, irela->r_offset, info);
2806 callee = bfd_malloc (sizeof *callee);
2810 callee->fun = find_function (sym_sec, val, info);
2811 if (callee->fun == NULL)
2813 callee->is_tail = !is_call;
2814 callee->is_pasted = FALSE;
2815 callee->broken_cycle = FALSE;
2816 callee->priority = priority;
2818 if (callee->fun->last_caller != sec)
2820 callee->fun->last_caller = sec;
2821 callee->fun->call_count += 1;
2823 if (!insert_callee (caller, callee))
2826 && !callee->fun->is_func
2827 && callee->fun->stack == 0)
2829 /* This is either a tail call or a branch from one part of
2830 the function to another, ie. hot/cold section. If the
2831 destination has been called by some other function then
2832 it is a separate function. We also assume that functions
2833 are not split across input files. */
2834 if (sec->owner != sym_sec->owner)
2836 callee->fun->start = NULL;
2837 callee->fun->is_func = TRUE;
2839 else if (callee->fun->start == NULL)
2841 struct function_info *caller_start = caller;
2842 while (caller_start->start)
2843 caller_start = caller_start->start;
2845 if (caller_start != callee->fun)
2846 callee->fun->start = caller_start;
2850 struct function_info *callee_start;
2851 struct function_info *caller_start;
2852 callee_start = callee->fun;
2853 while (callee_start->start)
2854 callee_start = callee_start->start;
2855 caller_start = caller;
2856 while (caller_start->start)
2857 caller_start = caller_start->start;
2858 if (caller_start != callee_start)
2860 callee->fun->start = NULL;
2861 callee->fun->is_func = TRUE;
2870 /* Handle something like .init or .fini, which has a piece of a function.
2871 These sections are pasted together to form a single function. */
2874 pasted_function (asection *sec)
2876 struct bfd_link_order *l;
2877 struct _spu_elf_section_data *sec_data;
2878 struct spu_elf_stack_info *sinfo;
2879 Elf_Internal_Sym *fake;
2880 struct function_info *fun, *fun_start;
2882 fake = bfd_zmalloc (sizeof (*fake));
2886 fake->st_size = sec->size;
2888 = _bfd_elf_section_from_bfd_section (sec->owner, sec);
2889 fun = maybe_insert_function (sec, fake, FALSE, FALSE);
2893 /* Find a function immediately preceding this section. */
2895 for (l = sec->output_section->map_head.link_order; l != NULL; l = l->next)
2897 if (l->u.indirect.section == sec)
2899 if (fun_start != NULL)
2901 struct call_info *callee = bfd_malloc (sizeof *callee);
2905 fun->start = fun_start;
2907 callee->is_tail = TRUE;
2908 callee->is_pasted = TRUE;
2909 callee->broken_cycle = FALSE;
2910 callee->priority = 0;
2912 if (!insert_callee (fun_start, callee))
2918 if (l->type == bfd_indirect_link_order
2919 && (sec_data = spu_elf_section_data (l->u.indirect.section)) != NULL
2920 && (sinfo = sec_data->u.i.stack_info) != NULL
2921 && sinfo->num_fun != 0)
2922 fun_start = &sinfo->fun[sinfo->num_fun - 1];
2925 /* Don't return an error if we did not find a function preceding this
2926 section. The section may have incorrect flags. */
2930 /* Map address ranges in code sections to functions. */
2933 discover_functions (struct bfd_link_info *info)
2937 Elf_Internal_Sym ***psym_arr;
2938 asection ***sec_arr;
2939 bfd_boolean gaps = FALSE;
2942 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2945 psym_arr = bfd_zmalloc (bfd_idx * sizeof (*psym_arr));
2946 if (psym_arr == NULL)
2948 sec_arr = bfd_zmalloc (bfd_idx * sizeof (*sec_arr));
2949 if (sec_arr == NULL)
2952 for (ibfd = info->input_bfds, bfd_idx = 0;
2954 ibfd = ibfd->link_next, bfd_idx++)
2956 extern const bfd_target bfd_elf32_spu_vec;
2957 Elf_Internal_Shdr *symtab_hdr;
2960 Elf_Internal_Sym *syms, *sy, **psyms, **psy;
2961 asection **psecs, **p;
2963 if (ibfd->xvec != &bfd_elf32_spu_vec)
2966 /* Read all the symbols. */
2967 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2968 symcount = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
2972 for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
2973 if (interesting_section (sec))
2981 if (symtab_hdr->contents != NULL)
2983 /* Don't use cached symbols since the generic ELF linker
2984 code only reads local symbols, and we need globals too. */
2985 free (symtab_hdr->contents);
2986 symtab_hdr->contents = NULL;
2988 syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, symcount, 0,
2990 symtab_hdr->contents = (void *) syms;
2994 /* Select defined function symbols that are going to be output. */
2995 psyms = bfd_malloc ((symcount + 1) * sizeof (*psyms));
2998 psym_arr[bfd_idx] = psyms;
2999 psecs = bfd_malloc (symcount * sizeof (*psecs));
3002 sec_arr[bfd_idx] = psecs;
3003 for (psy = psyms, p = psecs, sy = syms; sy < syms + symcount; ++p, ++sy)
3004 if (ELF_ST_TYPE (sy->st_info) == STT_NOTYPE
3005 || ELF_ST_TYPE (sy->st_info) == STT_FUNC)
3009 *p = s = bfd_section_from_elf_index (ibfd, sy->st_shndx);
3010 if (s != NULL && interesting_section (s))
3013 symcount = psy - psyms;
3016 /* Sort them by section and offset within section. */
3017 sort_syms_syms = syms;
3018 sort_syms_psecs = psecs;
3019 qsort (psyms, symcount, sizeof (*psyms), sort_syms);
3021 /* Now inspect the function symbols. */
3022 for (psy = psyms; psy < psyms + symcount; )
3024 asection *s = psecs[*psy - syms];
3025 Elf_Internal_Sym **psy2;
3027 for (psy2 = psy; ++psy2 < psyms + symcount; )
3028 if (psecs[*psy2 - syms] != s)
3031 if (!alloc_stack_info (s, psy2 - psy))
3036 /* First install info about properly typed and sized functions.
3037 In an ideal world this will cover all code sections, except
3038 when partitioning functions into hot and cold sections,
3039 and the horrible pasted together .init and .fini functions. */
3040 for (psy = psyms; psy < psyms + symcount; ++psy)
3043 if (ELF_ST_TYPE (sy->st_info) == STT_FUNC)
3045 asection *s = psecs[sy - syms];
3046 if (!maybe_insert_function (s, sy, FALSE, TRUE))
3051 for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
3052 if (interesting_section (sec))
3053 gaps |= check_function_ranges (sec, info);
3058 /* See if we can discover more function symbols by looking at
3060 for (ibfd = info->input_bfds, bfd_idx = 0;
3062 ibfd = ibfd->link_next, bfd_idx++)
3066 if (psym_arr[bfd_idx] == NULL)
3069 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3070 if (!mark_functions_via_relocs (sec, info, FALSE))
3074 for (ibfd = info->input_bfds, bfd_idx = 0;
3076 ibfd = ibfd->link_next, bfd_idx++)
3078 Elf_Internal_Shdr *symtab_hdr;
3080 Elf_Internal_Sym *syms, *sy, **psyms, **psy;
3083 if ((psyms = psym_arr[bfd_idx]) == NULL)
3086 psecs = sec_arr[bfd_idx];
3088 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3089 syms = (Elf_Internal_Sym *) symtab_hdr->contents;
3092 for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
3093 if (interesting_section (sec))
3094 gaps |= check_function_ranges (sec, info);
3098 /* Finally, install all globals. */
3099 for (psy = psyms; (sy = *psy) != NULL; ++psy)
3103 s = psecs[sy - syms];
3105 /* Global syms might be improperly typed functions. */
3106 if (ELF_ST_TYPE (sy->st_info) != STT_FUNC
3107 && ELF_ST_BIND (sy->st_info) == STB_GLOBAL)
3109 if (!maybe_insert_function (s, sy, FALSE, FALSE))
3115 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3117 extern const bfd_target bfd_elf32_spu_vec;
3120 if (ibfd->xvec != &bfd_elf32_spu_vec)
3123 /* Some of the symbols we've installed as marking the
3124 beginning of functions may have a size of zero. Extend
3125 the range of such functions to the beginning of the
3126 next symbol of interest. */
3127 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3128 if (interesting_section (sec))
3130 struct _spu_elf_section_data *sec_data;
3131 struct spu_elf_stack_info *sinfo;
3133 sec_data = spu_elf_section_data (sec);
3134 sinfo = sec_data->u.i.stack_info;
3135 if (sinfo != NULL && sinfo->num_fun != 0)
3138 bfd_vma hi = sec->size;
3140 for (fun_idx = sinfo->num_fun; --fun_idx >= 0; )
3142 sinfo->fun[fun_idx].hi = hi;
3143 hi = sinfo->fun[fun_idx].lo;
3146 sinfo->fun[0].lo = 0;
3148 /* No symbols in this section. Must be .init or .fini
3149 or something similar. */
3150 else if (!pasted_function (sec))
3156 for (ibfd = info->input_bfds, bfd_idx = 0;
3158 ibfd = ibfd->link_next, bfd_idx++)
3160 if (psym_arr[bfd_idx] == NULL)
3163 free (psym_arr[bfd_idx]);
3164 free (sec_arr[bfd_idx]);
3173 /* Iterate over all function_info we have collected, calling DOIT on
3174 each node if ROOT_ONLY is false. Only call DOIT on root nodes
3178 for_each_node (bfd_boolean (*doit) (struct function_info *,
3179 struct bfd_link_info *,
3181 struct bfd_link_info *info,
3187 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3189 extern const bfd_target bfd_elf32_spu_vec;
3192 if (ibfd->xvec != &bfd_elf32_spu_vec)
3195 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3197 struct _spu_elf_section_data *sec_data;
3198 struct spu_elf_stack_info *sinfo;
3200 if ((sec_data = spu_elf_section_data (sec)) != NULL
3201 && (sinfo = sec_data->u.i.stack_info) != NULL)
3204 for (i = 0; i < sinfo->num_fun; ++i)
3205 if (!root_only || !sinfo->fun[i].non_root)
3206 if (!doit (&sinfo->fun[i], info, param))
3214 /* Transfer call info attached to struct function_info entries for
3215 all of a given function's sections to the first entry. */
3218 transfer_calls (struct function_info *fun,
3219 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3220 void *param ATTRIBUTE_UNUSED)
3222 struct function_info *start = fun->start;
3226 struct call_info *call, *call_next;
3228 while (start->start != NULL)
3229 start = start->start;
3230 for (call = fun->call_list; call != NULL; call = call_next)
3232 call_next = call->next;
3233 if (!insert_callee (start, call))
3236 fun->call_list = NULL;
3241 /* Mark nodes in the call graph that are called by some other node. */
3244 mark_non_root (struct function_info *fun,
3245 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3246 void *param ATTRIBUTE_UNUSED)
3248 struct call_info *call;
3253 for (call = fun->call_list; call; call = call->next)
3255 call->fun->non_root = TRUE;
3256 mark_non_root (call->fun, 0, 0);
3261 /* Remove cycles from the call graph. Set depth of nodes. */
3264 remove_cycles (struct function_info *fun,
3265 struct bfd_link_info *info,
3268 struct call_info **callp, *call;
3269 unsigned int depth = *(unsigned int *) param;
3270 unsigned int max_depth = depth;
3274 fun->marking = TRUE;
3276 callp = &fun->call_list;
3277 while ((call = *callp) != NULL)
3279 call->max_depth = depth + !call->is_pasted;
3280 if (!call->fun->visit2)
3282 if (!remove_cycles (call->fun, info, &call->max_depth))
3284 if (max_depth < call->max_depth)
3285 max_depth = call->max_depth;
3287 else if (call->fun->marking)
3289 struct spu_link_hash_table *htab = spu_hash_table (info);
3291 if (!htab->params->auto_overlay
3292 && htab->params->stack_analysis)
3294 const char *f1 = func_name (fun);
3295 const char *f2 = func_name (call->fun);
3297 info->callbacks->info (_("Stack analysis will ignore the call "
3302 call->broken_cycle = TRUE;
3304 callp = &call->next;
3306 fun->marking = FALSE;
3307 *(unsigned int *) param = max_depth;
3311 /* Check that we actually visited all nodes in remove_cycles. If we
3312 didn't, then there is some cycle in the call graph not attached to
3313 any root node. Arbitrarily choose a node in the cycle as a new
3314 root and break the cycle. */
3317 mark_detached_root (struct function_info *fun,
3318 struct bfd_link_info *info,
3323 fun->non_root = FALSE;
3324 *(unsigned int *) param = 0;
3325 return remove_cycles (fun, info, param);
3328 /* Populate call_list for each function. */
3331 build_call_tree (struct bfd_link_info *info)
3336 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3338 extern const bfd_target bfd_elf32_spu_vec;
3341 if (ibfd->xvec != &bfd_elf32_spu_vec)
3344 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3345 if (!mark_functions_via_relocs (sec, info, TRUE))
3349 /* Transfer call info from hot/cold section part of function
3351 if (!spu_hash_table (info)->params->auto_overlay
3352 && !for_each_node (transfer_calls, info, 0, FALSE))
3355 /* Find the call graph root(s). */
3356 if (!for_each_node (mark_non_root, info, 0, FALSE))
3359 /* Remove cycles from the call graph. We start from the root node(s)
3360 so that we break cycles in a reasonable place. */
3362 if (!for_each_node (remove_cycles, info, &depth, TRUE))
3365 return for_each_node (mark_detached_root, info, &depth, FALSE);
3368 /* qsort predicate to sort calls by priority, max_depth then count. */
3371 sort_calls (const void *a, const void *b)
3373 struct call_info *const *c1 = a;
3374 struct call_info *const *c2 = b;
3377 delta = (*c2)->priority - (*c1)->priority;
3381 delta = (*c2)->max_depth - (*c1)->max_depth;
3385 delta = (*c2)->count - (*c1)->count;
3389 return (char *) c1 - (char *) c2;
3393 unsigned int max_overlay_size;
3396 /* Set linker_mark and gc_mark on any sections that we will put in
3397 overlays. These flags are used by the generic ELF linker, but we
3398 won't be continuing on to bfd_elf_final_link so it is OK to use
3399 them. linker_mark is clear before we get here. Set segment_mark
3400 on sections that are part of a pasted function (excluding the last
3403 Set up function rodata section if --overlay-rodata. We don't
3404 currently include merged string constant rodata sections since
3406 Sort the call graph so that the deepest nodes will be visited
3410 mark_overlay_section (struct function_info *fun,
3411 struct bfd_link_info *info,
3414 struct call_info *call;
3416 struct _mos_param *mos_param = param;
3417 struct spu_link_hash_table *htab = spu_hash_table (info);
3423 if (!fun->sec->linker_mark
3424 && (htab->params->ovly_flavour != ovly_soft_icache
3425 || htab->params->non_ia_text
3426 || strncmp (fun->sec->name, ".text.ia.", 9) == 0
3427 || strcmp (fun->sec->name, ".init") == 0
3428 || strcmp (fun->sec->name, ".fini") == 0))
3432 fun->sec->linker_mark = 1;
3433 fun->sec->gc_mark = 1;
3434 fun->sec->segment_mark = 0;
3435 /* Ensure SEC_CODE is set on this text section (it ought to
3436 be!), and SEC_CODE is clear on rodata sections. We use
3437 this flag to differentiate the two overlay section types. */
3438 fun->sec->flags |= SEC_CODE;
3440 size = fun->sec->size;
3441 if (htab->params->auto_overlay & OVERLAY_RODATA)
3445 /* Find the rodata section corresponding to this function's
3447 if (strcmp (fun->sec->name, ".text") == 0)
3449 name = bfd_malloc (sizeof (".rodata"));
3452 memcpy (name, ".rodata", sizeof (".rodata"));
3454 else if (strncmp (fun->sec->name, ".text.", 6) == 0)
3456 size_t len = strlen (fun->sec->name);
3457 name = bfd_malloc (len + 3);
3460 memcpy (name, ".rodata", sizeof (".rodata"));
3461 memcpy (name + 7, fun->sec->name + 5, len - 4);
3463 else if (strncmp (fun->sec->name, ".gnu.linkonce.t.", 16) == 0)
3465 size_t len = strlen (fun->sec->name) + 1;
3466 name = bfd_malloc (len);
3469 memcpy (name, fun->sec->name, len);
3475 asection *rodata = NULL;
3476 asection *group_sec = elf_section_data (fun->sec)->next_in_group;
3477 if (group_sec == NULL)
3478 rodata = bfd_get_section_by_name (fun->sec->owner, name);
3480 while (group_sec != NULL && group_sec != fun->sec)
3482 if (strcmp (group_sec->name, name) == 0)
3487 group_sec = elf_section_data (group_sec)->next_in_group;
3489 fun->rodata = rodata;
3492 size += fun->rodata->size;
3493 if (htab->params->line_size != 0
3494 && size > htab->params->line_size)
3496 size -= fun->rodata->size;
3501 fun->rodata->linker_mark = 1;
3502 fun->rodata->gc_mark = 1;
3503 fun->rodata->flags &= ~SEC_CODE;
3509 if (mos_param->max_overlay_size < size)
3510 mos_param->max_overlay_size = size;
3513 for (count = 0, call = fun->call_list; call != NULL; call = call->next)
3518 struct call_info **calls = bfd_malloc (count * sizeof (*calls));
3522 for (count = 0, call = fun->call_list; call != NULL; call = call->next)
3523 calls[count++] = call;
3525 qsort (calls, count, sizeof (*calls), sort_calls);
3527 fun->call_list = NULL;
3531 calls[count]->next = fun->call_list;
3532 fun->call_list = calls[count];
3537 for (call = fun->call_list; call != NULL; call = call->next)
3539 if (call->is_pasted)
3541 /* There can only be one is_pasted call per function_info. */
3542 BFD_ASSERT (!fun->sec->segment_mark);
3543 fun->sec->segment_mark = 1;
3545 if (!call->broken_cycle
3546 && !mark_overlay_section (call->fun, info, param))
3550 /* Don't put entry code into an overlay. The overlay manager needs
3551 a stack! Also, don't mark .ovl.init as an overlay. */
3552 if (fun->lo + fun->sec->output_offset + fun->sec->output_section->vma
3553 == info->output_bfd->start_address
3554 || strncmp (fun->sec->output_section->name, ".ovl.init", 9) == 0)
3556 fun->sec->linker_mark = 0;
3557 if (fun->rodata != NULL)
3558 fun->rodata->linker_mark = 0;
3563 /* If non-zero then unmark functions called from those within sections
3564 that we need to unmark. Unfortunately this isn't reliable since the
3565 call graph cannot know the destination of function pointer calls. */
3566 #define RECURSE_UNMARK 0
3569 asection *exclude_input_section;
3570 asection *exclude_output_section;
3571 unsigned long clearing;
3574 /* Undo some of mark_overlay_section's work. */
3577 unmark_overlay_section (struct function_info *fun,
3578 struct bfd_link_info *info,
3581 struct call_info *call;
3582 struct _uos_param *uos_param = param;
3583 unsigned int excluded = 0;
3591 if (fun->sec == uos_param->exclude_input_section
3592 || fun->sec->output_section == uos_param->exclude_output_section)
3596 uos_param->clearing += excluded;
3598 if (RECURSE_UNMARK ? uos_param->clearing : excluded)
3600 fun->sec->linker_mark = 0;
3602 fun->rodata->linker_mark = 0;
3605 for (call = fun->call_list; call != NULL; call = call->next)
3606 if (!call->broken_cycle
3607 && !unmark_overlay_section (call->fun, info, param))
3611 uos_param->clearing -= excluded;
3616 unsigned int lib_size;
3617 asection **lib_sections;
3620 /* Add sections we have marked as belonging to overlays to an array
3621 for consideration as non-overlay sections. The array consist of
3622 pairs of sections, (text,rodata), for functions in the call graph. */
3625 collect_lib_sections (struct function_info *fun,
3626 struct bfd_link_info *info,
3629 struct _cl_param *lib_param = param;
3630 struct call_info *call;
3637 if (!fun->sec->linker_mark || !fun->sec->gc_mark || fun->sec->segment_mark)
3640 size = fun->sec->size;
3642 size += fun->rodata->size;
3644 if (size <= lib_param->lib_size)
3646 *lib_param->lib_sections++ = fun->sec;
3647 fun->sec->gc_mark = 0;
3648 if (fun->rodata && fun->rodata->linker_mark && fun->rodata->gc_mark)
3650 *lib_param->lib_sections++ = fun->rodata;
3651 fun->rodata->gc_mark = 0;
3654 *lib_param->lib_sections++ = NULL;
3657 for (call = fun->call_list; call != NULL; call = call->next)
3658 if (!call->broken_cycle)
3659 collect_lib_sections (call->fun, info, param);
3664 /* qsort predicate to sort sections by call count. */
3667 sort_lib (const void *a, const void *b)
3669 asection *const *s1 = a;
3670 asection *const *s2 = b;
3671 struct _spu_elf_section_data *sec_data;
3672 struct spu_elf_stack_info *sinfo;
3676 if ((sec_data = spu_elf_section_data (*s1)) != NULL
3677 && (sinfo = sec_data->u.i.stack_info) != NULL)
3680 for (i = 0; i < sinfo->num_fun; ++i)
3681 delta -= sinfo->fun[i].call_count;
3684 if ((sec_data = spu_elf_section_data (*s2)) != NULL
3685 && (sinfo = sec_data->u.i.stack_info) != NULL)
3688 for (i = 0; i < sinfo->num_fun; ++i)
3689 delta += sinfo->fun[i].call_count;
3698 /* Remove some sections from those marked to be in overlays. Choose
3699 those that are called from many places, likely library functions. */
3702 auto_ovl_lib_functions (struct bfd_link_info *info, unsigned int lib_size)
3705 asection **lib_sections;
3706 unsigned int i, lib_count;
3707 struct _cl_param collect_lib_param;
3708 struct function_info dummy_caller;
3709 struct spu_link_hash_table *htab;
3711 memset (&dummy_caller, 0, sizeof (dummy_caller));
3713 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3715 extern const bfd_target bfd_elf32_spu_vec;
3718 if (ibfd->xvec != &bfd_elf32_spu_vec)
3721 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
3722 if (sec->linker_mark
3723 && sec->size < lib_size
3724 && (sec->flags & SEC_CODE) != 0)
3727 lib_sections = bfd_malloc (lib_count * 2 * sizeof (*lib_sections));
3728 if (lib_sections == NULL)
3729 return (unsigned int) -1;
3730 collect_lib_param.lib_size = lib_size;
3731 collect_lib_param.lib_sections = lib_sections;
3732 if (!for_each_node (collect_lib_sections, info, &collect_lib_param,
3734 return (unsigned int) -1;
3735 lib_count = (collect_lib_param.lib_sections - lib_sections) / 2;
3737 /* Sort sections so that those with the most calls are first. */
3739 qsort (lib_sections, lib_count, 2 * sizeof (*lib_sections), sort_lib);
3741 htab = spu_hash_table (info);
3742 for (i = 0; i < lib_count; i++)
3744 unsigned int tmp, stub_size;
3746 struct _spu_elf_section_data *sec_data;
3747 struct spu_elf_stack_info *sinfo;
3749 sec = lib_sections[2 * i];
3750 /* If this section is OK, its size must be less than lib_size. */
3752 /* If it has a rodata section, then add that too. */
3753 if (lib_sections[2 * i + 1])
3754 tmp += lib_sections[2 * i + 1]->size;
3755 /* Add any new overlay call stubs needed by the section. */
3758 && (sec_data = spu_elf_section_data (sec)) != NULL
3759 && (sinfo = sec_data->u.i.stack_info) != NULL)
3762 struct call_info *call;
3764 for (k = 0; k < sinfo->num_fun; ++k)
3765 for (call = sinfo->fun[k].call_list; call; call = call->next)
3766 if (call->fun->sec->linker_mark)
3768 struct call_info *p;
3769 for (p = dummy_caller.call_list; p; p = p->next)
3770 if (p->fun == call->fun)
3773 stub_size += ovl_stub_size (htab->params);
3776 if (tmp + stub_size < lib_size)
3778 struct call_info **pp, *p;
3780 /* This section fits. Mark it as non-overlay. */
3781 lib_sections[2 * i]->linker_mark = 0;
3782 if (lib_sections[2 * i + 1])
3783 lib_sections[2 * i + 1]->linker_mark = 0;
3784 lib_size -= tmp + stub_size;
3785 /* Call stubs to the section we just added are no longer
3787 pp = &dummy_caller.call_list;
3788 while ((p = *pp) != NULL)
3789 if (!p->fun->sec->linker_mark)
3791 lib_size += ovl_stub_size (htab->params);
3797 /* Add new call stubs to dummy_caller. */
3798 if ((sec_data = spu_elf_section_data (sec)) != NULL
3799 && (sinfo = sec_data->u.i.stack_info) != NULL)
3802 struct call_info *call;
3804 for (k = 0; k < sinfo->num_fun; ++k)
3805 for (call = sinfo->fun[k].call_list;
3808 if (call->fun->sec->linker_mark)
3810 struct call_info *callee;
3811 callee = bfd_malloc (sizeof (*callee));
3813 return (unsigned int) -1;
3815 if (!insert_callee (&dummy_caller, callee))
3821 while (dummy_caller.call_list != NULL)
3823 struct call_info *call = dummy_caller.call_list;
3824 dummy_caller.call_list = call->next;
3827 for (i = 0; i < 2 * lib_count; i++)
3828 if (lib_sections[i])
3829 lib_sections[i]->gc_mark = 1;
3830 free (lib_sections);
3834 /* Build an array of overlay sections. The deepest node's section is
3835 added first, then its parent node's section, then everything called
3836 from the parent section. The idea being to group sections to
3837 minimise calls between different overlays. */
3840 collect_overlays (struct function_info *fun,
3841 struct bfd_link_info *info,
3844 struct call_info *call;
3845 bfd_boolean added_fun;
3846 asection ***ovly_sections = param;
3852 for (call = fun->call_list; call != NULL; call = call->next)
3853 if (!call->is_pasted && !call->broken_cycle)
3855 if (!collect_overlays (call->fun, info, ovly_sections))
3861 if (fun->sec->linker_mark && fun->sec->gc_mark)
3863 fun->sec->gc_mark = 0;
3864 *(*ovly_sections)++ = fun->sec;
3865 if (fun->rodata && fun->rodata->linker_mark && fun->rodata->gc_mark)
3867 fun->rodata->gc_mark = 0;
3868 *(*ovly_sections)++ = fun->rodata;
3871 *(*ovly_sections)++ = NULL;
3874 /* Pasted sections must stay with the first section. We don't
3875 put pasted sections in the array, just the first section.
3876 Mark subsequent sections as already considered. */
3877 if (fun->sec->segment_mark)
3879 struct function_info *call_fun = fun;
3882 for (call = call_fun->call_list; call != NULL; call = call->next)
3883 if (call->is_pasted)
3885 call_fun = call->fun;
3886 call_fun->sec->gc_mark = 0;
3887 if (call_fun->rodata)
3888 call_fun->rodata->gc_mark = 0;
3894 while (call_fun->sec->segment_mark);
3898 for (call = fun->call_list; call != NULL; call = call->next)
3899 if (!call->broken_cycle
3900 && !collect_overlays (call->fun, info, ovly_sections))
3905 struct _spu_elf_section_data *sec_data;
3906 struct spu_elf_stack_info *sinfo;
3908 if ((sec_data = spu_elf_section_data (fun->sec)) != NULL
3909 && (sinfo = sec_data->u.i.stack_info) != NULL)
3912 for (i = 0; i < sinfo->num_fun; ++i)
3913 if (!collect_overlays (&sinfo->fun[i], info, ovly_sections))
3921 struct _sum_stack_param {
3923 size_t overall_stack;
3924 bfd_boolean emit_stack_syms;
3927 /* Descend the call graph for FUN, accumulating total stack required. */
3930 sum_stack (struct function_info *fun,
3931 struct bfd_link_info *info,
3934 struct call_info *call;
3935 struct function_info *max;
3936 size_t stack, cum_stack;
3938 bfd_boolean has_call;
3939 struct _sum_stack_param *sum_stack_param = param;
3940 struct spu_link_hash_table *htab;
3942 cum_stack = fun->stack;
3943 sum_stack_param->cum_stack = cum_stack;
3949 for (call = fun->call_list; call; call = call->next)
3951 if (call->broken_cycle)
3953 if (!call->is_pasted)
3955 if (!sum_stack (call->fun, info, sum_stack_param))
3957 stack = sum_stack_param->cum_stack;
3958 /* Include caller stack for normal calls, don't do so for
3959 tail calls. fun->stack here is local stack usage for
3961 if (!call->is_tail || call->is_pasted || call->fun->start != NULL)
3962 stack += fun->stack;
3963 if (cum_stack < stack)
3970 sum_stack_param->cum_stack = cum_stack;
3972 /* Now fun->stack holds cumulative stack. */
3973 fun->stack = cum_stack;
3977 && sum_stack_param->overall_stack < cum_stack)
3978 sum_stack_param->overall_stack = cum_stack;
3980 htab = spu_hash_table (info);
3981 if (htab->params->auto_overlay)
3984 f1 = func_name (fun);
3985 if (htab->params->stack_analysis)
3988 info->callbacks->info (_(" %s: 0x%v\n"), f1, (bfd_vma) cum_stack);
3989 info->callbacks->minfo (_("%s: 0x%v 0x%v\n"),
3990 f1, (bfd_vma) stack, (bfd_vma) cum_stack);
3994 info->callbacks->minfo (_(" calls:\n"));
3995 for (call = fun->call_list; call; call = call->next)
3996 if (!call->is_pasted && !call->broken_cycle)
3998 const char *f2 = func_name (call->fun);
3999 const char *ann1 = call->fun == max ? "*" : " ";
4000 const char *ann2 = call->is_tail ? "t" : " ";
4002 info->callbacks->minfo (_(" %s%s %s\n"), ann1, ann2, f2);
4007 if (sum_stack_param->emit_stack_syms)
4009 char *name = bfd_malloc (18 + strlen (f1));
4010 struct elf_link_hash_entry *h;
4015 if (fun->global || ELF_ST_BIND (fun->u.sym->st_info) == STB_GLOBAL)
4016 sprintf (name, "__stack_%s", f1);
4018 sprintf (name, "__stack_%x_%s", fun->sec->id & 0xffffffff, f1);
4020 h = elf_link_hash_lookup (&htab->elf, name, TRUE, TRUE, FALSE);
4023 && (h->root.type == bfd_link_hash_new
4024 || h->root.type == bfd_link_hash_undefined
4025 || h->root.type == bfd_link_hash_undefweak))
4027 h->root.type = bfd_link_hash_defined;
4028 h->root.u.def.section = bfd_abs_section_ptr;
4029 h->root.u.def.value = cum_stack;
4034 h->ref_regular_nonweak = 1;
4035 h->forced_local = 1;
4043 /* SEC is part of a pasted function. Return the call_info for the
4044 next section of this function. */
4046 static struct call_info *
4047 find_pasted_call (asection *sec)
4049 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
4050 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
4051 struct call_info *call;
4054 for (k = 0; k < sinfo->num_fun; ++k)
4055 for (call = sinfo->fun[k].call_list; call != NULL; call = call->next)
4056 if (call->is_pasted)
4062 /* qsort predicate to sort bfds by file name. */
4065 sort_bfds (const void *a, const void *b)
4067 bfd *const *abfd1 = a;
4068 bfd *const *abfd2 = b;
4070 return strcmp ((*abfd1)->filename, (*abfd2)->filename);
4074 print_one_overlay_section (FILE *script,
4077 unsigned int ovlynum,
4078 unsigned int *ovly_map,
4079 asection **ovly_sections,
4080 struct bfd_link_info *info)
4084 for (j = base; j < count && ovly_map[j] == ovlynum; j++)
4086 asection *sec = ovly_sections[2 * j];
4088 if (fprintf (script, " %s%c%s (%s)\n",
4089 (sec->owner->my_archive != NULL
4090 ? sec->owner->my_archive->filename : ""),
4091 info->path_separator,
4092 sec->owner->filename,
4095 if (sec->segment_mark)
4097 struct call_info *call = find_pasted_call (sec);
4098 while (call != NULL)
4100 struct function_info *call_fun = call->fun;
4101 sec = call_fun->sec;
4102 if (fprintf (script, " %s%c%s (%s)\n",
4103 (sec->owner->my_archive != NULL
4104 ? sec->owner->my_archive->filename : ""),
4105 info->path_separator,
4106 sec->owner->filename,
4109 for (call = call_fun->call_list; call; call = call->next)
4110 if (call->is_pasted)
4116 for (j = base; j < count && ovly_map[j] == ovlynum; j++)
4118 asection *sec = ovly_sections[2 * j + 1];
4120 && fprintf (script, " %s%c%s (%s)\n",
4121 (sec->owner->my_archive != NULL
4122 ? sec->owner->my_archive->filename : ""),
4123 info->path_separator,
4124 sec->owner->filename,
4128 sec = ovly_sections[2 * j];
4129 if (sec->segment_mark)
4131 struct call_info *call = find_pasted_call (sec);
4132 while (call != NULL)
4134 struct function_info *call_fun = call->fun;
4135 sec = call_fun->rodata;
4137 && fprintf (script, " %s%c%s (%s)\n",
4138 (sec->owner->my_archive != NULL
4139 ? sec->owner->my_archive->filename : ""),
4140 info->path_separator,
4141 sec->owner->filename,
4144 for (call = call_fun->call_list; call; call = call->next)
4145 if (call->is_pasted)
4154 /* Handle --auto-overlay. */
4157 spu_elf_auto_overlay (struct bfd_link_info *info)
4161 struct elf_segment_map *m;
4162 unsigned int fixed_size, lo, hi;
4163 struct spu_link_hash_table *htab;
4164 unsigned int base, i, count, bfd_count;
4165 unsigned int region, ovlynum;
4166 asection **ovly_sections, **ovly_p;
4167 unsigned int *ovly_map;
4169 unsigned int total_overlay_size, overlay_size;
4170 const char *ovly_mgr_entry;
4171 struct elf_link_hash_entry *h;
4172 struct _mos_param mos_param;
4173 struct _uos_param uos_param;
4174 struct function_info dummy_caller;
4176 /* Find the extents of our loadable image. */
4177 lo = (unsigned int) -1;
4179 for (m = elf_tdata (info->output_bfd)->segment_map; m != NULL; m = m->next)
4180 if (m->p_type == PT_LOAD)
4181 for (i = 0; i < m->count; i++)
4182 if (m->sections[i]->size != 0)
4184 if (m->sections[i]->vma < lo)
4185 lo = m->sections[i]->vma;
4186 if (m->sections[i]->vma + m->sections[i]->size - 1 > hi)
4187 hi = m->sections[i]->vma + m->sections[i]->size - 1;
4189 fixed_size = hi + 1 - lo;
4191 if (!discover_functions (info))
4194 if (!build_call_tree (info))
4197 htab = spu_hash_table (info);
4198 if (htab->reserved == 0)
4200 struct _sum_stack_param sum_stack_param;
4202 sum_stack_param.emit_stack_syms = 0;
4203 sum_stack_param.overall_stack = 0;
4204 if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
4206 htab->reserved = sum_stack_param.overall_stack + htab->extra_stack_space;
4209 /* No need for overlays if everything already fits. */
4210 if (fixed_size + htab->reserved <= htab->local_store
4211 && htab->params->ovly_flavour != ovly_soft_icache)
4213 htab->params->auto_overlay = 0;
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);
4227 && (h->root.type == bfd_link_hash_defined
4228 || h->root.type == bfd_link_hash_defweak)
4231 /* We have a user supplied overlay manager. */
4232 uos_param.exclude_input_section = h->root.u.def.section;
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))
4246 /* We can't put the overlay manager or interrupt routines in
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))
4255 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4257 bfd_arr = bfd_malloc (bfd_count * sizeof (*bfd_arr));
4258 if (bfd_arr == NULL)
4261 /* Count overlay sections, and subtract their sizes from "fixed_size". */
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;
4269 unsigned int old_count;
4271 if (ibfd->xvec != &bfd_elf32_spu_vec)
4275 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4276 if (sec->linker_mark)
4278 if ((sec->flags & SEC_CODE) != 0)
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. */
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);
4308 info->callbacks->einfo (_("%s duplicated\n"),
4309 bfd_arr[i]->filename);
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);
4323 fixed_size += htab->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. */
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->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->overlay_fixed)
4368 max_fixed = htab->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)
4373 fixed_size = max_fixed - lib_size;
4376 /* Build an array of sections, suitably sorted to place into
4378 ovly_sections = bfd_malloc (2 * count * sizeof (*ovly_sections));
4379 if (ovly_sections == NULL)
4381 ovly_p = ovly_sections;
4382 if (!for_each_node (collect_overlays, info, &ovly_p, TRUE))
4384 count = (size_t) (ovly_p - ovly_sections) / 2;
4385 ovly_map = bfd_malloc (count * sizeof (*ovly_map));
4386 if (ovly_map == NULL)
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;
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;
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;
4414 rosec = ovly_sections[2 * i + 1];
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)
4423 if (sec->segment_mark)
4425 /* Pasted sections must stay together, so add their
4427 struct call_info *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)
4446 if (align_power (tmp, roalign) + rotmp > overlay_size)
4449 /* If we add this section, we might need new overlay call
4450 stubs. Add any overlay section calls to dummy_call. */
4452 sec_data = spu_elf_section_data (sec);
4453 sinfo = sec_data->u.i.stack_info;
4454 for (k = 0; k < 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);
4461 else if (call->fun->sec->linker_mark)
4463 if (!copy_callee (&dummy_caller, call))
4466 while (pasty != NULL)
4468 struct function_info *call_fun = pasty->fun;
4470 for (call = call_fun->call_list; call; call = call->next)
4471 if (call->is_pasted)
4473 BFD_ASSERT (pasty == NULL);
4476 else if (!copy_callee (&dummy_caller, call))
4480 /* Calculate call stub size. */
4482 for (call = dummy_caller.call_list; call; call = call->next)
4485 unsigned int stub_delta = 1;
4487 if (htab->params->ovly_flavour == ovly_soft_icache)
4488 stub_delta = call->count;
4489 num_stubs += stub_delta;
4491 /* If the call is within this overlay, we won't need a
4493 for (k = base; k < i + 1; k++)
4494 if (call->fun->sec == ovly_sections[2 * k])
4496 num_stubs -= stub_delta;
4500 if (htab->params->ovly_flavour == ovly_soft_icache
4501 && num_stubs > htab->params->max_branch)
4503 if (align_power (tmp, roalign) + rotmp
4504 + num_stubs * ovl_stub_size (htab->params) > overlay_size)
4512 info->callbacks->einfo (_("%B:%A%s exceeds overlay size\n"),
4513 ovly_sections[2 * i]->owner,
4514 ovly_sections[2 * i],
4515 ovly_sections[2 * i + 1] ? " + rodata" : "");
4516 bfd_set_error (bfd_error_bad_value);
4520 while (dummy_caller.call_list != NULL)
4522 struct call_info *call = dummy_caller.call_list;
4523 dummy_caller.call_list = call->next;
4529 ovly_map[base++] = ovlynum;
4532 script = htab->params->spu_elf_open_overlay_script ();
4534 if (fprintf (script, "SECTIONS\n{\n") <= 0)
4537 if (htab->params->ovly_flavour == ovly_soft_icache)
4539 if (fprintf (script,
4540 " .data.icache ALIGN (16) : { *(.ovtab) *(.data.icache) }\n"
4541 " . = ALIGN (%u);\n"
4542 " .ovl.init : { *(.ovl.init) }\n"
4543 " . = ABSOLUTE (ADDR (.ovl.init));\n",
4544 htab->params->line_size) <= 0)
4549 while (base < count)
4551 unsigned int indx = ovlynum - 1;
4552 unsigned int vma, lma;
4554 vma = (indx & (htab->params->num_lines - 1)) << htab->line_size_log2;
4555 lma = indx << htab->line_size_log2;
4557 if (fprintf (script, " .ovly%u ABSOLUTE (ADDR (.ovl.init)) + %u "
4558 ": AT (ALIGN (LOADADDR (.ovl.init) + SIZEOF (.ovl.init), 16) + %u) {\n",
4559 ovlynum, vma, lma) <= 0)
4562 base = print_one_overlay_section (script, base, count, ovlynum,
4563 ovly_map, ovly_sections, info);
4564 if (base == (unsigned) -1)
4567 if (fprintf (script, " }\n") <= 0)
4573 if (fprintf (script, " . = ABSOLUTE (ADDR (.ovl.init)) + %u;\n",
4574 1 << (htab->num_lines_log2 + htab->line_size_log2)) <= 0)
4579 if (fprintf (script,
4580 " . = ALIGN (16);\n"
4581 " .ovl.init : { *(.ovl.init) }\n"
4582 " . = ABSOLUTE (ADDR (.ovl.init));\n") <= 0)
4585 for (region = 1; region <= htab->params->num_lines; region++)
4589 while (base < count && ovly_map[base] < ovlynum)
4597 /* We need to set lma since we are overlaying .ovl.init. */
4598 if (fprintf (script,
4599 " OVERLAY : AT (ALIGN (LOADADDR (.ovl.init) + SIZEOF (.ovl.init), 16))\n {\n") <= 0)
4604 if (fprintf (script, " OVERLAY :\n {\n") <= 0)
4608 while (base < count)
4610 if (fprintf (script, " .ovly%u {\n", ovlynum) <= 0)
4613 base = print_one_overlay_section (script, base, count, ovlynum,
4614 ovly_map, ovly_sections, info);
4615 if (base == (unsigned) -1)
4618 if (fprintf (script, " }\n") <= 0)
4621 ovlynum += htab->params->num_lines;
4622 while (base < count && ovly_map[base] < ovlynum)
4626 if (fprintf (script, " }\n") <= 0)
4633 free (ovly_sections);
4635 if (fprintf (script, "}\nINSERT BEFORE .text;\n") <= 0)
4637 if (fclose (script) != 0)
4640 if (htab->params->auto_overlay & AUTO_RELINK)
4641 (*htab->params->spu_elf_relink) ();
4646 bfd_set_error (bfd_error_system_call);
4648 info->callbacks->einfo ("%F%P: auto overlay error: %E\n");
4652 /* Provide an estimate of total stack required. */
4655 spu_elf_stack_analysis (struct bfd_link_info *info)
4657 struct spu_link_hash_table *htab;
4658 struct _sum_stack_param sum_stack_param;
4660 if (!discover_functions (info))
4663 if (!build_call_tree (info))
4666 htab = spu_hash_table (info);
4667 if (htab->params->stack_analysis)
4669 info->callbacks->info (_("Stack size for call graph root nodes.\n"));
4670 info->callbacks->minfo (_("\nStack size for functions. "
4671 "Annotations: '*' max stack, 't' tail call\n"));
4674 sum_stack_param.emit_stack_syms = htab->params->emit_stack_syms;
4675 sum_stack_param.overall_stack = 0;
4676 if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
4679 if (htab->params->stack_analysis)
4680 info->callbacks->info (_("Maximum stack required is 0x%v\n"),
4681 (bfd_vma) sum_stack_param.overall_stack);
4685 /* Perform a final link. */
4688 spu_elf_final_link (bfd *output_bfd, struct bfd_link_info *info)
4690 struct spu_link_hash_table *htab = spu_hash_table (info);
4692 if (htab->params->auto_overlay)
4693 spu_elf_auto_overlay (info);
4695 if ((htab->params->stack_analysis
4696 || (htab->params->ovly_flavour == ovly_soft_icache
4697 && htab->params->lrlive_analysis))
4698 && !spu_elf_stack_analysis (info))
4699 info->callbacks->einfo ("%X%P: stack/lrlive analysis error: %E\n");
4701 if (!spu_elf_build_stubs (info))
4702 info->callbacks->einfo ("%F%P: can not build overlay stubs: %E\n");
4704 return bfd_elf_final_link (output_bfd, info);
4707 /* Called when not normally emitting relocs, ie. !info->relocatable
4708 and !info->emitrelocations. Returns a count of special relocs
4709 that need to be emitted. */
4712 spu_elf_count_relocs (struct bfd_link_info *info, asection *sec)
4714 Elf_Internal_Rela *relocs;
4715 unsigned int count = 0;
4717 relocs = _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL,
4721 Elf_Internal_Rela *rel;
4722 Elf_Internal_Rela *relend = relocs + sec->reloc_count;
4724 for (rel = relocs; rel < relend; rel++)
4726 int r_type = ELF32_R_TYPE (rel->r_info);
4727 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
4731 if (elf_section_data (sec)->relocs != relocs)
4738 /* Functions for adding fixup records to .fixup */
4740 #define FIXUP_RECORD_SIZE 4
4742 #define FIXUP_PUT(output_bfd,htab,index,addr) \
4743 bfd_put_32 (output_bfd, addr, \
4744 htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4745 #define FIXUP_GET(output_bfd,htab,index) \
4746 bfd_get_32 (output_bfd, \
4747 htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4749 /* Store OFFSET in .fixup. This assumes it will be called with an
4750 increasing OFFSET. When this OFFSET fits with the last base offset,
4751 it just sets a bit, otherwise it adds a new fixup record. */
4753 spu_elf_emit_fixup (bfd * output_bfd, struct bfd_link_info *info,
4756 struct spu_link_hash_table *htab = spu_hash_table (info);
4757 asection *sfixup = htab->sfixup;
4758 bfd_vma qaddr = offset & ~(bfd_vma) 15;
4759 bfd_vma bit = ((bfd_vma) 8) >> ((offset & 15) >> 2);
4760 if (sfixup->reloc_count == 0)
4762 FIXUP_PUT (output_bfd, htab, 0, qaddr | bit);
4763 sfixup->reloc_count++;
4767 bfd_vma base = FIXUP_GET (output_bfd, htab, sfixup->reloc_count - 1);
4768 if (qaddr != (base & ~(bfd_vma) 15))
4770 if ((sfixup->reloc_count + 1) * FIXUP_RECORD_SIZE > sfixup->size)
4771 (*_bfd_error_handler) (_("fatal error while creating .fixup"));
4772 FIXUP_PUT (output_bfd, htab, sfixup->reloc_count, qaddr | bit);
4773 sfixup->reloc_count++;
4776 FIXUP_PUT (output_bfd, htab, sfixup->reloc_count - 1, base | bit);
4780 /* Apply RELOCS to CONTENTS of INPUT_SECTION from INPUT_BFD. */
4783 spu_elf_relocate_section (bfd *output_bfd,
4784 struct bfd_link_info *info,
4786 asection *input_section,
4788 Elf_Internal_Rela *relocs,
4789 Elf_Internal_Sym *local_syms,
4790 asection **local_sections)
4792 Elf_Internal_Shdr *symtab_hdr;
4793 struct elf_link_hash_entry **sym_hashes;
4794 Elf_Internal_Rela *rel, *relend;
4795 struct spu_link_hash_table *htab;
4798 bfd_boolean emit_these_relocs = FALSE;
4799 bfd_boolean is_ea_sym;
4801 unsigned int iovl = 0;
4803 htab = spu_hash_table (info);
4804 stubs = (htab->stub_sec != NULL
4805 && maybe_needs_stubs (input_section));
4806 iovl = overlay_index (input_section);
4807 ea = bfd_get_section_by_name (output_bfd, "._ea");
4808 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4809 sym_hashes = (struct elf_link_hash_entry **) (elf_sym_hashes (input_bfd));
4812 relend = relocs + input_section->reloc_count;
4813 for (; rel < relend; rel++)
4816 reloc_howto_type *howto;
4817 unsigned int r_symndx;
4818 Elf_Internal_Sym *sym;
4820 struct elf_link_hash_entry *h;
4821 const char *sym_name;
4824 bfd_reloc_status_type r;
4825 bfd_boolean unresolved_reloc;
4827 enum _stub_type stub_type;
4829 r_symndx = ELF32_R_SYM (rel->r_info);
4830 r_type = ELF32_R_TYPE (rel->r_info);
4831 howto = elf_howto_table + r_type;
4832 unresolved_reloc = FALSE;
4837 if (r_symndx < symtab_hdr->sh_info)
4839 sym = local_syms + r_symndx;
4840 sec = local_sections[r_symndx];
4841 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
4842 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4846 if (sym_hashes == NULL)
4849 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4851 while (h->root.type == bfd_link_hash_indirect
4852 || h->root.type == bfd_link_hash_warning)
4853 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4856 if (h->root.type == bfd_link_hash_defined
4857 || h->root.type == bfd_link_hash_defweak)
4859 sec = h->root.u.def.section;
4861 || sec->output_section == NULL)
4862 /* Set a flag that will be cleared later if we find a
4863 relocation value for this symbol. output_section
4864 is typically NULL for symbols satisfied by a shared
4866 unresolved_reloc = TRUE;
4868 relocation = (h->root.u.def.value
4869 + sec->output_section->vma
4870 + sec->output_offset);
4872 else if (h->root.type == bfd_link_hash_undefweak)
4874 else if (info->unresolved_syms_in_objects == RM_IGNORE
4875 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
4877 else if (!info->relocatable
4878 && !(r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64))
4881 err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
4882 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);
4883 if (!info->callbacks->undefined_symbol (info,
4884 h->root.root.string,
4887 rel->r_offset, err))
4891 sym_name = h->root.root.string;
4894 if (sec != NULL && elf_discarded_section (sec))
4896 /* For relocs against symbols from removed linkonce sections,
4897 or sections discarded by a linker script, we just want the
4898 section contents zeroed. Avoid any special processing. */
4899 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
4905 if (info->relocatable)
4908 /* Change "a rt,ra,rb" to "ai rt,ra,0". */
4909 if (r_type == R_SPU_ADD_PIC && h != NULL
4910 && (h->def_regular || ELF_COMMON_DEF_P (h)))
4912 bfd_byte *loc = contents + rel->r_offset;
4918 is_ea_sym = (ea != NULL
4920 && sec->output_section == ea);
4922 /* If this symbol is in an overlay area, we may need to relocate
4923 to the overlay stub. */
4924 addend = rel->r_addend;
4927 && (stub_type = needs_ovl_stub (h, sym, sec, input_section, rel,
4928 contents, info)) != no_stub)
4930 unsigned int ovl = 0;
4931 struct got_entry *g, **head;
4933 if (stub_type != nonovl_stub)
4937 head = &h->got.glist;
4939 head = elf_local_got_ents (input_bfd) + r_symndx;
4941 for (g = *head; g != NULL; g = g->next)
4942 if (htab->params->ovly_flavour == ovly_soft_icache
4944 && g->br_addr == (rel->r_offset
4945 + input_section->output_offset
4946 + input_section->output_section->vma))
4947 : g->addend == addend && (g->ovl == ovl || g->ovl == 0))
4952 relocation = g->stub_addr;
4957 /* For soft icache, encode the overlay index into addresses. */
4958 if (htab->params->ovly_flavour == ovly_soft_icache
4959 && (r_type == R_SPU_ADDR16_HI
4960 || r_type == R_SPU_ADDR32 || r_type == R_SPU_REL32)
4963 unsigned int ovl = overlay_index (sec);
4966 unsigned int set_id = ((ovl - 1) >> htab->num_lines_log2) + 1;
4967 relocation += set_id << 18;
4972 if (htab->params->emit_fixups && !info->relocatable
4973 && (input_section->flags & SEC_ALLOC) != 0
4974 && r_type == R_SPU_ADDR32)
4977 offset = rel->r_offset + input_section->output_section->vma
4978 + input_section->output_offset;
4979 spu_elf_emit_fixup (output_bfd, info, offset);
4982 if (unresolved_reloc)
4984 else if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
4988 /* ._ea is a special section that isn't allocated in SPU
4989 memory, but rather occupies space in PPU memory as
4990 part of an embedded ELF image. If this reloc is
4991 against a symbol defined in ._ea, then transform the
4992 reloc into an equivalent one without a symbol
4993 relative to the start of the ELF image. */
4994 rel->r_addend += (relocation
4996 + elf_section_data (ea)->this_hdr.sh_offset);
4997 rel->r_info = ELF32_R_INFO (0, r_type);
4999 emit_these_relocs = TRUE;
5003 unresolved_reloc = TRUE;
5005 if (unresolved_reloc)
5007 (*_bfd_error_handler)
5008 (_("%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
5010 bfd_get_section_name (input_bfd, input_section),
5011 (long) rel->r_offset,
5017 r = _bfd_final_link_relocate (howto,
5021 rel->r_offset, relocation, addend);
5023 if (r != bfd_reloc_ok)
5025 const char *msg = (const char *) 0;
5029 case bfd_reloc_overflow:
5030 if (!((*info->callbacks->reloc_overflow)
5031 (info, (h ? &h->root : NULL), sym_name, howto->name,
5032 (bfd_vma) 0, input_bfd, input_section, rel->r_offset)))
5036 case bfd_reloc_undefined:
5037 if (!((*info->callbacks->undefined_symbol)
5038 (info, sym_name, input_bfd, input_section,
5039 rel->r_offset, TRUE)))
5043 case bfd_reloc_outofrange:
5044 msg = _("internal error: out of range error");
5047 case bfd_reloc_notsupported:
5048 msg = _("internal error: unsupported relocation error");
5051 case bfd_reloc_dangerous:
5052 msg = _("internal error: dangerous error");
5056 msg = _("internal error: unknown error");
5061 if (!((*info->callbacks->warning)
5062 (info, msg, sym_name, input_bfd, input_section,
5071 && emit_these_relocs
5072 && !info->emitrelocations)
5074 Elf_Internal_Rela *wrel;
5075 Elf_Internal_Shdr *rel_hdr;
5077 wrel = rel = relocs;
5078 relend = relocs + input_section->reloc_count;
5079 for (; rel < relend; rel++)
5083 r_type = ELF32_R_TYPE (rel->r_info);
5084 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
5087 input_section->reloc_count = wrel - relocs;
5088 /* Backflips for _bfd_elf_link_output_relocs. */
5089 rel_hdr = &elf_section_data (input_section)->rel_hdr;
5090 rel_hdr->sh_size = input_section->reloc_count * rel_hdr->sh_entsize;
5097 /* Adjust _SPUEAR_ syms to point at their overlay stubs. */
5100 spu_elf_output_symbol_hook (struct bfd_link_info *info,
5101 const char *sym_name ATTRIBUTE_UNUSED,
5102 Elf_Internal_Sym *sym,
5103 asection *sym_sec ATTRIBUTE_UNUSED,
5104 struct elf_link_hash_entry *h)
5106 struct spu_link_hash_table *htab = spu_hash_table (info);
5108 if (!info->relocatable
5109 && htab->stub_sec != NULL
5111 && (h->root.type == bfd_link_hash_defined
5112 || h->root.type == bfd_link_hash_defweak)
5114 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0)
5116 struct got_entry *g;
5118 for (g = h->got.glist; g != NULL; g = g->next)
5119 if (htab->params->ovly_flavour == ovly_soft_icache
5120 ? g->br_addr == g->stub_addr
5121 : g->addend == 0 && g->ovl == 0)
5123 sym->st_shndx = (_bfd_elf_section_from_bfd_section
5124 (htab->stub_sec[0]->output_section->owner,
5125 htab->stub_sec[0]->output_section));
5126 sym->st_value = g->stub_addr;
5134 static int spu_plugin = 0;
5137 spu_elf_plugin (int val)
5142 /* Set ELF header e_type for plugins. */
5145 spu_elf_post_process_headers (bfd *abfd,
5146 struct bfd_link_info *info ATTRIBUTE_UNUSED)
5150 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5152 i_ehdrp->e_type = ET_DYN;
5156 /* We may add an extra PT_LOAD segment for .toe. We also need extra
5157 segments for overlays. */
5160 spu_elf_additional_program_headers (bfd *abfd, struct bfd_link_info *info)
5167 struct spu_link_hash_table *htab = spu_hash_table (info);
5168 extra = htab->num_overlays;
5174 sec = bfd_get_section_by_name (abfd, ".toe");
5175 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
5181 /* Remove .toe section from other PT_LOAD segments and put it in
5182 a segment of its own. Put overlays in separate segments too. */
5185 spu_elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
5188 struct elf_segment_map *m, *m_overlay;
5189 struct elf_segment_map **p, **p_overlay;
5195 toe = bfd_get_section_by_name (abfd, ".toe");
5196 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
5197 if (m->p_type == PT_LOAD && m->count > 1)
5198 for (i = 0; i < m->count; i++)
5199 if ((s = m->sections[i]) == toe
5200 || spu_elf_section_data (s)->u.o.ovl_index != 0)
5202 struct elf_segment_map *m2;
5205 if (i + 1 < m->count)
5207 amt = sizeof (struct elf_segment_map);
5208 amt += (m->count - (i + 2)) * sizeof (m->sections[0]);
5209 m2 = bfd_zalloc (abfd, amt);
5212 m2->count = m->count - (i + 1);
5213 memcpy (m2->sections, m->sections + i + 1,
5214 m2->count * sizeof (m->sections[0]));
5215 m2->p_type = PT_LOAD;
5223 amt = sizeof (struct elf_segment_map);
5224 m2 = bfd_zalloc (abfd, amt);
5227 m2->p_type = PT_LOAD;
5229 m2->sections[0] = s;
5237 /* Some SPU ELF loaders ignore the PF_OVERLAY flag and just load all
5238 PT_LOAD segments. This can cause the .ovl.init section to be
5239 overwritten with the contents of some overlay segment. To work
5240 around this issue, we ensure that all PF_OVERLAY segments are
5241 sorted first amongst the program headers; this ensures that even
5242 with a broken loader, the .ovl.init section (which is not marked
5243 as PF_OVERLAY) will be placed into SPU local store on startup. */
5245 /* Move all overlay segments onto a separate list. */
5246 p = &elf_tdata (abfd)->segment_map;
5247 p_overlay = &m_overlay;
5250 if ((*p)->p_type == PT_LOAD && (*p)->count == 1
5251 && spu_elf_section_data ((*p)->sections[0])->u.o.ovl_index != 0)
5253 struct elf_segment_map *m = *p;
5256 p_overlay = &m->next;
5263 /* Re-insert overlay segments at the head of the segment map. */
5264 *p_overlay = elf_tdata (abfd)->segment_map;
5265 elf_tdata (abfd)->segment_map = m_overlay;
5270 /* Tweak the section type of .note.spu_name. */
5273 spu_elf_fake_sections (bfd *obfd ATTRIBUTE_UNUSED,
5274 Elf_Internal_Shdr *hdr,
5277 if (strcmp (sec->name, SPU_PTNOTE_SPUNAME) == 0)
5278 hdr->sh_type = SHT_NOTE;
5282 /* Tweak phdrs before writing them out. */
5285 spu_elf_modify_program_headers (bfd *abfd, struct bfd_link_info *info)
5287 const struct elf_backend_data *bed;
5288 struct elf_obj_tdata *tdata;
5289 Elf_Internal_Phdr *phdr, *last;
5290 struct spu_link_hash_table *htab;
5297 bed = get_elf_backend_data (abfd);
5298 tdata = elf_tdata (abfd);
5300 count = tdata->program_header_size / bed->s->sizeof_phdr;
5301 htab = spu_hash_table (info);
5302 if (htab->num_overlays != 0)
5304 struct elf_segment_map *m;
5307 for (i = 0, m = elf_tdata (abfd)->segment_map; m; ++i, m = m->next)
5309 && (o = spu_elf_section_data (m->sections[0])->u.o.ovl_index) != 0)
5311 /* Mark this as an overlay header. */
5312 phdr[i].p_flags |= PF_OVERLAY;
5314 if (htab->ovtab != NULL && htab->ovtab->size != 0
5315 && htab->params->ovly_flavour != ovly_soft_icache)
5317 bfd_byte *p = htab->ovtab->contents;
5318 unsigned int off = o * 16 + 8;
5320 /* Write file_off into _ovly_table. */
5321 bfd_put_32 (htab->ovtab->owner, phdr[i].p_offset, p + off);
5324 /* Soft-icache has its file offset put in .ovl.init. */
5325 if (htab->init != NULL && htab->init->size != 0)
5327 bfd_vma val = elf_section_data (htab->ovl_sec[0])->this_hdr.sh_offset;
5329 bfd_put_32 (htab->init->owner, val, htab->init->contents + 4);
5333 /* Round up p_filesz and p_memsz of PT_LOAD segments to multiples
5334 of 16. This should always be possible when using the standard
5335 linker scripts, but don't create overlapping segments if
5336 someone is playing games with linker scripts. */
5338 for (i = count; i-- != 0; )
5339 if (phdr[i].p_type == PT_LOAD)
5343 adjust = -phdr[i].p_filesz & 15;
5346 && phdr[i].p_offset + phdr[i].p_filesz > last->p_offset - adjust)
5349 adjust = -phdr[i].p_memsz & 15;
5352 && phdr[i].p_filesz != 0
5353 && phdr[i].p_vaddr + phdr[i].p_memsz > last->p_vaddr - adjust
5354 && phdr[i].p_vaddr + phdr[i].p_memsz <= last->p_vaddr)
5357 if (phdr[i].p_filesz != 0)
5361 if (i == (unsigned int) -1)
5362 for (i = count; i-- != 0; )
5363 if (phdr[i].p_type == PT_LOAD)
5367 adjust = -phdr[i].p_filesz & 15;
5368 phdr[i].p_filesz += adjust;
5370 adjust = -phdr[i].p_memsz & 15;
5371 phdr[i].p_memsz += adjust;
5378 spu_elf_size_sections (bfd * output_bfd, struct bfd_link_info *info)
5380 struct spu_link_hash_table *htab = spu_hash_table (info);
5381 if (htab->params->emit_fixups)
5383 asection *sfixup = htab->sfixup;
5384 int fixup_count = 0;
5388 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5392 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5395 /* Walk over each section attached to the input bfd. */
5396 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
5398 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
5401 /* If there aren't any relocs, then there's nothing more
5403 if ((isec->flags & SEC_RELOC) == 0
5404 || isec->reloc_count == 0)
5407 /* Get the relocs. */
5409 _bfd_elf_link_read_relocs (ibfd, isec, NULL, NULL,
5411 if (internal_relocs == NULL)
5414 /* 1 quadword can contain up to 4 R_SPU_ADDR32
5415 relocations. They are stored in a single word by
5416 saving the upper 28 bits of the address and setting the
5417 lower 4 bits to a bit mask of the words that have the
5418 relocation. BASE_END keeps track of the next quadword. */
5419 irela = internal_relocs;
5420 irelaend = irela + isec->reloc_count;
5422 for (; irela < irelaend; irela++)
5423 if (ELF32_R_TYPE (irela->r_info) == R_SPU_ADDR32
5424 && irela->r_offset >= base_end)
5426 base_end = (irela->r_offset & ~(bfd_vma) 15) + 16;
5432 /* We always have a NULL fixup as a sentinel */
5433 size = (fixup_count + 1) * FIXUP_RECORD_SIZE;
5434 if (!bfd_set_section_size (output_bfd, sfixup, size))
5436 sfixup->contents = (bfd_byte *) bfd_zalloc (info->input_bfds, size);
5437 if (sfixup->contents == NULL)
5443 #define TARGET_BIG_SYM bfd_elf32_spu_vec
5444 #define TARGET_BIG_NAME "elf32-spu"
5445 #define ELF_ARCH bfd_arch_spu
5446 #define ELF_MACHINE_CODE EM_SPU
5447 /* This matches the alignment need for DMA. */
5448 #define ELF_MAXPAGESIZE 0x80
5449 #define elf_backend_rela_normal 1
5450 #define elf_backend_can_gc_sections 1
5452 #define bfd_elf32_bfd_reloc_type_lookup spu_elf_reloc_type_lookup
5453 #define bfd_elf32_bfd_reloc_name_lookup spu_elf_reloc_name_lookup
5454 #define elf_info_to_howto spu_elf_info_to_howto
5455 #define elf_backend_count_relocs spu_elf_count_relocs
5456 #define elf_backend_relocate_section spu_elf_relocate_section
5457 #define elf_backend_symbol_processing spu_elf_backend_symbol_processing
5458 #define elf_backend_link_output_symbol_hook spu_elf_output_symbol_hook
5459 #define elf_backend_object_p spu_elf_object_p
5460 #define bfd_elf32_new_section_hook spu_elf_new_section_hook
5461 #define bfd_elf32_bfd_link_hash_table_create spu_elf_link_hash_table_create
5463 #define elf_backend_additional_program_headers spu_elf_additional_program_headers
5464 #define elf_backend_modify_segment_map spu_elf_modify_segment_map
5465 #define elf_backend_modify_program_headers spu_elf_modify_program_headers
5466 #define elf_backend_post_process_headers spu_elf_post_process_headers
5467 #define elf_backend_fake_sections spu_elf_fake_sections
5468 #define elf_backend_special_sections spu_elf_special_sections
5469 #define bfd_elf32_bfd_final_link spu_elf_final_link
5471 #include "elf32-target.h"