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