OSDN Git Service

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