1# This shell script emits a C file. -*- C -*- 2# Copyright (C) 2003-2020 Free Software Foundation, Inc. 3# 4# This file is part of the GNU Binutils. 5# 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation; either version 3 of the License, or 9# (at your option) any later version. 10# 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15# 16# You should have received a copy of the GNU General Public License 17# along with this program; if not, write to the Free Software 18# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19# MA 02110-1301, USA. 20# 21 22# This file is sourced from elf.em, and defines extra xtensa-elf 23# specific routines. 24# 25fragment <<EOF 26 27#include <xtensa-config.h> 28#include "../bfd/elf-bfd.h" 29#include "elf/xtensa.h" 30#include "bfd.h" 31 32/* Provide default values for new configuration settings. */ 33#ifndef XSHAL_ABI 34#define XSHAL_ABI 0 35#endif 36 37static void xtensa_wild_group_interleave (lang_statement_union_type *); 38static void xtensa_colocate_output_literals (lang_statement_union_type *); 39static void xtensa_strip_inconsistent_linkonce_sections 40 (lang_statement_list_type *); 41 42 43/* This number is irrelevant until we turn on use_literal_pages */ 44static bfd_vma xtensa_page_power = 12; /* 4K pages. */ 45 46/* To force a page break between literals and text, change 47 xtensa_use_literal_pages to "TRUE". */ 48static bfd_boolean xtensa_use_literal_pages = FALSE; 49 50#define EXTRA_VALIDATION 0 51 52 53static char * 54elf_xtensa_choose_target (int argc ATTRIBUTE_UNUSED, 55 char **argv ATTRIBUTE_UNUSED) 56{ 57 if (XCHAL_HAVE_BE) 58 return "${BIG_OUTPUT_FORMAT}"; 59 else 60 return "${LITTLE_OUTPUT_FORMAT}"; 61} 62 63 64static void 65elf_xtensa_before_parse (void) 66{ 67 /* Just call the default hook.... Tensilica's version of this function 68 does some other work that isn't relevant here. */ 69 gld${EMULATION_NAME}_before_parse (); 70} 71 72 73static void 74remove_section (bfd *abfd, asection *os) 75{ 76 asection **spp; 77 for (spp = &abfd->sections; *spp; spp = &(*spp)->next) 78 if (*spp == os) 79 { 80 *spp = os->next; 81 os->owner->section_count--; 82 break; 83 } 84} 85 86 87static bfd_boolean 88replace_insn_sec_with_prop_sec (bfd *abfd, 89 const char *insn_sec_name, 90 const char *prop_sec_name, 91 char **error_message) 92{ 93 asection *insn_sec; 94 asection *prop_sec; 95 bfd_byte *prop_contents = NULL; 96 bfd_byte *insn_contents = NULL; 97 unsigned entry_count; 98 unsigned entry; 99 Elf_Internal_Shdr *rel_hdr; 100 Elf_Internal_Rela *internal_relocs = NULL; 101 unsigned reloc_count; 102 103 *error_message = ""; 104 insn_sec = bfd_get_section_by_name (abfd, insn_sec_name); 105 if (insn_sec == NULL) 106 return TRUE; 107 entry_count = insn_sec->size / 8; 108 109 prop_sec = bfd_get_section_by_name (abfd, prop_sec_name); 110 if (prop_sec != NULL && insn_sec != NULL) 111 { 112 *error_message = _("file already has property tables"); 113 return FALSE; 114 } 115 116 if (insn_sec->size != 0) 117 { 118 insn_contents = (bfd_byte *) xmalloc (insn_sec->size); 119 if (! bfd_get_section_contents (abfd, insn_sec, insn_contents, 120 (file_ptr) 0, insn_sec->size)) 121 { 122 *error_message = _("failed to read section contents"); 123 goto cleanup; 124 } 125 } 126 127 /* Create a property table section for it. */ 128 prop_sec_name = strdup (prop_sec_name); 129 prop_sec = bfd_make_section_with_flags 130 (abfd, prop_sec_name, bfd_section_flags (insn_sec)); 131 if (prop_sec == NULL 132 || !bfd_set_section_alignment (prop_sec, 2)) 133 { 134 *error_message = _("could not create new section"); 135 goto cleanup; 136 } 137 138 prop_sec->size = entry_count * 12; 139 prop_contents = (bfd_byte *) bfd_zalloc (abfd, prop_sec->size); 140 elf_section_data (prop_sec)->this_hdr.contents = prop_contents; 141 142 /* The entry size and size must be set to allow the linker to compute 143 the number of relocations since it does not use reloc_count. */ 144 rel_hdr = _bfd_elf_single_rel_hdr (prop_sec); 145 rel_hdr->sh_entsize = sizeof (Elf32_External_Rela); 146 rel_hdr->sh_size = _bfd_elf_single_rel_hdr (insn_sec)->sh_size; 147 148 if (prop_contents == NULL && prop_sec->size != 0) 149 { 150 *error_message = _("could not allocate section contents"); 151 goto cleanup; 152 } 153 154 /* Read the relocations. */ 155 reloc_count = insn_sec->reloc_count; 156 if (reloc_count != 0) 157 { 158 /* If there is already an internal_reloc, then save it so that the 159 read_relocs function freshly allocates a copy. */ 160 Elf_Internal_Rela *saved_relocs = elf_section_data (insn_sec)->relocs; 161 162 elf_section_data (insn_sec)->relocs = NULL; 163 internal_relocs = 164 _bfd_elf_link_read_relocs (abfd, insn_sec, NULL, NULL, FALSE); 165 elf_section_data (insn_sec)->relocs = saved_relocs; 166 167 if (internal_relocs == NULL) 168 { 169 *error_message = _("out of memory"); 170 goto cleanup; 171 } 172 } 173 174 /* Create a relocation section for the property section. */ 175 if (internal_relocs != NULL) 176 { 177 elf_section_data (prop_sec)->relocs = internal_relocs; 178 prop_sec->reloc_count = reloc_count; 179 } 180 181 /* Now copy each insn table entry to the prop table entry with 182 appropriate flags. */ 183 for (entry = 0; entry < entry_count; ++entry) 184 { 185 unsigned value; 186 unsigned flags = (XTENSA_PROP_INSN | XTENSA_PROP_NO_TRANSFORM 187 | XTENSA_PROP_INSN_NO_REORDER); 188 value = bfd_get_32 (abfd, insn_contents + entry * 8 + 0); 189 bfd_put_32 (abfd, value, prop_contents + entry * 12 + 0); 190 value = bfd_get_32 (abfd, insn_contents + entry * 8 + 4); 191 bfd_put_32 (abfd, value, prop_contents + entry * 12 + 4); 192 bfd_put_32 (abfd, flags, prop_contents + entry * 12 + 8); 193 } 194 195 /* Now copy all of the relocations. Change offsets for the 196 instruction table section to offsets in the property table 197 section. */ 198 if (internal_relocs) 199 { 200 unsigned i; 201 202 for (i = 0; i < reloc_count; i++) 203 { 204 Elf_Internal_Rela *rela; 205 unsigned r_offset; 206 207 rela = &internal_relocs[i]; 208 209 /* If this relocation is to the .xt.insn section, 210 change the section number and the offset. */ 211 r_offset = rela->r_offset; 212 r_offset += 4 * (r_offset / 8); 213 rela->r_offset = r_offset; 214 } 215 } 216 217 remove_section (abfd, insn_sec); 218 219 if (insn_contents) 220 free (insn_contents); 221 222 return TRUE; 223 224 cleanup: 225 if (prop_sec && prop_sec->owner) 226 remove_section (abfd, prop_sec); 227 if (insn_contents) 228 free (insn_contents); 229 if (internal_relocs) 230 free (internal_relocs); 231 232 return FALSE; 233} 234 235 236#define PROP_SEC_BASE_NAME ".xt.prop" 237#define INSN_SEC_BASE_NAME ".xt.insn" 238#define LINKONCE_SEC_OLD_TEXT_BASE_NAME ".gnu.linkonce.x." 239 240 241static void 242replace_instruction_table_sections (bfd *abfd, asection *sec) 243{ 244 char *message = ""; 245 const char *insn_sec_name = NULL; 246 char *prop_sec_name = NULL; 247 char *owned_prop_sec_name = NULL; 248 const char *sec_name; 249 250 sec_name = bfd_section_name (sec); 251 if (strcmp (sec_name, INSN_SEC_BASE_NAME) == 0) 252 { 253 insn_sec_name = INSN_SEC_BASE_NAME; 254 prop_sec_name = PROP_SEC_BASE_NAME; 255 } 256 else if (CONST_STRNEQ (sec_name, LINKONCE_SEC_OLD_TEXT_BASE_NAME)) 257 { 258 insn_sec_name = sec_name; 259 owned_prop_sec_name = (char *) xmalloc (strlen (sec_name) + 20); 260 prop_sec_name = owned_prop_sec_name; 261 strcpy (prop_sec_name, ".gnu.linkonce.prop.t."); 262 strcat (prop_sec_name, 263 sec_name + strlen (LINKONCE_SEC_OLD_TEXT_BASE_NAME)); 264 } 265 if (insn_sec_name != NULL) 266 { 267 if (! replace_insn_sec_with_prop_sec (abfd, insn_sec_name, prop_sec_name, 268 &message)) 269 { 270 einfo (_("%P: warning: failed to convert %s table in %pB (%s); subsequent disassembly may be incomplete\n"), 271 insn_sec_name, abfd, message); 272 } 273 } 274 if (owned_prop_sec_name) 275 free (owned_prop_sec_name); 276} 277 278 279/* This is called after all input sections have been opened to convert 280 instruction tables (.xt.insn, gnu.linkonce.x.*) tables into property 281 tables (.xt.prop) before any section placement. */ 282 283static void 284elf_xtensa_after_open (void) 285{ 286 /* First call the ELF version. */ 287 gld${EMULATION_NAME}_after_open (); 288 289 /* Now search the input files looking for instruction table sections. */ 290 LANG_FOR_EACH_INPUT_STATEMENT (f) 291 { 292 asection *sec = f->the_bfd->sections; 293 asection *next_sec; 294 295 /* Do not use bfd_map_over_sections here since we are removing 296 sections as we iterate. */ 297 while (sec != NULL) 298 { 299 next_sec = sec->next; 300 replace_instruction_table_sections (f->the_bfd, sec); 301 sec = next_sec; 302 } 303 } 304} 305 306 307static bfd_boolean 308xt_config_info_unpack_and_check (char *data, 309 bfd_boolean *pmismatch, 310 char **pmsg) 311{ 312 char *d, *key; 313 unsigned num; 314 315 *pmismatch = FALSE; 316 317 d = data; 318 while (*d) 319 { 320 key = d; 321 d = strchr (d, '='); 322 if (! d) 323 goto error; 324 325 /* Overwrite the equal sign. */ 326 *d++ = 0; 327 328 /* Check if this is a quoted string or a number. */ 329 if (*d == '"') 330 { 331 /* No string values are currently checked by LD; 332 just skip over the quotes. */ 333 d++; 334 d = strchr (d, '"'); 335 if (! d) 336 goto error; 337 /* Overwrite the trailing quote. */ 338 *d++ = 0; 339 } 340 else 341 { 342 if (*d == 0) 343 goto error; 344 num = strtoul (d, &d, 0); 345 346 if (! strcmp (key, "ABI")) 347 { 348 if (num != XSHAL_ABI) 349 { 350 *pmismatch = TRUE; 351 *pmsg = "ABI does not match"; 352 } 353 } 354 else if (! strcmp (key, "USE_ABSOLUTE_LITERALS")) 355 { 356 if (num != XSHAL_USE_ABSOLUTE_LITERALS) 357 { 358 *pmismatch = TRUE; 359 *pmsg = "incompatible use of the Extended L32R option"; 360 } 361 } 362 } 363 364 if (*d++ != '\n') 365 goto error; 366 } 367 368 return TRUE; 369 370 error: 371 return FALSE; 372} 373 374 375#define XTINFO_NAME "Xtensa_Info" 376#define XTINFO_NAMESZ 12 377#define XTINFO_TYPE 1 378 379static void 380check_xtensa_info (bfd *abfd, asection *info_sec) 381{ 382 char *data, *errmsg = ""; 383 bfd_boolean mismatch; 384 385 data = xmalloc (info_sec->size); 386 if (! bfd_get_section_contents (abfd, info_sec, data, 0, info_sec->size)) 387 einfo (_("%F%P: %pB: cannot read contents of section %pA\n"), abfd, info_sec); 388 389 if (info_sec->size > 24 390 && info_sec->size >= 24 + bfd_get_32 (abfd, data + 4) 391 && bfd_get_32 (abfd, data + 0) == XTINFO_NAMESZ 392 && bfd_get_32 (abfd, data + 8) == XTINFO_TYPE 393 && strcmp (data + 12, XTINFO_NAME) == 0 394 && xt_config_info_unpack_and_check (data + 12 + XTINFO_NAMESZ, 395 &mismatch, &errmsg)) 396 { 397 if (mismatch) 398 einfo (_("%P: %pB: warning: incompatible Xtensa configuration (%s)\n"), 399 abfd, errmsg); 400 } 401 else 402 einfo (_("%P: %pB: warning: cannot parse .xtensa.info section\n"), abfd); 403 404 free (data); 405} 406 407 408/* This is called after the sections have been attached to output 409 sections, but before any sizes or addresses have been set. */ 410 411static void 412elf_xtensa_before_allocation (void) 413{ 414 asection *info_sec, *first_info_sec; 415 bfd *first_bfd; 416 bfd_boolean is_big_endian = XCHAL_HAVE_BE; 417 418 /* Check that the output endianness matches the Xtensa 419 configuration. The BFD library always includes both big and 420 little endian target vectors for Xtensa, but it only supports the 421 detailed instruction encode/decode operations (such as are 422 required to process relocations) for the selected Xtensa 423 configuration. */ 424 425 if (is_big_endian 426 && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE) 427 { 428 einfo (_("%F%P: little endian output does not match " 429 "Xtensa configuration\n")); 430 } 431 if (!is_big_endian 432 && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_BIG) 433 { 434 einfo (_("%F%P: big endian output does not match " 435 "Xtensa configuration\n")); 436 } 437 438 /* Keep track of the first input .xtensa.info section, and as a fallback, 439 the first input bfd where a .xtensa.info section could be created. 440 After the input .xtensa.info has been checked, the contents of the 441 first one will be replaced with the output .xtensa.info table. */ 442 first_info_sec = 0; 443 first_bfd = 0; 444 445 LANG_FOR_EACH_INPUT_STATEMENT (f) 446 { 447 /* Check that the endianness for each input file matches the output. 448 The merge_private_bfd_data hook has already reported any mismatches 449 as errors, but those errors are not fatal. At this point, we 450 cannot go any further if there are any mismatches. */ 451 if ((is_big_endian && f->the_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE) 452 || (!is_big_endian && f->the_bfd->xvec->byteorder == BFD_ENDIAN_BIG)) 453 einfo (_("%F%P: cross-endian linking for %pB not supported\n"), 454 f->the_bfd); 455 456 if (! first_bfd) 457 first_bfd = f->the_bfd; 458 459 info_sec = bfd_get_section_by_name (f->the_bfd, ".xtensa.info"); 460 if (! info_sec) 461 continue; 462 463 if (! first_info_sec) 464 first_info_sec = info_sec; 465 466 /* Unpack the .xtensa.info section and check it against the current 467 Xtensa configuration. */ 468 check_xtensa_info (f->the_bfd, info_sec); 469 470 /* Do not include this copy of .xtensa.info in the output. */ 471 info_sec->size = 0; 472 info_sec->flags |= SEC_EXCLUDE; 473 } 474 475 /* Reuse the first .xtensa.info input section to hold the output 476 .xtensa.info; or, if none were found, create a new section in the 477 first input bfd (assuming there is one). */ 478 info_sec = first_info_sec; 479 if (! info_sec && first_bfd) 480 { 481 info_sec = bfd_make_section_with_flags (first_bfd, ".xtensa.info", 482 SEC_HAS_CONTENTS | SEC_READONLY); 483 if (! info_sec) 484 einfo (_("%F%P: failed to create .xtensa.info section\n")); 485 } 486 if (info_sec) 487 { 488 int xtensa_info_size; 489 char *data; 490 491 info_sec->flags &= ~SEC_EXCLUDE; 492 info_sec->flags |= SEC_IN_MEMORY; 493 494 data = xmalloc (100); 495 sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n", 496 XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI); 497 xtensa_info_size = strlen (data) + 1; 498 499 /* Add enough null terminators to pad to a word boundary. */ 500 do 501 data[xtensa_info_size++] = 0; 502 while ((xtensa_info_size & 3) != 0); 503 504 info_sec->size = 12 + XTINFO_NAMESZ + xtensa_info_size; 505 info_sec->contents = xmalloc (info_sec->size); 506 bfd_put_32 (info_sec->owner, XTINFO_NAMESZ, info_sec->contents + 0); 507 bfd_put_32 (info_sec->owner, xtensa_info_size, info_sec->contents + 4); 508 bfd_put_32 (info_sec->owner, XTINFO_TYPE, info_sec->contents + 8); 509 memcpy (info_sec->contents + 12, XTINFO_NAME, XTINFO_NAMESZ); 510 memcpy (info_sec->contents + 12 + XTINFO_NAMESZ, data, xtensa_info_size); 511 free (data); 512 } 513 514 /* Enable relaxation by default if the "--no-relax" option was not 515 specified. This is done here instead of in the before_parse hook 516 because there is a check in main() to prohibit use of --relax and 517 -r together and that combination should be allowed for Xtensa. */ 518 if (RELAXATION_DISABLED_BY_DEFAULT) 519 ENABLE_RELAXATION; 520 521 xtensa_strip_inconsistent_linkonce_sections (stat_ptr); 522 523 gld${EMULATION_NAME}_before_allocation (); 524 525 xtensa_wild_group_interleave (stat_ptr->head); 526 527 if (RELAXATION_ENABLED) 528 xtensa_colocate_output_literals (stat_ptr->head); 529 530 /* TBD: We need to force the page alignments to here and only do 531 them as needed for the entire output section. Finally, if this 532 is a relocatable link then we need to add alignment notes so 533 that the literals can be separated later. */ 534} 535 536 537typedef struct wildcard_list section_name_list; 538 539typedef struct reloc_deps_e_t reloc_deps_e; 540typedef struct reloc_deps_section_t reloc_deps_section; 541typedef struct reloc_deps_graph_t reloc_deps_graph; 542 543 544struct reloc_deps_e_t 545{ 546 asection *src; /* Contains l32rs. */ 547 asection *tgt; /* Contains literals. */ 548 reloc_deps_e *next; 549}; 550 551/* Place these in the userdata field. */ 552struct reloc_deps_section_t 553{ 554 reloc_deps_e *preds; 555 reloc_deps_e *succs; 556 bfd_boolean is_only_literal; 557}; 558 559 560struct reloc_deps_graph_t 561{ 562 size_t count; 563 size_t size; 564 asection **sections; 565}; 566 567static void xtensa_layout_wild 568 (const reloc_deps_graph *, lang_wild_statement_type *); 569 570typedef void (*deps_callback_t) (asection *, /* src_sec */ 571 bfd_vma, /* src_offset */ 572 asection *, /* target_sec */ 573 bfd_vma, /* target_offset */ 574 void *); /* closure */ 575 576extern bfd_boolean xtensa_callback_required_dependence 577 (bfd *, asection *, struct bfd_link_info *, deps_callback_t, void *); 578static void xtensa_ldlang_clear_addresses (lang_statement_union_type *); 579static bfd_boolean ld_local_file_relocations_fit 580 (lang_statement_union_type *, const reloc_deps_graph *); 581static bfd_vma ld_assign_relative_paged_dot 582 (bfd_vma, lang_statement_union_type *, const reloc_deps_graph *, 583 bfd_boolean); 584static bfd_vma ld_xtensa_insert_page_offsets 585 (bfd_vma, lang_statement_union_type *, reloc_deps_graph *, bfd_boolean); 586#if EXTRA_VALIDATION 587static size_t ld_count_children (lang_statement_union_type *); 588#endif 589 590extern lang_statement_list_type constructor_list; 591 592static reloc_deps_section * 593xtensa_get_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED, 594 asection *sec) 595{ 596 /* We have a separate function for this so that 597 we could in the future keep a completely independent 598 structure that maps a section to its dependence edges. 599 For now, we place these in the sec->userdata field. 600 This doesn't clash with ldlang.c use of userdata for output 601 sections, and during map output for input sections, since the 602 xtensa use is only for input sections and only extant in 603 before_allocation. */ 604 reloc_deps_section *sec_deps = bfd_section_userdata (sec); 605 return sec_deps; 606} 607 608static void 609xtensa_set_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED, 610 asection *sec, 611 reloc_deps_section *deps_section) 612{ 613 bfd_set_section_userdata (sec, deps_section); 614} 615 616 617/* This is used to keep a list of all of the sections participating in 618 the graph so we can clean them up quickly. */ 619 620static void 621xtensa_append_section_deps (reloc_deps_graph *deps, asection *sec) 622{ 623 if (deps->size <= deps->count) 624 { 625 asection **new_sections; 626 size_t i; 627 size_t new_size; 628 629 new_size = deps->size * 2; 630 if (new_size == 0) 631 new_size = 20; 632 633 new_sections = xmalloc (sizeof (asection *) * new_size); 634 memset (new_sections, 0, sizeof (asection *) * new_size); 635 for (i = 0; i < deps->count; i++) 636 { 637 new_sections[i] = deps->sections[i]; 638 } 639 if (deps->sections != NULL) 640 free (deps->sections); 641 deps->sections = new_sections; 642 deps->size = new_size; 643 } 644 deps->sections[deps->count] = sec; 645 deps->count++; 646} 647 648 649static void 650free_reloc_deps_graph (reloc_deps_graph *deps) 651{ 652 size_t i; 653 for (i = 0; i < deps->count; i++) 654 { 655 asection *sec = deps->sections[i]; 656 reloc_deps_section *sec_deps; 657 sec_deps = xtensa_get_section_deps (deps, sec); 658 if (sec_deps) 659 { 660 reloc_deps_e *next; 661 while (sec_deps->succs != NULL) 662 { 663 next = sec_deps->succs->next; 664 free (sec_deps->succs); 665 sec_deps->succs = next; 666 } 667 668 while (sec_deps->preds != NULL) 669 { 670 next = sec_deps->preds->next; 671 free (sec_deps->preds); 672 sec_deps->preds = next; 673 } 674 free (sec_deps); 675 } 676 xtensa_set_section_deps (deps, sec, NULL); 677 } 678 if (deps->sections) 679 free (deps->sections); 680 681 free (deps); 682} 683 684 685static bfd_boolean 686section_is_source (const reloc_deps_graph *deps ATTRIBUTE_UNUSED, 687 lang_statement_union_type *s) 688{ 689 asection *sec; 690 const reloc_deps_section *sec_deps; 691 692 if (s->header.type != lang_input_section_enum) 693 return FALSE; 694 sec = s->input_section.section; 695 696 sec_deps = xtensa_get_section_deps (deps, sec); 697 return sec_deps && sec_deps->succs != NULL; 698} 699 700 701static bfd_boolean 702section_is_target (const reloc_deps_graph *deps ATTRIBUTE_UNUSED, 703 lang_statement_union_type *s) 704{ 705 asection *sec; 706 const reloc_deps_section *sec_deps; 707 708 if (s->header.type != lang_input_section_enum) 709 return FALSE; 710 sec = s->input_section.section; 711 712 sec_deps = xtensa_get_section_deps (deps, sec); 713 return sec_deps && sec_deps->preds != NULL; 714} 715 716 717static bfd_boolean 718section_is_source_or_target (const reloc_deps_graph *deps ATTRIBUTE_UNUSED, 719 lang_statement_union_type *s) 720{ 721 return (section_is_source (deps, s) 722 || section_is_target (deps, s)); 723} 724 725 726typedef struct xtensa_ld_iter_stack_t xtensa_ld_iter_stack; 727typedef struct xtensa_ld_iter_t xtensa_ld_iter; 728 729struct xtensa_ld_iter_t 730{ 731 lang_statement_union_type *parent; /* Parent of the list. */ 732 lang_statement_list_type *l; /* List that holds it. */ 733 lang_statement_union_type **loc; /* Place in the list. */ 734}; 735 736struct xtensa_ld_iter_stack_t 737{ 738 xtensa_ld_iter iterloc; /* List that hold it. */ 739 740 xtensa_ld_iter_stack *next; /* Next in the stack. */ 741 xtensa_ld_iter_stack *prev; /* Back pointer for stack. */ 742}; 743 744 745static void 746ld_xtensa_move_section_after (xtensa_ld_iter *to, xtensa_ld_iter *current) 747{ 748 lang_statement_union_type *to_next; 749 lang_statement_union_type *current_next; 750 lang_statement_union_type **e; 751 752#if EXTRA_VALIDATION 753 size_t old_to_count, new_to_count; 754 size_t old_current_count, new_current_count; 755#endif 756 757 if (to == current) 758 return; 759 760#if EXTRA_VALIDATION 761 old_to_count = ld_count_children (to->parent); 762 old_current_count = ld_count_children (current->parent); 763#endif 764 765 to_next = *(to->loc); 766 current_next = (*current->loc)->header.next; 767 768 *(to->loc) = *(current->loc); 769 770 *(current->loc) = current_next; 771 (*(to->loc))->header.next = to_next; 772 773 /* reset "to" list tail */ 774 for (e = &to->l->head; *e != NULL; e = &(*e)->header.next) 775 ; 776 to->l->tail = e; 777 778 /* reset "current" list tail */ 779 for (e = ¤t->l->head; *e != NULL; e = &(*e)->header.next) 780 ; 781 current->l->tail = e; 782 783#if EXTRA_VALIDATION 784 new_to_count = ld_count_children (to->parent); 785 new_current_count = ld_count_children (current->parent); 786 787 ASSERT ((old_to_count + old_current_count) 788 == (new_to_count + new_current_count)); 789#endif 790} 791 792 793/* Can only be called with lang_statements that have lists. Returns 794 FALSE if the list is empty. */ 795 796static bfd_boolean 797iter_stack_empty (xtensa_ld_iter_stack **stack_p) 798{ 799 return *stack_p == NULL; 800} 801 802 803static bfd_boolean 804iter_stack_push (xtensa_ld_iter_stack **stack_p, 805 lang_statement_union_type *parent) 806{ 807 xtensa_ld_iter_stack *stack; 808 lang_statement_list_type *l = NULL; 809 810 switch (parent->header.type) 811 { 812 case lang_output_section_statement_enum: 813 l = &parent->output_section_statement.children; 814 break; 815 case lang_wild_statement_enum: 816 l = &parent->wild_statement.children; 817 break; 818 case lang_group_statement_enum: 819 l = &parent->group_statement.children; 820 break; 821 default: 822 ASSERT (0); 823 return FALSE; 824 } 825 826 /* Empty. do not push. */ 827 if (l->tail == &l->head) 828 return FALSE; 829 830 stack = xmalloc (sizeof (xtensa_ld_iter_stack)); 831 memset (stack, 0, sizeof (xtensa_ld_iter_stack)); 832 stack->iterloc.parent = parent; 833 stack->iterloc.l = l; 834 stack->iterloc.loc = &l->head; 835 836 stack->next = *stack_p; 837 stack->prev = NULL; 838 if (*stack_p != NULL) 839 (*stack_p)->prev = stack; 840 *stack_p = stack; 841 return TRUE; 842} 843 844 845static void 846iter_stack_pop (xtensa_ld_iter_stack **stack_p) 847{ 848 xtensa_ld_iter_stack *stack; 849 850 stack = *stack_p; 851 852 if (stack == NULL) 853 { 854 ASSERT (stack != NULL); 855 return; 856 } 857 858 if (stack->next != NULL) 859 stack->next->prev = NULL; 860 861 *stack_p = stack->next; 862 free (stack); 863} 864 865 866/* This MUST be called if, during iteration, the user changes the 867 underlying structure. It will check for a NULL current and advance 868 accordingly. */ 869 870static void 871iter_stack_update (xtensa_ld_iter_stack **stack_p) 872{ 873 if (!iter_stack_empty (stack_p) 874 && (*(*stack_p)->iterloc.loc) == NULL) 875 { 876 iter_stack_pop (stack_p); 877 878 while (!iter_stack_empty (stack_p) 879 && ((*(*stack_p)->iterloc.loc)->header.next == NULL)) 880 { 881 iter_stack_pop (stack_p); 882 } 883 if (!iter_stack_empty (stack_p)) 884 (*stack_p)->iterloc.loc = &(*(*stack_p)->iterloc.loc)->header.next; 885 } 886} 887 888 889static void 890iter_stack_next (xtensa_ld_iter_stack **stack_p) 891{ 892 xtensa_ld_iter_stack *stack; 893 lang_statement_union_type *current; 894 stack = *stack_p; 895 896 current = *stack->iterloc.loc; 897 /* If we are on the first element. */ 898 if (current != NULL) 899 { 900 switch (current->header.type) 901 { 902 case lang_output_section_statement_enum: 903 case lang_wild_statement_enum: 904 case lang_group_statement_enum: 905 /* If the list if not empty, we are done. */ 906 if (iter_stack_push (stack_p, *stack->iterloc.loc)) 907 return; 908 /* Otherwise increment the pointer as normal. */ 909 break; 910 default: 911 break; 912 } 913 } 914 915 while (!iter_stack_empty (stack_p) 916 && ((*(*stack_p)->iterloc.loc)->header.next == NULL)) 917 { 918 iter_stack_pop (stack_p); 919 } 920 if (!iter_stack_empty (stack_p)) 921 (*stack_p)->iterloc.loc = &(*(*stack_p)->iterloc.loc)->header.next; 922} 923 924 925static lang_statement_union_type * 926iter_stack_current (xtensa_ld_iter_stack **stack_p) 927{ 928 return *((*stack_p)->iterloc.loc); 929} 930 931 932/* The iter stack is a preorder. */ 933 934static void 935iter_stack_create (xtensa_ld_iter_stack **stack_p, 936 lang_statement_union_type *parent) 937{ 938 iter_stack_push (stack_p, parent); 939} 940 941 942static void 943iter_stack_copy_current (xtensa_ld_iter_stack **stack_p, xtensa_ld_iter *front) 944{ 945 *front = (*stack_p)->iterloc; 946} 947 948 949static void 950xtensa_colocate_literals (reloc_deps_graph *deps, 951 lang_statement_union_type *statement) 952{ 953 /* Keep a stack of pointers to control iteration through the contours. */ 954 xtensa_ld_iter_stack *stack = NULL; 955 xtensa_ld_iter_stack **stack_p = &stack; 956 957 xtensa_ld_iter front; /* Location where new insertion should occur. */ 958 xtensa_ld_iter *front_p = NULL; 959 960 xtensa_ld_iter current; /* Location we are checking. */ 961 xtensa_ld_iter *current_p = NULL; 962 bfd_boolean in_literals = FALSE; 963 964 if (deps->count == 0) 965 return; 966 967 iter_stack_create (stack_p, statement); 968 969 while (!iter_stack_empty (stack_p)) 970 { 971 bfd_boolean skip_increment = FALSE; 972 lang_statement_union_type *l = iter_stack_current (stack_p); 973 974 switch (l->header.type) 975 { 976 case lang_assignment_statement_enum: 977 /* Any assignment statement should block reordering across it. */ 978 front_p = NULL; 979 in_literals = FALSE; 980 break; 981 982 case lang_input_section_enum: 983 if (front_p == NULL) 984 { 985 in_literals = (section_is_target (deps, l) 986 && !section_is_source (deps, l)); 987 if (in_literals) 988 { 989 front_p = &front; 990 iter_stack_copy_current (stack_p, front_p); 991 } 992 } 993 else 994 { 995 bfd_boolean is_target; 996 current_p = ¤t; 997 iter_stack_copy_current (stack_p, current_p); 998 is_target = (section_is_target (deps, l) 999 && !section_is_source (deps, l)); 1000 1001 if (in_literals) 1002 { 1003 iter_stack_copy_current (stack_p, front_p); 1004 if (!is_target) 1005 in_literals = FALSE; 1006 } 1007 else 1008 { 1009 if (is_target) 1010 { 1011 /* Try to insert in place. */ 1012 ld_xtensa_move_section_after (front_p, current_p); 1013 ld_assign_relative_paged_dot (0x100000, 1014 statement, 1015 deps, 1016 xtensa_use_literal_pages); 1017 1018 /* We use this code because it's already written. */ 1019 if (!ld_local_file_relocations_fit (statement, deps)) 1020 { 1021 /* Move it back. */ 1022 ld_xtensa_move_section_after (current_p, front_p); 1023 /* Reset the literal placement. */ 1024 iter_stack_copy_current (stack_p, front_p); 1025 } 1026 else 1027 { 1028 /* Move front pointer up by one. */ 1029 front_p->loc = &(*front_p->loc)->header.next; 1030 1031 /* Do not increment the current pointer. */ 1032 skip_increment = TRUE; 1033 } 1034 } 1035 } 1036 } 1037 break; 1038 default: 1039 break; 1040 } 1041 1042 if (!skip_increment) 1043 iter_stack_next (stack_p); 1044 else 1045 /* Be careful to update the stack_p if it now is a null. */ 1046 iter_stack_update (stack_p); 1047 } 1048 1049 lang_for_each_statement_worker (xtensa_ldlang_clear_addresses, statement); 1050} 1051 1052 1053static void 1054xtensa_move_dependencies_to_front (reloc_deps_graph *deps, 1055 lang_wild_statement_type *w) 1056{ 1057 /* Keep a front pointer and a current pointer. */ 1058 lang_statement_union_type **front; 1059 lang_statement_union_type **current; 1060 1061 /* Walk to the end of the targets. */ 1062 for (front = &w->children.head; 1063 (*front != NULL) && section_is_source_or_target (deps, *front); 1064 front = &(*front)->header.next) 1065 ; 1066 1067 if (*front == NULL) 1068 return; 1069 1070 current = &(*front)->header.next; 1071 while (*current != NULL) 1072 { 1073 if (section_is_source_or_target (deps, *current)) 1074 { 1075 /* Insert in place. */ 1076 xtensa_ld_iter front_iter; 1077 xtensa_ld_iter current_iter; 1078 1079 front_iter.parent = (lang_statement_union_type *) w; 1080 front_iter.l = &w->children; 1081 front_iter.loc = front; 1082 1083 current_iter.parent = (lang_statement_union_type *) w; 1084 current_iter.l = &w->children; 1085 current_iter.loc = current; 1086 1087 ld_xtensa_move_section_after (&front_iter, ¤t_iter); 1088 front = &(*front)->header.next; 1089 } 1090 else 1091 { 1092 current = &(*current)->header.next; 1093 } 1094 } 1095} 1096 1097 1098static bfd_boolean 1099deps_has_sec_edge (const reloc_deps_graph *deps, asection *src, asection *tgt) 1100{ 1101 const reloc_deps_section *sec_deps; 1102 const reloc_deps_e *sec_deps_e; 1103 1104 sec_deps = xtensa_get_section_deps (deps, src); 1105 if (sec_deps == NULL) 1106 return FALSE; 1107 1108 for (sec_deps_e = sec_deps->succs; 1109 sec_deps_e != NULL; 1110 sec_deps_e = sec_deps_e->next) 1111 { 1112 ASSERT (sec_deps_e->src == src); 1113 if (sec_deps_e->tgt == tgt) 1114 return TRUE; 1115 } 1116 return FALSE; 1117} 1118 1119 1120static bfd_boolean 1121deps_has_edge (const reloc_deps_graph *deps, 1122 lang_statement_union_type *src, 1123 lang_statement_union_type *tgt) 1124{ 1125 if (!section_is_source (deps, src)) 1126 return FALSE; 1127 if (!section_is_target (deps, tgt)) 1128 return FALSE; 1129 1130 if (src->header.type != lang_input_section_enum) 1131 return FALSE; 1132 if (tgt->header.type != lang_input_section_enum) 1133 return FALSE; 1134 1135 return deps_has_sec_edge (deps, src->input_section.section, 1136 tgt->input_section.section); 1137} 1138 1139 1140static void 1141add_deps_edge (reloc_deps_graph *deps, asection *src_sec, asection *tgt_sec) 1142{ 1143 reloc_deps_section *src_sec_deps; 1144 reloc_deps_section *tgt_sec_deps; 1145 1146 reloc_deps_e *src_edge; 1147 reloc_deps_e *tgt_edge; 1148 1149 if (deps_has_sec_edge (deps, src_sec, tgt_sec)) 1150 return; 1151 1152 src_sec_deps = xtensa_get_section_deps (deps, src_sec); 1153 if (src_sec_deps == NULL) 1154 { 1155 /* Add a section. */ 1156 src_sec_deps = xmalloc (sizeof (reloc_deps_section)); 1157 memset (src_sec_deps, 0, sizeof (reloc_deps_section)); 1158 src_sec_deps->is_only_literal = 0; 1159 src_sec_deps->preds = NULL; 1160 src_sec_deps->succs = NULL; 1161 xtensa_set_section_deps (deps, src_sec, src_sec_deps); 1162 xtensa_append_section_deps (deps, src_sec); 1163 } 1164 1165 tgt_sec_deps = xtensa_get_section_deps (deps, tgt_sec); 1166 if (tgt_sec_deps == NULL) 1167 { 1168 /* Add a section. */ 1169 tgt_sec_deps = xmalloc (sizeof (reloc_deps_section)); 1170 memset (tgt_sec_deps, 0, sizeof (reloc_deps_section)); 1171 tgt_sec_deps->is_only_literal = 0; 1172 tgt_sec_deps->preds = NULL; 1173 tgt_sec_deps->succs = NULL; 1174 xtensa_set_section_deps (deps, tgt_sec, tgt_sec_deps); 1175 xtensa_append_section_deps (deps, tgt_sec); 1176 } 1177 1178 /* Add the edges. */ 1179 src_edge = xmalloc (sizeof (reloc_deps_e)); 1180 memset (src_edge, 0, sizeof (reloc_deps_e)); 1181 src_edge->src = src_sec; 1182 src_edge->tgt = tgt_sec; 1183 src_edge->next = src_sec_deps->succs; 1184 src_sec_deps->succs = src_edge; 1185 1186 tgt_edge = xmalloc (sizeof (reloc_deps_e)); 1187 memset (tgt_edge, 0, sizeof (reloc_deps_e)); 1188 tgt_edge->src = src_sec; 1189 tgt_edge->tgt = tgt_sec; 1190 tgt_edge->next = tgt_sec_deps->preds; 1191 tgt_sec_deps->preds = tgt_edge; 1192} 1193 1194 1195static void 1196build_deps_graph_callback (asection *src_sec, 1197 bfd_vma src_offset ATTRIBUTE_UNUSED, 1198 asection *target_sec, 1199 bfd_vma target_offset ATTRIBUTE_UNUSED, 1200 void *closure) 1201{ 1202 reloc_deps_graph *deps = closure; 1203 1204 /* If the target is defined. */ 1205 if (target_sec != NULL) 1206 add_deps_edge (deps, src_sec, target_sec); 1207} 1208 1209 1210static reloc_deps_graph * 1211ld_build_required_section_dependence (lang_statement_union_type *s) 1212{ 1213 reloc_deps_graph *deps; 1214 xtensa_ld_iter_stack *stack = NULL; 1215 1216 deps = xmalloc (sizeof (reloc_deps_graph)); 1217 deps->sections = NULL; 1218 deps->count = 0; 1219 deps->size = 0; 1220 1221 for (iter_stack_create (&stack, s); 1222 !iter_stack_empty (&stack); 1223 iter_stack_next (&stack)) 1224 { 1225 lang_statement_union_type *l = iter_stack_current (&stack); 1226 1227 if (l->header.type == lang_input_section_enum) 1228 { 1229 lang_input_section_type *input; 1230 input = &l->input_section; 1231 xtensa_callback_required_dependence (input->section->owner, 1232 input->section, 1233 &link_info, 1234 /* Use the same closure. */ 1235 build_deps_graph_callback, 1236 deps); 1237 } 1238 } 1239 return deps; 1240} 1241 1242 1243#if EXTRA_VALIDATION 1244static size_t 1245ld_count_children (lang_statement_union_type *s) 1246{ 1247 size_t count = 0; 1248 xtensa_ld_iter_stack *stack = NULL; 1249 for (iter_stack_create (&stack, s); 1250 !iter_stack_empty (&stack); 1251 iter_stack_next (&stack)) 1252 { 1253 lang_statement_union_type *l = iter_stack_current (&stack); 1254 ASSERT (l != NULL); 1255 count++; 1256 } 1257 return count; 1258} 1259#endif /* EXTRA_VALIDATION */ 1260 1261 1262/* Check if a particular section is included in the link. This will only 1263 be true for one instance of a particular linkonce section. */ 1264 1265static bfd_boolean input_section_found = FALSE; 1266static asection *input_section_target = NULL; 1267 1268static void 1269input_section_linked_worker (lang_statement_union_type *statement) 1270{ 1271 if ((statement->header.type == lang_input_section_enum 1272 && (statement->input_section.section == input_section_target))) 1273 input_section_found = TRUE; 1274} 1275 1276static bfd_boolean 1277input_section_linked (asection *sec) 1278{ 1279 input_section_found = FALSE; 1280 input_section_target = sec; 1281 lang_for_each_statement_worker (input_section_linked_worker, stat_ptr->head); 1282 return input_section_found; 1283} 1284 1285 1286/* Strip out any linkonce property tables or XCC exception tables where the 1287 associated linkonce text is from a different object file. Normally, 1288 a matching set of linkonce sections is taken from the same object file, 1289 but sometimes the files are compiled differently so that some of the 1290 linkonce sections are not present in all files. Stripping the 1291 inconsistent sections like this is not completely robust -- a much 1292 better solution is to use comdat groups. */ 1293 1294static int linkonce_len = sizeof (".gnu.linkonce.") - 1; 1295 1296static bfd_boolean 1297is_inconsistent_linkonce_section (asection *sec) 1298{ 1299 bfd *abfd = sec->owner; 1300 const char *sec_name = bfd_section_name (sec); 1301 const char *name; 1302 1303 if ((bfd_section_flags (sec) & SEC_LINK_ONCE) == 0 1304 || strncmp (sec_name, ".gnu.linkonce.", linkonce_len) != 0) 1305 return FALSE; 1306 1307 /* Check if this is an Xtensa property section or an exception table 1308 for Tensilica's XCC compiler. */ 1309 name = sec_name + linkonce_len; 1310 if (CONST_STRNEQ (name, "prop.")) 1311 name = strchr (name + 5, '.') ? strchr (name + 5, '.') + 1 : name + 5; 1312 else if (name[1] == '.' 1313 && (name[0] == 'p' || name[0] == 'e' || name[0] == 'h')) 1314 name += 2; 1315 else 1316 name = 0; 1317 1318 if (name) 1319 { 1320 char *dep_sec_name = xmalloc (strlen (sec_name) + 1); 1321 asection *dep_sec; 1322 1323 /* Get the associated linkonce text section and check if it is 1324 included in the link. If not, this section is inconsistent 1325 and should be stripped. */ 1326 strcpy (dep_sec_name, ".gnu.linkonce.t."); 1327 strcat (dep_sec_name, name); 1328 dep_sec = bfd_get_section_by_name (abfd, dep_sec_name); 1329 if (dep_sec == NULL || ! input_section_linked (dep_sec)) 1330 { 1331 free (dep_sec_name); 1332 return TRUE; 1333 } 1334 free (dep_sec_name); 1335 } 1336 1337 return FALSE; 1338} 1339 1340 1341static void 1342xtensa_strip_inconsistent_linkonce_sections (lang_statement_list_type *slist) 1343{ 1344 lang_statement_union_type **s_p = &slist->head; 1345 while (*s_p) 1346 { 1347 lang_statement_union_type *s = *s_p; 1348 lang_statement_union_type *s_next = (*s_p)->header.next; 1349 1350 switch (s->header.type) 1351 { 1352 case lang_input_section_enum: 1353 if (is_inconsistent_linkonce_section (s->input_section.section)) 1354 { 1355 s->input_section.section->output_section = bfd_abs_section_ptr; 1356 *s_p = s_next; 1357 continue; 1358 } 1359 break; 1360 1361 case lang_constructors_statement_enum: 1362 xtensa_strip_inconsistent_linkonce_sections (&constructor_list); 1363 break; 1364 1365 case lang_output_section_statement_enum: 1366 if (s->output_section_statement.children.head) 1367 xtensa_strip_inconsistent_linkonce_sections 1368 (&s->output_section_statement.children); 1369 break; 1370 1371 case lang_wild_statement_enum: 1372 xtensa_strip_inconsistent_linkonce_sections 1373 (&s->wild_statement.children); 1374 break; 1375 1376 case lang_group_statement_enum: 1377 xtensa_strip_inconsistent_linkonce_sections 1378 (&s->group_statement.children); 1379 break; 1380 1381 case lang_data_statement_enum: 1382 case lang_reloc_statement_enum: 1383 case lang_object_symbols_statement_enum: 1384 case lang_output_statement_enum: 1385 case lang_target_statement_enum: 1386 case lang_input_statement_enum: 1387 case lang_assignment_statement_enum: 1388 case lang_padding_statement_enum: 1389 case lang_address_statement_enum: 1390 case lang_fill_statement_enum: 1391 break; 1392 1393 default: 1394 FAIL (); 1395 break; 1396 } 1397 1398 s_p = &(*s_p)->header.next; 1399 } 1400 1401 /* Reset the tail of the list, in case the last entry was removed. */ 1402 if (s_p != slist->tail) 1403 slist->tail = s_p; 1404} 1405 1406 1407static void 1408xtensa_wild_group_interleave_callback (lang_statement_union_type *statement) 1409{ 1410 lang_wild_statement_type *w; 1411 reloc_deps_graph *deps; 1412 if (statement->header.type == lang_wild_statement_enum) 1413 { 1414#if EXTRA_VALIDATION 1415 size_t old_child_count; 1416 size_t new_child_count; 1417#endif 1418 bfd_boolean no_reorder; 1419 1420 w = &statement->wild_statement; 1421 1422 no_reorder = FALSE; 1423 1424 /* If it has 0 or 1 section bound, then do not reorder. */ 1425 if (w->children.head == NULL 1426 || (w->children.head->header.type == lang_input_section_enum 1427 && w->children.head->header.next == NULL)) 1428 no_reorder = TRUE; 1429 1430 if (w->filenames_sorted) 1431 no_reorder = TRUE; 1432 1433 /* Check for sorting in a section list wildcard spec as well. */ 1434 if (!no_reorder) 1435 { 1436 struct wildcard_list *l; 1437 for (l = w->section_list; l != NULL; l = l->next) 1438 { 1439 if (l->spec.sorted == by_name) 1440 { 1441 no_reorder = TRUE; 1442 break; 1443 } 1444 } 1445 } 1446 1447 /* Special case until the NOREORDER linker directive is supported: 1448 *(.init) output sections and *(.fini) specs may NOT be reordered. */ 1449 1450 /* Check for sorting in a section list wildcard spec as well. */ 1451 if (!no_reorder) 1452 { 1453 struct wildcard_list *l; 1454 for (l = w->section_list; l != NULL; l = l->next) 1455 { 1456 if (l->spec.name 1457 && ((strcmp (".init", l->spec.name) == 0) 1458 || (strcmp (".fini", l->spec.name) == 0))) 1459 { 1460 no_reorder = TRUE; 1461 break; 1462 } 1463 } 1464 } 1465 1466#if EXTRA_VALIDATION 1467 old_child_count = ld_count_children (statement); 1468#endif 1469 1470 /* It is now officially a target. Build the graph of source 1471 section -> target section (kept as a list of edges). */ 1472 deps = ld_build_required_section_dependence (statement); 1473 1474 /* If this wildcard does not reorder.... */ 1475 if (!no_reorder && deps->count != 0) 1476 { 1477 /* First check for reverse dependences. Fix if possible. */ 1478 xtensa_layout_wild (deps, w); 1479 1480 xtensa_move_dependencies_to_front (deps, w); 1481#if EXTRA_VALIDATION 1482 new_child_count = ld_count_children (statement); 1483 ASSERT (new_child_count == old_child_count); 1484#endif 1485 1486 xtensa_colocate_literals (deps, statement); 1487 1488#if EXTRA_VALIDATION 1489 new_child_count = ld_count_children (statement); 1490 ASSERT (new_child_count == old_child_count); 1491#endif 1492 } 1493 1494 /* Clean up. */ 1495 free_reloc_deps_graph (deps); 1496 } 1497} 1498 1499 1500static void 1501xtensa_wild_group_interleave (lang_statement_union_type *s) 1502{ 1503 lang_for_each_statement_worker (xtensa_wild_group_interleave_callback, s); 1504} 1505 1506 1507static void 1508xtensa_layout_wild (const reloc_deps_graph *deps, lang_wild_statement_type *w) 1509{ 1510 /* If it does not fit initially, we need to do this step. Move all 1511 of the wild literal sections to a new list, then move each of 1512 them back in just before the first section they depend on. */ 1513 lang_statement_union_type **s_p; 1514#if EXTRA_VALIDATION 1515 size_t old_count, new_count; 1516 size_t ct1, ct2; 1517#endif 1518 1519 lang_wild_statement_type literal_wild; 1520 literal_wild.header.next = NULL; 1521 literal_wild.header.type = lang_wild_statement_enum; 1522 literal_wild.filename = NULL; 1523 literal_wild.filenames_sorted = FALSE; 1524 literal_wild.section_list = NULL; 1525 literal_wild.keep_sections = FALSE; 1526 literal_wild.children.head = NULL; 1527 literal_wild.children.tail = &literal_wild.children.head; 1528 1529#if EXTRA_VALIDATION 1530 old_count = ld_count_children ((lang_statement_union_type*) w); 1531#endif 1532 1533 s_p = &w->children.head; 1534 while (*s_p != NULL) 1535 { 1536 lang_statement_union_type *l = *s_p; 1537 if (l->header.type == lang_input_section_enum) 1538 { 1539 if (section_is_target (deps, l) 1540 && ! section_is_source (deps, l)) 1541 { 1542 /* Detach. */ 1543 *s_p = l->header.next; 1544 if (*s_p == NULL) 1545 w->children.tail = s_p; 1546 l->header.next = NULL; 1547 1548 /* Append. */ 1549 *literal_wild.children.tail = l; 1550 literal_wild.children.tail = &l->header.next; 1551 continue; 1552 } 1553 } 1554 s_p = &(*s_p)->header.next; 1555 } 1556 1557#if EXTRA_VALIDATION 1558 ct1 = ld_count_children ((lang_statement_union_type*) w); 1559 ct2 = ld_count_children ((lang_statement_union_type*) &literal_wild); 1560 1561 ASSERT (old_count == (ct1 + ct2)); 1562#endif 1563 1564 /* Now place them back in front of their dependent sections. */ 1565 1566 while (literal_wild.children.head != NULL) 1567 { 1568 lang_statement_union_type *lit = literal_wild.children.head; 1569 bfd_boolean placed = FALSE; 1570 1571#if EXTRA_VALIDATION 1572 ASSERT (ct2 > 0); 1573 ct2--; 1574#endif 1575 1576 /* Detach. */ 1577 literal_wild.children.head = lit->header.next; 1578 if (literal_wild.children.head == NULL) 1579 literal_wild.children.tail = &literal_wild.children.head; 1580 lit->header.next = NULL; 1581 1582 /* Find a spot to place it. */ 1583 for (s_p = &w->children.head; *s_p != NULL; s_p = &(*s_p)->header.next) 1584 { 1585 lang_statement_union_type *src = *s_p; 1586 if (deps_has_edge (deps, src, lit)) 1587 { 1588 /* Place it here. */ 1589 lit->header.next = *s_p; 1590 *s_p = lit; 1591 placed = TRUE; 1592 break; 1593 } 1594 } 1595 1596 if (!placed) 1597 { 1598 /* Put it at the end. */ 1599 *w->children.tail = lit; 1600 w->children.tail = &lit->header.next; 1601 } 1602 } 1603 1604#if EXTRA_VALIDATION 1605 new_count = ld_count_children ((lang_statement_union_type*) w); 1606 ASSERT (new_count == old_count); 1607#endif 1608} 1609 1610 1611static void 1612xtensa_colocate_output_literals_callback (lang_statement_union_type *statement) 1613{ 1614 reloc_deps_graph *deps; 1615 if (statement->header.type == lang_output_section_statement_enum) 1616 { 1617 /* Now, we walk over the contours of the output section statement. 1618 1619 First we build the literal section dependences as before. 1620 1621 At the first uniquely_literal section, we mark it as a good 1622 spot to place other literals. Continue walking (and counting 1623 sizes) until we find the next literal section. If this 1624 section can be moved to the first one, then we move it. If 1625 we every find a modification of ".", start over. If we find 1626 a labeling of the current location, start over. Finally, at 1627 the end, if we require page alignment, add page alignments. */ 1628 1629#if EXTRA_VALIDATION 1630 size_t old_child_count; 1631 size_t new_child_count; 1632#endif 1633 bfd_boolean no_reorder = FALSE; 1634 1635#if EXTRA_VALIDATION 1636 old_child_count = ld_count_children (statement); 1637#endif 1638 1639 /* It is now officially a target. Build the graph of source 1640 section -> target section (kept as a list of edges). */ 1641 1642 deps = ld_build_required_section_dependence (statement); 1643 1644 /* If this wildcard does not reorder.... */ 1645 if (!no_reorder) 1646 { 1647 /* First check for reverse dependences. Fix if possible. */ 1648 xtensa_colocate_literals (deps, statement); 1649 1650#if EXTRA_VALIDATION 1651 new_child_count = ld_count_children (statement); 1652 ASSERT (new_child_count == old_child_count); 1653#endif 1654 } 1655 1656 /* Insert align/offset assignment statement. */ 1657 if (xtensa_use_literal_pages) 1658 { 1659 ld_xtensa_insert_page_offsets (0, statement, deps, 1660 xtensa_use_literal_pages); 1661 lang_for_each_statement_worker (xtensa_ldlang_clear_addresses, 1662 statement); 1663 } 1664 1665 /* Clean up. */ 1666 free_reloc_deps_graph (deps); 1667 } 1668} 1669 1670 1671static void 1672xtensa_colocate_output_literals (lang_statement_union_type *s) 1673{ 1674 lang_for_each_statement_worker (xtensa_colocate_output_literals_callback, s); 1675} 1676 1677 1678static void 1679xtensa_ldlang_clear_addresses (lang_statement_union_type *statement) 1680{ 1681 switch (statement->header.type) 1682 { 1683 case lang_input_section_enum: 1684 { 1685 asection *bfd_section = statement->input_section.section; 1686 bfd_section->output_offset = 0; 1687 } 1688 break; 1689 default: 1690 break; 1691 } 1692} 1693 1694 1695static bfd_vma 1696ld_assign_relative_paged_dot (bfd_vma dot, 1697 lang_statement_union_type *s, 1698 const reloc_deps_graph *deps ATTRIBUTE_UNUSED, 1699 bfd_boolean lit_align) 1700{ 1701 /* Walk through all of the input statements in this wild statement 1702 assign dot to all of them. */ 1703 1704 xtensa_ld_iter_stack *stack = NULL; 1705 xtensa_ld_iter_stack **stack_p = &stack; 1706 1707 bfd_boolean first_section = FALSE; 1708 bfd_boolean in_literals = FALSE; 1709 1710 for (iter_stack_create (stack_p, s); 1711 !iter_stack_empty (stack_p); 1712 iter_stack_next (stack_p)) 1713 { 1714 lang_statement_union_type *l = iter_stack_current (stack_p); 1715 1716 switch (l->header.type) 1717 { 1718 case lang_input_section_enum: 1719 { 1720 asection *section = l->input_section.section; 1721 size_t align_pow = section->alignment_power; 1722 bfd_boolean do_xtensa_alignment = FALSE; 1723 1724 if (lit_align) 1725 { 1726 bfd_boolean sec_is_target = section_is_target (deps, l); 1727 bfd_boolean sec_is_source = section_is_source (deps, l); 1728 1729 if (section->size != 0 1730 && (first_section 1731 || (in_literals && !sec_is_target) 1732 || (!in_literals && sec_is_target))) 1733 { 1734 do_xtensa_alignment = TRUE; 1735 } 1736 first_section = FALSE; 1737 if (section->size != 0) 1738 in_literals = (sec_is_target && !sec_is_source); 1739 } 1740 1741 if (do_xtensa_alignment && xtensa_page_power != 0) 1742 dot += (1 << xtensa_page_power); 1743 1744 dot = align_power (dot, align_pow); 1745 section->output_offset = dot; 1746 dot += section->size; 1747 } 1748 break; 1749 case lang_fill_statement_enum: 1750 dot += l->fill_statement.size; 1751 break; 1752 case lang_padding_statement_enum: 1753 dot += l->padding_statement.size; 1754 break; 1755 default: 1756 break; 1757 } 1758 } 1759 return dot; 1760} 1761 1762 1763static bfd_boolean 1764ld_local_file_relocations_fit (lang_statement_union_type *statement, 1765 const reloc_deps_graph *deps ATTRIBUTE_UNUSED) 1766{ 1767 /* Walk over all of the dependencies that we identified and make 1768 sure that IF the source and target are here (addr != 0): 1769 1) target addr < source addr 1770 2) (roundup(source + source_size, 4) - rounddown(target, 4)) 1771 < (256K - (1 << bad align)) 1772 Need a worst-case proof.... */ 1773 1774 xtensa_ld_iter_stack *stack = NULL; 1775 xtensa_ld_iter_stack **stack_p = &stack; 1776 size_t max_align_power = 0; 1777 size_t align_penalty = 256; 1778 reloc_deps_e *e; 1779 size_t i; 1780 1781 /* Find the worst-case alignment requirement for this set of statements. */ 1782 for (iter_stack_create (stack_p, statement); 1783 !iter_stack_empty (stack_p); 1784 iter_stack_next (stack_p)) 1785 { 1786 lang_statement_union_type *l = iter_stack_current (stack_p); 1787 if (l->header.type == lang_input_section_enum) 1788 { 1789 lang_input_section_type *input = &l->input_section; 1790 asection *section = input->section; 1791 if (section->alignment_power > max_align_power) 1792 max_align_power = section->alignment_power; 1793 } 1794 } 1795 1796 /* Now check that everything fits. */ 1797 for (i = 0; i < deps->count; i++) 1798 { 1799 asection *sec = deps->sections[i]; 1800 const reloc_deps_section *deps_section = 1801 xtensa_get_section_deps (deps, sec); 1802 if (deps_section) 1803 { 1804 /* We choose to walk through the successors. */ 1805 for (e = deps_section->succs; e != NULL; e = e->next) 1806 { 1807 if (e->src != e->tgt 1808 && e->src->output_section == e->tgt->output_section 1809 && e->src->output_offset != 0 1810 && e->tgt->output_offset != 0) 1811 { 1812 bfd_vma l32r_addr = 1813 align_power (e->src->output_offset + e->src->size, 2); 1814 bfd_vma target_addr = e->tgt->output_offset & ~3; 1815 if (l32r_addr < target_addr) 1816 { 1817 fflush (stdout); 1818 fprintf (stderr, "Warning: " 1819 "l32r target section before l32r\n"); 1820 fflush (stderr); 1821 return FALSE; 1822 } 1823 1824 if (l32r_addr - target_addr > 256 * 1024 - align_penalty) 1825 return FALSE; 1826 } 1827 } 1828 } 1829 } 1830 1831 return TRUE; 1832} 1833 1834 1835static bfd_vma 1836ld_xtensa_insert_page_offsets (bfd_vma dot, 1837 lang_statement_union_type *s, 1838 reloc_deps_graph *deps, 1839 bfd_boolean lit_align) 1840{ 1841 xtensa_ld_iter_stack *stack = NULL; 1842 xtensa_ld_iter_stack **stack_p = &stack; 1843 1844 bfd_boolean first_section = FALSE; 1845 bfd_boolean in_literals = FALSE; 1846 1847 if (!lit_align) 1848 return FALSE; 1849 1850 for (iter_stack_create (stack_p, s); 1851 !iter_stack_empty (stack_p); 1852 iter_stack_next (stack_p)) 1853 { 1854 lang_statement_union_type *l = iter_stack_current (stack_p); 1855 1856 switch (l->header.type) 1857 { 1858 case lang_input_section_enum: 1859 { 1860 asection *section = l->input_section.section; 1861 bfd_boolean do_xtensa_alignment = FALSE; 1862 1863 if (lit_align) 1864 { 1865 if (section->size != 0 1866 && (first_section 1867 || (in_literals && !section_is_target (deps, l)) 1868 || (!in_literals && section_is_target (deps, l)))) 1869 { 1870 do_xtensa_alignment = TRUE; 1871 } 1872 first_section = FALSE; 1873 if (section->size != 0) 1874 { 1875 in_literals = (section_is_target (deps, l) 1876 && !section_is_source (deps, l)); 1877 } 1878 } 1879 1880 if (do_xtensa_alignment && xtensa_page_power != 0) 1881 { 1882 /* Create an expression that increments the current address, 1883 i.e., "dot", by (1 << xtensa_align_power). */ 1884 etree_type *name_op = exp_nameop (NAME, "."); 1885 etree_type *addend_op = exp_intop (1 << xtensa_page_power); 1886 etree_type *add_op = exp_binop ('+', name_op, addend_op); 1887 etree_type *assign_op = exp_assign (".", add_op, FALSE); 1888 1889 lang_assignment_statement_type *assign_stmt; 1890 lang_statement_union_type *assign_union; 1891 lang_statement_list_type tmplist; 1892 1893 /* There is hidden state in "lang_add_assignment". It 1894 appends the new assignment statement to the stat_ptr 1895 list. Thus, we swap it before and after the call. */ 1896 1897 lang_list_init (&tmplist); 1898 push_stat_ptr (&tmplist); 1899 /* Warning: side effect; statement appended to stat_ptr. */ 1900 assign_stmt = lang_add_assignment (assign_op); 1901 assign_union = (lang_statement_union_type *) assign_stmt; 1902 pop_stat_ptr (); 1903 1904 assign_union->header.next = l; 1905 *(*stack_p)->iterloc.loc = assign_union; 1906 iter_stack_next (stack_p); 1907 } 1908 } 1909 break; 1910 default: 1911 break; 1912 } 1913 } 1914 return dot; 1915} 1916 1917EOF 1918 1919# Define some shell vars to insert bits of code into the standard ELF 1920# parse_args and list_options functions. 1921# 1922PARSE_AND_LIST_PROLOGUE=' 1923#define OPTION_OPT_SIZEOPT (300) 1924#define OPTION_LITERAL_MOVEMENT (OPTION_OPT_SIZEOPT + 1) 1925#define OPTION_NO_LITERAL_MOVEMENT (OPTION_LITERAL_MOVEMENT + 1) 1926extern int elf32xtensa_size_opt; 1927extern int elf32xtensa_no_literal_movement; 1928' 1929 1930PARSE_AND_LIST_LONGOPTS=' 1931 { "size-opt", no_argument, NULL, OPTION_OPT_SIZEOPT}, 1932 { "literal-movement", no_argument, NULL, OPTION_LITERAL_MOVEMENT}, 1933 { "no-literal-movement", no_argument, NULL, OPTION_NO_LITERAL_MOVEMENT}, 1934' 1935 1936PARSE_AND_LIST_OPTIONS=' 1937 fprintf (file, _("\ 1938 --size-opt When relaxing longcalls, prefer size\n\ 1939 optimization over branch target alignment\n")); 1940' 1941 1942PARSE_AND_LIST_ARGS_CASES=' 1943 case OPTION_OPT_SIZEOPT: 1944 elf32xtensa_size_opt = 1; 1945 break; 1946 case OPTION_LITERAL_MOVEMENT: 1947 elf32xtensa_no_literal_movement = 0; 1948 break; 1949 case OPTION_NO_LITERAL_MOVEMENT: 1950 elf32xtensa_no_literal_movement = 1; 1951 break; 1952' 1953 1954# Replace some of the standard ELF functions with our own versions. 1955# 1956LDEMUL_BEFORE_PARSE=elf_xtensa_before_parse 1957LDEMUL_AFTER_OPEN=elf_xtensa_after_open 1958LDEMUL_CHOOSE_TARGET=elf_xtensa_choose_target 1959LDEMUL_BEFORE_ALLOCATION=elf_xtensa_before_allocation 1960