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