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