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