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