* elf32-spu.c (spu_elf_relocate_section): Test identical conditions
[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 "bfd.h"
23 #include "bfdlink.h"
24 #include "libbfd.h"
25 #include "elf-bfd.h"
26 #include "elf/spu.h"
27 #include "elf32-spu.h"
28
29 /* We use RELA style relocs. Don't define USE_REL. */
30
31 static bfd_reloc_status_type spu_elf_rel9 (bfd *, arelent *, asymbol *,
32 void *, asection *,
33 bfd *, char **);
34
35 /* Values of type 'enum elf_spu_reloc_type' are used to index this
36 array, so it must be declared in the order of that type. */
37
38 static reloc_howto_type elf_howto_table[] = {
39 HOWTO (R_SPU_NONE, 0, 0, 0, FALSE, 0, complain_overflow_dont,
40 bfd_elf_generic_reloc, "SPU_NONE",
41 FALSE, 0, 0x00000000, FALSE),
42 HOWTO (R_SPU_ADDR10, 4, 2, 10, FALSE, 14, complain_overflow_bitfield,
43 bfd_elf_generic_reloc, "SPU_ADDR10",
44 FALSE, 0, 0x00ffc000, FALSE),
45 HOWTO (R_SPU_ADDR16, 2, 2, 16, FALSE, 7, complain_overflow_bitfield,
46 bfd_elf_generic_reloc, "SPU_ADDR16",
47 FALSE, 0, 0x007fff80, FALSE),
48 HOWTO (R_SPU_ADDR16_HI, 16, 2, 16, FALSE, 7, complain_overflow_bitfield,
49 bfd_elf_generic_reloc, "SPU_ADDR16_HI",
50 FALSE, 0, 0x007fff80, FALSE),
51 HOWTO (R_SPU_ADDR16_LO, 0, 2, 16, FALSE, 7, complain_overflow_dont,
52 bfd_elf_generic_reloc, "SPU_ADDR16_LO",
53 FALSE, 0, 0x007fff80, FALSE),
54 HOWTO (R_SPU_ADDR18, 0, 2, 18, FALSE, 7, complain_overflow_bitfield,
55 bfd_elf_generic_reloc, "SPU_ADDR18",
56 FALSE, 0, 0x01ffff80, FALSE),
57 HOWTO (R_SPU_ADDR32, 0, 2, 32, FALSE, 0, complain_overflow_dont,
58 bfd_elf_generic_reloc, "SPU_ADDR32",
59 FALSE, 0, 0xffffffff, FALSE),
60 HOWTO (R_SPU_REL16, 2, 2, 16, TRUE, 7, complain_overflow_bitfield,
61 bfd_elf_generic_reloc, "SPU_REL16",
62 FALSE, 0, 0x007fff80, TRUE),
63 HOWTO (R_SPU_ADDR7, 0, 2, 7, FALSE, 14, complain_overflow_dont,
64 bfd_elf_generic_reloc, "SPU_ADDR7",
65 FALSE, 0, 0x001fc000, FALSE),
66 HOWTO (R_SPU_REL9, 2, 2, 9, TRUE, 0, complain_overflow_signed,
67 spu_elf_rel9, "SPU_REL9",
68 FALSE, 0, 0x0180007f, TRUE),
69 HOWTO (R_SPU_REL9I, 2, 2, 9, TRUE, 0, complain_overflow_signed,
70 spu_elf_rel9, "SPU_REL9I",
71 FALSE, 0, 0x0000c07f, TRUE),
72 HOWTO (R_SPU_ADDR10I, 0, 2, 10, FALSE, 14, complain_overflow_signed,
73 bfd_elf_generic_reloc, "SPU_ADDR10I",
74 FALSE, 0, 0x00ffc000, FALSE),
75 HOWTO (R_SPU_ADDR16I, 0, 2, 16, FALSE, 7, complain_overflow_signed,
76 bfd_elf_generic_reloc, "SPU_ADDR16I",
77 FALSE, 0, 0x007fff80, FALSE),
78 HOWTO (R_SPU_REL32, 0, 2, 32, TRUE, 0, complain_overflow_dont,
79 bfd_elf_generic_reloc, "SPU_REL32",
80 FALSE, 0, 0xffffffff, TRUE),
81 HOWTO (R_SPU_ADDR16X, 0, 2, 16, FALSE, 7, complain_overflow_bitfield,
82 bfd_elf_generic_reloc, "SPU_ADDR16X",
83 FALSE, 0, 0x007fff80, FALSE),
84 HOWTO (R_SPU_PPU32, 0, 2, 32, FALSE, 0, complain_overflow_dont,
85 bfd_elf_generic_reloc, "SPU_PPU32",
86 FALSE, 0, 0xffffffff, FALSE),
87 HOWTO (R_SPU_PPU64, 0, 4, 64, FALSE, 0, complain_overflow_dont,
88 bfd_elf_generic_reloc, "SPU_PPU64",
89 FALSE, 0, -1, FALSE),
90 };
91
92 static struct bfd_elf_special_section const spu_elf_special_sections[] = {
93 { ".toe", 4, 0, SHT_NOBITS, SHF_ALLOC },
94 { NULL, 0, 0, 0, 0 }
95 };
96
97 static enum elf_spu_reloc_type
98 spu_elf_bfd_to_reloc_type (bfd_reloc_code_real_type code)
99 {
100 switch (code)
101 {
102 default:
103 return R_SPU_NONE;
104 case BFD_RELOC_SPU_IMM10W:
105 return R_SPU_ADDR10;
106 case BFD_RELOC_SPU_IMM16W:
107 return R_SPU_ADDR16;
108 case BFD_RELOC_SPU_LO16:
109 return R_SPU_ADDR16_LO;
110 case BFD_RELOC_SPU_HI16:
111 return R_SPU_ADDR16_HI;
112 case BFD_RELOC_SPU_IMM18:
113 return R_SPU_ADDR18;
114 case BFD_RELOC_SPU_PCREL16:
115 return R_SPU_REL16;
116 case BFD_RELOC_SPU_IMM7:
117 return R_SPU_ADDR7;
118 case BFD_RELOC_SPU_IMM8:
119 return R_SPU_NONE;
120 case BFD_RELOC_SPU_PCREL9a:
121 return R_SPU_REL9;
122 case BFD_RELOC_SPU_PCREL9b:
123 return R_SPU_REL9I;
124 case BFD_RELOC_SPU_IMM10:
125 return R_SPU_ADDR10I;
126 case BFD_RELOC_SPU_IMM16:
127 return R_SPU_ADDR16I;
128 case BFD_RELOC_32:
129 return R_SPU_ADDR32;
130 case BFD_RELOC_32_PCREL:
131 return R_SPU_REL32;
132 case BFD_RELOC_SPU_PPU32:
133 return R_SPU_PPU32;
134 case BFD_RELOC_SPU_PPU64:
135 return R_SPU_PPU64;
136 }
137 }
138
139 static void
140 spu_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
141 arelent *cache_ptr,
142 Elf_Internal_Rela *dst)
143 {
144 enum elf_spu_reloc_type r_type;
145
146 r_type = (enum elf_spu_reloc_type) ELF32_R_TYPE (dst->r_info);
147 BFD_ASSERT (r_type < R_SPU_max);
148 cache_ptr->howto = &elf_howto_table[(int) r_type];
149 }
150
151 static reloc_howto_type *
152 spu_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
153 bfd_reloc_code_real_type code)
154 {
155 enum elf_spu_reloc_type r_type = spu_elf_bfd_to_reloc_type (code);
156
157 if (r_type == R_SPU_NONE)
158 return NULL;
159
160 return elf_howto_table + r_type;
161 }
162
163 static reloc_howto_type *
164 spu_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
165 const char *r_name)
166 {
167 unsigned int i;
168
169 for (i = 0; i < sizeof (elf_howto_table) / sizeof (elf_howto_table[0]); i++)
170 if (elf_howto_table[i].name != NULL
171 && strcasecmp (elf_howto_table[i].name, r_name) == 0)
172 return &elf_howto_table[i];
173
174 return NULL;
175 }
176
177 /* Apply R_SPU_REL9 and R_SPU_REL9I relocs. */
178
179 static bfd_reloc_status_type
180 spu_elf_rel9 (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
181 void *data, asection *input_section,
182 bfd *output_bfd, char **error_message)
183 {
184 bfd_size_type octets;
185 bfd_vma val;
186 long insn;
187
188 /* If this is a relocatable link (output_bfd test tells us), just
189 call the generic function. Any adjustment will be done at final
190 link time. */
191 if (output_bfd != NULL)
192 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
193 input_section, output_bfd, error_message);
194
195 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
196 return bfd_reloc_outofrange;
197 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
198
199 /* Get symbol value. */
200 val = 0;
201 if (!bfd_is_com_section (symbol->section))
202 val = symbol->value;
203 if (symbol->section->output_section)
204 val += symbol->section->output_section->vma;
205
206 val += reloc_entry->addend;
207
208 /* Make it pc-relative. */
209 val -= input_section->output_section->vma + input_section->output_offset;
210
211 val >>= 2;
212 if (val + 256 >= 512)
213 return bfd_reloc_overflow;
214
215 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
216
217 /* Move two high bits of value to REL9I and REL9 position.
218 The mask will take care of selecting the right field. */
219 val = (val & 0x7f) | ((val & 0x180) << 7) | ((val & 0x180) << 16);
220 insn &= ~reloc_entry->howto->dst_mask;
221 insn |= val & reloc_entry->howto->dst_mask;
222 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
223 return bfd_reloc_ok;
224 }
225
226 static bfd_boolean
227 spu_elf_new_section_hook (bfd *abfd, asection *sec)
228 {
229 if (!sec->used_by_bfd)
230 {
231 struct _spu_elf_section_data *sdata;
232
233 sdata = bfd_zalloc (abfd, sizeof (*sdata));
234 if (sdata == NULL)
235 return FALSE;
236 sec->used_by_bfd = sdata;
237 }
238
239 return _bfd_elf_new_section_hook (abfd, sec);
240 }
241
242 /* Specially mark defined symbols named _EAR_* with BSF_KEEP so that
243 strip --strip-unneeded will not remove them. */
244
245 static void
246 spu_elf_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
247 {
248 if (sym->name != NULL
249 && sym->section != bfd_abs_section_ptr
250 && strncmp (sym->name, "_EAR_", 5) == 0)
251 sym->flags |= BSF_KEEP;
252 }
253
254 /* SPU ELF linker hash table. */
255
256 struct spu_link_hash_table
257 {
258 struct elf_link_hash_table elf;
259
260 /* Shortcuts to overlay sections. */
261 asection *ovtab;
262 asection *toe;
263 asection **ovl_sec;
264
265 /* Count of stubs in each overlay section. */
266 unsigned int *stub_count;
267
268 /* The stub section for each overlay section. */
269 asection **stub_sec;
270
271 struct elf_link_hash_entry *ovly_load;
272 struct elf_link_hash_entry *ovly_return;
273 unsigned long ovly_load_r_symndx;
274
275 /* Number of overlay buffers. */
276 unsigned int num_buf;
277
278 /* Total number of overlays. */
279 unsigned int num_overlays;
280
281 /* Set if we should emit symbols for stubs. */
282 unsigned int emit_stub_syms:1;
283
284 /* Set if we want stubs on calls out of overlay regions to
285 non-overlay regions. */
286 unsigned int non_overlay_stubs : 1;
287
288 /* Set on error. */
289 unsigned int stub_err : 1;
290
291 /* Set if stack size analysis should be done. */
292 unsigned int stack_analysis : 1;
293
294 /* Set if __stack_* syms will be emitted. */
295 unsigned int emit_stack_syms : 1;
296 };
297
298 /* Hijack the generic got fields for overlay stub accounting. */
299
300 struct got_entry
301 {
302 struct got_entry *next;
303 unsigned int ovl;
304 bfd_vma addend;
305 bfd_vma stub_addr;
306 };
307
308 #define spu_hash_table(p) \
309 ((struct spu_link_hash_table *) ((p)->hash))
310
311 /* Create a spu ELF linker hash table. */
312
313 static struct bfd_link_hash_table *
314 spu_elf_link_hash_table_create (bfd *abfd)
315 {
316 struct spu_link_hash_table *htab;
317
318 htab = bfd_malloc (sizeof (*htab));
319 if (htab == NULL)
320 return NULL;
321
322 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd,
323 _bfd_elf_link_hash_newfunc,
324 sizeof (struct elf_link_hash_entry)))
325 {
326 free (htab);
327 return NULL;
328 }
329
330 memset (&htab->ovtab, 0,
331 sizeof (*htab) - offsetof (struct spu_link_hash_table, ovtab));
332
333 htab->elf.init_got_refcount.refcount = 0;
334 htab->elf.init_got_refcount.glist = NULL;
335 htab->elf.init_got_offset.offset = 0;
336 htab->elf.init_got_offset.glist = NULL;
337 return &htab->elf.root;
338 }
339
340 /* Find the symbol for the given R_SYMNDX in IBFD and set *HP and *SYMP
341 to (hash, NULL) for global symbols, and (NULL, sym) for locals. Set
342 *SYMSECP to the symbol's section. *LOCSYMSP caches local syms. */
343
344 static bfd_boolean
345 get_sym_h (struct elf_link_hash_entry **hp,
346 Elf_Internal_Sym **symp,
347 asection **symsecp,
348 Elf_Internal_Sym **locsymsp,
349 unsigned long r_symndx,
350 bfd *ibfd)
351 {
352 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
353
354 if (r_symndx >= symtab_hdr->sh_info)
355 {
356 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
357 struct elf_link_hash_entry *h;
358
359 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
360 while (h->root.type == bfd_link_hash_indirect
361 || h->root.type == bfd_link_hash_warning)
362 h = (struct elf_link_hash_entry *) h->root.u.i.link;
363
364 if (hp != NULL)
365 *hp = h;
366
367 if (symp != NULL)
368 *symp = NULL;
369
370 if (symsecp != NULL)
371 {
372 asection *symsec = NULL;
373 if (h->root.type == bfd_link_hash_defined
374 || h->root.type == bfd_link_hash_defweak)
375 symsec = h->root.u.def.section;
376 *symsecp = symsec;
377 }
378 }
379 else
380 {
381 Elf_Internal_Sym *sym;
382 Elf_Internal_Sym *locsyms = *locsymsp;
383
384 if (locsyms == NULL)
385 {
386 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
387 if (locsyms == NULL)
388 {
389 size_t symcount = symtab_hdr->sh_info;
390
391 /* If we are reading symbols into the contents, then
392 read the global syms too. This is done to cache
393 syms for later stack analysis. */
394 if ((unsigned char **) locsymsp == &symtab_hdr->contents)
395 symcount = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
396 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, symcount, 0,
397 NULL, NULL, NULL);
398 }
399 if (locsyms == NULL)
400 return FALSE;
401 *locsymsp = locsyms;
402 }
403 sym = locsyms + r_symndx;
404
405 if (hp != NULL)
406 *hp = NULL;
407
408 if (symp != NULL)
409 *symp = sym;
410
411 if (symsecp != NULL)
412 {
413 asection *symsec = NULL;
414 if ((sym->st_shndx != SHN_UNDEF
415 && sym->st_shndx < SHN_LORESERVE)
416 || sym->st_shndx > SHN_HIRESERVE)
417 symsec = bfd_section_from_elf_index (ibfd, sym->st_shndx);
418 *symsecp = symsec;
419 }
420 }
421
422 return TRUE;
423 }
424
425 /* Create the note section if not already present. This is done early so
426 that the linker maps the sections to the right place in the output. */
427
428 bfd_boolean
429 spu_elf_create_sections (bfd *output_bfd,
430 struct bfd_link_info *info,
431 int stack_analysis,
432 int emit_stack_syms)
433 {
434 bfd *ibfd;
435 struct spu_link_hash_table *htab = spu_hash_table (info);
436
437 /* Stash some options away where we can get at them later. */
438 htab->stack_analysis = stack_analysis;
439 htab->emit_stack_syms = emit_stack_syms;
440
441 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
442 if (bfd_get_section_by_name (ibfd, SPU_PTNOTE_SPUNAME) != NULL)
443 break;
444
445 if (ibfd == NULL)
446 {
447 /* Make SPU_PTNOTE_SPUNAME section. */
448 asection *s;
449 size_t name_len;
450 size_t size;
451 bfd_byte *data;
452 flagword flags;
453
454 ibfd = info->input_bfds;
455 flags = SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
456 s = bfd_make_section_anyway_with_flags (ibfd, SPU_PTNOTE_SPUNAME, flags);
457 if (s == NULL
458 || !bfd_set_section_alignment (ibfd, s, 4))
459 return FALSE;
460
461 name_len = strlen (bfd_get_filename (output_bfd)) + 1;
462 size = 12 + ((sizeof (SPU_PLUGIN_NAME) + 3) & -4);
463 size += (name_len + 3) & -4;
464
465 if (!bfd_set_section_size (ibfd, s, size))
466 return FALSE;
467
468 data = bfd_zalloc (ibfd, size);
469 if (data == NULL)
470 return FALSE;
471
472 bfd_put_32 (ibfd, sizeof (SPU_PLUGIN_NAME), data + 0);
473 bfd_put_32 (ibfd, name_len, data + 4);
474 bfd_put_32 (ibfd, 1, data + 8);
475 memcpy (data + 12, SPU_PLUGIN_NAME, sizeof (SPU_PLUGIN_NAME));
476 memcpy (data + 12 + ((sizeof (SPU_PLUGIN_NAME) + 3) & -4),
477 bfd_get_filename (output_bfd), name_len);
478 s->contents = data;
479 }
480
481 return TRUE;
482 }
483
484 /* qsort predicate to sort sections by vma. */
485
486 static int
487 sort_sections (const void *a, const void *b)
488 {
489 const asection *const *s1 = a;
490 const asection *const *s2 = b;
491 bfd_signed_vma delta = (*s1)->vma - (*s2)->vma;
492
493 if (delta != 0)
494 return delta < 0 ? -1 : 1;
495
496 return (*s1)->index - (*s2)->index;
497 }
498
499 /* Identify overlays in the output bfd, and number them. */
500
501 bfd_boolean
502 spu_elf_find_overlays (bfd *output_bfd, struct bfd_link_info *info)
503 {
504 struct spu_link_hash_table *htab = spu_hash_table (info);
505 asection **alloc_sec;
506 unsigned int i, n, ovl_index, num_buf;
507 asection *s;
508 bfd_vma ovl_end;
509
510 if (output_bfd->section_count < 2)
511 return FALSE;
512
513 alloc_sec = bfd_malloc (output_bfd->section_count * sizeof (*alloc_sec));
514 if (alloc_sec == NULL)
515 return FALSE;
516
517 /* Pick out all the alloced sections. */
518 for (n = 0, s = output_bfd->sections; s != NULL; s = s->next)
519 if ((s->flags & SEC_ALLOC) != 0
520 && (s->flags & (SEC_LOAD | SEC_THREAD_LOCAL)) != SEC_THREAD_LOCAL
521 && s->size != 0)
522 alloc_sec[n++] = s;
523
524 if (n == 0)
525 {
526 free (alloc_sec);
527 return FALSE;
528 }
529
530 /* Sort them by vma. */
531 qsort (alloc_sec, n, sizeof (*alloc_sec), sort_sections);
532
533 /* Look for overlapping vmas. Any with overlap must be overlays.
534 Count them. Also count the number of overlay regions. */
535 ovl_end = alloc_sec[0]->vma + alloc_sec[0]->size;
536 for (ovl_index = 0, num_buf = 0, i = 1; i < n; i++)
537 {
538 s = alloc_sec[i];
539 if (s->vma < ovl_end)
540 {
541 asection *s0 = alloc_sec[i - 1];
542
543 if (spu_elf_section_data (s0)->u.o.ovl_index == 0)
544 {
545 alloc_sec[ovl_index] = s0;
546 spu_elf_section_data (s0)->u.o.ovl_index = ++ovl_index;
547 spu_elf_section_data (s0)->u.o.ovl_buf = ++num_buf;
548 }
549 alloc_sec[ovl_index] = s;
550 spu_elf_section_data (s)->u.o.ovl_index = ++ovl_index;
551 spu_elf_section_data (s)->u.o.ovl_buf = num_buf;
552 if (s0->vma != s->vma)
553 {
554 info->callbacks->einfo (_("%X%P: overlay sections %A and %A "
555 "do not start at the same address.\n"),
556 s0, s);
557 return FALSE;
558 }
559 if (ovl_end < s->vma + s->size)
560 ovl_end = s->vma + s->size;
561 }
562 else
563 ovl_end = s->vma + s->size;
564 }
565
566 htab->num_overlays = ovl_index;
567 htab->num_buf = num_buf;
568 htab->ovl_sec = alloc_sec;
569 return ovl_index != 0;
570 }
571
572 /* Support two sizes of overlay stubs, a slower more compact stub of two
573 intructions, and a faster stub of four instructions. */
574 #ifndef OVL_STUB_SIZE
575 /* Default to faster. */
576 #define OVL_STUB_SIZE 16
577 /* #define OVL_STUB_SIZE 8 */
578 #endif
579 #define BRSL 0x33000000
580 #define BR 0x32000000
581 #define NOP 0x40200000
582 #define LNOP 0x00200000
583 #define ILA 0x42000000
584
585 /* Return true for all relative and absolute branch instructions.
586 bra 00110000 0..
587 brasl 00110001 0..
588 br 00110010 0..
589 brsl 00110011 0..
590 brz 00100000 0..
591 brnz 00100001 0..
592 brhz 00100010 0..
593 brhnz 00100011 0.. */
594
595 static bfd_boolean
596 is_branch (const unsigned char *insn)
597 {
598 return (insn[0] & 0xec) == 0x20 && (insn[1] & 0x80) == 0;
599 }
600
601 /* Return true for all indirect branch instructions.
602 bi 00110101 000
603 bisl 00110101 001
604 iret 00110101 010
605 bisled 00110101 011
606 biz 00100101 000
607 binz 00100101 001
608 bihz 00100101 010
609 bihnz 00100101 011 */
610
611 static bfd_boolean
612 is_indirect_branch (const unsigned char *insn)
613 {
614 return (insn[0] & 0xef) == 0x25 && (insn[1] & 0x80) == 0;
615 }
616
617 /* Return true for branch hint instructions.
618 hbra 0001000..
619 hbrr 0001001.. */
620
621 static bfd_boolean
622 is_hint (const unsigned char *insn)
623 {
624 return (insn[0] & 0xfc) == 0x10;
625 }
626
627 /* Return TRUE if this reloc symbol should possibly go via an overlay stub. */
628
629 static bfd_boolean
630 needs_ovl_stub (const char *sym_name,
631 asection *sym_sec,
632 asection *input_section,
633 struct spu_link_hash_table *htab,
634 bfd_boolean is_branch)
635 {
636 if (htab->num_overlays == 0)
637 return FALSE;
638
639 if (sym_sec == NULL
640 || sym_sec->output_section == NULL
641 || spu_elf_section_data (sym_sec->output_section) == NULL)
642 return FALSE;
643
644 /* setjmp always goes via an overlay stub, because then the return
645 and hence the longjmp goes via __ovly_return. That magically
646 makes setjmp/longjmp between overlays work. */
647 if (strncmp (sym_name, "setjmp", 6) == 0
648 && (sym_name[6] == '\0' || sym_name[6] == '@'))
649 return TRUE;
650
651 /* Usually, symbols in non-overlay sections don't need stubs. */
652 if (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index == 0
653 && !htab->non_overlay_stubs)
654 return FALSE;
655
656 /* A reference from some other section to a symbol in an overlay
657 section needs a stub. */
658 if (spu_elf_section_data (sym_sec->output_section)->u.o.ovl_index
659 != spu_elf_section_data (input_section->output_section)->u.o.ovl_index)
660 return TRUE;
661
662 /* If this insn isn't a branch then we are possibly taking the
663 address of a function and passing it out somehow. */
664 return !is_branch;
665 }
666
667 enum _insn_type { non_branch, branch, call };
668
669 static bfd_boolean
670 count_stub (struct spu_link_hash_table *htab,
671 bfd *ibfd,
672 asection *isec,
673 enum _insn_type insn_type,
674 struct elf_link_hash_entry *h,
675 const Elf_Internal_Rela *irela)
676 {
677 unsigned int ovl = 0;
678 struct got_entry *g, **head;
679 bfd_vma addend;
680
681 /* If this instruction is a branch or call, we need a stub
682 for it. One stub per function per overlay.
683 If it isn't a branch, then we are taking the address of
684 this function so need a stub in the non-overlay area
685 for it. One stub per function. */
686 if (insn_type != non_branch)
687 ovl = spu_elf_section_data (isec->output_section)->u.o.ovl_index;
688
689 if (h != NULL)
690 head = &h->got.glist;
691 else
692 {
693 if (elf_local_got_ents (ibfd) == NULL)
694 {
695 bfd_size_type amt = (elf_tdata (ibfd)->symtab_hdr.sh_info
696 * sizeof (*elf_local_got_ents (ibfd)));
697 elf_local_got_ents (ibfd) = bfd_zmalloc (amt);
698 if (elf_local_got_ents (ibfd) == NULL)
699 return FALSE;
700 }
701 head = elf_local_got_ents (ibfd) + ELF32_R_SYM (irela->r_info);
702 }
703
704 addend = 0;
705 if (irela != NULL)
706 addend = irela->r_addend;
707
708 if (ovl == 0)
709 {
710 struct got_entry *gnext;
711
712 for (g = *head; g != NULL; g = g->next)
713 if (g->addend == addend && g->ovl == 0)
714 break;
715
716 if (g == NULL)
717 {
718 /* Need a new non-overlay area stub. Zap other stubs. */
719 for (g = *head; g != NULL; g = gnext)
720 {
721 gnext = g->next;
722 if (g->addend == addend)
723 {
724 htab->stub_count[g->ovl] -= 1;
725 free (g);
726 }
727 }
728 }
729 }
730 else
731 {
732 for (g = *head; g != NULL; g = g->next)
733 if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
734 break;
735 }
736
737 if (g == NULL)
738 {
739 g = bfd_malloc (sizeof *g);
740 if (g == NULL)
741 return FALSE;
742 g->ovl = ovl;
743 g->addend = addend;
744 g->stub_addr = (bfd_vma) -1;
745 g->next = *head;
746 *head = g;
747
748 htab->stub_count[ovl] += 1;
749 }
750
751 return TRUE;
752 }
753
754 /* Two instruction overlay stubs look like:
755
756 brsl $75,__ovly_load
757 .word target_ovl_and_address
758
759 ovl_and_address is a word with the overlay number in the top 14 bits
760 and local store address in the bottom 18 bits.
761
762 Four instruction overlay stubs look like:
763
764 ila $78,ovl_number
765 lnop
766 ila $79,target_address
767 br __ovly_load */
768
769 static bfd_boolean
770 build_stub (struct spu_link_hash_table *htab,
771 bfd *ibfd,
772 asection *isec,
773 enum _insn_type insn_type,
774 struct elf_link_hash_entry *h,
775 const Elf_Internal_Rela *irela,
776 bfd_vma dest,
777 asection *dest_sec)
778 {
779 unsigned int ovl;
780 struct got_entry *g, **head;
781 asection *sec;
782 bfd_vma addend, val, from, to;
783
784 ovl = 0;
785 if (insn_type != non_branch)
786 ovl = spu_elf_section_data (isec->output_section)->u.o.ovl_index;
787
788 if (h != NULL)
789 head = &h->got.glist;
790 else
791 head = elf_local_got_ents (ibfd) + ELF32_R_SYM (irela->r_info);
792
793 addend = 0;
794 if (irela != NULL)
795 addend = irela->r_addend;
796
797 for (g = *head; g != NULL; g = g->next)
798 if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
799 break;
800 if (g == NULL)
801 abort ();
802
803 if (g->ovl == 0 && ovl != 0)
804 return TRUE;
805
806 if (g->stub_addr != (bfd_vma) -1)
807 return TRUE;
808
809 sec = htab->stub_sec[ovl];
810 dest += dest_sec->output_offset + dest_sec->output_section->vma;
811 from = sec->size + sec->output_offset + sec->output_section->vma;
812 g->stub_addr = from;
813 to = (htab->ovly_load->root.u.def.value
814 + htab->ovly_load->root.u.def.section->output_offset
815 + htab->ovly_load->root.u.def.section->output_section->vma);
816 val = to - from;
817 if (OVL_STUB_SIZE == 16)
818 val -= 12;
819 if (((dest | to | from) & 3) != 0
820 || val + 0x20000 >= 0x40000)
821 {
822 htab->stub_err = 1;
823 return FALSE;
824 }
825 ovl = spu_elf_section_data (dest_sec->output_section)->u.o.ovl_index;
826
827 if (OVL_STUB_SIZE == 16)
828 {
829 bfd_put_32 (sec->owner, ILA + ((ovl << 7) & 0x01ffff80) + 78,
830 sec->contents + sec->size);
831 bfd_put_32 (sec->owner, LNOP,
832 sec->contents + sec->size + 4);
833 bfd_put_32 (sec->owner, ILA + ((dest << 7) & 0x01ffff80) + 79,
834 sec->contents + sec->size + 8);
835 bfd_put_32 (sec->owner, BR + ((val << 5) & 0x007fff80),
836 sec->contents + sec->size + 12);
837 }
838 else if (OVL_STUB_SIZE == 8)
839 {
840 bfd_put_32 (sec->owner, BRSL + ((val << 5) & 0x007fff80) + 75,
841 sec->contents + sec->size);
842
843 val = (dest & 0x3ffff) | (ovl << 14);
844 bfd_put_32 (sec->owner, val,
845 sec->contents + sec->size + 4);
846 }
847 else
848 abort ();
849 sec->size += OVL_STUB_SIZE;
850
851 if (htab->emit_stub_syms)
852 {
853 size_t len;
854 char *name;
855 int add;
856
857 len = 8 + sizeof (".ovl_call.") - 1;
858 if (h != NULL)
859 len += strlen (h->root.root.string);
860 else
861 len += 8 + 1 + 8;
862 add = 0;
863 if (irela != NULL)
864 add = (int) irela->r_addend & 0xffffffff;
865 if (add != 0)
866 len += 1 + 8;
867 name = bfd_malloc (len);
868 if (name == NULL)
869 return FALSE;
870
871 sprintf (name, "%08x.ovl_call.", g->ovl);
872 if (h != NULL)
873 strcpy (name + 8 + sizeof (".ovl_call.") - 1, h->root.root.string);
874 else
875 sprintf (name + 8 + sizeof (".ovl_call.") - 1, "%x:%x",
876 dest_sec->id & 0xffffffff,
877 (int) ELF32_R_SYM (irela->r_info) & 0xffffffff);
878 if (add != 0)
879 sprintf (name + len - 9, "+%x", add);
880
881 h = elf_link_hash_lookup (&htab->elf, name, TRUE, TRUE, FALSE);
882 free (name);
883 if (h == NULL)
884 return FALSE;
885 if (h->root.type == bfd_link_hash_new)
886 {
887 h->root.type = bfd_link_hash_defined;
888 h->root.u.def.section = sec;
889 h->root.u.def.value = sec->size - OVL_STUB_SIZE;
890 h->size = OVL_STUB_SIZE;
891 h->type = STT_FUNC;
892 h->ref_regular = 1;
893 h->def_regular = 1;
894 h->ref_regular_nonweak = 1;
895 h->forced_local = 1;
896 h->non_elf = 0;
897 }
898 }
899
900 return TRUE;
901 }
902
903 /* Called via elf_link_hash_traverse to allocate stubs for any _SPUEAR_
904 symbols. */
905
906 static bfd_boolean
907 allocate_spuear_stubs (struct elf_link_hash_entry *h, void *inf)
908 {
909 /* Symbols starting with _SPUEAR_ need a stub because they may be
910 invoked by the PPU. */
911 if ((h->root.type == bfd_link_hash_defined
912 || h->root.type == bfd_link_hash_defweak)
913 && h->def_regular
914 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0)
915 {
916 struct spu_link_hash_table *htab = inf;
917
918 count_stub (htab, NULL, NULL, non_branch, h, NULL);
919 }
920
921 return TRUE;
922 }
923
924 static bfd_boolean
925 build_spuear_stubs (struct elf_link_hash_entry *h, void *inf)
926 {
927 /* Symbols starting with _SPUEAR_ need a stub because they may be
928 invoked by the PPU. */
929 if ((h->root.type == bfd_link_hash_defined
930 || h->root.type == bfd_link_hash_defweak)
931 && h->def_regular
932 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0)
933 {
934 struct spu_link_hash_table *htab = inf;
935
936 build_stub (htab, NULL, NULL, non_branch, h, NULL,
937 h->root.u.def.value, h->root.u.def.section);
938 }
939
940 return TRUE;
941 }
942
943 /* Size or build stubs. */
944
945 static bfd_boolean
946 process_stubs (bfd *output_bfd,
947 struct bfd_link_info *info,
948 bfd_boolean build)
949 {
950 struct spu_link_hash_table *htab = spu_hash_table (info);
951 bfd *ibfd;
952
953 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
954 {
955 extern const bfd_target bfd_elf32_spu_vec;
956 Elf_Internal_Shdr *symtab_hdr;
957 asection *isec;
958 Elf_Internal_Sym *local_syms = NULL;
959 void *psyms;
960
961 if (ibfd->xvec != &bfd_elf32_spu_vec)
962 continue;
963
964 /* We'll need the symbol table in a second. */
965 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
966 if (symtab_hdr->sh_info == 0)
967 continue;
968
969 /* Arrange to read and keep global syms for later stack analysis. */
970 psyms = &local_syms;
971 if (htab->stack_analysis)
972 psyms = &symtab_hdr->contents;
973
974 /* Walk over each section attached to the input bfd. */
975 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
976 {
977 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
978
979 /* If there aren't any relocs, then there's nothing more to do. */
980 if ((isec->flags & SEC_RELOC) == 0
981 || (isec->flags & SEC_ALLOC) == 0
982 || (isec->flags & SEC_LOAD) == 0
983 || isec->reloc_count == 0)
984 continue;
985
986 /* If this section is a link-once section that will be
987 discarded, then don't create any stubs. */
988 if (isec->output_section == NULL
989 || isec->output_section->owner != output_bfd)
990 continue;
991
992 /* Get the relocs. */
993 internal_relocs = _bfd_elf_link_read_relocs (ibfd, isec, NULL, NULL,
994 info->keep_memory);
995 if (internal_relocs == NULL)
996 goto error_ret_free_local;
997
998 /* Now examine each relocation. */
999 irela = internal_relocs;
1000 irelaend = irela + isec->reloc_count;
1001 for (; irela < irelaend; irela++)
1002 {
1003 enum elf_spu_reloc_type r_type;
1004 unsigned int r_indx;
1005 asection *sym_sec;
1006 Elf_Internal_Sym *sym;
1007 struct elf_link_hash_entry *h;
1008 const char *sym_name;
1009 unsigned int sym_type;
1010 enum _insn_type insn_type;
1011
1012 r_type = ELF32_R_TYPE (irela->r_info);
1013 r_indx = ELF32_R_SYM (irela->r_info);
1014
1015 if (r_type >= R_SPU_max)
1016 {
1017 bfd_set_error (bfd_error_bad_value);
1018 error_ret_free_internal:
1019 if (elf_section_data (isec)->relocs != internal_relocs)
1020 free (internal_relocs);
1021 error_ret_free_local:
1022 if (local_syms != NULL
1023 && (symtab_hdr->contents
1024 != (unsigned char *) local_syms))
1025 free (local_syms);
1026 return FALSE;
1027 }
1028
1029 /* Determine the reloc target section. */
1030 if (!get_sym_h (&h, &sym, &sym_sec, psyms, r_indx, ibfd))
1031 goto error_ret_free_internal;
1032
1033 if (sym_sec == NULL
1034 || sym_sec->output_section == NULL
1035 || sym_sec->output_section->owner != output_bfd)
1036 continue;
1037
1038 /* Ensure no stubs for user supplied overlay manager syms. */
1039 if (h != NULL
1040 && (strcmp (h->root.root.string, "__ovly_load") == 0
1041 || strcmp (h->root.root.string, "__ovly_return") == 0))
1042 continue;
1043
1044 insn_type = non_branch;
1045 if (r_type == R_SPU_REL16
1046 || r_type == R_SPU_ADDR16)
1047 {
1048 unsigned char insn[4];
1049
1050 if (!bfd_get_section_contents (ibfd, isec, insn,
1051 irela->r_offset, 4))
1052 goto error_ret_free_internal;
1053
1054 if (is_branch (insn) || is_hint (insn))
1055 {
1056 insn_type = branch;
1057 if ((insn[0] & 0xfd) == 0x31)
1058 insn_type = call;
1059 }
1060 }
1061
1062 /* We are only interested in function symbols. */
1063 if (h != NULL)
1064 {
1065 sym_type = h->type;
1066 sym_name = h->root.root.string;
1067 }
1068 else
1069 {
1070 sym_type = ELF_ST_TYPE (sym->st_info);
1071 sym_name = bfd_elf_sym_name (sym_sec->owner,
1072 symtab_hdr,
1073 sym,
1074 sym_sec);
1075 }
1076
1077 if (sym_type != STT_FUNC)
1078 {
1079 /* It's common for people to write assembly and forget
1080 to give function symbols the right type. Handle
1081 calls to such symbols, but warn so that (hopefully)
1082 people will fix their code. We need the symbol
1083 type to be correct to distinguish function pointer
1084 initialisation from other pointer initialisation. */
1085 if (insn_type == call)
1086 (*_bfd_error_handler) (_("warning: call to non-function"
1087 " symbol %s defined in %B"),
1088 sym_sec->owner, sym_name);
1089 else if (insn_type == non_branch)
1090 continue;
1091 }
1092
1093 if (!needs_ovl_stub (sym_name, sym_sec, isec, htab,
1094 insn_type != non_branch))
1095 continue;
1096
1097 if (htab->stub_count == NULL)
1098 {
1099 bfd_size_type amt;
1100 amt = (htab->num_overlays + 1) * sizeof (*htab->stub_count);
1101 htab->stub_count = bfd_zmalloc (amt);
1102 if (htab->stub_count == NULL)
1103 goto error_ret_free_internal;
1104 }
1105
1106 if (!build)
1107 {
1108 if (!count_stub (htab, ibfd, isec, insn_type, h, irela))
1109 goto error_ret_free_internal;
1110 }
1111 else
1112 {
1113 bfd_vma dest;
1114
1115 if (h != NULL)
1116 dest = h->root.u.def.value;
1117 else
1118 dest = sym->st_value;
1119 dest += irela->r_addend;
1120 if (!build_stub (htab, ibfd, isec, insn_type, h, irela,
1121 dest, sym_sec))
1122 goto error_ret_free_internal;
1123 }
1124 }
1125
1126 /* We're done with the internal relocs, free them. */
1127 if (elf_section_data (isec)->relocs != internal_relocs)
1128 free (internal_relocs);
1129 }
1130
1131 if (local_syms != NULL
1132 && symtab_hdr->contents != (unsigned char *) local_syms)
1133 {
1134 if (!info->keep_memory)
1135 free (local_syms);
1136 else
1137 symtab_hdr->contents = (unsigned char *) local_syms;
1138 }
1139 }
1140
1141 return TRUE;
1142 }
1143
1144 /* Allocate space for overlay call and return stubs. */
1145
1146 int
1147 spu_elf_size_stubs (bfd *output_bfd,
1148 struct bfd_link_info *info,
1149 void (*place_spu_section) (asection *, asection *,
1150 const char *),
1151 int non_overlay_stubs)
1152 {
1153 struct spu_link_hash_table *htab = spu_hash_table (info);
1154 bfd *ibfd;
1155 bfd_size_type amt;
1156 flagword flags;
1157 unsigned int i;
1158 asection *stub;
1159
1160 htab->non_overlay_stubs = non_overlay_stubs;
1161 if (!process_stubs (output_bfd, info, FALSE))
1162 return 0;
1163
1164 elf_link_hash_traverse (&htab->elf, allocate_spuear_stubs, htab);
1165 if (htab->stub_err)
1166 return 0;
1167
1168 if (htab->stub_count == NULL)
1169 return 1;
1170
1171 ibfd = info->input_bfds;
1172 amt = (htab->num_overlays + 1) * sizeof (*htab->stub_sec);
1173 htab->stub_sec = bfd_zmalloc (amt);
1174 if (htab->stub_sec == NULL)
1175 return 0;
1176
1177 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
1178 | SEC_HAS_CONTENTS | SEC_IN_MEMORY);
1179 stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
1180 htab->stub_sec[0] = stub;
1181 if (stub == NULL
1182 || !bfd_set_section_alignment (ibfd, stub, 3 + (OVL_STUB_SIZE > 8)))
1183 return 0;
1184 stub->size = htab->stub_count[0] * OVL_STUB_SIZE;
1185 (*place_spu_section) (stub, NULL, ".text");
1186
1187 for (i = 0; i < htab->num_overlays; ++i)
1188 {
1189 asection *osec = htab->ovl_sec[i];
1190 unsigned int ovl = spu_elf_section_data (osec)->u.o.ovl_index;
1191 stub = bfd_make_section_anyway_with_flags (ibfd, ".stub", flags);
1192 htab->stub_sec[ovl] = stub;
1193 if (stub == NULL
1194 || !bfd_set_section_alignment (ibfd, stub, 3 + (OVL_STUB_SIZE > 8)))
1195 return 0;
1196 stub->size = htab->stub_count[ovl] * OVL_STUB_SIZE;
1197 (*place_spu_section) (stub, osec, NULL);
1198 }
1199
1200 /* htab->ovtab consists of two arrays.
1201 . struct {
1202 . u32 vma;
1203 . u32 size;
1204 . u32 file_off;
1205 . u32 buf;
1206 . } _ovly_table[];
1207 .
1208 . struct {
1209 . u32 mapped;
1210 . } _ovly_buf_table[];
1211 . */
1212
1213 flags = (SEC_ALLOC | SEC_LOAD
1214 | SEC_HAS_CONTENTS | SEC_IN_MEMORY);
1215 htab->ovtab = bfd_make_section_anyway_with_flags (ibfd, ".ovtab", flags);
1216 if (htab->ovtab == NULL
1217 || !bfd_set_section_alignment (ibfd, htab->ovtab, 4))
1218 return 0;
1219
1220 htab->ovtab->size = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
1221 (*place_spu_section) (htab->ovtab, NULL, ".data");
1222
1223 htab->toe = bfd_make_section_anyway_with_flags (ibfd, ".toe", SEC_ALLOC);
1224 if (htab->toe == NULL
1225 || !bfd_set_section_alignment (ibfd, htab->toe, 4))
1226 return 0;
1227 htab->toe->size = 16;
1228 (*place_spu_section) (htab->toe, NULL, ".toe");
1229
1230 return 2;
1231 }
1232
1233 /* Functions to handle embedded spu_ovl.o object. */
1234
1235 static void *
1236 ovl_mgr_open (struct bfd *nbfd ATTRIBUTE_UNUSED, void *stream)
1237 {
1238 return stream;
1239 }
1240
1241 static file_ptr
1242 ovl_mgr_pread (struct bfd *abfd ATTRIBUTE_UNUSED,
1243 void *stream,
1244 void *buf,
1245 file_ptr nbytes,
1246 file_ptr offset)
1247 {
1248 struct _ovl_stream *os;
1249 size_t count;
1250 size_t max;
1251
1252 os = (struct _ovl_stream *) stream;
1253 max = (const char *) os->end - (const char *) os->start;
1254
1255 if ((ufile_ptr) offset >= max)
1256 return 0;
1257
1258 count = nbytes;
1259 if (count > max - offset)
1260 count = max - offset;
1261
1262 memcpy (buf, (const char *) os->start + offset, count);
1263 return count;
1264 }
1265
1266 bfd_boolean
1267 spu_elf_open_builtin_lib (bfd **ovl_bfd, const struct _ovl_stream *stream)
1268 {
1269 *ovl_bfd = bfd_openr_iovec ("builtin ovl_mgr",
1270 "elf32-spu",
1271 ovl_mgr_open,
1272 (void *) stream,
1273 ovl_mgr_pread,
1274 NULL,
1275 NULL);
1276 return *ovl_bfd != NULL;
1277 }
1278
1279 /* Define an STT_OBJECT symbol. */
1280
1281 static struct elf_link_hash_entry *
1282 define_ovtab_symbol (struct spu_link_hash_table *htab, const char *name)
1283 {
1284 struct elf_link_hash_entry *h;
1285
1286 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
1287 if (h == NULL)
1288 return NULL;
1289
1290 if (h->root.type != bfd_link_hash_defined
1291 || !h->def_regular)
1292 {
1293 h->root.type = bfd_link_hash_defined;
1294 h->root.u.def.section = htab->ovtab;
1295 h->type = STT_OBJECT;
1296 h->ref_regular = 1;
1297 h->def_regular = 1;
1298 h->ref_regular_nonweak = 1;
1299 h->non_elf = 0;
1300 }
1301 else
1302 {
1303 (*_bfd_error_handler) (_("%B is not allowed to define %s"),
1304 h->root.u.def.section->owner,
1305 h->root.root.string);
1306 bfd_set_error (bfd_error_bad_value);
1307 return NULL;
1308 }
1309
1310 return h;
1311 }
1312
1313 /* Fill in all stubs and the overlay tables. */
1314
1315 bfd_boolean
1316 spu_elf_build_stubs (struct bfd_link_info *info, int emit_syms)
1317 {
1318 struct spu_link_hash_table *htab = spu_hash_table (info);
1319 struct elf_link_hash_entry *h;
1320 bfd_byte *p;
1321 asection *s;
1322 bfd *obfd;
1323 unsigned int i;
1324
1325 htab->emit_stub_syms = emit_syms;
1326 if (htab->stub_count == NULL)
1327 return TRUE;
1328
1329 for (i = 0; i <= htab->num_overlays; i++)
1330 if (htab->stub_sec[i]->size != 0)
1331 {
1332 htab->stub_sec[i]->contents = bfd_zalloc (htab->stub_sec[i]->owner,
1333 htab->stub_sec[i]->size);
1334 if (htab->stub_sec[i]->contents == NULL)
1335 return FALSE;
1336 htab->stub_sec[i]->rawsize = htab->stub_sec[i]->size;
1337 htab->stub_sec[i]->size = 0;
1338 }
1339
1340 h = elf_link_hash_lookup (&htab->elf, "__ovly_load", FALSE, FALSE, FALSE);
1341 htab->ovly_load = h;
1342 BFD_ASSERT (h != NULL
1343 && (h->root.type == bfd_link_hash_defined
1344 || h->root.type == bfd_link_hash_defweak)
1345 && h->def_regular);
1346
1347 s = h->root.u.def.section->output_section;
1348 if (spu_elf_section_data (s)->u.o.ovl_index)
1349 {
1350 (*_bfd_error_handler) (_("%s in overlay section"),
1351 h->root.u.def.section->owner);
1352 bfd_set_error (bfd_error_bad_value);
1353 return FALSE;
1354 }
1355
1356 h = elf_link_hash_lookup (&htab->elf, "__ovly_return", FALSE, FALSE, FALSE);
1357 htab->ovly_return = h;
1358
1359 /* Write out all the stubs. */
1360 obfd = htab->ovtab->output_section->owner;
1361 process_stubs (obfd, info, TRUE);
1362
1363 elf_link_hash_traverse (&htab->elf, build_spuear_stubs, htab);
1364 if (htab->stub_err)
1365 return FALSE;
1366
1367 for (i = 0; i <= htab->num_overlays; i++)
1368 {
1369 if (htab->stub_sec[i]->size != htab->stub_sec[i]->rawsize)
1370 {
1371 (*_bfd_error_handler) (_("stubs don't match calculated size"));
1372 bfd_set_error (bfd_error_bad_value);
1373 return FALSE;
1374 }
1375 htab->stub_sec[i]->rawsize = 0;
1376 }
1377
1378 if (htab->stub_err)
1379 {
1380 (*_bfd_error_handler) (_("overlay stub relocation overflow"));
1381 bfd_set_error (bfd_error_bad_value);
1382 return FALSE;
1383 }
1384
1385 htab->ovtab->contents = bfd_zalloc (htab->ovtab->owner, htab->ovtab->size);
1386 if (htab->ovtab->contents == NULL)
1387 return FALSE;
1388
1389 /* Write out _ovly_table. */
1390 p = htab->ovtab->contents;
1391 /* set low bit of .size to mark non-overlay area as present. */
1392 p[7] = 1;
1393 for (s = obfd->sections; s != NULL; s = s->next)
1394 {
1395 unsigned int ovl_index = spu_elf_section_data (s)->u.o.ovl_index;
1396
1397 if (ovl_index != 0)
1398 {
1399 unsigned long off = ovl_index * 16;
1400 unsigned int ovl_buf = spu_elf_section_data (s)->u.o.ovl_buf;
1401
1402 bfd_put_32 (htab->ovtab->owner, s->vma, p + off);
1403 bfd_put_32 (htab->ovtab->owner, (s->size + 15) & -16, p + off + 4);
1404 /* file_off written later in spu_elf_modify_program_headers. */
1405 bfd_put_32 (htab->ovtab->owner, ovl_buf, p + off + 12);
1406 }
1407 }
1408
1409 h = define_ovtab_symbol (htab, "_ovly_table");
1410 if (h == NULL)
1411 return FALSE;
1412 h->root.u.def.value = 16;
1413 h->size = htab->num_overlays * 16;
1414
1415 h = define_ovtab_symbol (htab, "_ovly_table_end");
1416 if (h == NULL)
1417 return FALSE;
1418 h->root.u.def.value = htab->num_overlays * 16 + 16;
1419 h->size = 0;
1420
1421 h = define_ovtab_symbol (htab, "_ovly_buf_table");
1422 if (h == NULL)
1423 return FALSE;
1424 h->root.u.def.value = htab->num_overlays * 16 + 16;
1425 h->size = htab->num_buf * 4;
1426
1427 h = define_ovtab_symbol (htab, "_ovly_buf_table_end");
1428 if (h == NULL)
1429 return FALSE;
1430 h->root.u.def.value = htab->num_overlays * 16 + 16 + htab->num_buf * 4;
1431 h->size = 0;
1432
1433 h = define_ovtab_symbol (htab, "_EAR_");
1434 if (h == NULL)
1435 return FALSE;
1436 h->root.u.def.section = htab->toe;
1437 h->root.u.def.value = 0;
1438 h->size = 16;
1439
1440 return TRUE;
1441 }
1442
1443 /* OFFSET in SEC (presumably) is the beginning of a function prologue.
1444 Search for stack adjusting insns, and return the sp delta. */
1445
1446 static int
1447 find_function_stack_adjust (asection *sec, bfd_vma offset)
1448 {
1449 int unrecog;
1450 int reg[128];
1451
1452 memset (reg, 0, sizeof (reg));
1453 for (unrecog = 0; offset + 4 <= sec->size && unrecog < 32; offset += 4)
1454 {
1455 unsigned char buf[4];
1456 int rt, ra;
1457 int imm;
1458
1459 /* Assume no relocs on stack adjusing insns. */
1460 if (!bfd_get_section_contents (sec->owner, sec, buf, offset, 4))
1461 break;
1462
1463 if (buf[0] == 0x24 /* stqd */)
1464 continue;
1465
1466 rt = buf[3] & 0x7f;
1467 ra = ((buf[2] & 0x3f) << 1) | (buf[3] >> 7);
1468 /* Partly decoded immediate field. */
1469 imm = (buf[1] << 9) | (buf[2] << 1) | (buf[3] >> 7);
1470
1471 if (buf[0] == 0x1c /* ai */)
1472 {
1473 imm >>= 7;
1474 imm = (imm ^ 0x200) - 0x200;
1475 reg[rt] = reg[ra] + imm;
1476
1477 if (rt == 1 /* sp */)
1478 {
1479 if (imm > 0)
1480 break;
1481 return reg[rt];
1482 }
1483 }
1484 else if (buf[0] == 0x18 && (buf[1] & 0xe0) == 0 /* a */)
1485 {
1486 int rb = ((buf[1] & 0x1f) << 2) | ((buf[2] & 0xc0) >> 6);
1487
1488 reg[rt] = reg[ra] + reg[rb];
1489 if (rt == 1)
1490 return reg[rt];
1491 }
1492 else if ((buf[0] & 0xfc) == 0x40 /* il, ilh, ilhu, ila */)
1493 {
1494 if (buf[0] >= 0x42 /* ila */)
1495 imm |= (buf[0] & 1) << 17;
1496 else
1497 {
1498 imm &= 0xffff;
1499
1500 if (buf[0] == 0x40 /* il */)
1501 {
1502 if ((buf[1] & 0x80) == 0)
1503 goto unknown_insn;
1504 imm = (imm ^ 0x8000) - 0x8000;
1505 }
1506 else if ((buf[1] & 0x80) == 0 /* ilhu */)
1507 imm <<= 16;
1508 }
1509 reg[rt] = imm;
1510 continue;
1511 }
1512 else if (buf[0] == 0x60 && (buf[1] & 0x80) != 0 /* iohl */)
1513 {
1514 reg[rt] |= imm & 0xffff;
1515 continue;
1516 }
1517 else if (buf[0] == 0x04 /* ori */)
1518 {
1519 imm >>= 7;
1520 imm = (imm ^ 0x200) - 0x200;
1521 reg[rt] = reg[ra] | imm;
1522 continue;
1523 }
1524 else if ((buf[0] == 0x33 && imm == 1 /* brsl .+4 */)
1525 || (buf[0] == 0x08 && (buf[1] & 0xe0) == 0 /* sf */))
1526 {
1527 /* Used in pic reg load. Say rt is trashed. */
1528 reg[rt] = 0;
1529 continue;
1530 }
1531 else if (is_branch (buf) || is_indirect_branch (buf))
1532 /* If we hit a branch then we must be out of the prologue. */
1533 break;
1534 unknown_insn:
1535 ++unrecog;
1536 }
1537
1538 return 0;
1539 }
1540
1541 /* qsort predicate to sort symbols by section and value. */
1542
1543 static Elf_Internal_Sym *sort_syms_syms;
1544 static asection **sort_syms_psecs;
1545
1546 static int
1547 sort_syms (const void *a, const void *b)
1548 {
1549 Elf_Internal_Sym *const *s1 = a;
1550 Elf_Internal_Sym *const *s2 = b;
1551 asection *sec1,*sec2;
1552 bfd_signed_vma delta;
1553
1554 sec1 = sort_syms_psecs[*s1 - sort_syms_syms];
1555 sec2 = sort_syms_psecs[*s2 - sort_syms_syms];
1556
1557 if (sec1 != sec2)
1558 return sec1->index - sec2->index;
1559
1560 delta = (*s1)->st_value - (*s2)->st_value;
1561 if (delta != 0)
1562 return delta < 0 ? -1 : 1;
1563
1564 delta = (*s2)->st_size - (*s1)->st_size;
1565 if (delta != 0)
1566 return delta < 0 ? -1 : 1;
1567
1568 return *s1 < *s2 ? -1 : 1;
1569 }
1570
1571 struct call_info
1572 {
1573 struct function_info *fun;
1574 struct call_info *next;
1575 int is_tail;
1576 };
1577
1578 struct function_info
1579 {
1580 /* List of functions called. Also branches to hot/cold part of
1581 function. */
1582 struct call_info *call_list;
1583 /* For hot/cold part of function, point to owner. */
1584 struct function_info *start;
1585 /* Symbol at start of function. */
1586 union {
1587 Elf_Internal_Sym *sym;
1588 struct elf_link_hash_entry *h;
1589 } u;
1590 /* Function section. */
1591 asection *sec;
1592 /* Address range of (this part of) function. */
1593 bfd_vma lo, hi;
1594 /* Stack usage. */
1595 int stack;
1596 /* Set if global symbol. */
1597 unsigned int global : 1;
1598 /* Set if known to be start of function (as distinct from a hunk
1599 in hot/cold section. */
1600 unsigned int is_func : 1;
1601 /* Flags used during call tree traversal. */
1602 unsigned int visit1 : 1;
1603 unsigned int non_root : 1;
1604 unsigned int visit2 : 1;
1605 unsigned int marking : 1;
1606 unsigned int visit3 : 1;
1607 };
1608
1609 struct spu_elf_stack_info
1610 {
1611 int num_fun;
1612 int max_fun;
1613 /* Variable size array describing functions, one per contiguous
1614 address range belonging to a function. */
1615 struct function_info fun[1];
1616 };
1617
1618 /* Allocate a struct spu_elf_stack_info with MAX_FUN struct function_info
1619 entries for section SEC. */
1620
1621 static struct spu_elf_stack_info *
1622 alloc_stack_info (asection *sec, int max_fun)
1623 {
1624 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
1625 bfd_size_type amt;
1626
1627 amt = sizeof (struct spu_elf_stack_info);
1628 amt += (max_fun - 1) * sizeof (struct function_info);
1629 sec_data->u.i.stack_info = bfd_zmalloc (amt);
1630 if (sec_data->u.i.stack_info != NULL)
1631 sec_data->u.i.stack_info->max_fun = max_fun;
1632 return sec_data->u.i.stack_info;
1633 }
1634
1635 /* Add a new struct function_info describing a (part of a) function
1636 starting at SYM_H. Keep the array sorted by address. */
1637
1638 static struct function_info *
1639 maybe_insert_function (asection *sec,
1640 void *sym_h,
1641 bfd_boolean global,
1642 bfd_boolean is_func)
1643 {
1644 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
1645 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
1646 int i;
1647 bfd_vma off, size;
1648
1649 if (sinfo == NULL)
1650 {
1651 sinfo = alloc_stack_info (sec, 20);
1652 if (sinfo == NULL)
1653 return NULL;
1654 }
1655
1656 if (!global)
1657 {
1658 Elf_Internal_Sym *sym = sym_h;
1659 off = sym->st_value;
1660 size = sym->st_size;
1661 }
1662 else
1663 {
1664 struct elf_link_hash_entry *h = sym_h;
1665 off = h->root.u.def.value;
1666 size = h->size;
1667 }
1668
1669 for (i = sinfo->num_fun; --i >= 0; )
1670 if (sinfo->fun[i].lo <= off)
1671 break;
1672
1673 if (i >= 0)
1674 {
1675 /* Don't add another entry for an alias, but do update some
1676 info. */
1677 if (sinfo->fun[i].lo == off)
1678 {
1679 /* Prefer globals over local syms. */
1680 if (global && !sinfo->fun[i].global)
1681 {
1682 sinfo->fun[i].global = TRUE;
1683 sinfo->fun[i].u.h = sym_h;
1684 }
1685 if (is_func)
1686 sinfo->fun[i].is_func = TRUE;
1687 return &sinfo->fun[i];
1688 }
1689 /* Ignore a zero-size symbol inside an existing function. */
1690 else if (sinfo->fun[i].hi > off && size == 0)
1691 return &sinfo->fun[i];
1692 }
1693
1694 if (++i < sinfo->num_fun)
1695 memmove (&sinfo->fun[i + 1], &sinfo->fun[i],
1696 (sinfo->num_fun - i) * sizeof (sinfo->fun[i]));
1697 else if (i >= sinfo->max_fun)
1698 {
1699 bfd_size_type amt = sizeof (struct spu_elf_stack_info);
1700 bfd_size_type old = amt;
1701
1702 old += (sinfo->max_fun - 1) * sizeof (struct function_info);
1703 sinfo->max_fun += 20 + (sinfo->max_fun >> 1);
1704 amt += (sinfo->max_fun - 1) * sizeof (struct function_info);
1705 sinfo = bfd_realloc (sinfo, amt);
1706 if (sinfo == NULL)
1707 return NULL;
1708 memset ((char *) sinfo + old, 0, amt - old);
1709 sec_data->u.i.stack_info = sinfo;
1710 }
1711 sinfo->fun[i].is_func = is_func;
1712 sinfo->fun[i].global = global;
1713 sinfo->fun[i].sec = sec;
1714 if (global)
1715 sinfo->fun[i].u.h = sym_h;
1716 else
1717 sinfo->fun[i].u.sym = sym_h;
1718 sinfo->fun[i].lo = off;
1719 sinfo->fun[i].hi = off + size;
1720 sinfo->fun[i].stack = -find_function_stack_adjust (sec, off);
1721 sinfo->num_fun += 1;
1722 return &sinfo->fun[i];
1723 }
1724
1725 /* Return the name of FUN. */
1726
1727 static const char *
1728 func_name (struct function_info *fun)
1729 {
1730 asection *sec;
1731 bfd *ibfd;
1732 Elf_Internal_Shdr *symtab_hdr;
1733
1734 while (fun->start != NULL)
1735 fun = fun->start;
1736
1737 if (fun->global)
1738 return fun->u.h->root.root.string;
1739
1740 sec = fun->sec;
1741 if (fun->u.sym->st_name == 0)
1742 {
1743 size_t len = strlen (sec->name);
1744 char *name = bfd_malloc (len + 10);
1745 if (name == NULL)
1746 return "(null)";
1747 sprintf (name, "%s+%lx", sec->name,
1748 (unsigned long) fun->u.sym->st_value & 0xffffffff);
1749 return name;
1750 }
1751 ibfd = sec->owner;
1752 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
1753 return bfd_elf_sym_name (ibfd, symtab_hdr, fun->u.sym, sec);
1754 }
1755
1756 /* Read the instruction at OFF in SEC. Return true iff the instruction
1757 is a nop, lnop, or stop 0 (all zero insn). */
1758
1759 static bfd_boolean
1760 is_nop (asection *sec, bfd_vma off)
1761 {
1762 unsigned char insn[4];
1763
1764 if (off + 4 > sec->size
1765 || !bfd_get_section_contents (sec->owner, sec, insn, off, 4))
1766 return FALSE;
1767 if ((insn[0] & 0xbf) == 0 && (insn[1] & 0xe0) == 0x20)
1768 return TRUE;
1769 if (insn[0] == 0 && insn[1] == 0 && insn[2] == 0 && insn[3] == 0)
1770 return TRUE;
1771 return FALSE;
1772 }
1773
1774 /* Extend the range of FUN to cover nop padding up to LIMIT.
1775 Return TRUE iff some instruction other than a NOP was found. */
1776
1777 static bfd_boolean
1778 insns_at_end (struct function_info *fun, bfd_vma limit)
1779 {
1780 bfd_vma off = (fun->hi + 3) & -4;
1781
1782 while (off < limit && is_nop (fun->sec, off))
1783 off += 4;
1784 if (off < limit)
1785 {
1786 fun->hi = off;
1787 return TRUE;
1788 }
1789 fun->hi = limit;
1790 return FALSE;
1791 }
1792
1793 /* Check and fix overlapping function ranges. Return TRUE iff there
1794 are gaps in the current info we have about functions in SEC. */
1795
1796 static bfd_boolean
1797 check_function_ranges (asection *sec, struct bfd_link_info *info)
1798 {
1799 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
1800 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
1801 int i;
1802 bfd_boolean gaps = FALSE;
1803
1804 if (sinfo == NULL)
1805 return FALSE;
1806
1807 for (i = 1; i < sinfo->num_fun; i++)
1808 if (sinfo->fun[i - 1].hi > sinfo->fun[i].lo)
1809 {
1810 /* Fix overlapping symbols. */
1811 const char *f1 = func_name (&sinfo->fun[i - 1]);
1812 const char *f2 = func_name (&sinfo->fun[i]);
1813
1814 info->callbacks->einfo (_("warning: %s overlaps %s\n"), f1, f2);
1815 sinfo->fun[i - 1].hi = sinfo->fun[i].lo;
1816 }
1817 else if (insns_at_end (&sinfo->fun[i - 1], sinfo->fun[i].lo))
1818 gaps = TRUE;
1819
1820 if (sinfo->num_fun == 0)
1821 gaps = TRUE;
1822 else
1823 {
1824 if (sinfo->fun[0].lo != 0)
1825 gaps = TRUE;
1826 if (sinfo->fun[sinfo->num_fun - 1].hi > sec->size)
1827 {
1828 const char *f1 = func_name (&sinfo->fun[sinfo->num_fun - 1]);
1829
1830 info->callbacks->einfo (_("warning: %s exceeds section size\n"), f1);
1831 sinfo->fun[sinfo->num_fun - 1].hi = sec->size;
1832 }
1833 else if (insns_at_end (&sinfo->fun[sinfo->num_fun - 1], sec->size))
1834 gaps = TRUE;
1835 }
1836 return gaps;
1837 }
1838
1839 /* Search current function info for a function that contains address
1840 OFFSET in section SEC. */
1841
1842 static struct function_info *
1843 find_function (asection *sec, bfd_vma offset, struct bfd_link_info *info)
1844 {
1845 struct _spu_elf_section_data *sec_data = spu_elf_section_data (sec);
1846 struct spu_elf_stack_info *sinfo = sec_data->u.i.stack_info;
1847 int lo, hi, mid;
1848
1849 lo = 0;
1850 hi = sinfo->num_fun;
1851 while (lo < hi)
1852 {
1853 mid = (lo + hi) / 2;
1854 if (offset < sinfo->fun[mid].lo)
1855 hi = mid;
1856 else if (offset >= sinfo->fun[mid].hi)
1857 lo = mid + 1;
1858 else
1859 return &sinfo->fun[mid];
1860 }
1861 info->callbacks->einfo (_("%A:0x%v not found in function table\n"),
1862 sec, offset);
1863 return NULL;
1864 }
1865
1866 /* Add CALLEE to CALLER call list if not already present. */
1867
1868 static bfd_boolean
1869 insert_callee (struct function_info *caller, struct call_info *callee)
1870 {
1871 struct call_info *p;
1872 for (p = caller->call_list; p != NULL; p = p->next)
1873 if (p->fun == callee->fun)
1874 {
1875 /* Tail calls use less stack than normal calls. Retain entry
1876 for normal call over one for tail call. */
1877 if (p->is_tail > callee->is_tail)
1878 p->is_tail = callee->is_tail;
1879 return FALSE;
1880 }
1881 callee->next = caller->call_list;
1882 caller->call_list = callee;
1883 return TRUE;
1884 }
1885
1886 /* Rummage through the relocs for SEC, looking for function calls.
1887 If CALL_TREE is true, fill in call graph. If CALL_TREE is false,
1888 mark destination symbols on calls as being functions. Also
1889 look at branches, which may be tail calls or go to hot/cold
1890 section part of same function. */
1891
1892 static bfd_boolean
1893 mark_functions_via_relocs (asection *sec,
1894 struct bfd_link_info *info,
1895 int call_tree)
1896 {
1897 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
1898 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (sec->owner)->symtab_hdr;
1899 Elf_Internal_Sym *syms;
1900 void *psyms;
1901 static bfd_boolean warned;
1902
1903 internal_relocs = _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL,
1904 info->keep_memory);
1905 if (internal_relocs == NULL)
1906 return FALSE;
1907
1908 symtab_hdr = &elf_tdata (sec->owner)->symtab_hdr;
1909 psyms = &symtab_hdr->contents;
1910 syms = *(Elf_Internal_Sym **) psyms;
1911 irela = internal_relocs;
1912 irelaend = irela + sec->reloc_count;
1913 for (; irela < irelaend; irela++)
1914 {
1915 enum elf_spu_reloc_type r_type;
1916 unsigned int r_indx;
1917 asection *sym_sec;
1918 Elf_Internal_Sym *sym;
1919 struct elf_link_hash_entry *h;
1920 bfd_vma val;
1921 unsigned char insn[4];
1922 bfd_boolean is_call;
1923 struct function_info *caller;
1924 struct call_info *callee;
1925
1926 r_type = ELF32_R_TYPE (irela->r_info);
1927 if (r_type != R_SPU_REL16
1928 && r_type != R_SPU_ADDR16)
1929 continue;
1930
1931 r_indx = ELF32_R_SYM (irela->r_info);
1932 if (!get_sym_h (&h, &sym, &sym_sec, psyms, r_indx, sec->owner))
1933 return FALSE;
1934
1935 if (sym_sec == NULL
1936 || sym_sec->output_section == NULL
1937 || sym_sec->output_section->owner != sec->output_section->owner)
1938 continue;
1939
1940 if (!bfd_get_section_contents (sec->owner, sec, insn,
1941 irela->r_offset, 4))
1942 return FALSE;
1943 if (!is_branch (insn))
1944 continue;
1945
1946 if ((sym_sec->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE))
1947 != (SEC_ALLOC | SEC_LOAD | SEC_CODE))
1948 {
1949 if (!call_tree)
1950 warned = TRUE;
1951 if (!call_tree || !warned)
1952 info->callbacks->einfo (_("%B(%A+0x%v): call to non-code section"
1953 " %B(%A), stack analysis incomplete\n"),
1954 sec->owner, sec, irela->r_offset,
1955 sym_sec->owner, sym_sec);
1956 continue;
1957 }
1958
1959 is_call = (insn[0] & 0xfd) == 0x31;
1960
1961 if (h)
1962 val = h->root.u.def.value;
1963 else
1964 val = sym->st_value;
1965 val += irela->r_addend;
1966
1967 if (!call_tree)
1968 {
1969 struct function_info *fun;
1970
1971 if (irela->r_addend != 0)
1972 {
1973 Elf_Internal_Sym *fake = bfd_zmalloc (sizeof (*fake));
1974 if (fake == NULL)
1975 return FALSE;
1976 fake->st_value = val;
1977 fake->st_shndx
1978 = _bfd_elf_section_from_bfd_section (sym_sec->owner, sym_sec);
1979 sym = fake;
1980 }
1981 if (sym)
1982 fun = maybe_insert_function (sym_sec, sym, FALSE, is_call);
1983 else
1984 fun = maybe_insert_function (sym_sec, h, TRUE, is_call);
1985 if (fun == NULL)
1986 return FALSE;
1987 if (irela->r_addend != 0
1988 && fun->u.sym != sym)
1989 free (sym);
1990 continue;
1991 }
1992
1993 caller = find_function (sec, irela->r_offset, info);
1994 if (caller == NULL)
1995 return FALSE;
1996 callee = bfd_malloc (sizeof *callee);
1997 if (callee == NULL)
1998 return FALSE;
1999
2000 callee->fun = find_function (sym_sec, val, info);
2001 if (callee->fun == NULL)
2002 return FALSE;
2003 callee->is_tail = !is_call;
2004 if (!insert_callee (caller, callee))
2005 free (callee);
2006 else if (!is_call
2007 && !callee->fun->is_func
2008 && callee->fun->stack == 0)
2009 {
2010 /* This is either a tail call or a branch from one part of
2011 the function to another, ie. hot/cold section. If the
2012 destination has been called by some other function then
2013 it is a separate function. We also assume that functions
2014 are not split across input files. */
2015 if (sec->owner != sym_sec->owner)
2016 {
2017 callee->fun->start = NULL;
2018 callee->fun->is_func = TRUE;
2019 }
2020 else if (callee->fun->start == NULL)
2021 callee->fun->start = caller;
2022 else
2023 {
2024 struct function_info *callee_start;
2025 struct function_info *caller_start;
2026 callee_start = callee->fun;
2027 while (callee_start->start)
2028 callee_start = callee_start->start;
2029 caller_start = caller;
2030 while (caller_start->start)
2031 caller_start = caller_start->start;
2032 if (caller_start != callee_start)
2033 {
2034 callee->fun->start = NULL;
2035 callee->fun->is_func = TRUE;
2036 }
2037 }
2038 }
2039 }
2040
2041 return TRUE;
2042 }
2043
2044 /* Handle something like .init or .fini, which has a piece of a function.
2045 These sections are pasted together to form a single function. */
2046
2047 static bfd_boolean
2048 pasted_function (asection *sec, struct bfd_link_info *info)
2049 {
2050 struct bfd_link_order *l;
2051 struct _spu_elf_section_data *sec_data;
2052 struct spu_elf_stack_info *sinfo;
2053 Elf_Internal_Sym *fake;
2054 struct function_info *fun, *fun_start;
2055
2056 fake = bfd_zmalloc (sizeof (*fake));
2057 if (fake == NULL)
2058 return FALSE;
2059 fake->st_value = 0;
2060 fake->st_size = sec->size;
2061 fake->st_shndx
2062 = _bfd_elf_section_from_bfd_section (sec->owner, sec);
2063 fun = maybe_insert_function (sec, fake, FALSE, FALSE);
2064 if (!fun)
2065 return FALSE;
2066
2067 /* Find a function immediately preceding this section. */
2068 fun_start = NULL;
2069 for (l = sec->output_section->map_head.link_order; l != NULL; l = l->next)
2070 {
2071 if (l->u.indirect.section == sec)
2072 {
2073 if (fun_start != NULL)
2074 fun->start = fun_start;
2075 return TRUE;
2076 }
2077 if (l->type == bfd_indirect_link_order
2078 && (sec_data = spu_elf_section_data (l->u.indirect.section)) != NULL
2079 && (sinfo = sec_data->u.i.stack_info) != NULL
2080 && sinfo->num_fun != 0)
2081 fun_start = &sinfo->fun[sinfo->num_fun - 1];
2082 }
2083
2084 info->callbacks->einfo (_("%A link_order not found\n"), sec);
2085 return FALSE;
2086 }
2087
2088 /* We're only interested in code sections. Testing SEC_IN_MEMORY excludes
2089 overlay stub sections. */
2090
2091 static bfd_boolean
2092 interesting_section (asection *s, bfd *obfd)
2093 {
2094 return (s->output_section != NULL
2095 && s->output_section->owner == obfd
2096 && ((s->flags & (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_IN_MEMORY))
2097 == (SEC_ALLOC | SEC_LOAD | SEC_CODE))
2098 && s->size != 0);
2099 }
2100
2101 /* Map address ranges in code sections to functions. */
2102
2103 static bfd_boolean
2104 discover_functions (bfd *output_bfd, struct bfd_link_info *info)
2105 {
2106 bfd *ibfd;
2107 int bfd_idx;
2108 Elf_Internal_Sym ***psym_arr;
2109 asection ***sec_arr;
2110 bfd_boolean gaps = FALSE;
2111
2112 bfd_idx = 0;
2113 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2114 bfd_idx++;
2115
2116 psym_arr = bfd_zmalloc (bfd_idx * sizeof (*psym_arr));
2117 if (psym_arr == NULL)
2118 return FALSE;
2119 sec_arr = bfd_zmalloc (bfd_idx * sizeof (*sec_arr));
2120 if (sec_arr == NULL)
2121 return FALSE;
2122
2123
2124 for (ibfd = info->input_bfds, bfd_idx = 0;
2125 ibfd != NULL;
2126 ibfd = ibfd->link_next, bfd_idx++)
2127 {
2128 extern const bfd_target bfd_elf32_spu_vec;
2129 Elf_Internal_Shdr *symtab_hdr;
2130 asection *sec;
2131 size_t symcount;
2132 Elf_Internal_Sym *syms, *sy, **psyms, **psy;
2133 asection **psecs, **p;
2134
2135 if (ibfd->xvec != &bfd_elf32_spu_vec)
2136 continue;
2137
2138 /* Read all the symbols. */
2139 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2140 symcount = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
2141 if (symcount == 0)
2142 continue;
2143
2144 syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2145 if (syms == NULL)
2146 {
2147 syms = bfd_elf_get_elf_syms (ibfd, symtab_hdr, symcount, 0,
2148 NULL, NULL, NULL);
2149 symtab_hdr->contents = (void *) syms;
2150 if (syms == NULL)
2151 return FALSE;
2152 }
2153
2154 /* Select defined function symbols that are going to be output. */
2155 psyms = bfd_malloc ((symcount + 1) * sizeof (*psyms));
2156 if (psyms == NULL)
2157 return FALSE;
2158 psym_arr[bfd_idx] = psyms;
2159 psecs = bfd_malloc (symcount * sizeof (*psecs));
2160 if (psecs == NULL)
2161 return FALSE;
2162 sec_arr[bfd_idx] = psecs;
2163 for (psy = psyms, p = psecs, sy = syms; sy < syms + symcount; ++p, ++sy)
2164 if (ELF_ST_TYPE (sy->st_info) == STT_NOTYPE
2165 || ELF_ST_TYPE (sy->st_info) == STT_FUNC)
2166 {
2167 asection *s;
2168
2169 *p = s = bfd_section_from_elf_index (ibfd, sy->st_shndx);
2170 if (s != NULL && interesting_section (s, output_bfd))
2171 *psy++ = sy;
2172 }
2173 symcount = psy - psyms;
2174 *psy = NULL;
2175
2176 /* Sort them by section and offset within section. */
2177 sort_syms_syms = syms;
2178 sort_syms_psecs = psecs;
2179 qsort (psyms, symcount, sizeof (*psyms), sort_syms);
2180
2181 /* Now inspect the function symbols. */
2182 for (psy = psyms; psy < psyms + symcount; )
2183 {
2184 asection *s = psecs[*psy - syms];
2185 Elf_Internal_Sym **psy2;
2186
2187 for (psy2 = psy; ++psy2 < psyms + symcount; )
2188 if (psecs[*psy2 - syms] != s)
2189 break;
2190
2191 if (!alloc_stack_info (s, psy2 - psy))
2192 return FALSE;
2193 psy = psy2;
2194 }
2195
2196 /* First install info about properly typed and sized functions.
2197 In an ideal world this will cover all code sections, except
2198 when partitioning functions into hot and cold sections,
2199 and the horrible pasted together .init and .fini functions. */
2200 for (psy = psyms; psy < psyms + symcount; ++psy)
2201 {
2202 sy = *psy;
2203 if (ELF_ST_TYPE (sy->st_info) == STT_FUNC)
2204 {
2205 asection *s = psecs[sy - syms];
2206 if (!maybe_insert_function (s, sy, FALSE, TRUE))
2207 return FALSE;
2208 }
2209 }
2210
2211 for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
2212 if (interesting_section (sec, output_bfd))
2213 gaps |= check_function_ranges (sec, info);
2214 }
2215
2216 if (gaps)
2217 {
2218 /* See if we can discover more function symbols by looking at
2219 relocations. */
2220 for (ibfd = info->input_bfds, bfd_idx = 0;
2221 ibfd != NULL;
2222 ibfd = ibfd->link_next, bfd_idx++)
2223 {
2224 asection *sec;
2225
2226 if (psym_arr[bfd_idx] == NULL)
2227 continue;
2228
2229 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2230 if (interesting_section (sec, output_bfd)
2231 && sec->reloc_count != 0)
2232 {
2233 if (!mark_functions_via_relocs (sec, info, FALSE))
2234 return FALSE;
2235 }
2236 }
2237
2238 for (ibfd = info->input_bfds, bfd_idx = 0;
2239 ibfd != NULL;
2240 ibfd = ibfd->link_next, bfd_idx++)
2241 {
2242 Elf_Internal_Shdr *symtab_hdr;
2243 asection *sec;
2244 Elf_Internal_Sym *syms, *sy, **psyms, **psy;
2245 asection **psecs;
2246
2247 if ((psyms = psym_arr[bfd_idx]) == NULL)
2248 continue;
2249
2250 psecs = sec_arr[bfd_idx];
2251
2252 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
2253 syms = (Elf_Internal_Sym *) symtab_hdr->contents;
2254
2255 gaps = FALSE;
2256 for (sec = ibfd->sections; sec != NULL && !gaps; sec = sec->next)
2257 if (interesting_section (sec, output_bfd))
2258 gaps |= check_function_ranges (sec, info);
2259 if (!gaps)
2260 continue;
2261
2262 /* Finally, install all globals. */
2263 for (psy = psyms; (sy = *psy) != NULL; ++psy)
2264 {
2265 asection *s;
2266
2267 s = psecs[sy - syms];
2268
2269 /* Global syms might be improperly typed functions. */
2270 if (ELF_ST_TYPE (sy->st_info) != STT_FUNC
2271 && ELF_ST_BIND (sy->st_info) == STB_GLOBAL)
2272 {
2273 if (!maybe_insert_function (s, sy, FALSE, FALSE))
2274 return FALSE;
2275 }
2276 }
2277
2278 /* Some of the symbols we've installed as marking the
2279 beginning of functions may have a size of zero. Extend
2280 the range of such functions to the beginning of the
2281 next symbol of interest. */
2282 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2283 if (interesting_section (sec, output_bfd))
2284 {
2285 struct _spu_elf_section_data *sec_data;
2286 struct spu_elf_stack_info *sinfo;
2287
2288 sec_data = spu_elf_section_data (sec);
2289 sinfo = sec_data->u.i.stack_info;
2290 if (sinfo != NULL)
2291 {
2292 int fun_idx;
2293 bfd_vma hi = sec->size;
2294
2295 for (fun_idx = sinfo->num_fun; --fun_idx >= 0; )
2296 {
2297 sinfo->fun[fun_idx].hi = hi;
2298 hi = sinfo->fun[fun_idx].lo;
2299 }
2300 }
2301 /* No symbols in this section. Must be .init or .fini
2302 or something similar. */
2303 else if (!pasted_function (sec, info))
2304 return FALSE;
2305 }
2306 }
2307 }
2308
2309 for (ibfd = info->input_bfds, bfd_idx = 0;
2310 ibfd != NULL;
2311 ibfd = ibfd->link_next, bfd_idx++)
2312 {
2313 if (psym_arr[bfd_idx] == NULL)
2314 continue;
2315
2316 free (psym_arr[bfd_idx]);
2317 free (sec_arr[bfd_idx]);
2318 }
2319
2320 free (psym_arr);
2321 free (sec_arr);
2322
2323 return TRUE;
2324 }
2325
2326 /* Mark nodes in the call graph that are called by some other node. */
2327
2328 static void
2329 mark_non_root (struct function_info *fun)
2330 {
2331 struct call_info *call;
2332
2333 fun->visit1 = TRUE;
2334 for (call = fun->call_list; call; call = call->next)
2335 {
2336 call->fun->non_root = TRUE;
2337 if (!call->fun->visit1)
2338 mark_non_root (call->fun);
2339 }
2340 }
2341
2342 /* Remove cycles from the call graph. */
2343
2344 static void
2345 call_graph_traverse (struct function_info *fun, struct bfd_link_info *info)
2346 {
2347 struct call_info **callp, *call;
2348
2349 fun->visit2 = TRUE;
2350 fun->marking = TRUE;
2351
2352 callp = &fun->call_list;
2353 while ((call = *callp) != NULL)
2354 {
2355 if (!call->fun->visit2)
2356 call_graph_traverse (call->fun, info);
2357 else if (call->fun->marking)
2358 {
2359 const char *f1 = func_name (fun);
2360 const char *f2 = func_name (call->fun);
2361
2362 info->callbacks->info (_("Stack analysis will ignore the call "
2363 "from %s to %s\n"),
2364 f1, f2);
2365 *callp = call->next;
2366 continue;
2367 }
2368 callp = &call->next;
2369 }
2370 fun->marking = FALSE;
2371 }
2372
2373 /* Populate call_list for each function. */
2374
2375 static bfd_boolean
2376 build_call_tree (bfd *output_bfd, struct bfd_link_info *info)
2377 {
2378 bfd *ibfd;
2379
2380 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2381 {
2382 extern const bfd_target bfd_elf32_spu_vec;
2383 asection *sec;
2384
2385 if (ibfd->xvec != &bfd_elf32_spu_vec)
2386 continue;
2387
2388 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2389 {
2390 if (!interesting_section (sec, output_bfd)
2391 || sec->reloc_count == 0)
2392 continue;
2393
2394 if (!mark_functions_via_relocs (sec, info, TRUE))
2395 return FALSE;
2396 }
2397
2398 /* Transfer call info from hot/cold section part of function
2399 to main entry. */
2400 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2401 {
2402 struct _spu_elf_section_data *sec_data;
2403 struct spu_elf_stack_info *sinfo;
2404
2405 if ((sec_data = spu_elf_section_data (sec)) != NULL
2406 && (sinfo = sec_data->u.i.stack_info) != NULL)
2407 {
2408 int i;
2409 for (i = 0; i < sinfo->num_fun; ++i)
2410 {
2411 struct function_info *start = sinfo->fun[i].start;
2412
2413 if (start != NULL)
2414 {
2415 struct call_info *call;
2416
2417 while (start->start != NULL)
2418 start = start->start;
2419 call = sinfo->fun[i].call_list;
2420 while (call != NULL)
2421 {
2422 struct call_info *call_next = call->next;
2423 if (!insert_callee (start, call))
2424 free (call);
2425 call = call_next;
2426 }
2427 sinfo->fun[i].call_list = NULL;
2428 sinfo->fun[i].non_root = TRUE;
2429 }
2430 }
2431 }
2432 }
2433 }
2434
2435 /* Find the call graph root(s). */
2436 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2437 {
2438 extern const bfd_target bfd_elf32_spu_vec;
2439 asection *sec;
2440
2441 if (ibfd->xvec != &bfd_elf32_spu_vec)
2442 continue;
2443
2444 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2445 {
2446 struct _spu_elf_section_data *sec_data;
2447 struct spu_elf_stack_info *sinfo;
2448
2449 if ((sec_data = spu_elf_section_data (sec)) != NULL
2450 && (sinfo = sec_data->u.i.stack_info) != NULL)
2451 {
2452 int i;
2453 for (i = 0; i < sinfo->num_fun; ++i)
2454 if (!sinfo->fun[i].visit1)
2455 mark_non_root (&sinfo->fun[i]);
2456 }
2457 }
2458 }
2459
2460 /* Remove cycles from the call graph. We start from the root node(s)
2461 so that we break cycles in a reasonable place. */
2462 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2463 {
2464 extern const bfd_target bfd_elf32_spu_vec;
2465 asection *sec;
2466
2467 if (ibfd->xvec != &bfd_elf32_spu_vec)
2468 continue;
2469
2470 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2471 {
2472 struct _spu_elf_section_data *sec_data;
2473 struct spu_elf_stack_info *sinfo;
2474
2475 if ((sec_data = spu_elf_section_data (sec)) != NULL
2476 && (sinfo = sec_data->u.i.stack_info) != NULL)
2477 {
2478 int i;
2479 for (i = 0; i < sinfo->num_fun; ++i)
2480 if (!sinfo->fun[i].non_root)
2481 call_graph_traverse (&sinfo->fun[i], info);
2482 }
2483 }
2484 }
2485
2486 return TRUE;
2487 }
2488
2489 /* Descend the call graph for FUN, accumulating total stack required. */
2490
2491 static bfd_vma
2492 sum_stack (struct function_info *fun,
2493 struct bfd_link_info *info,
2494 int emit_stack_syms)
2495 {
2496 struct call_info *call;
2497 struct function_info *max = NULL;
2498 bfd_vma max_stack = fun->stack;
2499 bfd_vma stack;
2500 const char *f1;
2501
2502 if (fun->visit3)
2503 return max_stack;
2504
2505 for (call = fun->call_list; call; call = call->next)
2506 {
2507 stack = sum_stack (call->fun, info, emit_stack_syms);
2508 /* Include caller stack for normal calls, don't do so for
2509 tail calls. fun->stack here is local stack usage for
2510 this function. */
2511 if (!call->is_tail)
2512 stack += fun->stack;
2513 if (max_stack < stack)
2514 {
2515 max_stack = stack;
2516 max = call->fun;
2517 }
2518 }
2519
2520 f1 = func_name (fun);
2521 info->callbacks->minfo (_("%s: 0x%v 0x%v\n"),
2522 f1, (bfd_vma) fun->stack, max_stack);
2523
2524 if (fun->call_list)
2525 {
2526 info->callbacks->minfo (_(" calls:\n"));
2527 for (call = fun->call_list; call; call = call->next)
2528 {
2529 const char *f2 = func_name (call->fun);
2530 const char *ann1 = call->fun == max ? "*" : " ";
2531 const char *ann2 = call->is_tail ? "t" : " ";
2532
2533 info->callbacks->minfo (_(" %s%s %s\n"), ann1, ann2, f2);
2534 }
2535 }
2536
2537 /* Now fun->stack holds cumulative stack. */
2538 fun->stack = max_stack;
2539 fun->visit3 = TRUE;
2540
2541 if (emit_stack_syms)
2542 {
2543 struct spu_link_hash_table *htab = spu_hash_table (info);
2544 char *name = bfd_malloc (18 + strlen (f1));
2545 struct elf_link_hash_entry *h;
2546
2547 if (name != NULL)
2548 {
2549 if (fun->global || ELF_ST_BIND (fun->u.sym->st_info) == STB_GLOBAL)
2550 sprintf (name, "__stack_%s", f1);
2551 else
2552 sprintf (name, "__stack_%x_%s", fun->sec->id & 0xffffffff, f1);
2553
2554 h = elf_link_hash_lookup (&htab->elf, name, TRUE, TRUE, FALSE);
2555 free (name);
2556 if (h != NULL
2557 && (h->root.type == bfd_link_hash_new
2558 || h->root.type == bfd_link_hash_undefined
2559 || h->root.type == bfd_link_hash_undefweak))
2560 {
2561 h->root.type = bfd_link_hash_defined;
2562 h->root.u.def.section = bfd_abs_section_ptr;
2563 h->root.u.def.value = max_stack;
2564 h->size = 0;
2565 h->type = 0;
2566 h->ref_regular = 1;
2567 h->def_regular = 1;
2568 h->ref_regular_nonweak = 1;
2569 h->forced_local = 1;
2570 h->non_elf = 0;
2571 }
2572 }
2573 }
2574
2575 return max_stack;
2576 }
2577
2578 /* Provide an estimate of total stack required. */
2579
2580 static bfd_boolean
2581 spu_elf_stack_analysis (bfd *output_bfd,
2582 struct bfd_link_info *info,
2583 int emit_stack_syms)
2584 {
2585 bfd *ibfd;
2586 bfd_vma max_stack = 0;
2587
2588 if (!discover_functions (output_bfd, info))
2589 return FALSE;
2590
2591 if (!build_call_tree (output_bfd, info))
2592 return FALSE;
2593
2594 info->callbacks->info (_("Stack size for call graph root nodes.\n"));
2595 info->callbacks->minfo (_("\nStack size for functions. "
2596 "Annotations: '*' max stack, 't' tail call\n"));
2597 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
2598 {
2599 extern const bfd_target bfd_elf32_spu_vec;
2600 asection *sec;
2601
2602 if (ibfd->xvec != &bfd_elf32_spu_vec)
2603 continue;
2604
2605 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
2606 {
2607 struct _spu_elf_section_data *sec_data;
2608 struct spu_elf_stack_info *sinfo;
2609
2610 if ((sec_data = spu_elf_section_data (sec)) != NULL
2611 && (sinfo = sec_data->u.i.stack_info) != NULL)
2612 {
2613 int i;
2614 for (i = 0; i < sinfo->num_fun; ++i)
2615 {
2616 if (!sinfo->fun[i].non_root)
2617 {
2618 bfd_vma stack;
2619 const char *f1;
2620
2621 stack = sum_stack (&sinfo->fun[i], info,
2622 emit_stack_syms);
2623 f1 = func_name (&sinfo->fun[i]);
2624 info->callbacks->info (_(" %s: 0x%v\n"),
2625 f1, stack);
2626 if (max_stack < stack)
2627 max_stack = stack;
2628 }
2629 }
2630 }
2631 }
2632 }
2633
2634 info->callbacks->info (_("Maximum stack required is 0x%v\n"), max_stack);
2635 return TRUE;
2636 }
2637
2638 /* Perform a final link. */
2639
2640 static bfd_boolean
2641 spu_elf_final_link (bfd *output_bfd, struct bfd_link_info *info)
2642 {
2643 struct spu_link_hash_table *htab = spu_hash_table (info);
2644
2645 if (htab->stack_analysis
2646 && !spu_elf_stack_analysis (output_bfd, info, htab->emit_stack_syms))
2647 info->callbacks->einfo ("%X%P: stack analysis error: %E\n");
2648
2649 return bfd_elf_final_link (output_bfd, info);
2650 }
2651
2652 /* Called when not normally emitting relocs, ie. !info->relocatable
2653 and !info->emitrelocations. Returns a count of special relocs
2654 that need to be emitted. */
2655
2656 static unsigned int
2657 spu_elf_count_relocs (asection *sec, Elf_Internal_Rela *relocs)
2658 {
2659 unsigned int count = 0;
2660 Elf_Internal_Rela *relend = relocs + sec->reloc_count;
2661
2662 for (; relocs < relend; relocs++)
2663 {
2664 int r_type = ELF32_R_TYPE (relocs->r_info);
2665 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
2666 ++count;
2667 }
2668
2669 return count;
2670 }
2671
2672 /* Apply RELOCS to CONTENTS of INPUT_SECTION from INPUT_BFD. */
2673
2674 static int
2675 spu_elf_relocate_section (bfd *output_bfd,
2676 struct bfd_link_info *info,
2677 bfd *input_bfd,
2678 asection *input_section,
2679 bfd_byte *contents,
2680 Elf_Internal_Rela *relocs,
2681 Elf_Internal_Sym *local_syms,
2682 asection **local_sections)
2683 {
2684 Elf_Internal_Shdr *symtab_hdr;
2685 struct elf_link_hash_entry **sym_hashes;
2686 Elf_Internal_Rela *rel, *relend;
2687 struct spu_link_hash_table *htab;
2688 int ret = TRUE;
2689 bfd_boolean emit_these_relocs = FALSE;
2690
2691 htab = spu_hash_table (info);
2692 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2693 sym_hashes = (struct elf_link_hash_entry **) (elf_sym_hashes (input_bfd));
2694
2695 rel = relocs;
2696 relend = relocs + input_section->reloc_count;
2697 for (; rel < relend; rel++)
2698 {
2699 int r_type;
2700 reloc_howto_type *howto;
2701 unsigned long r_symndx;
2702 Elf_Internal_Sym *sym;
2703 asection *sec;
2704 struct elf_link_hash_entry *h;
2705 const char *sym_name;
2706 bfd_vma relocation;
2707 bfd_vma addend;
2708 bfd_reloc_status_type r;
2709 bfd_boolean unresolved_reloc;
2710 bfd_boolean warned;
2711
2712 r_symndx = ELF32_R_SYM (rel->r_info);
2713 r_type = ELF32_R_TYPE (rel->r_info);
2714 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
2715 {
2716 emit_these_relocs = TRUE;
2717 continue;
2718 }
2719
2720 howto = elf_howto_table + r_type;
2721 unresolved_reloc = FALSE;
2722 warned = FALSE;
2723 h = NULL;
2724 sym = NULL;
2725 sec = NULL;
2726 if (r_symndx < symtab_hdr->sh_info)
2727 {
2728 sym = local_syms + r_symndx;
2729 sec = local_sections[r_symndx];
2730 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
2731 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
2732 }
2733 else
2734 {
2735 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
2736 r_symndx, symtab_hdr, sym_hashes,
2737 h, sec, relocation,
2738 unresolved_reloc, warned);
2739 sym_name = h->root.root.string;
2740 }
2741
2742 if (sec != NULL && elf_discarded_section (sec))
2743 {
2744 /* For relocs against symbols from removed linkonce sections,
2745 or sections discarded by a linker script, we just want the
2746 section contents zeroed. Avoid any special processing. */
2747 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
2748 rel->r_info = 0;
2749 rel->r_addend = 0;
2750 continue;
2751 }
2752
2753 if (info->relocatable)
2754 continue;
2755
2756 if (unresolved_reloc)
2757 {
2758 (*_bfd_error_handler)
2759 (_("%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
2760 input_bfd,
2761 bfd_get_section_name (input_bfd, input_section),
2762 (long) rel->r_offset,
2763 howto->name,
2764 sym_name);
2765 ret = FALSE;
2766 }
2767
2768 /* If this symbol is in an overlay area, we may need to relocate
2769 to the overlay stub. */
2770 addend = rel->r_addend;
2771 if (htab->stub_sec != NULL
2772 && sec != NULL
2773 && sec->output_section != NULL
2774 && sec->output_section->owner == output_bfd
2775 && (h == NULL
2776 || (h != htab->ovly_load && h != htab->ovly_return)))
2777 {
2778 bfd_boolean branch;
2779 unsigned int sym_type;
2780
2781 branch = FALSE;
2782 if (r_type == R_SPU_REL16
2783 || r_type == R_SPU_ADDR16)
2784 branch = (is_branch (contents + rel->r_offset)
2785 || is_hint (contents + rel->r_offset));
2786
2787 if (h != NULL)
2788 sym_type = h->type;
2789 else
2790 sym_type = ELF_ST_TYPE (sym->st_info);
2791
2792 if ((sym_type == STT_FUNC || branch)
2793 && needs_ovl_stub (sym_name, sec, input_section, htab, branch))
2794 {
2795 unsigned int ovl = 0;
2796 struct got_entry *g, **head;
2797
2798 if (branch)
2799 ovl = (spu_elf_section_data (input_section->output_section)
2800 ->u.o.ovl_index);
2801
2802 if (h != NULL)
2803 head = &h->got.glist;
2804 else
2805 head = elf_local_got_ents (input_bfd) + r_symndx;
2806
2807 for (g = *head; g != NULL; g = g->next)
2808 if (g->addend == addend && (g->ovl == ovl || g->ovl == 0))
2809 break;
2810 if (g == NULL)
2811 abort ();
2812
2813 relocation = g->stub_addr;
2814 addend = 0;
2815 }
2816 }
2817
2818 r = _bfd_final_link_relocate (howto,
2819 input_bfd,
2820 input_section,
2821 contents,
2822 rel->r_offset, relocation, addend);
2823
2824 if (r != bfd_reloc_ok)
2825 {
2826 const char *msg = (const char *) 0;
2827
2828 switch (r)
2829 {
2830 case bfd_reloc_overflow:
2831 if (!((*info->callbacks->reloc_overflow)
2832 (info, (h ? &h->root : NULL), sym_name, howto->name,
2833 (bfd_vma) 0, input_bfd, input_section, rel->r_offset)))
2834 return FALSE;
2835 break;
2836
2837 case bfd_reloc_undefined:
2838 if (!((*info->callbacks->undefined_symbol)
2839 (info, sym_name, input_bfd, input_section,
2840 rel->r_offset, TRUE)))
2841 return FALSE;
2842 break;
2843
2844 case bfd_reloc_outofrange:
2845 msg = _("internal error: out of range error");
2846 goto common_error;
2847
2848 case bfd_reloc_notsupported:
2849 msg = _("internal error: unsupported relocation error");
2850 goto common_error;
2851
2852 case bfd_reloc_dangerous:
2853 msg = _("internal error: dangerous error");
2854 goto common_error;
2855
2856 default:
2857 msg = _("internal error: unknown error");
2858 /* fall through */
2859
2860 common_error:
2861 ret = FALSE;
2862 if (!((*info->callbacks->warning)
2863 (info, msg, sym_name, input_bfd, input_section,
2864 rel->r_offset)))
2865 return FALSE;
2866 break;
2867 }
2868 }
2869 }
2870
2871 if (ret
2872 && emit_these_relocs
2873 && !info->relocatable
2874 && !info->emitrelocations)
2875 {
2876 Elf_Internal_Rela *wrel;
2877 Elf_Internal_Shdr *rel_hdr;
2878
2879 wrel = rel = relocs;
2880 relend = relocs + input_section->reloc_count;
2881 for (; rel < relend; rel++)
2882 {
2883 int r_type;
2884
2885 r_type = ELF32_R_TYPE (rel->r_info);
2886 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
2887 *wrel++ = *rel;
2888 }
2889 input_section->reloc_count = wrel - relocs;
2890 /* Backflips for _bfd_elf_link_output_relocs. */
2891 rel_hdr = &elf_section_data (input_section)->rel_hdr;
2892 rel_hdr->sh_size = input_section->reloc_count * rel_hdr->sh_entsize;
2893 ret = 2;
2894 }
2895
2896 return ret;
2897 }
2898
2899 /* Adjust _SPUEAR_ syms to point at their overlay stubs. */
2900
2901 static bfd_boolean
2902 spu_elf_output_symbol_hook (struct bfd_link_info *info,
2903 const char *sym_name ATTRIBUTE_UNUSED,
2904 Elf_Internal_Sym *sym,
2905 asection *sym_sec ATTRIBUTE_UNUSED,
2906 struct elf_link_hash_entry *h)
2907 {
2908 struct spu_link_hash_table *htab = spu_hash_table (info);
2909
2910 if (!info->relocatable
2911 && htab->stub_sec != NULL
2912 && h != NULL
2913 && (h->root.type == bfd_link_hash_defined
2914 || h->root.type == bfd_link_hash_defweak)
2915 && h->def_regular
2916 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0)
2917 {
2918 struct got_entry *g;
2919
2920 for (g = h->got.glist; g != NULL; g = g->next)
2921 if (g->addend == 0 && g->ovl == 0)
2922 {
2923 sym->st_shndx = (_bfd_elf_section_from_bfd_section
2924 (htab->stub_sec[0]->output_section->owner,
2925 htab->stub_sec[0]->output_section));
2926 sym->st_value = g->stub_addr;
2927 break;
2928 }
2929 }
2930
2931 return TRUE;
2932 }
2933
2934 static int spu_plugin = 0;
2935
2936 void
2937 spu_elf_plugin (int val)
2938 {
2939 spu_plugin = val;
2940 }
2941
2942 /* Set ELF header e_type for plugins. */
2943
2944 static void
2945 spu_elf_post_process_headers (bfd *abfd,
2946 struct bfd_link_info *info ATTRIBUTE_UNUSED)
2947 {
2948 if (spu_plugin)
2949 {
2950 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
2951
2952 i_ehdrp->e_type = ET_DYN;
2953 }
2954 }
2955
2956 /* We may add an extra PT_LOAD segment for .toe. We also need extra
2957 segments for overlays. */
2958
2959 static int
2960 spu_elf_additional_program_headers (bfd *abfd, struct bfd_link_info *info)
2961 {
2962 struct spu_link_hash_table *htab = spu_hash_table (info);
2963 int extra = htab->num_overlays;
2964 asection *sec;
2965
2966 if (extra)
2967 ++extra;
2968
2969 sec = bfd_get_section_by_name (abfd, ".toe");
2970 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
2971 ++extra;
2972
2973 return extra;
2974 }
2975
2976 /* Remove .toe section from other PT_LOAD segments and put it in
2977 a segment of its own. Put overlays in separate segments too. */
2978
2979 static bfd_boolean
2980 spu_elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
2981 {
2982 asection *toe, *s;
2983 struct elf_segment_map *m;
2984 unsigned int i;
2985
2986 if (info == NULL)
2987 return TRUE;
2988
2989 toe = bfd_get_section_by_name (abfd, ".toe");
2990 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
2991 if (m->p_type == PT_LOAD && m->count > 1)
2992 for (i = 0; i < m->count; i++)
2993 if ((s = m->sections[i]) == toe
2994 || spu_elf_section_data (s)->u.o.ovl_index != 0)
2995 {
2996 struct elf_segment_map *m2;
2997 bfd_vma amt;
2998
2999 if (i + 1 < m->count)
3000 {
3001 amt = sizeof (struct elf_segment_map);
3002 amt += (m->count - (i + 2)) * sizeof (m->sections[0]);
3003 m2 = bfd_zalloc (abfd, amt);
3004 if (m2 == NULL)
3005 return FALSE;
3006 m2->count = m->count - (i + 1);
3007 memcpy (m2->sections, m->sections + i + 1,
3008 m2->count * sizeof (m->sections[0]));
3009 m2->p_type = PT_LOAD;
3010 m2->next = m->next;
3011 m->next = m2;
3012 }
3013 m->count = 1;
3014 if (i != 0)
3015 {
3016 m->count = i;
3017 amt = sizeof (struct elf_segment_map);
3018 m2 = bfd_zalloc (abfd, amt);
3019 if (m2 == NULL)
3020 return FALSE;
3021 m2->p_type = PT_LOAD;
3022 m2->count = 1;
3023 m2->sections[0] = s;
3024 m2->next = m->next;
3025 m->next = m2;
3026 }
3027 break;
3028 }
3029
3030 return TRUE;
3031 }
3032
3033 /* Check that all loadable section VMAs lie in the range
3034 LO .. HI inclusive. */
3035
3036 asection *
3037 spu_elf_check_vma (bfd *abfd, bfd_vma lo, bfd_vma hi)
3038 {
3039 struct elf_segment_map *m;
3040 unsigned int i;
3041
3042 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
3043 if (m->p_type == PT_LOAD)
3044 for (i = 0; i < m->count; i++)
3045 if (m->sections[i]->size != 0
3046 && (m->sections[i]->vma < lo
3047 || m->sections[i]->vma > hi
3048 || m->sections[i]->vma + m->sections[i]->size - 1 > hi))
3049 return m->sections[i];
3050
3051 return NULL;
3052 }
3053
3054 /* Tweak the section type of .note.spu_name. */
3055
3056 static bfd_boolean
3057 spu_elf_fake_sections (bfd *obfd ATTRIBUTE_UNUSED,
3058 Elf_Internal_Shdr *hdr,
3059 asection *sec)
3060 {
3061 if (strcmp (sec->name, SPU_PTNOTE_SPUNAME) == 0)
3062 hdr->sh_type = SHT_NOTE;
3063 return TRUE;
3064 }
3065
3066 /* Tweak phdrs before writing them out. */
3067
3068 static int
3069 spu_elf_modify_program_headers (bfd *abfd, struct bfd_link_info *info)
3070 {
3071 const struct elf_backend_data *bed;
3072 struct elf_obj_tdata *tdata;
3073 Elf_Internal_Phdr *phdr, *last;
3074 struct spu_link_hash_table *htab;
3075 unsigned int count;
3076 unsigned int i;
3077
3078 if (info == NULL)
3079 return TRUE;
3080
3081 bed = get_elf_backend_data (abfd);
3082 tdata = elf_tdata (abfd);
3083 phdr = tdata->phdr;
3084 count = tdata->program_header_size / bed->s->sizeof_phdr;
3085 htab = spu_hash_table (info);
3086 if (htab->num_overlays != 0)
3087 {
3088 struct elf_segment_map *m;
3089 unsigned int o;
3090
3091 for (i = 0, m = elf_tdata (abfd)->segment_map; m; ++i, m = m->next)
3092 if (m->count != 0
3093 && (o = spu_elf_section_data (m->sections[0])->u.o.ovl_index) != 0)
3094 {
3095 /* Mark this as an overlay header. */
3096 phdr[i].p_flags |= PF_OVERLAY;
3097
3098 if (htab->ovtab != NULL && htab->ovtab->size != 0)
3099 {
3100 bfd_byte *p = htab->ovtab->contents;
3101 unsigned int off = o * 16 + 8;
3102
3103 /* Write file_off into _ovly_table. */
3104 bfd_put_32 (htab->ovtab->owner, phdr[i].p_offset, p + off);
3105 }
3106 }
3107 }
3108
3109 /* Round up p_filesz and p_memsz of PT_LOAD segments to multiples
3110 of 16. This should always be possible when using the standard
3111 linker scripts, but don't create overlapping segments if
3112 someone is playing games with linker scripts. */
3113 last = NULL;
3114 for (i = count; i-- != 0; )
3115 if (phdr[i].p_type == PT_LOAD)
3116 {
3117 unsigned adjust;
3118
3119 adjust = -phdr[i].p_filesz & 15;
3120 if (adjust != 0
3121 && last != NULL
3122 && phdr[i].p_offset + phdr[i].p_filesz > last->p_offset - adjust)
3123 break;
3124
3125 adjust = -phdr[i].p_memsz & 15;
3126 if (adjust != 0
3127 && last != NULL
3128 && phdr[i].p_filesz != 0
3129 && phdr[i].p_vaddr + phdr[i].p_memsz > last->p_vaddr - adjust
3130 && phdr[i].p_vaddr + phdr[i].p_memsz <= last->p_vaddr)
3131 break;
3132
3133 if (phdr[i].p_filesz != 0)
3134 last = &phdr[i];
3135 }
3136
3137 if (i == (unsigned int) -1)
3138 for (i = count; i-- != 0; )
3139 if (phdr[i].p_type == PT_LOAD)
3140 {
3141 unsigned adjust;
3142
3143 adjust = -phdr[i].p_filesz & 15;
3144 phdr[i].p_filesz += adjust;
3145
3146 adjust = -phdr[i].p_memsz & 15;
3147 phdr[i].p_memsz += adjust;
3148 }
3149
3150 return TRUE;
3151 }
3152
3153 #define TARGET_BIG_SYM bfd_elf32_spu_vec
3154 #define TARGET_BIG_NAME "elf32-spu"
3155 #define ELF_ARCH bfd_arch_spu
3156 #define ELF_MACHINE_CODE EM_SPU
3157 /* This matches the alignment need for DMA. */
3158 #define ELF_MAXPAGESIZE 0x80
3159 #define elf_backend_rela_normal 1
3160 #define elf_backend_can_gc_sections 1
3161
3162 #define bfd_elf32_bfd_reloc_type_lookup spu_elf_reloc_type_lookup
3163 #define bfd_elf32_bfd_reloc_name_lookup spu_elf_reloc_name_lookup
3164 #define elf_info_to_howto spu_elf_info_to_howto
3165 #define elf_backend_count_relocs spu_elf_count_relocs
3166 #define elf_backend_relocate_section spu_elf_relocate_section
3167 #define elf_backend_symbol_processing spu_elf_backend_symbol_processing
3168 #define elf_backend_link_output_symbol_hook spu_elf_output_symbol_hook
3169 #define bfd_elf32_new_section_hook spu_elf_new_section_hook
3170 #define bfd_elf32_bfd_link_hash_table_create spu_elf_link_hash_table_create
3171
3172 #define elf_backend_additional_program_headers spu_elf_additional_program_headers
3173 #define elf_backend_modify_segment_map spu_elf_modify_segment_map
3174 #define elf_backend_modify_program_headers spu_elf_modify_program_headers
3175 #define elf_backend_post_process_headers spu_elf_post_process_headers
3176 #define elf_backend_fake_sections spu_elf_fake_sections
3177 #define elf_backend_special_sections spu_elf_special_sections
3178 #define bfd_elf32_bfd_final_link spu_elf_final_link
3179
3180 #include "elf32-target.h"
This page took 0.091508 seconds and 5 git commands to generate.