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