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