daily update
[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;
91d6fa6a 4404 unsigned int k;
9dcc4794
AM
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. */
91d6fa6a 4424 pasty = find_pasted_call (sec);
9dcc4794
AM
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;
91d6fa6a 4451 for (k = 0; k < (unsigned) sinfo->num_fun; ++k)
9dcc4794
AM
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 {
34ad4cb0
UW
4481 unsigned int stub_delta = 1;
4482
4483 if (htab->params->ovly_flavour == ovly_soft_icache)
4484 stub_delta = call->count;
4485 num_stubs += stub_delta;
9dcc4794 4486
9dcc4794
AM
4487 /* If the call is within this overlay, we won't need a
4488 stub. */
4489 for (k = base; k < i + 1; k++)
4490 if (call->fun->sec == ovly_sections[2 * k])
4491 {
34ad4cb0 4492 num_stubs -= stub_delta;
9dcc4794
AM
4493 break;
4494 }
4495 }
cd4a7468
AM
4496 if (htab->params->ovly_flavour == ovly_soft_icache
4497 && num_stubs > htab->params->max_branch)
4498 break;
2fc6d3b0
AM
4499 if (align_power (tmp, roalign) + rotmp
4500 + num_stubs * ovl_stub_size (htab->params) > overlay_size)
9dcc4794 4501 break;
9dcc4794 4502 size = tmp;
2fc6d3b0 4503 rosize = rotmp;
9dcc4794
AM
4504 }
4505
4506 if (i == base)
4507 {
4508 info->callbacks->einfo (_("%B:%A%s exceeds overlay size\n"),
4509 ovly_sections[2 * i]->owner,
4510 ovly_sections[2 * i],
4511 ovly_sections[2 * i + 1] ? " + rodata" : "");
4512 bfd_set_error (bfd_error_bad_value);
4513 goto err_exit;
4514 }
4515
a3a219a9
AM
4516 while (dummy_caller.call_list != NULL)
4517 {
4518 struct call_info *call = dummy_caller.call_list;
4519 dummy_caller.call_list = call->next;
4520 free (call);
4521 }
4522
4523 ++ovlynum;
4524 while (base < i)
4525 ovly_map[base++] = ovlynum;
4526 }
4527
4528 script = htab->params->spu_elf_open_overlay_script ();
4529
cd4a7468 4530 if (htab->params->ovly_flavour == ovly_soft_icache)
a3a219a9 4531 {
64028ad7
UW
4532 if (fprintf (script, "SECTIONS\n{\n") <= 0)
4533 goto file_err;
4534
cd4a7468 4535 if (fprintf (script,
cd4a7468
AM
4536 " . = ALIGN (%u);\n"
4537 " .ovl.init : { *(.ovl.init) }\n"
4538 " . = ABSOLUTE (ADDR (.ovl.init));\n",
4539 htab->params->line_size) <= 0)
4540 goto file_err;
4541
a3a219a9 4542 base = 0;
cd4a7468
AM
4543 ovlynum = 1;
4544 while (base < count)
4545 {
4546 unsigned int indx = ovlynum - 1;
4547 unsigned int vma, lma;
a3a219a9 4548
37107878 4549 vma = (indx & (htab->params->num_lines - 1)) << htab->line_size_log2;
64028ad7 4550 lma = vma + (((indx >> htab->num_lines_log2) + 1) << 18);
cd4a7468
AM
4551
4552 if (fprintf (script, " .ovly%u ABSOLUTE (ADDR (.ovl.init)) + %u "
64028ad7 4553 ": AT (LOADADDR (.ovl.init) + %u) {\n",
cd4a7468
AM
4554 ovlynum, vma, lma) <= 0)
4555 goto file_err;
4556
4557 base = print_one_overlay_section (script, base, count, ovlynum,
4558 ovly_map, ovly_sections, info);
4559 if (base == (unsigned) -1)
4560 goto file_err;
4561
4562 if (fprintf (script, " }\n") <= 0)
4563 goto file_err;
4564
4565 ovlynum++;
4566 }
a3a219a9 4567
cd4a7468
AM
4568 if (fprintf (script, " . = ABSOLUTE (ADDR (.ovl.init)) + %u;\n",
4569 1 << (htab->num_lines_log2 + htab->line_size_log2)) <= 0)
4570 goto file_err;
64028ad7
UW
4571
4572 if (fprintf (script, "}\nINSERT AFTER .toe;\n") <= 0)
4573 goto file_err;
cd4a7468
AM
4574 }
4575 else
4576 {
64028ad7
UW
4577 if (fprintf (script, "SECTIONS\n{\n") <= 0)
4578 goto file_err;
4579
cd4a7468
AM
4580 if (fprintf (script,
4581 " . = ALIGN (16);\n"
4582 " .ovl.init : { *(.ovl.init) }\n"
4583 " . = ABSOLUTE (ADDR (.ovl.init));\n") <= 0)
9dcc4794 4584 goto file_err;
a3a219a9 4585
cd4a7468 4586 for (region = 1; region <= htab->params->num_lines; region++)
9dcc4794 4587 {
cd4a7468
AM
4588 ovlynum = region;
4589 base = 0;
4590 while (base < count && ovly_map[base] < ovlynum)
4591 base++;
a3a219a9 4592
cd4a7468
AM
4593 if (base == count)
4594 break;
a3a219a9 4595
cd4a7468
AM
4596 if (region == 1)
4597 {
4598 /* We need to set lma since we are overlaying .ovl.init. */
4599 if (fprintf (script,
4600 " OVERLAY : AT (ALIGN (LOADADDR (.ovl.init) + SIZEOF (.ovl.init), 16))\n {\n") <= 0)
4601 goto file_err;
4602 }
4603 else
4604 {
4605 if (fprintf (script, " OVERLAY :\n {\n") <= 0)
a3a219a9 4606 goto file_err;
9dcc4794 4607 }
9dcc4794 4608
cd4a7468 4609 while (base < count)
9dcc4794 4610 {
cd4a7468 4611 if (fprintf (script, " .ovly%u {\n", ovlynum) <= 0)
a3a219a9
AM
4612 goto file_err;
4613
cd4a7468
AM
4614 base = print_one_overlay_section (script, base, count, ovlynum,
4615 ovly_map, ovly_sections, info);
4616 if (base == (unsigned) -1)
4617 goto file_err;
4618
4619 if (fprintf (script, " }\n") <= 0)
4620 goto file_err;
4621
4622 ovlynum += htab->params->num_lines;
4623 while (base < count && ovly_map[base] < ovlynum)
4624 base++;
9dcc4794 4625 }
9dcc4794 4626
cd4a7468 4627 if (fprintf (script, " }\n") <= 0)
a3a219a9 4628 goto file_err;
9dcc4794
AM
4629 }
4630
64028ad7
UW
4631 if (fprintf (script, "}\nINSERT BEFORE .text;\n") <= 0)
4632 goto file_err;
9dcc4794 4633 }
a3a219a9
AM
4634
4635 free (ovly_map);
9dcc4794
AM
4636 free (ovly_sections);
4637
9dcc4794
AM
4638 if (fclose (script) != 0)
4639 goto file_err;
4640
64615358
AM
4641 if (htab->params->auto_overlay & AUTO_RELINK)
4642 (*htab->params->spu_elf_relink) ();
9dcc4794
AM
4643
4644 xexit (0);
4645
4646 file_err:
4647 bfd_set_error (bfd_error_system_call);
4648 err_exit:
4649 info->callbacks->einfo ("%F%P: auto overlay error: %E\n");
4650 xexit (1);
4651}
4652
49fa1e15
AM
4653/* Provide an estimate of total stack required. */
4654
4655static bfd_boolean
64615358 4656spu_elf_stack_analysis (struct bfd_link_info *info)
49fa1e15 4657{
64615358 4658 struct spu_link_hash_table *htab;
055ed83b 4659 struct _sum_stack_param sum_stack_param;
49fa1e15 4660
c65be8d7 4661 if (!discover_functions (info))
49fa1e15
AM
4662 return FALSE;
4663
c65be8d7 4664 if (!build_call_tree (info))
49fa1e15
AM
4665 return FALSE;
4666
64615358 4667 htab = spu_hash_table (info);
cd4a7468
AM
4668 if (htab->params->stack_analysis)
4669 {
4670 info->callbacks->info (_("Stack size for call graph root nodes.\n"));
4671 info->callbacks->minfo (_("\nStack size for functions. "
4672 "Annotations: '*' max stack, 't' tail call\n"));
4673 }
49fa1e15 4674
64615358 4675 sum_stack_param.emit_stack_syms = htab->params->emit_stack_syms;
055ed83b
AM
4676 sum_stack_param.overall_stack = 0;
4677 if (!for_each_node (sum_stack, info, &sum_stack_param, TRUE))
4678 return FALSE;
49fa1e15 4679
cd4a7468
AM
4680 if (htab->params->stack_analysis)
4681 info->callbacks->info (_("Maximum stack required is 0x%v\n"),
4682 (bfd_vma) sum_stack_param.overall_stack);
49fa1e15
AM
4683 return TRUE;
4684}
4685
4686/* Perform a final link. */
4687
4688static bfd_boolean
4689spu_elf_final_link (bfd *output_bfd, struct bfd_link_info *info)
4690{
4691 struct spu_link_hash_table *htab = spu_hash_table (info);
4692
64615358
AM
4693 if (htab->params->auto_overlay)
4694 spu_elf_auto_overlay (info);
9dcc4794 4695
cd4a7468
AM
4696 if ((htab->params->stack_analysis
4697 || (htab->params->ovly_flavour == ovly_soft_icache
4698 && htab->params->lrlive_analysis))
64615358 4699 && !spu_elf_stack_analysis (info))
cd4a7468
AM
4700 info->callbacks->einfo ("%X%P: stack/lrlive analysis error: %E\n");
4701
4702 if (!spu_elf_build_stubs (info))
4703 info->callbacks->einfo ("%F%P: can not build overlay stubs: %E\n");
49fa1e15
AM
4704
4705 return bfd_elf_final_link (output_bfd, info);
4706}
4707
ece5ef60
AM
4708/* Called when not normally emitting relocs, ie. !info->relocatable
4709 and !info->emitrelocations. Returns a count of special relocs
4710 that need to be emitted. */
4711
4712static unsigned int
58217f29 4713spu_elf_count_relocs (struct bfd_link_info *info, asection *sec)
ece5ef60 4714{
58217f29 4715 Elf_Internal_Rela *relocs;
ece5ef60 4716 unsigned int count = 0;
ece5ef60 4717
58217f29
AM
4718 relocs = _bfd_elf_link_read_relocs (sec->owner, sec, NULL, NULL,
4719 info->keep_memory);
4720 if (relocs != NULL)
ece5ef60 4721 {
58217f29
AM
4722 Elf_Internal_Rela *rel;
4723 Elf_Internal_Rela *relend = relocs + sec->reloc_count;
4724
4725 for (rel = relocs; rel < relend; rel++)
4726 {
4727 int r_type = ELF32_R_TYPE (rel->r_info);
4728 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
4729 ++count;
4730 }
4731
4732 if (elf_section_data (sec)->relocs != relocs)
4733 free (relocs);
ece5ef60
AM
4734 }
4735
4736 return count;
4737}
4738
9cc305ec
TS
4739/* Functions for adding fixup records to .fixup */
4740
4741#define FIXUP_RECORD_SIZE 4
4742
4743#define FIXUP_PUT(output_bfd,htab,index,addr) \
4744 bfd_put_32 (output_bfd, addr, \
4745 htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4746#define FIXUP_GET(output_bfd,htab,index) \
4747 bfd_get_32 (output_bfd, \
4748 htab->sfixup->contents + FIXUP_RECORD_SIZE * (index))
4749
4750/* Store OFFSET in .fixup. This assumes it will be called with an
4751 increasing OFFSET. When this OFFSET fits with the last base offset,
4752 it just sets a bit, otherwise it adds a new fixup record. */
4753static void
4754spu_elf_emit_fixup (bfd * output_bfd, struct bfd_link_info *info,
4755 bfd_vma offset)
4756{
4757 struct spu_link_hash_table *htab = spu_hash_table (info);
4758 asection *sfixup = htab->sfixup;
4759 bfd_vma qaddr = offset & ~(bfd_vma) 15;
4760 bfd_vma bit = ((bfd_vma) 8) >> ((offset & 15) >> 2);
4761 if (sfixup->reloc_count == 0)
4762 {
4763 FIXUP_PUT (output_bfd, htab, 0, qaddr | bit);
4764 sfixup->reloc_count++;
4765 }
4766 else
4767 {
4768 bfd_vma base = FIXUP_GET (output_bfd, htab, sfixup->reloc_count - 1);
4769 if (qaddr != (base & ~(bfd_vma) 15))
4770 {
4771 if ((sfixup->reloc_count + 1) * FIXUP_RECORD_SIZE > sfixup->size)
4772 (*_bfd_error_handler) (_("fatal error while creating .fixup"));
4773 FIXUP_PUT (output_bfd, htab, sfixup->reloc_count, qaddr | bit);
4774 sfixup->reloc_count++;
4775 }
4776 else
4777 FIXUP_PUT (output_bfd, htab, sfixup->reloc_count - 1, base | bit);
4778 }
4779}
4780
e9f53129
AM
4781/* Apply RELOCS to CONTENTS of INPUT_SECTION from INPUT_BFD. */
4782
d16c7321 4783static int
e9f53129
AM
4784spu_elf_relocate_section (bfd *output_bfd,
4785 struct bfd_link_info *info,
4786 bfd *input_bfd,
4787 asection *input_section,
4788 bfd_byte *contents,
4789 Elf_Internal_Rela *relocs,
4790 Elf_Internal_Sym *local_syms,
4791 asection **local_sections)
4792{
4793 Elf_Internal_Shdr *symtab_hdr;
4794 struct elf_link_hash_entry **sym_hashes;
4795 Elf_Internal_Rela *rel, *relend;
4796 struct spu_link_hash_table *htab;
64615358 4797 asection *ea;
d16c7321 4798 int ret = TRUE;
ece5ef60 4799 bfd_boolean emit_these_relocs = FALSE;
cc5ca406 4800 bfd_boolean is_ea_sym;
fdba2fcd 4801 bfd_boolean stubs;
cd4a7468 4802 unsigned int iovl = 0;
e9f53129 4803
e9f53129 4804 htab = spu_hash_table (info);
fdba2fcd 4805 stubs = (htab->stub_sec != NULL
64615358 4806 && maybe_needs_stubs (input_section));
cd4a7468 4807 iovl = overlay_index (input_section);
64615358 4808 ea = bfd_get_section_by_name (output_bfd, "._ea");
e9f53129
AM
4809 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4810 sym_hashes = (struct elf_link_hash_entry **) (elf_sym_hashes (input_bfd));
4811
4812 rel = relocs;
4813 relend = relocs + input_section->reloc_count;
4814 for (; rel < relend; rel++)
4815 {
4816 int r_type;
4817 reloc_howto_type *howto;
8374f9d4 4818 unsigned int r_symndx;
e9f53129
AM
4819 Elf_Internal_Sym *sym;
4820 asection *sec;
4821 struct elf_link_hash_entry *h;
4822 const char *sym_name;
4823 bfd_vma relocation;
4824 bfd_vma addend;
4825 bfd_reloc_status_type r;
4826 bfd_boolean unresolved_reloc;
4827 bfd_boolean warned;
124b52c6 4828 enum _stub_type stub_type;
e9f53129
AM
4829
4830 r_symndx = ELF32_R_SYM (rel->r_info);
4831 r_type = ELF32_R_TYPE (rel->r_info);
4832 howto = elf_howto_table + r_type;
4833 unresolved_reloc = FALSE;
4834 warned = FALSE;
e9f53129
AM
4835 h = NULL;
4836 sym = NULL;
4837 sec = NULL;
4838 if (r_symndx < symtab_hdr->sh_info)
4839 {
4840 sym = local_syms + r_symndx;
4841 sec = local_sections[r_symndx];
4842 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
4843 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4844 }
4845 else
4846 {
dc1859a6
AM
4847 if (sym_hashes == NULL)
4848 return FALSE;
4849
4850 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4851
4852 while (h->root.type == bfd_link_hash_indirect
4853 || h->root.type == bfd_link_hash_warning)
4854 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4855
4856 relocation = 0;
4857 if (h->root.type == bfd_link_hash_defined
4858 || h->root.type == bfd_link_hash_defweak)
4859 {
4860 sec = h->root.u.def.section;
4861 if (sec == NULL
4862 || sec->output_section == NULL)
4863 /* Set a flag that will be cleared later if we find a
4864 relocation value for this symbol. output_section
4865 is typically NULL for symbols satisfied by a shared
4866 library. */
4867 unresolved_reloc = TRUE;
4868 else
4869 relocation = (h->root.u.def.value
4870 + sec->output_section->vma
4871 + sec->output_offset);
4872 }
4873 else if (h->root.type == bfd_link_hash_undefweak)
4874 ;
4875 else if (info->unresolved_syms_in_objects == RM_IGNORE
4876 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
4877 ;
4878 else if (!info->relocatable
4879 && !(r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64))
4880 {
4881 bfd_boolean err;
4882 err = (info->unresolved_syms_in_objects == RM_GENERATE_ERROR
4883 || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT);
4884 if (!info->callbacks->undefined_symbol (info,
4885 h->root.root.string,
4886 input_bfd,
4887 input_section,
4888 rel->r_offset, err))
4889 return FALSE;
4890 warned = TRUE;
4891 }
e9f53129
AM
4892 sym_name = h->root.root.string;
4893 }
4894
ab96bf03
AM
4895 if (sec != NULL && elf_discarded_section (sec))
4896 {
4897 /* For relocs against symbols from removed linkonce sections,
4898 or sections discarded by a linker script, we just want the
4899 section contents zeroed. Avoid any special processing. */
4900 _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
4901 rel->r_info = 0;
4902 rel->r_addend = 0;
4903 continue;
4904 }
4905
4906 if (info->relocatable)
4907 continue;
4908
8fdcc58d 4909 /* Change "a rt,ra,rb" to "ai rt,ra,0". */
57e96a08
AM
4910 if (r_type == R_SPU_ADD_PIC
4911 && h != NULL
4912 && !(h->def_regular || ELF_COMMON_DEF_P (h)))
8fdcc58d
TS
4913 {
4914 bfd_byte *loc = contents + rel->r_offset;
4915 loc[0] = 0x1c;
4916 loc[1] = 0x00;
4917 loc[2] &= 0x3f;
4918 }
4919
cc5ca406
AM
4920 is_ea_sym = (ea != NULL
4921 && sec != NULL
4922 && sec->output_section == ea);
cd4a7468
AM
4923
4924 /* If this symbol is in an overlay area, we may need to relocate
4925 to the overlay stub. */
4926 addend = rel->r_addend;
4927 if (stubs
4928 && !is_ea_sym
4929 && (stub_type = needs_ovl_stub (h, sym, sec, input_section, rel,
4930 contents, info)) != no_stub)
4931 {
4932 unsigned int ovl = 0;
4933 struct got_entry *g, **head;
4934
4935 if (stub_type != nonovl_stub)
4936 ovl = iovl;
4937
4938 if (h != NULL)
4939 head = &h->got.glist;
4940 else
4941 head = elf_local_got_ents (input_bfd) + r_symndx;
cc5ca406 4942
cd4a7468
AM
4943 for (g = *head; g != NULL; g = g->next)
4944 if (htab->params->ovly_flavour == ovly_soft_icache
74681fc4
AM
4945 ? (g->ovl == ovl
4946 && g->br_addr == (rel->r_offset
4947 + input_section->output_offset
4948 + input_section->output_section->vma))
cd4a7468
AM
4949 : g->addend == addend && (g->ovl == ovl || g->ovl == 0))
4950 break;
4951 if (g == NULL)
4952 abort ();
4953
4954 relocation = g->stub_addr;
4955 addend = 0;
4956 }
4957 else
4958 {
4959 /* For soft icache, encode the overlay index into addresses. */
4960 if (htab->params->ovly_flavour == ovly_soft_icache
d342a8b1
UW
4961 && (r_type == R_SPU_ADDR16_HI
4962 || r_type == R_SPU_ADDR32 || r_type == R_SPU_REL32)
cd4a7468
AM
4963 && !is_ea_sym)
4964 {
4965 unsigned int ovl = overlay_index (sec);
4966 if (ovl != 0)
4967 {
30c665df 4968 unsigned int set_id = ((ovl - 1) >> htab->num_lines_log2) + 1;
cd4a7468 4969 relocation += set_id << 18;
cd4a7468
AM
4970 }
4971 }
4972 }
4973
9cc305ec
TS
4974 if (htab->params->emit_fixups && !info->relocatable
4975 && (input_section->flags & SEC_ALLOC) != 0
4976 && r_type == R_SPU_ADDR32)
4977 {
4978 bfd_vma offset;
4979 offset = rel->r_offset + input_section->output_section->vma
4980 + input_section->output_offset;
4981 spu_elf_emit_fixup (output_bfd, info, offset);
4982 }
4983
cd4a7468
AM
4984 if (unresolved_reloc)
4985 ;
4986 else if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
8374f9d4 4987 {
cc5ca406 4988 if (is_ea_sym)
8374f9d4
AM
4989 {
4990 /* ._ea is a special section that isn't allocated in SPU
4991 memory, but rather occupies space in PPU memory as
4992 part of an embedded ELF image. If this reloc is
4993 against a symbol defined in ._ea, then transform the
4994 reloc into an equivalent one without a symbol
4995 relative to the start of the ELF image. */
4996 rel->r_addend += (relocation
4997 - ea->vma
4998 + elf_section_data (ea)->this_hdr.sh_offset);
4999 rel->r_info = ELF32_R_INFO (0, r_type);
5000 }
5001 emit_these_relocs = TRUE;
5002 continue;
5003 }
cd4a7468 5004 else if (is_ea_sym)
8374f9d4
AM
5005 unresolved_reloc = TRUE;
5006
e9f53129
AM
5007 if (unresolved_reloc)
5008 {
5009 (*_bfd_error_handler)
5010 (_("%B(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
5011 input_bfd,
5012 bfd_get_section_name (input_bfd, input_section),
5013 (long) rel->r_offset,
5014 howto->name,
5015 sym_name);
5016 ret = FALSE;
5017 }
5018
e9f53129
AM
5019 r = _bfd_final_link_relocate (howto,
5020 input_bfd,
5021 input_section,
5022 contents,
5023 rel->r_offset, relocation, addend);
5024
5025 if (r != bfd_reloc_ok)
5026 {
5027 const char *msg = (const char *) 0;
5028
5029 switch (r)
5030 {
5031 case bfd_reloc_overflow:
5032 if (!((*info->callbacks->reloc_overflow)
5033 (info, (h ? &h->root : NULL), sym_name, howto->name,
5034 (bfd_vma) 0, input_bfd, input_section, rel->r_offset)))
5035 return FALSE;
5036 break;
5037
5038 case bfd_reloc_undefined:
5039 if (!((*info->callbacks->undefined_symbol)
5040 (info, sym_name, input_bfd, input_section,
5041 rel->r_offset, TRUE)))
5042 return FALSE;
5043 break;
5044
5045 case bfd_reloc_outofrange:
5046 msg = _("internal error: out of range error");
5047 goto common_error;
5048
5049 case bfd_reloc_notsupported:
5050 msg = _("internal error: unsupported relocation error");
5051 goto common_error;
5052
5053 case bfd_reloc_dangerous:
5054 msg = _("internal error: dangerous error");
5055 goto common_error;
5056
5057 default:
5058 msg = _("internal error: unknown error");
5059 /* fall through */
5060
5061 common_error:
d16c7321 5062 ret = FALSE;
e9f53129
AM
5063 if (!((*info->callbacks->warning)
5064 (info, msg, sym_name, input_bfd, input_section,
5065 rel->r_offset)))
5066 return FALSE;
5067 break;
5068 }
5069 }
5070 }
5071
ece5ef60
AM
5072 if (ret
5073 && emit_these_relocs
ece5ef60
AM
5074 && !info->emitrelocations)
5075 {
5076 Elf_Internal_Rela *wrel;
5077 Elf_Internal_Shdr *rel_hdr;
5078
5079 wrel = rel = relocs;
5080 relend = relocs + input_section->reloc_count;
5081 for (; rel < relend; rel++)
5082 {
5083 int r_type;
5084
5085 r_type = ELF32_R_TYPE (rel->r_info);
5086 if (r_type == R_SPU_PPU32 || r_type == R_SPU_PPU64)
5087 *wrel++ = *rel;
5088 }
5089 input_section->reloc_count = wrel - relocs;
5090 /* Backflips for _bfd_elf_link_output_relocs. */
5091 rel_hdr = &elf_section_data (input_section)->rel_hdr;
5092 rel_hdr->sh_size = input_section->reloc_count * rel_hdr->sh_entsize;
5093 ret = 2;
5094 }
5095
e9f53129
AM
5096 return ret;
5097}
5098
c1b2796f
AM
5099/* Adjust _SPUEAR_ syms to point at their overlay stubs. */
5100
6e0b88f1 5101static int
c1b2796f
AM
5102spu_elf_output_symbol_hook (struct bfd_link_info *info,
5103 const char *sym_name ATTRIBUTE_UNUSED,
5104 Elf_Internal_Sym *sym,
5105 asection *sym_sec ATTRIBUTE_UNUSED,
5106 struct elf_link_hash_entry *h)
5107{
5108 struct spu_link_hash_table *htab = spu_hash_table (info);
5109
5110 if (!info->relocatable
47f6dab9 5111 && htab->stub_sec != NULL
c1b2796f
AM
5112 && h != NULL
5113 && (h->root.type == bfd_link_hash_defined
5114 || h->root.type == bfd_link_hash_defweak)
5115 && h->def_regular
5116 && strncmp (h->root.root.string, "_SPUEAR_", 8) == 0)
5117 {
4a628337 5118 struct got_entry *g;
c1b2796f 5119
4a628337 5120 for (g = h->got.glist; g != NULL; g = g->next)
cd4a7468
AM
5121 if (htab->params->ovly_flavour == ovly_soft_icache
5122 ? g->br_addr == g->stub_addr
5123 : g->addend == 0 && g->ovl == 0)
4a628337
AM
5124 {
5125 sym->st_shndx = (_bfd_elf_section_from_bfd_section
5126 (htab->stub_sec[0]->output_section->owner,
5127 htab->stub_sec[0]->output_section));
5128 sym->st_value = g->stub_addr;
5129 break;
5130 }
c1b2796f
AM
5131 }
5132
6e0b88f1 5133 return 1;
c1b2796f
AM
5134}
5135
e9f53129
AM
5136static int spu_plugin = 0;
5137
5138void
5139spu_elf_plugin (int val)
5140{
5141 spu_plugin = val;
5142}
5143
5144/* Set ELF header e_type for plugins. */
5145
5146static void
5147spu_elf_post_process_headers (bfd *abfd,
5148 struct bfd_link_info *info ATTRIBUTE_UNUSED)
5149{
5150 if (spu_plugin)
5151 {
5152 Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
5153
5154 i_ehdrp->e_type = ET_DYN;
5155 }
5156}
5157
5158/* We may add an extra PT_LOAD segment for .toe. We also need extra
5159 segments for overlays. */
5160
5161static int
5162spu_elf_additional_program_headers (bfd *abfd, struct bfd_link_info *info)
5163{
ceae84aa 5164 int extra = 0;
e9f53129
AM
5165 asection *sec;
5166
ceae84aa
AM
5167 if (info != NULL)
5168 {
5169 struct spu_link_hash_table *htab = spu_hash_table (info);
5170 extra = htab->num_overlays;
5171 }
5172
e9f53129
AM
5173 if (extra)
5174 ++extra;
5175
5176 sec = bfd_get_section_by_name (abfd, ".toe");
5177 if (sec != NULL && (sec->flags & SEC_LOAD) != 0)
5178 ++extra;
5179
5180 return extra;
5181}
5182
5183/* Remove .toe section from other PT_LOAD segments and put it in
5184 a segment of its own. Put overlays in separate segments too. */
5185
5186static bfd_boolean
5187spu_elf_modify_segment_map (bfd *abfd, struct bfd_link_info *info)
5188{
5189 asection *toe, *s;
452de53c
UW
5190 struct elf_segment_map *m, *m_overlay;
5191 struct elf_segment_map **p, **p_overlay;
e9f53129
AM
5192 unsigned int i;
5193
5194 if (info == NULL)
5195 return TRUE;
5196
5197 toe = bfd_get_section_by_name (abfd, ".toe");
5198 for (m = elf_tdata (abfd)->segment_map; m != NULL; m = m->next)
5199 if (m->p_type == PT_LOAD && m->count > 1)
5200 for (i = 0; i < m->count; i++)
5201 if ((s = m->sections[i]) == toe
47f6dab9 5202 || spu_elf_section_data (s)->u.o.ovl_index != 0)
e9f53129
AM
5203 {
5204 struct elf_segment_map *m2;
5205 bfd_vma amt;
5206
5207 if (i + 1 < m->count)
5208 {
5209 amt = sizeof (struct elf_segment_map);
5210 amt += (m->count - (i + 2)) * sizeof (m->sections[0]);
5211 m2 = bfd_zalloc (abfd, amt);
5212 if (m2 == NULL)
5213 return FALSE;
5214 m2->count = m->count - (i + 1);
5215 memcpy (m2->sections, m->sections + i + 1,
5216 m2->count * sizeof (m->sections[0]));
5217 m2->p_type = PT_LOAD;
5218 m2->next = m->next;
5219 m->next = m2;
5220 }
5221 m->count = 1;
5222 if (i != 0)
5223 {
5224 m->count = i;
5225 amt = sizeof (struct elf_segment_map);
5226 m2 = bfd_zalloc (abfd, amt);
5227 if (m2 == NULL)
5228 return FALSE;
5229 m2->p_type = PT_LOAD;
5230 m2->count = 1;
5231 m2->sections[0] = s;
5232 m2->next = m->next;
5233 m->next = m2;
5234 }
5235 break;
5236 }
5237
452de53c
UW
5238
5239 /* Some SPU ELF loaders ignore the PF_OVERLAY flag and just load all
5240 PT_LOAD segments. This can cause the .ovl.init section to be
5241 overwritten with the contents of some overlay segment. To work
5242 around this issue, we ensure that all PF_OVERLAY segments are
5243 sorted first amongst the program headers; this ensures that even
5244 with a broken loader, the .ovl.init section (which is not marked
5245 as PF_OVERLAY) will be placed into SPU local store on startup. */
5246
5247 /* Move all overlay segments onto a separate list. */
5248 p = &elf_tdata (abfd)->segment_map;
5249 p_overlay = &m_overlay;
5250 while (*p != NULL)
5251 {
5252 if ((*p)->p_type == PT_LOAD && (*p)->count == 1
5253 && spu_elf_section_data ((*p)->sections[0])->u.o.ovl_index != 0)
5254 {
91d6fa6a 5255 m = *p;
452de53c
UW
5256 *p = m->next;
5257 *p_overlay = m;
5258 p_overlay = &m->next;
5259 continue;
5260 }
5261
5262 p = &((*p)->next);
5263 }
5264
5265 /* Re-insert overlay segments at the head of the segment map. */
5266 *p_overlay = elf_tdata (abfd)->segment_map;
5267 elf_tdata (abfd)->segment_map = m_overlay;
5268
e9f53129
AM
5269 return TRUE;
5270}
5271
7d3287cb
AM
5272/* Tweak the section type of .note.spu_name. */
5273
5274static bfd_boolean
5275spu_elf_fake_sections (bfd *obfd ATTRIBUTE_UNUSED,
5276 Elf_Internal_Shdr *hdr,
5277 asection *sec)
5278{
5279 if (strcmp (sec->name, SPU_PTNOTE_SPUNAME) == 0)
5280 hdr->sh_type = SHT_NOTE;
5281 return TRUE;
5282}
5283
e9f53129
AM
5284/* Tweak phdrs before writing them out. */
5285
5286static int
5287spu_elf_modify_program_headers (bfd *abfd, struct bfd_link_info *info)
5288{
5289 const struct elf_backend_data *bed;
5290 struct elf_obj_tdata *tdata;
5291 Elf_Internal_Phdr *phdr, *last;
5292 struct spu_link_hash_table *htab;
5293 unsigned int count;
5294 unsigned int i;
5295
5296 if (info == NULL)
5297 return TRUE;
5298
5299 bed = get_elf_backend_data (abfd);
5300 tdata = elf_tdata (abfd);
5301 phdr = tdata->phdr;
5302 count = tdata->program_header_size / bed->s->sizeof_phdr;
5303 htab = spu_hash_table (info);
5304 if (htab->num_overlays != 0)
5305 {
5306 struct elf_segment_map *m;
5307 unsigned int o;
5308
5309 for (i = 0, m = elf_tdata (abfd)->segment_map; m; ++i, m = m->next)
5310 if (m->count != 0
47f6dab9 5311 && (o = spu_elf_section_data (m->sections[0])->u.o.ovl_index) != 0)
e9f53129
AM
5312 {
5313 /* Mark this as an overlay header. */
5314 phdr[i].p_flags |= PF_OVERLAY;
5315
cd4a7468
AM
5316 if (htab->ovtab != NULL && htab->ovtab->size != 0
5317 && htab->params->ovly_flavour != ovly_soft_icache)
e9f53129
AM
5318 {
5319 bfd_byte *p = htab->ovtab->contents;
47f6dab9 5320 unsigned int off = o * 16 + 8;
e9f53129
AM
5321
5322 /* Write file_off into _ovly_table. */
5323 bfd_put_32 (htab->ovtab->owner, phdr[i].p_offset, p + off);
5324 }
5325 }
cd4a7468
AM
5326 /* Soft-icache has its file offset put in .ovl.init. */
5327 if (htab->init != NULL && htab->init->size != 0)
5328 {
5329 bfd_vma val = elf_section_data (htab->ovl_sec[0])->this_hdr.sh_offset;
5330
5331 bfd_put_32 (htab->init->owner, val, htab->init->contents + 4);
5332 }
e9f53129
AM
5333 }
5334
5335 /* Round up p_filesz and p_memsz of PT_LOAD segments to multiples
5336 of 16. This should always be possible when using the standard
5337 linker scripts, but don't create overlapping segments if
5338 someone is playing games with linker scripts. */
5339 last = NULL;
5340 for (i = count; i-- != 0; )
5341 if (phdr[i].p_type == PT_LOAD)
5342 {
5343 unsigned adjust;
5344
5345 adjust = -phdr[i].p_filesz & 15;
5346 if (adjust != 0
5347 && last != NULL
5348 && phdr[i].p_offset + phdr[i].p_filesz > last->p_offset - adjust)
5349 break;
5350
5351 adjust = -phdr[i].p_memsz & 15;
5352 if (adjust != 0
5353 && last != NULL
5354 && phdr[i].p_filesz != 0
5355 && phdr[i].p_vaddr + phdr[i].p_memsz > last->p_vaddr - adjust
5356 && phdr[i].p_vaddr + phdr[i].p_memsz <= last->p_vaddr)
5357 break;
5358
5359 if (phdr[i].p_filesz != 0)
5360 last = &phdr[i];
5361 }
5362
5363 if (i == (unsigned int) -1)
5364 for (i = count; i-- != 0; )
5365 if (phdr[i].p_type == PT_LOAD)
5366 {
5367 unsigned adjust;
5368
5369 adjust = -phdr[i].p_filesz & 15;
5370 phdr[i].p_filesz += adjust;
5371
5372 adjust = -phdr[i].p_memsz & 15;
5373 phdr[i].p_memsz += adjust;
5374 }
5375
5376 return TRUE;
5377}
5378
9cc305ec
TS
5379bfd_boolean
5380spu_elf_size_sections (bfd * output_bfd, struct bfd_link_info *info)
5381{
5382 struct spu_link_hash_table *htab = spu_hash_table (info);
5383 if (htab->params->emit_fixups)
5384 {
5385 asection *sfixup = htab->sfixup;
5386 int fixup_count = 0;
5387 bfd *ibfd;
5388 size_t size;
5389
5390 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
5391 {
5392 asection *isec;
5393
5394 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
5395 continue;
5396
5397 /* Walk over each section attached to the input bfd. */
5398 for (isec = ibfd->sections; isec != NULL; isec = isec->next)
5399 {
5400 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
5401 bfd_vma base_end;
5402
5403 /* If there aren't any relocs, then there's nothing more
5404 to do. */
5405 if ((isec->flags & SEC_RELOC) == 0
5406 || isec->reloc_count == 0)
5407 continue;
5408
5409 /* Get the relocs. */
5410 internal_relocs =
5411 _bfd_elf_link_read_relocs (ibfd, isec, NULL, NULL,
5412 info->keep_memory);
5413 if (internal_relocs == NULL)
5414 return FALSE;
5415
5416 /* 1 quadword can contain up to 4 R_SPU_ADDR32
5417 relocations. They are stored in a single word by
5418 saving the upper 28 bits of the address and setting the
5419 lower 4 bits to a bit mask of the words that have the
5420 relocation. BASE_END keeps track of the next quadword. */
5421 irela = internal_relocs;
5422 irelaend = irela + isec->reloc_count;
5423 base_end = 0;
5424 for (; irela < irelaend; irela++)
5425 if (ELF32_R_TYPE (irela->r_info) == R_SPU_ADDR32
5426 && irela->r_offset >= base_end)
5427 {
5428 base_end = (irela->r_offset & ~(bfd_vma) 15) + 16;
5429 fixup_count++;
5430 }
5431 }
5432 }
5433
5434 /* We always have a NULL fixup as a sentinel */
5435 size = (fixup_count + 1) * FIXUP_RECORD_SIZE;
5436 if (!bfd_set_section_size (output_bfd, sfixup, size))
5437 return FALSE;
5438 sfixup->contents = (bfd_byte *) bfd_zalloc (info->input_bfds, size);
5439 if (sfixup->contents == NULL)
5440 return FALSE;
5441 }
5442 return TRUE;
5443}
5444
e9f53129
AM
5445#define TARGET_BIG_SYM bfd_elf32_spu_vec
5446#define TARGET_BIG_NAME "elf32-spu"
5447#define ELF_ARCH bfd_arch_spu
5448#define ELF_MACHINE_CODE EM_SPU
5449/* This matches the alignment need for DMA. */
5450#define ELF_MAXPAGESIZE 0x80
5451#define elf_backend_rela_normal 1
5452#define elf_backend_can_gc_sections 1
5453
5454#define bfd_elf32_bfd_reloc_type_lookup spu_elf_reloc_type_lookup
ad2adbc8 5455#define bfd_elf32_bfd_reloc_name_lookup spu_elf_reloc_name_lookup
e9f53129 5456#define elf_info_to_howto spu_elf_info_to_howto
ece5ef60 5457#define elf_backend_count_relocs spu_elf_count_relocs
e9f53129
AM
5458#define elf_backend_relocate_section spu_elf_relocate_section
5459#define elf_backend_symbol_processing spu_elf_backend_symbol_processing
c1b2796f 5460#define elf_backend_link_output_symbol_hook spu_elf_output_symbol_hook
124b52c6 5461#define elf_backend_object_p spu_elf_object_p
e9f53129
AM
5462#define bfd_elf32_new_section_hook spu_elf_new_section_hook
5463#define bfd_elf32_bfd_link_hash_table_create spu_elf_link_hash_table_create
e9f53129
AM
5464
5465#define elf_backend_additional_program_headers spu_elf_additional_program_headers
5466#define elf_backend_modify_segment_map spu_elf_modify_segment_map
5467#define elf_backend_modify_program_headers spu_elf_modify_program_headers
5468#define elf_backend_post_process_headers spu_elf_post_process_headers
7d3287cb 5469#define elf_backend_fake_sections spu_elf_fake_sections
e9f53129 5470#define elf_backend_special_sections spu_elf_special_sections
49fa1e15 5471#define bfd_elf32_bfd_final_link spu_elf_final_link
e9f53129
AM
5472
5473#include "elf32-target.h"
This page took 0.455311 seconds and 4 git commands to generate.