1 # This shell script emits a C file. -*- C -*-
2 # Copyright (C) 2003-2021 Free Software Foundation, Inc.
4 # This file is part of the GNU Binutils.
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.
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.
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,
22 # This file is sourced from elf.em, and defines extra xtensa-elf
27 #include <xtensa-config.h>
28 #include "../bfd/elf-bfd.h"
29 #include "elf/xtensa.h"
32 /* Provide default values for new configuration settings. */
33 #ifndef XTHAL_ABI_UNDEFINED
34 #define XTHAL_ABI_UNDEFINED -1
37 #ifndef XTHAL_ABI_WINDOWED
38 #define XTHAL_ABI_WINDOWED 0
41 #ifndef XTHAL_ABI_CALL0
42 #define XTHAL_ABI_CALL0 1
45 static void xtensa_wild_group_interleave (lang_statement_union_type *);
46 static void xtensa_colocate_output_literals (lang_statement_union_type *);
47 static void xtensa_strip_inconsistent_linkonce_sections
48 (lang_statement_list_type *);
51 /* This number is irrelevant until we turn on use_literal_pages */
52 static bfd_vma xtensa_page_power = 12; /* 4K pages. */
54 /* To force a page break between literals and text, change
55 xtensa_use_literal_pages to "true". */
56 static bool xtensa_use_literal_pages = false;
58 #define EXTRA_VALIDATION 0
61 This option is defined in BDF library. */
62 extern int elf32xtensa_abi;
66 elf_xtensa_choose_target (int argc ATTRIBUTE_UNUSED,
67 char **argv ATTRIBUTE_UNUSED)
70 return "${BIG_OUTPUT_FORMAT}";
72 return "${LITTLE_OUTPUT_FORMAT}";
77 elf_xtensa_before_parse (void)
79 /* Just call the default hook.... Tensilica's version of this function
80 does some other work that isn't relevant here. */
81 gld${EMULATION_NAME}_before_parse ();
86 remove_section (bfd *abfd, asection *os)
89 for (spp = &abfd->sections; *spp; spp = &(*spp)->next)
93 os->owner->section_count--;
100 replace_insn_sec_with_prop_sec (bfd *abfd,
101 const char *insn_sec_name,
102 const char *prop_sec_name,
103 char **error_message)
107 bfd_byte *prop_contents = NULL;
108 bfd_byte *insn_contents = NULL;
109 unsigned entry_count;
111 Elf_Internal_Shdr *rel_hdr;
112 Elf_Internal_Rela *internal_relocs = NULL;
113 unsigned reloc_count;
116 insn_sec = bfd_get_section_by_name (abfd, insn_sec_name);
117 if (insn_sec == NULL)
119 entry_count = insn_sec->size / 8;
121 prop_sec = bfd_get_section_by_name (abfd, prop_sec_name);
122 if (prop_sec != NULL && insn_sec != NULL)
124 *error_message = _("file already has property tables");
128 if (insn_sec->size != 0)
130 insn_contents = (bfd_byte *) xmalloc (insn_sec->size);
131 if (! bfd_get_section_contents (abfd, insn_sec, insn_contents,
132 (file_ptr) 0, insn_sec->size))
134 *error_message = _("failed to read section contents");
139 /* Create a property table section for it. */
140 prop_sec_name = strdup (prop_sec_name);
141 prop_sec = bfd_make_section_with_flags
142 (abfd, prop_sec_name, bfd_section_flags (insn_sec));
144 || !bfd_set_section_alignment (prop_sec, 2))
146 *error_message = _("could not create new section");
150 prop_sec->size = entry_count * 12;
151 prop_contents = (bfd_byte *) bfd_zalloc (abfd, prop_sec->size);
152 elf_section_data (prop_sec)->this_hdr.contents = prop_contents;
154 /* The entry size and size must be set to allow the linker to compute
155 the number of relocations since it does not use reloc_count. */
156 rel_hdr = _bfd_elf_single_rel_hdr (prop_sec);
157 rel_hdr->sh_entsize = sizeof (Elf32_External_Rela);
158 rel_hdr->sh_size = _bfd_elf_single_rel_hdr (insn_sec)->sh_size;
160 if (prop_contents == NULL && prop_sec->size != 0)
162 *error_message = _("could not allocate section contents");
166 /* Read the relocations. */
167 reloc_count = insn_sec->reloc_count;
168 if (reloc_count != 0)
170 /* If there is already an internal_reloc, then save it so that the
171 read_relocs function freshly allocates a copy. */
172 Elf_Internal_Rela *saved_relocs = elf_section_data (insn_sec)->relocs;
174 elf_section_data (insn_sec)->relocs = NULL;
176 _bfd_elf_link_read_relocs (abfd, insn_sec, NULL, NULL, false);
177 elf_section_data (insn_sec)->relocs = saved_relocs;
179 if (internal_relocs == NULL)
181 *error_message = _("out of memory");
186 /* Create a relocation section for the property section. */
187 if (internal_relocs != NULL)
189 elf_section_data (prop_sec)->relocs = internal_relocs;
190 prop_sec->reloc_count = reloc_count;
193 /* Now copy each insn table entry to the prop table entry with
194 appropriate flags. */
195 for (entry = 0; entry < entry_count; ++entry)
198 unsigned flags = (XTENSA_PROP_INSN | XTENSA_PROP_NO_TRANSFORM
199 | XTENSA_PROP_INSN_NO_REORDER);
200 value = bfd_get_32 (abfd, insn_contents + entry * 8 + 0);
201 bfd_put_32 (abfd, value, prop_contents + entry * 12 + 0);
202 value = bfd_get_32 (abfd, insn_contents + entry * 8 + 4);
203 bfd_put_32 (abfd, value, prop_contents + entry * 12 + 4);
204 bfd_put_32 (abfd, flags, prop_contents + entry * 12 + 8);
207 /* Now copy all of the relocations. Change offsets for the
208 instruction table section to offsets in the property table
214 for (i = 0; i < reloc_count; i++)
216 Elf_Internal_Rela *rela;
219 rela = &internal_relocs[i];
221 /* If this relocation is to the .xt.insn section,
222 change the section number and the offset. */
223 r_offset = rela->r_offset;
224 r_offset += 4 * (r_offset / 8);
225 rela->r_offset = r_offset;
229 remove_section (abfd, insn_sec);
231 free (insn_contents);
236 if (prop_sec && prop_sec->owner)
237 remove_section (abfd, prop_sec);
238 free (insn_contents);
239 free (internal_relocs);
245 #define PROP_SEC_BASE_NAME ".xt.prop"
246 #define INSN_SEC_BASE_NAME ".xt.insn"
247 #define LINKONCE_SEC_OLD_TEXT_BASE_NAME ".gnu.linkonce.x."
251 replace_instruction_table_sections (bfd *abfd, asection *sec)
254 const char *insn_sec_name = NULL;
255 char *prop_sec_name = NULL;
256 char *owned_prop_sec_name = NULL;
257 const char *sec_name;
259 sec_name = bfd_section_name (sec);
260 if (strcmp (sec_name, INSN_SEC_BASE_NAME) == 0)
262 insn_sec_name = INSN_SEC_BASE_NAME;
263 prop_sec_name = PROP_SEC_BASE_NAME;
265 else if (startswith (sec_name, LINKONCE_SEC_OLD_TEXT_BASE_NAME))
267 insn_sec_name = sec_name;
268 owned_prop_sec_name = (char *) xmalloc (strlen (sec_name) + 20);
269 prop_sec_name = owned_prop_sec_name;
270 strcpy (prop_sec_name, ".gnu.linkonce.prop.t.");
271 strcat (prop_sec_name,
272 sec_name + strlen (LINKONCE_SEC_OLD_TEXT_BASE_NAME));
274 if (insn_sec_name != NULL)
276 if (! replace_insn_sec_with_prop_sec (abfd, insn_sec_name, prop_sec_name,
279 einfo (_("%P: warning: failed to convert %s table in %pB (%s); subsequent disassembly may be incomplete\n"),
280 insn_sec_name, abfd, message);
283 free (owned_prop_sec_name);
287 /* This is called after all input sections have been opened to convert
288 instruction tables (.xt.insn, gnu.linkonce.x.*) tables into property
289 tables (.xt.prop) before any section placement. */
292 elf_xtensa_after_open (void)
294 /* First call the ELF version. */
295 gld${EMULATION_NAME}_after_open ();
297 /* Now search the input files looking for instruction table sections. */
298 LANG_FOR_EACH_INPUT_STATEMENT (f)
300 asection *sec = f->the_bfd->sections;
303 /* Do not use bfd_map_over_sections here since we are removing
304 sections as we iterate. */
307 next_sec = sec->next;
308 replace_instruction_table_sections (f->the_bfd, sec);
316 xt_config_info_unpack_and_check (char *data,
333 /* Overwrite the equal sign. */
336 /* Check if this is a quoted string or a number. */
339 /* No string values are currently checked by LD;
340 just skip over the quotes. */
345 /* Overwrite the trailing quote. */
352 num = strtoul (d, &d, 0);
354 if (! strcmp (key, "ABI"))
356 if (elf32xtensa_abi == XTHAL_ABI_UNDEFINED)
358 elf32xtensa_abi = num;
360 else if (num != elf32xtensa_abi)
363 *pmsg = "ABI does not match";
366 else if (! strcmp (key, "USE_ABSOLUTE_LITERALS"))
368 if (num != XSHAL_USE_ABSOLUTE_LITERALS)
371 *pmsg = "incompatible use of the Extended L32R option";
387 #define XTINFO_NAME "Xtensa_Info"
388 #define XTINFO_NAMESZ 12
389 #define XTINFO_TYPE 1
392 check_xtensa_info (bfd *abfd, asection *info_sec)
394 char *data, *errmsg = "";
397 data = xmalloc (info_sec->size);
398 if (! bfd_get_section_contents (abfd, info_sec, data, 0, info_sec->size))
399 einfo (_("%F%P: %pB: cannot read contents of section %pA\n"), abfd, info_sec);
401 if (info_sec->size > 24
402 && info_sec->size >= 24 + bfd_get_32 (abfd, data + 4)
403 && bfd_get_32 (abfd, data + 0) == XTINFO_NAMESZ
404 && bfd_get_32 (abfd, data + 8) == XTINFO_TYPE
405 && strcmp (data + 12, XTINFO_NAME) == 0
406 && xt_config_info_unpack_and_check (data + 12 + XTINFO_NAMESZ,
410 einfo (_("%P: %pB: warning: incompatible Xtensa configuration (%s)\n"),
414 einfo (_("%P: %pB: warning: cannot parse .xtensa.info section\n"), abfd);
420 /* This is called after the sections have been attached to output
421 sections, but before any sizes or addresses have been set. */
424 elf_xtensa_before_allocation (void)
426 asection *info_sec, *first_info_sec;
428 bool is_big_endian = XCHAL_HAVE_BE;
430 /* Check that the output endianness matches the Xtensa
431 configuration. The BFD library always includes both big and
432 little endian target vectors for Xtensa, but it only supports the
433 detailed instruction encode/decode operations (such as are
434 required to process relocations) for the selected Xtensa
438 && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
440 einfo (_("%F%P: little endian output does not match "
441 "Xtensa configuration\n"));
444 && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_BIG)
446 einfo (_("%F%P: big endian output does not match "
447 "Xtensa configuration\n"));
450 /* Keep track of the first input .xtensa.info section, and as a fallback,
451 the first input bfd where a .xtensa.info section could be created.
452 After the input .xtensa.info has been checked, the contents of the
453 first one will be replaced with the output .xtensa.info table. */
457 LANG_FOR_EACH_INPUT_STATEMENT (f)
459 /* Check that the endianness for each input file matches the output.
460 The merge_private_bfd_data hook has already reported any mismatches
461 as errors, but those errors are not fatal. At this point, we
462 cannot go any further if there are any mismatches. */
463 if ((is_big_endian && f->the_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
464 || (!is_big_endian && f->the_bfd->xvec->byteorder == BFD_ENDIAN_BIG))
465 einfo (_("%F%P: cross-endian linking for %pB not supported\n"),
469 first_bfd = f->the_bfd;
471 info_sec = bfd_get_section_by_name (f->the_bfd, ".xtensa.info");
475 if (! first_info_sec)
476 first_info_sec = info_sec;
478 /* Unpack the .xtensa.info section and check it against the current
479 Xtensa configuration. */
480 check_xtensa_info (f->the_bfd, info_sec);
482 /* Do not include this copy of .xtensa.info in the output. */
484 info_sec->flags |= SEC_EXCLUDE;
487 /* Reuse the first .xtensa.info input section to hold the output
488 .xtensa.info; or, if none were found, create a new section in the
489 first input bfd (assuming there is one). */
490 info_sec = first_info_sec;
491 if (! info_sec && first_bfd)
493 info_sec = bfd_make_section_with_flags (first_bfd, ".xtensa.info",
494 SEC_HAS_CONTENTS | SEC_READONLY);
496 einfo (_("%F%P: failed to create .xtensa.info section\n"));
500 int xtensa_info_size;
503 info_sec->flags &= ~SEC_EXCLUDE;
504 info_sec->flags |= SEC_IN_MEMORY;
506 data = xmalloc (100);
507 sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
508 XSHAL_USE_ABSOLUTE_LITERALS, xtensa_abi_choice ());
509 xtensa_info_size = strlen (data) + 1;
511 /* Add enough null terminators to pad to a word boundary. */
513 data[xtensa_info_size++] = 0;
514 while ((xtensa_info_size & 3) != 0);
516 info_sec->size = 12 + XTINFO_NAMESZ + xtensa_info_size;
517 info_sec->contents = xmalloc (info_sec->size);
518 bfd_put_32 (info_sec->owner, XTINFO_NAMESZ, info_sec->contents + 0);
519 bfd_put_32 (info_sec->owner, xtensa_info_size, info_sec->contents + 4);
520 bfd_put_32 (info_sec->owner, XTINFO_TYPE, info_sec->contents + 8);
521 memcpy (info_sec->contents + 12, XTINFO_NAME, XTINFO_NAMESZ);
522 memcpy (info_sec->contents + 12 + XTINFO_NAMESZ, data, xtensa_info_size);
526 /* Enable relaxation by default if the "--no-relax" option was not
527 specified. This is done here instead of in the before_parse hook
528 because there is a check in main() to prohibit use of --relax and
529 -r together and that combination should be allowed for Xtensa. */
530 if (RELAXATION_DISABLED_BY_DEFAULT)
533 xtensa_strip_inconsistent_linkonce_sections (stat_ptr);
535 gld${EMULATION_NAME}_before_allocation ();
537 xtensa_wild_group_interleave (stat_ptr->head);
539 if (RELAXATION_ENABLED)
540 xtensa_colocate_output_literals (stat_ptr->head);
542 /* TBD: We need to force the page alignments to here and only do
543 them as needed for the entire output section. Finally, if this
544 is a relocatable link then we need to add alignment notes so
545 that the literals can be separated later. */
549 typedef struct wildcard_list section_name_list;
551 typedef struct reloc_deps_e_t reloc_deps_e;
552 typedef struct reloc_deps_section_t reloc_deps_section;
553 typedef struct reloc_deps_graph_t reloc_deps_graph;
556 struct reloc_deps_e_t
558 asection *src; /* Contains l32rs. */
559 asection *tgt; /* Contains literals. */
563 /* Place these in the userdata field. */
564 struct reloc_deps_section_t
568 bool is_only_literal;
572 struct reloc_deps_graph_t
579 static void xtensa_layout_wild
580 (const reloc_deps_graph *, lang_wild_statement_type *);
582 typedef void (*deps_callback_t) (asection *, /* src_sec */
583 bfd_vma, /* src_offset */
584 asection *, /* target_sec */
585 bfd_vma, /* target_offset */
586 void *); /* closure */
588 extern bool xtensa_callback_required_dependence
589 (bfd *, asection *, struct bfd_link_info *, deps_callback_t, void *);
590 static void xtensa_ldlang_clear_addresses (lang_statement_union_type *);
591 static bool ld_local_file_relocations_fit
592 (lang_statement_union_type *, const reloc_deps_graph *);
593 static bfd_vma ld_assign_relative_paged_dot
594 (bfd_vma, lang_statement_union_type *, const reloc_deps_graph *,
596 static bfd_vma ld_xtensa_insert_page_offsets
597 (bfd_vma, lang_statement_union_type *, reloc_deps_graph *, bool);
599 static size_t ld_count_children (lang_statement_union_type *);
602 extern lang_statement_list_type constructor_list;
604 static reloc_deps_section *
605 xtensa_get_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
608 /* We have a separate function for this so that
609 we could in the future keep a completely independent
610 structure that maps a section to its dependence edges.
611 For now, we place these in the sec->userdata field.
612 This doesn't clash with ldlang.c use of userdata for output
613 sections, and during map output for input sections, since the
614 xtensa use is only for input sections and only extant in
615 before_allocation. */
616 reloc_deps_section *sec_deps = bfd_section_userdata (sec);
621 xtensa_set_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
623 reloc_deps_section *deps_section)
625 bfd_set_section_userdata (sec, deps_section);
629 /* This is used to keep a list of all of the sections participating in
630 the graph so we can clean them up quickly. */
633 xtensa_append_section_deps (reloc_deps_graph *deps, asection *sec)
635 if (deps->size <= deps->count)
637 asection **new_sections;
641 new_size = deps->size * 2;
645 new_sections = xmalloc (sizeof (asection *) * new_size);
646 memset (new_sections, 0, sizeof (asection *) * new_size);
647 for (i = 0; i < deps->count; i++)
649 new_sections[i] = deps->sections[i];
651 free (deps->sections);
652 deps->sections = new_sections;
653 deps->size = new_size;
655 deps->sections[deps->count] = sec;
661 free_reloc_deps_graph (reloc_deps_graph *deps)
664 for (i = 0; i < deps->count; i++)
666 asection *sec = deps->sections[i];
667 reloc_deps_section *sec_deps;
668 sec_deps = xtensa_get_section_deps (deps, sec);
672 while (sec_deps->succs != NULL)
674 next = sec_deps->succs->next;
675 free (sec_deps->succs);
676 sec_deps->succs = next;
679 while (sec_deps->preds != NULL)
681 next = sec_deps->preds->next;
682 free (sec_deps->preds);
683 sec_deps->preds = next;
687 xtensa_set_section_deps (deps, sec, NULL);
689 free (deps->sections);
695 section_is_source (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
696 lang_statement_union_type *s)
699 const reloc_deps_section *sec_deps;
701 if (s->header.type != lang_input_section_enum)
703 sec = s->input_section.section;
705 sec_deps = xtensa_get_section_deps (deps, sec);
706 return sec_deps && sec_deps->succs != NULL;
711 section_is_target (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
712 lang_statement_union_type *s)
715 const reloc_deps_section *sec_deps;
717 if (s->header.type != lang_input_section_enum)
719 sec = s->input_section.section;
721 sec_deps = xtensa_get_section_deps (deps, sec);
722 return sec_deps && sec_deps->preds != NULL;
727 section_is_source_or_target (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
728 lang_statement_union_type *s)
730 return (section_is_source (deps, s)
731 || section_is_target (deps, s));
735 typedef struct xtensa_ld_iter_stack_t xtensa_ld_iter_stack;
736 typedef struct xtensa_ld_iter_t xtensa_ld_iter;
738 struct xtensa_ld_iter_t
740 lang_statement_union_type *parent; /* Parent of the list. */
741 lang_statement_list_type *l; /* List that holds it. */
742 lang_statement_union_type **loc; /* Place in the list. */
745 struct xtensa_ld_iter_stack_t
747 xtensa_ld_iter iterloc; /* List that hold it. */
749 xtensa_ld_iter_stack *next; /* Next in the stack. */
750 xtensa_ld_iter_stack *prev; /* Back pointer for stack. */
755 ld_xtensa_move_section_after (xtensa_ld_iter *to, xtensa_ld_iter *current)
757 lang_statement_union_type *to_next;
758 lang_statement_union_type *current_next;
759 lang_statement_union_type **e;
762 size_t old_to_count, new_to_count;
763 size_t old_current_count, new_current_count;
770 old_to_count = ld_count_children (to->parent);
771 old_current_count = ld_count_children (current->parent);
774 to_next = *(to->loc);
775 current_next = (*current->loc)->header.next;
777 *(to->loc) = *(current->loc);
779 *(current->loc) = current_next;
780 (*(to->loc))->header.next = to_next;
782 /* reset "to" list tail */
783 for (e = &to->l->head; *e != NULL; e = &(*e)->header.next)
787 /* reset "current" list tail */
788 for (e = ¤t->l->head; *e != NULL; e = &(*e)->header.next)
790 current->l->tail = e;
793 new_to_count = ld_count_children (to->parent);
794 new_current_count = ld_count_children (current->parent);
796 ASSERT ((old_to_count + old_current_count)
797 == (new_to_count + new_current_count));
802 /* Can only be called with lang_statements that have lists. Returns
803 FALSE if the list is empty. */
806 iter_stack_empty (xtensa_ld_iter_stack **stack_p)
808 return *stack_p == NULL;
813 iter_stack_push (xtensa_ld_iter_stack **stack_p,
814 lang_statement_union_type *parent)
816 xtensa_ld_iter_stack *stack;
817 lang_statement_list_type *l = NULL;
819 switch (parent->header.type)
821 case lang_output_section_statement_enum:
822 l = &parent->output_section_statement.children;
824 case lang_wild_statement_enum:
825 l = &parent->wild_statement.children;
827 case lang_group_statement_enum:
828 l = &parent->group_statement.children;
835 /* Empty. do not push. */
836 if (l->tail == &l->head)
839 stack = xmalloc (sizeof (xtensa_ld_iter_stack));
840 memset (stack, 0, sizeof (xtensa_ld_iter_stack));
841 stack->iterloc.parent = parent;
842 stack->iterloc.l = l;
843 stack->iterloc.loc = &l->head;
845 stack->next = *stack_p;
847 if (*stack_p != NULL)
848 (*stack_p)->prev = stack;
855 iter_stack_pop (xtensa_ld_iter_stack **stack_p)
857 xtensa_ld_iter_stack *stack;
863 ASSERT (stack != NULL);
867 if (stack->next != NULL)
868 stack->next->prev = NULL;
870 *stack_p = stack->next;
875 /* This MUST be called if, during iteration, the user changes the
876 underlying structure. It will check for a NULL current and advance
880 iter_stack_update (xtensa_ld_iter_stack **stack_p)
882 if (!iter_stack_empty (stack_p)
883 && (*(*stack_p)->iterloc.loc) == NULL)
885 iter_stack_pop (stack_p);
887 while (!iter_stack_empty (stack_p)
888 && ((*(*stack_p)->iterloc.loc)->header.next == NULL))
890 iter_stack_pop (stack_p);
892 if (!iter_stack_empty (stack_p))
893 (*stack_p)->iterloc.loc = &(*(*stack_p)->iterloc.loc)->header.next;
899 iter_stack_next (xtensa_ld_iter_stack **stack_p)
901 xtensa_ld_iter_stack *stack;
902 lang_statement_union_type *current;
905 current = *stack->iterloc.loc;
906 /* If we are on the first element. */
909 switch (current->header.type)
911 case lang_output_section_statement_enum:
912 case lang_wild_statement_enum:
913 case lang_group_statement_enum:
914 /* If the list if not empty, we are done. */
915 if (iter_stack_push (stack_p, *stack->iterloc.loc))
917 /* Otherwise increment the pointer as normal. */
924 while (!iter_stack_empty (stack_p)
925 && ((*(*stack_p)->iterloc.loc)->header.next == NULL))
927 iter_stack_pop (stack_p);
929 if (!iter_stack_empty (stack_p))
930 (*stack_p)->iterloc.loc = &(*(*stack_p)->iterloc.loc)->header.next;
934 static lang_statement_union_type *
935 iter_stack_current (xtensa_ld_iter_stack **stack_p)
937 return *((*stack_p)->iterloc.loc);
941 /* The iter stack is a preorder. */
944 iter_stack_create (xtensa_ld_iter_stack **stack_p,
945 lang_statement_union_type *parent)
947 iter_stack_push (stack_p, parent);
952 iter_stack_copy_current (xtensa_ld_iter_stack **stack_p, xtensa_ld_iter *front)
954 *front = (*stack_p)->iterloc;
959 xtensa_colocate_literals (reloc_deps_graph *deps,
960 lang_statement_union_type *statement)
962 /* Keep a stack of pointers to control iteration through the contours. */
963 xtensa_ld_iter_stack *stack = NULL;
964 xtensa_ld_iter_stack **stack_p = &stack;
966 xtensa_ld_iter front; /* Location where new insertion should occur. */
967 xtensa_ld_iter *front_p = NULL;
969 xtensa_ld_iter current; /* Location we are checking. */
970 xtensa_ld_iter *current_p = NULL;
971 bool in_literals = false;
973 if (deps->count == 0)
976 iter_stack_create (stack_p, statement);
978 while (!iter_stack_empty (stack_p))
980 bool skip_increment = false;
981 lang_statement_union_type *l = iter_stack_current (stack_p);
983 switch (l->header.type)
985 case lang_assignment_statement_enum:
986 /* Any assignment statement should block reordering across it. */
991 case lang_input_section_enum:
994 in_literals = (section_is_target (deps, l)
995 && !section_is_source (deps, l));
999 iter_stack_copy_current (stack_p, front_p);
1005 current_p = ¤t;
1006 iter_stack_copy_current (stack_p, current_p);
1007 is_target = (section_is_target (deps, l)
1008 && !section_is_source (deps, l));
1012 iter_stack_copy_current (stack_p, front_p);
1014 in_literals = false;
1020 /* Try to insert in place. */
1021 ld_xtensa_move_section_after (front_p, current_p);
1022 ld_assign_relative_paged_dot (0x100000,
1025 xtensa_use_literal_pages);
1027 /* We use this code because it's already written. */
1028 if (!ld_local_file_relocations_fit (statement, deps))
1031 ld_xtensa_move_section_after (current_p, front_p);
1032 /* Reset the literal placement. */
1033 iter_stack_copy_current (stack_p, front_p);
1037 /* Move front pointer up by one. */
1038 front_p->loc = &(*front_p->loc)->header.next;
1040 /* Do not increment the current pointer. */
1041 skip_increment = true;
1051 if (!skip_increment)
1052 iter_stack_next (stack_p);
1054 /* Be careful to update the stack_p if it now is a null. */
1055 iter_stack_update (stack_p);
1058 lang_for_each_statement_worker (xtensa_ldlang_clear_addresses, statement);
1063 xtensa_move_dependencies_to_front (reloc_deps_graph *deps,
1064 lang_wild_statement_type *w)
1066 /* Keep a front pointer and a current pointer. */
1067 lang_statement_union_type **front;
1068 lang_statement_union_type **current;
1070 /* Walk to the end of the targets. */
1071 for (front = &w->children.head;
1072 (*front != NULL) && section_is_source_or_target (deps, *front);
1073 front = &(*front)->header.next)
1079 current = &(*front)->header.next;
1080 while (*current != NULL)
1082 if (section_is_source_or_target (deps, *current))
1084 /* Insert in place. */
1085 xtensa_ld_iter front_iter;
1086 xtensa_ld_iter current_iter;
1088 front_iter.parent = (lang_statement_union_type *) w;
1089 front_iter.l = &w->children;
1090 front_iter.loc = front;
1092 current_iter.parent = (lang_statement_union_type *) w;
1093 current_iter.l = &w->children;
1094 current_iter.loc = current;
1096 ld_xtensa_move_section_after (&front_iter, ¤t_iter);
1097 front = &(*front)->header.next;
1101 current = &(*current)->header.next;
1108 deps_has_sec_edge (const reloc_deps_graph *deps, asection *src, asection *tgt)
1110 const reloc_deps_section *sec_deps;
1111 const reloc_deps_e *sec_deps_e;
1113 sec_deps = xtensa_get_section_deps (deps, src);
1114 if (sec_deps == NULL)
1117 for (sec_deps_e = sec_deps->succs;
1119 sec_deps_e = sec_deps_e->next)
1121 ASSERT (sec_deps_e->src == src);
1122 if (sec_deps_e->tgt == tgt)
1130 deps_has_edge (const reloc_deps_graph *deps,
1131 lang_statement_union_type *src,
1132 lang_statement_union_type *tgt)
1134 if (!section_is_source (deps, src))
1136 if (!section_is_target (deps, tgt))
1139 if (src->header.type != lang_input_section_enum)
1141 if (tgt->header.type != lang_input_section_enum)
1144 return deps_has_sec_edge (deps, src->input_section.section,
1145 tgt->input_section.section);
1150 add_deps_edge (reloc_deps_graph *deps, asection *src_sec, asection *tgt_sec)
1152 reloc_deps_section *src_sec_deps;
1153 reloc_deps_section *tgt_sec_deps;
1155 reloc_deps_e *src_edge;
1156 reloc_deps_e *tgt_edge;
1158 if (deps_has_sec_edge (deps, src_sec, tgt_sec))
1161 src_sec_deps = xtensa_get_section_deps (deps, src_sec);
1162 if (src_sec_deps == NULL)
1164 /* Add a section. */
1165 src_sec_deps = xmalloc (sizeof (reloc_deps_section));
1166 memset (src_sec_deps, 0, sizeof (reloc_deps_section));
1167 src_sec_deps->is_only_literal = 0;
1168 src_sec_deps->preds = NULL;
1169 src_sec_deps->succs = NULL;
1170 xtensa_set_section_deps (deps, src_sec, src_sec_deps);
1171 xtensa_append_section_deps (deps, src_sec);
1174 tgt_sec_deps = xtensa_get_section_deps (deps, tgt_sec);
1175 if (tgt_sec_deps == NULL)
1177 /* Add a section. */
1178 tgt_sec_deps = xmalloc (sizeof (reloc_deps_section));
1179 memset (tgt_sec_deps, 0, sizeof (reloc_deps_section));
1180 tgt_sec_deps->is_only_literal = 0;
1181 tgt_sec_deps->preds = NULL;
1182 tgt_sec_deps->succs = NULL;
1183 xtensa_set_section_deps (deps, tgt_sec, tgt_sec_deps);
1184 xtensa_append_section_deps (deps, tgt_sec);
1187 /* Add the edges. */
1188 src_edge = xmalloc (sizeof (reloc_deps_e));
1189 memset (src_edge, 0, sizeof (reloc_deps_e));
1190 src_edge->src = src_sec;
1191 src_edge->tgt = tgt_sec;
1192 src_edge->next = src_sec_deps->succs;
1193 src_sec_deps->succs = src_edge;
1195 tgt_edge = xmalloc (sizeof (reloc_deps_e));
1196 memset (tgt_edge, 0, sizeof (reloc_deps_e));
1197 tgt_edge->src = src_sec;
1198 tgt_edge->tgt = tgt_sec;
1199 tgt_edge->next = tgt_sec_deps->preds;
1200 tgt_sec_deps->preds = tgt_edge;
1205 build_deps_graph_callback (asection *src_sec,
1206 bfd_vma src_offset ATTRIBUTE_UNUSED,
1207 asection *target_sec,
1208 bfd_vma target_offset ATTRIBUTE_UNUSED,
1211 reloc_deps_graph *deps = closure;
1213 /* If the target is defined. */
1214 if (target_sec != NULL)
1215 add_deps_edge (deps, src_sec, target_sec);
1219 static reloc_deps_graph *
1220 ld_build_required_section_dependence (lang_statement_union_type *s)
1222 reloc_deps_graph *deps;
1223 xtensa_ld_iter_stack *stack = NULL;
1225 deps = xmalloc (sizeof (reloc_deps_graph));
1226 deps->sections = NULL;
1230 for (iter_stack_create (&stack, s);
1231 !iter_stack_empty (&stack);
1232 iter_stack_next (&stack))
1234 lang_statement_union_type *l = iter_stack_current (&stack);
1236 if (l == NULL && link_info.non_contiguous_regions)
1237 einfo (_("%F%P: Relaxation not supported with "
1238 "--enable-non-contiguous-regions.\n"));
1240 if (l->header.type == lang_input_section_enum)
1242 lang_input_section_type *input;
1243 input = &l->input_section;
1244 xtensa_callback_required_dependence (input->section->owner,
1247 /* Use the same closure. */
1248 build_deps_graph_callback,
1256 #if EXTRA_VALIDATION
1258 ld_count_children (lang_statement_union_type *s)
1261 xtensa_ld_iter_stack *stack = NULL;
1262 for (iter_stack_create (&stack, s);
1263 !iter_stack_empty (&stack);
1264 iter_stack_next (&stack))
1266 lang_statement_union_type *l = iter_stack_current (&stack);
1272 #endif /* EXTRA_VALIDATION */
1275 /* Check if a particular section is included in the link. This will only
1276 be true for one instance of a particular linkonce section. */
1278 static bool input_section_found = false;
1279 static asection *input_section_target = NULL;
1282 input_section_linked_worker (lang_statement_union_type *statement)
1284 if ((statement->header.type == lang_input_section_enum
1285 && (statement->input_section.section == input_section_target)))
1286 input_section_found = true;
1290 input_section_linked (asection *sec)
1292 input_section_found = false;
1293 input_section_target = sec;
1294 lang_for_each_statement_worker (input_section_linked_worker, stat_ptr->head);
1295 return input_section_found;
1299 /* Strip out any linkonce property tables or XCC exception tables where the
1300 associated linkonce text is from a different object file. Normally,
1301 a matching set of linkonce sections is taken from the same object file,
1302 but sometimes the files are compiled differently so that some of the
1303 linkonce sections are not present in all files. Stripping the
1304 inconsistent sections like this is not completely robust -- a much
1305 better solution is to use comdat groups. */
1307 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
1310 is_inconsistent_linkonce_section (asection *sec)
1312 bfd *abfd = sec->owner;
1313 const char *sec_name = bfd_section_name (sec);
1316 if ((bfd_section_flags (sec) & SEC_LINK_ONCE) == 0
1317 || strncmp (sec_name, ".gnu.linkonce.", linkonce_len) != 0)
1320 /* Check if this is an Xtensa property section or an exception table
1321 for Tensilica's XCC compiler. */
1322 name = sec_name + linkonce_len;
1323 if (startswith (name, "prop."))
1324 name = strchr (name + 5, '.') ? strchr (name + 5, '.') + 1 : name + 5;
1325 else if (name[1] == '.'
1326 && (name[0] == 'p' || name[0] == 'e' || name[0] == 'h'))
1333 char *dep_sec_name = xmalloc (strlen (sec_name) + 1);
1336 /* Get the associated linkonce text section and check if it is
1337 included in the link. If not, this section is inconsistent
1338 and should be stripped. */
1339 strcpy (dep_sec_name, ".gnu.linkonce.t.");
1340 strcat (dep_sec_name, name);
1341 dep_sec = bfd_get_section_by_name (abfd, dep_sec_name);
1342 if (dep_sec == NULL || ! input_section_linked (dep_sec))
1344 free (dep_sec_name);
1347 free (dep_sec_name);
1355 xtensa_strip_inconsistent_linkonce_sections (lang_statement_list_type *slist)
1357 lang_statement_union_type **s_p = &slist->head;
1360 lang_statement_union_type *s = *s_p;
1361 lang_statement_union_type *s_next = (*s_p)->header.next;
1363 switch (s->header.type)
1365 case lang_input_section_enum:
1366 if (is_inconsistent_linkonce_section (s->input_section.section))
1368 s->input_section.section->output_section = bfd_abs_section_ptr;
1374 case lang_constructors_statement_enum:
1375 xtensa_strip_inconsistent_linkonce_sections (&constructor_list);
1378 case lang_output_section_statement_enum:
1379 if (s->output_section_statement.children.head)
1380 xtensa_strip_inconsistent_linkonce_sections
1381 (&s->output_section_statement.children);
1384 case lang_wild_statement_enum:
1385 xtensa_strip_inconsistent_linkonce_sections
1386 (&s->wild_statement.children);
1389 case lang_group_statement_enum:
1390 xtensa_strip_inconsistent_linkonce_sections
1391 (&s->group_statement.children);
1394 case lang_data_statement_enum:
1395 case lang_reloc_statement_enum:
1396 case lang_object_symbols_statement_enum:
1397 case lang_output_statement_enum:
1398 case lang_target_statement_enum:
1399 case lang_input_statement_enum:
1400 case lang_assignment_statement_enum:
1401 case lang_padding_statement_enum:
1402 case lang_address_statement_enum:
1403 case lang_fill_statement_enum:
1411 s_p = &(*s_p)->header.next;
1414 /* Reset the tail of the list, in case the last entry was removed. */
1415 if (s_p != slist->tail)
1421 xtensa_wild_group_interleave_callback (lang_statement_union_type *statement)
1423 lang_wild_statement_type *w;
1424 reloc_deps_graph *deps;
1425 if (statement->header.type == lang_wild_statement_enum)
1427 #if EXTRA_VALIDATION
1428 size_t old_child_count;
1429 size_t new_child_count;
1433 w = &statement->wild_statement;
1437 /* If it has 0 or 1 section bound, then do not reorder. */
1438 if (w->children.head == NULL
1439 || (w->children.head->header.type == lang_input_section_enum
1440 && w->children.head->header.next == NULL))
1443 if (w->filenames_sorted)
1446 /* Check for sorting in a section list wildcard spec as well. */
1449 struct wildcard_list *l;
1450 for (l = w->section_list; l != NULL; l = l->next)
1452 if (l->spec.sorted == by_name)
1460 /* Special case until the NOREORDER linker directive is supported:
1461 *(.init) output sections and *(.fini) specs may NOT be reordered. */
1463 /* Check for sorting in a section list wildcard spec as well. */
1466 struct wildcard_list *l;
1467 for (l = w->section_list; l != NULL; l = l->next)
1470 && ((strcmp (".init", l->spec.name) == 0)
1471 || (strcmp (".fini", l->spec.name) == 0)))
1479 #if EXTRA_VALIDATION
1480 old_child_count = ld_count_children (statement);
1483 /* It is now officially a target. Build the graph of source
1484 section -> target section (kept as a list of edges). */
1485 deps = ld_build_required_section_dependence (statement);
1487 /* If this wildcard does not reorder.... */
1488 if (!no_reorder && deps->count != 0)
1490 /* First check for reverse dependences. Fix if possible. */
1491 xtensa_layout_wild (deps, w);
1493 xtensa_move_dependencies_to_front (deps, w);
1494 #if EXTRA_VALIDATION
1495 new_child_count = ld_count_children (statement);
1496 ASSERT (new_child_count == old_child_count);
1499 xtensa_colocate_literals (deps, statement);
1501 #if EXTRA_VALIDATION
1502 new_child_count = ld_count_children (statement);
1503 ASSERT (new_child_count == old_child_count);
1508 free_reloc_deps_graph (deps);
1514 xtensa_wild_group_interleave (lang_statement_union_type *s)
1516 lang_for_each_statement_worker (xtensa_wild_group_interleave_callback, s);
1521 xtensa_layout_wild (const reloc_deps_graph *deps, lang_wild_statement_type *w)
1523 /* If it does not fit initially, we need to do this step. Move all
1524 of the wild literal sections to a new list, then move each of
1525 them back in just before the first section they depend on. */
1526 lang_statement_union_type **s_p;
1527 #if EXTRA_VALIDATION
1528 size_t old_count, new_count;
1532 lang_wild_statement_type literal_wild;
1533 literal_wild.header.next = NULL;
1534 literal_wild.header.type = lang_wild_statement_enum;
1535 literal_wild.filename = NULL;
1536 literal_wild.filenames_sorted = false;
1537 literal_wild.section_list = NULL;
1538 literal_wild.keep_sections = false;
1539 literal_wild.children.head = NULL;
1540 literal_wild.children.tail = &literal_wild.children.head;
1542 #if EXTRA_VALIDATION
1543 old_count = ld_count_children ((lang_statement_union_type*) w);
1546 s_p = &w->children.head;
1547 while (*s_p != NULL)
1549 lang_statement_union_type *l = *s_p;
1550 if (l->header.type == lang_input_section_enum)
1552 if (section_is_target (deps, l)
1553 && ! section_is_source (deps, l))
1556 *s_p = l->header.next;
1558 w->children.tail = s_p;
1559 l->header.next = NULL;
1562 *literal_wild.children.tail = l;
1563 literal_wild.children.tail = &l->header.next;
1567 s_p = &(*s_p)->header.next;
1570 #if EXTRA_VALIDATION
1571 ct1 = ld_count_children ((lang_statement_union_type*) w);
1572 ct2 = ld_count_children ((lang_statement_union_type*) &literal_wild);
1574 ASSERT (old_count == (ct1 + ct2));
1577 /* Now place them back in front of their dependent sections. */
1579 while (literal_wild.children.head != NULL)
1581 lang_statement_union_type *lit = literal_wild.children.head;
1582 bool placed = false;
1584 #if EXTRA_VALIDATION
1590 literal_wild.children.head = lit->header.next;
1591 if (literal_wild.children.head == NULL)
1592 literal_wild.children.tail = &literal_wild.children.head;
1593 lit->header.next = NULL;
1595 /* Find a spot to place it. */
1596 for (s_p = &w->children.head; *s_p != NULL; s_p = &(*s_p)->header.next)
1598 lang_statement_union_type *src = *s_p;
1599 if (deps_has_edge (deps, src, lit))
1601 /* Place it here. */
1602 lit->header.next = *s_p;
1611 /* Put it at the end. */
1612 *w->children.tail = lit;
1613 w->children.tail = &lit->header.next;
1617 #if EXTRA_VALIDATION
1618 new_count = ld_count_children ((lang_statement_union_type*) w);
1619 ASSERT (new_count == old_count);
1625 xtensa_colocate_output_literals_callback (lang_statement_union_type *statement)
1627 reloc_deps_graph *deps;
1628 if (statement->header.type == lang_output_section_statement_enum)
1630 /* Now, we walk over the contours of the output section statement.
1632 First we build the literal section dependences as before.
1634 At the first uniquely_literal section, we mark it as a good
1635 spot to place other literals. Continue walking (and counting
1636 sizes) until we find the next literal section. If this
1637 section can be moved to the first one, then we move it. If
1638 we every find a modification of ".", start over. If we find
1639 a labeling of the current location, start over. Finally, at
1640 the end, if we require page alignment, add page alignments. */
1642 #if EXTRA_VALIDATION
1643 size_t old_child_count;
1644 size_t new_child_count;
1646 bool no_reorder = false;
1648 #if EXTRA_VALIDATION
1649 old_child_count = ld_count_children (statement);
1652 /* It is now officially a target. Build the graph of source
1653 section -> target section (kept as a list of edges). */
1655 deps = ld_build_required_section_dependence (statement);
1657 /* If this wildcard does not reorder.... */
1660 /* First check for reverse dependences. Fix if possible. */
1661 xtensa_colocate_literals (deps, statement);
1663 #if EXTRA_VALIDATION
1664 new_child_count = ld_count_children (statement);
1665 ASSERT (new_child_count == old_child_count);
1669 /* Insert align/offset assignment statement. */
1670 if (xtensa_use_literal_pages)
1672 ld_xtensa_insert_page_offsets (0, statement, deps,
1673 xtensa_use_literal_pages);
1674 lang_for_each_statement_worker (xtensa_ldlang_clear_addresses,
1679 free_reloc_deps_graph (deps);
1685 xtensa_colocate_output_literals (lang_statement_union_type *s)
1687 lang_for_each_statement_worker (xtensa_colocate_output_literals_callback, s);
1692 xtensa_ldlang_clear_addresses (lang_statement_union_type *statement)
1694 switch (statement->header.type)
1696 case lang_input_section_enum:
1698 asection *bfd_section = statement->input_section.section;
1699 bfd_section->output_offset = 0;
1709 ld_assign_relative_paged_dot (bfd_vma dot,
1710 lang_statement_union_type *s,
1711 const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
1714 /* Walk through all of the input statements in this wild statement
1715 assign dot to all of them. */
1717 xtensa_ld_iter_stack *stack = NULL;
1718 xtensa_ld_iter_stack **stack_p = &stack;
1720 bool first_section = false;
1721 bool in_literals = false;
1723 for (iter_stack_create (stack_p, s);
1724 !iter_stack_empty (stack_p);
1725 iter_stack_next (stack_p))
1727 lang_statement_union_type *l = iter_stack_current (stack_p);
1729 switch (l->header.type)
1731 case lang_input_section_enum:
1733 asection *section = l->input_section.section;
1734 size_t align_pow = section->alignment_power;
1735 bool do_xtensa_alignment = false;
1739 bool sec_is_target = section_is_target (deps, l);
1740 bool sec_is_source = section_is_source (deps, l);
1742 if (section->size != 0
1744 || (in_literals && !sec_is_target)
1745 || (!in_literals && sec_is_target)))
1747 do_xtensa_alignment = true;
1749 first_section = false;
1750 if (section->size != 0)
1751 in_literals = (sec_is_target && !sec_is_source);
1754 if (do_xtensa_alignment && xtensa_page_power != 0)
1755 dot += (1 << xtensa_page_power);
1757 dot = align_power (dot, align_pow);
1758 section->output_offset = dot;
1759 dot += section->size;
1762 case lang_fill_statement_enum:
1763 dot += l->fill_statement.size;
1765 case lang_padding_statement_enum:
1766 dot += l->padding_statement.size;
1777 ld_local_file_relocations_fit (lang_statement_union_type *statement,
1778 const reloc_deps_graph *deps ATTRIBUTE_UNUSED)
1780 /* Walk over all of the dependencies that we identified and make
1781 sure that IF the source and target are here (addr != 0):
1782 1) target addr < source addr
1783 2) (roundup(source + source_size, 4) - rounddown(target, 4))
1784 < (256K - (1 << bad align))
1785 Need a worst-case proof.... */
1787 xtensa_ld_iter_stack *stack = NULL;
1788 xtensa_ld_iter_stack **stack_p = &stack;
1789 size_t max_align_power = 0;
1790 size_t align_penalty = 256;
1794 /* Find the worst-case alignment requirement for this set of statements. */
1795 for (iter_stack_create (stack_p, statement);
1796 !iter_stack_empty (stack_p);
1797 iter_stack_next (stack_p))
1799 lang_statement_union_type *l = iter_stack_current (stack_p);
1800 if (l->header.type == lang_input_section_enum)
1802 lang_input_section_type *input = &l->input_section;
1803 asection *section = input->section;
1804 if (section->alignment_power > max_align_power)
1805 max_align_power = section->alignment_power;
1809 /* Now check that everything fits. */
1810 for (i = 0; i < deps->count; i++)
1812 asection *sec = deps->sections[i];
1813 const reloc_deps_section *deps_section =
1814 xtensa_get_section_deps (deps, sec);
1817 /* We choose to walk through the successors. */
1818 for (e = deps_section->succs; e != NULL; e = e->next)
1820 if (e->src != e->tgt
1821 && e->src->output_section == e->tgt->output_section
1822 && e->src->output_offset != 0
1823 && e->tgt->output_offset != 0)
1826 align_power (e->src->output_offset + e->src->size, 2);
1827 bfd_vma target_addr = e->tgt->output_offset & ~3;
1828 if (l32r_addr < target_addr)
1831 fprintf (stderr, "Warning: "
1832 "l32r target section before l32r\n");
1837 if (l32r_addr - target_addr > 256 * 1024 - align_penalty)
1849 ld_xtensa_insert_page_offsets (bfd_vma dot,
1850 lang_statement_union_type *s,
1851 reloc_deps_graph *deps,
1854 xtensa_ld_iter_stack *stack = NULL;
1855 xtensa_ld_iter_stack **stack_p = &stack;
1857 bool first_section = false;
1858 bool in_literals = false;
1863 for (iter_stack_create (stack_p, s);
1864 !iter_stack_empty (stack_p);
1865 iter_stack_next (stack_p))
1867 lang_statement_union_type *l = iter_stack_current (stack_p);
1869 switch (l->header.type)
1871 case lang_input_section_enum:
1873 asection *section = l->input_section.section;
1874 bool do_xtensa_alignment = false;
1878 if (section->size != 0
1880 || (in_literals && !section_is_target (deps, l))
1881 || (!in_literals && section_is_target (deps, l))))
1883 do_xtensa_alignment = true;
1885 first_section = false;
1886 if (section->size != 0)
1888 in_literals = (section_is_target (deps, l)
1889 && !section_is_source (deps, l));
1893 if (do_xtensa_alignment && xtensa_page_power != 0)
1895 /* Create an expression that increments the current address,
1896 i.e., "dot", by (1 << xtensa_align_power). */
1897 etree_type *name_op = exp_nameop (NAME, ".");
1898 etree_type *addend_op = exp_intop (1 << xtensa_page_power);
1899 etree_type *add_op = exp_binop ('+', name_op, addend_op);
1900 etree_type *assign_op = exp_assign (".", add_op, false);
1902 lang_assignment_statement_type *assign_stmt;
1903 lang_statement_union_type *assign_union;
1904 lang_statement_list_type tmplist;
1906 /* There is hidden state in "lang_add_assignment". It
1907 appends the new assignment statement to the stat_ptr
1908 list. Thus, we swap it before and after the call. */
1910 lang_list_init (&tmplist);
1911 push_stat_ptr (&tmplist);
1912 /* Warning: side effect; statement appended to stat_ptr. */
1913 assign_stmt = lang_add_assignment (assign_op);
1914 assign_union = (lang_statement_union_type *) assign_stmt;
1917 assign_union->header.next = l;
1918 *(*stack_p)->iterloc.loc = assign_union;
1919 iter_stack_next (stack_p);
1932 # Define some shell vars to insert bits of code into the standard ELF
1933 # parse_args and list_options functions.
1935 PARSE_AND_LIST_PROLOGUE='
1936 #define OPTION_OPT_SIZEOPT (300)
1937 #define OPTION_LITERAL_MOVEMENT (OPTION_OPT_SIZEOPT + 1)
1938 #define OPTION_NO_LITERAL_MOVEMENT (OPTION_LITERAL_MOVEMENT + 1)
1939 #define OPTION_ABI_WINDOWED (OPTION_NO_LITERAL_MOVEMENT + 1)
1940 #define OPTION_ABI_CALL0 (OPTION_ABI_WINDOWED + 1)
1941 extern int elf32xtensa_size_opt;
1942 extern int elf32xtensa_no_literal_movement;
1943 extern int elf32xtensa_abi;
1946 PARSE_AND_LIST_LONGOPTS='
1947 { "size-opt", no_argument, NULL, OPTION_OPT_SIZEOPT},
1948 { "literal-movement", no_argument, NULL, OPTION_LITERAL_MOVEMENT},
1949 { "no-literal-movement", no_argument, NULL, OPTION_NO_LITERAL_MOVEMENT},
1950 { "abi-windowed", no_argument, NULL, OPTION_ABI_WINDOWED},
1951 { "abi-call0", no_argument, NULL, OPTION_ABI_CALL0},
1954 PARSE_AND_LIST_OPTIONS='
1956 --size-opt When relaxing longcalls, prefer size\n\
1957 optimization over branch target alignment\n"));
1959 --abi-windowed Choose windowed ABI for the output object\n"));
1961 --abi-call0 Choose call0 ABI for the output object\n"));
1964 PARSE_AND_LIST_ARGS_CASES='
1965 case OPTION_OPT_SIZEOPT:
1966 elf32xtensa_size_opt = 1;
1968 case OPTION_LITERAL_MOVEMENT:
1969 elf32xtensa_no_literal_movement = 0;
1971 case OPTION_NO_LITERAL_MOVEMENT:
1972 elf32xtensa_no_literal_movement = 1;
1974 case OPTION_ABI_WINDOWED:
1975 elf32xtensa_abi = XTHAL_ABI_WINDOWED;
1977 case OPTION_ABI_CALL0:
1978 elf32xtensa_abi = XTHAL_ABI_CALL0;
1982 # Replace some of the standard ELF functions with our own versions.
1984 LDEMUL_BEFORE_PARSE=elf_xtensa_before_parse
1985 LDEMUL_AFTER_OPEN=elf_xtensa_after_open
1986 LDEMUL_CHOOSE_TARGET=elf_xtensa_choose_target
1987 LDEMUL_BEFORE_ALLOCATION=elf_xtensa_before_allocation