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