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