1 # This shell script emits a C file. -*- C -*-
2 # Copyright (C) 2003-2024 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-dynconfig.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 static void xtensa_wild_group_interleave (lang_statement_union_type *);
38 static void xtensa_colocate_output_literals (lang_statement_union_type *);
39 static void xtensa_strip_inconsistent_linkonce_sections
40 (lang_statement_list_type *);
42 extern int elf32xtensa_size_opt;
43 extern int elf32xtensa_no_literal_movement;
44 extern int elf32xtensa_abi;
46 /* This number is irrelevant until we turn on use_literal_pages */
47 static bfd_vma xtensa_page_power = 12; /* 4K pages. */
49 /* To force a page break between literals and text, change
50 xtensa_use_literal_pages to "true". */
51 static bool xtensa_use_literal_pages = false;
53 #define EXTRA_VALIDATION 0
56 This option is defined in BDF library. */
57 extern int elf32xtensa_abi;
61 elf_xtensa_choose_target (int argc ATTRIBUTE_UNUSED,
62 char **argv ATTRIBUTE_UNUSED)
65 return "${BIG_OUTPUT_FORMAT}";
67 return "${LITTLE_OUTPUT_FORMAT}";
72 elf_xtensa_before_parse (void)
74 /* Just call the default hook.... Tensilica's version of this function
75 does some other work that isn't relevant here. */
76 gld${EMULATION_NAME}_before_parse ();
81 remove_section (bfd *abfd, asection *os)
84 for (spp = &abfd->sections; *spp; spp = &(*spp)->next)
88 os->owner->section_count--;
95 replace_insn_sec_with_prop_sec (bfd *abfd,
96 const char *insn_sec_name,
97 const char *prop_sec_name,
102 bfd_byte *prop_contents = NULL;
103 bfd_byte *insn_contents = NULL;
104 unsigned entry_count;
106 Elf_Internal_Shdr *rel_hdr;
107 Elf_Internal_Rela *internal_relocs = NULL;
108 unsigned reloc_count;
111 insn_sec = bfd_get_section_by_name (abfd, insn_sec_name);
112 if (insn_sec == NULL)
114 entry_count = insn_sec->size / 8;
116 prop_sec = bfd_get_section_by_name (abfd, prop_sec_name);
117 if (prop_sec != NULL && insn_sec != NULL)
119 *error_message = _("file already has property tables");
123 if (insn_sec->size != 0)
125 insn_contents = (bfd_byte *) xmalloc (insn_sec->size);
126 if (! bfd_get_section_contents (abfd, insn_sec, insn_contents,
127 (file_ptr) 0, insn_sec->size))
129 *error_message = _("failed to read section contents");
134 /* Create a property table section for it. */
135 prop_sec_name = strdup (prop_sec_name);
136 prop_sec = bfd_make_section_with_flags
137 (abfd, prop_sec_name, bfd_section_flags (insn_sec));
139 || !bfd_set_section_alignment (prop_sec, 2))
141 *error_message = _("could not create new section");
145 prop_sec->size = entry_count * 12;
146 prop_contents = (bfd_byte *) bfd_zalloc (abfd, prop_sec->size);
147 elf_section_data (prop_sec)->this_hdr.contents = prop_contents;
149 /* The entry size and size must be set to allow the linker to compute
150 the number of relocations since it does not use reloc_count. */
151 rel_hdr = _bfd_elf_single_rel_hdr (prop_sec);
152 rel_hdr->sh_entsize = sizeof (Elf32_External_Rela);
153 rel_hdr->sh_size = _bfd_elf_single_rel_hdr (insn_sec)->sh_size;
155 if (prop_contents == NULL && prop_sec->size != 0)
157 *error_message = _("could not allocate section contents");
161 /* Read the relocations. */
162 reloc_count = insn_sec->reloc_count;
163 if (reloc_count != 0)
165 /* If there is already an internal_reloc, then save it so that the
166 read_relocs function freshly allocates a copy. */
167 Elf_Internal_Rela *saved_relocs = elf_section_data (insn_sec)->relocs;
169 elf_section_data (insn_sec)->relocs = NULL;
171 _bfd_elf_link_read_relocs (abfd, insn_sec, NULL, NULL, false);
172 elf_section_data (insn_sec)->relocs = saved_relocs;
174 if (internal_relocs == NULL)
176 *error_message = _("out of memory");
181 /* Create a relocation section for the property section. */
182 if (internal_relocs != NULL)
184 elf_section_data (prop_sec)->relocs = internal_relocs;
185 prop_sec->reloc_count = reloc_count;
188 /* Now copy each insn table entry to the prop table entry with
189 appropriate flags. */
190 for (entry = 0; entry < entry_count; ++entry)
193 unsigned flags = (XTENSA_PROP_INSN | XTENSA_PROP_NO_TRANSFORM
194 | XTENSA_PROP_INSN_NO_REORDER);
195 value = bfd_get_32 (abfd, insn_contents + entry * 8 + 0);
196 bfd_put_32 (abfd, value, prop_contents + entry * 12 + 0);
197 value = bfd_get_32 (abfd, insn_contents + entry * 8 + 4);
198 bfd_put_32 (abfd, value, prop_contents + entry * 12 + 4);
199 bfd_put_32 (abfd, flags, prop_contents + entry * 12 + 8);
202 /* Now copy all of the relocations. Change offsets for the
203 instruction table section to offsets in the property table
209 for (i = 0; i < reloc_count; i++)
211 Elf_Internal_Rela *rela;
214 rela = &internal_relocs[i];
216 /* If this relocation is to the .xt.insn section,
217 change the section number and the offset. */
218 r_offset = rela->r_offset;
219 r_offset += 4 * (r_offset / 8);
220 rela->r_offset = r_offset;
224 remove_section (abfd, insn_sec);
226 free (insn_contents);
231 if (prop_sec && prop_sec->owner)
232 remove_section (abfd, prop_sec);
233 free (insn_contents);
234 free (internal_relocs);
240 #define PROP_SEC_BASE_NAME ".xt.prop"
241 #define INSN_SEC_BASE_NAME ".xt.insn"
242 #define LINKONCE_SEC_OLD_TEXT_BASE_NAME ".gnu.linkonce.x."
246 replace_instruction_table_sections (bfd *abfd, asection *sec)
249 const char *insn_sec_name = NULL;
250 char *prop_sec_name = NULL;
251 char *owned_prop_sec_name = NULL;
252 const char *sec_name;
254 sec_name = bfd_section_name (sec);
255 if (strcmp (sec_name, INSN_SEC_BASE_NAME) == 0)
257 insn_sec_name = INSN_SEC_BASE_NAME;
258 prop_sec_name = PROP_SEC_BASE_NAME;
260 else if (startswith (sec_name, LINKONCE_SEC_OLD_TEXT_BASE_NAME))
262 insn_sec_name = sec_name;
263 owned_prop_sec_name = (char *) xmalloc (strlen (sec_name) + 20);
264 prop_sec_name = owned_prop_sec_name;
265 strcpy (prop_sec_name, ".gnu.linkonce.prop.t.");
266 strcat (prop_sec_name,
267 sec_name + strlen (LINKONCE_SEC_OLD_TEXT_BASE_NAME));
269 if (insn_sec_name != NULL)
271 if (! replace_insn_sec_with_prop_sec (abfd, insn_sec_name, prop_sec_name,
274 einfo (_("%P: warning: failed to convert %s table in %pB (%s); subsequent disassembly may be incomplete\n"),
275 insn_sec_name, abfd, message);
278 free (owned_prop_sec_name);
282 /* This is called after all input sections have been opened to convert
283 instruction tables (.xt.insn, gnu.linkonce.x.*) tables into property
284 tables (.xt.prop) before any section placement. */
287 elf_xtensa_after_open (void)
289 /* First call the ELF version. */
290 gld${EMULATION_NAME}_after_open ();
292 /* Now search the input files looking for instruction table sections. */
293 LANG_FOR_EACH_INPUT_STATEMENT (f)
295 asection *sec = f->the_bfd->sections;
298 /* Do not use bfd_map_over_sections here since we are removing
299 sections as we iterate. */
302 next_sec = sec->next;
303 replace_instruction_table_sections (f->the_bfd, sec);
311 xt_config_info_unpack_and_check (char *data,
328 /* Overwrite the equal sign. */
331 /* Check if this is a quoted string or a number. */
334 /* No string values are currently checked by LD;
335 just skip over the quotes. */
340 /* Overwrite the trailing quote. */
347 num = strtoul (d, &d, 0);
349 if (! strcmp (key, "ABI"))
351 if (elf32xtensa_abi == XTHAL_ABI_UNDEFINED)
353 elf32xtensa_abi = num;
355 else if (num != elf32xtensa_abi)
358 *pmsg = "ABI does not match";
361 else if (! strcmp (key, "USE_ABSOLUTE_LITERALS"))
363 if (num != XSHAL_USE_ABSOLUTE_LITERALS)
366 *pmsg = "incompatible use of the Extended L32R option";
382 #define XTINFO_NAME "Xtensa_Info"
383 #define XTINFO_NAMESZ 12
384 #define XTINFO_TYPE 1
387 check_xtensa_info (bfd *abfd, asection *info_sec)
389 char *data, *errmsg = "";
392 data = xmalloc (info_sec->size);
393 if (! bfd_get_section_contents (abfd, info_sec, data, 0, info_sec->size))
394 einfo (_("%F%P: %pB: cannot read contents of section %pA\n"), abfd, info_sec);
396 if (info_sec->size > 24
397 && info_sec->size >= 24 + bfd_get_32 (abfd, data + 4)
398 && bfd_get_32 (abfd, data + 0) == XTINFO_NAMESZ
399 && bfd_get_32 (abfd, data + 8) == XTINFO_TYPE
400 && strcmp (data + 12, XTINFO_NAME) == 0
401 && xt_config_info_unpack_and_check (data + 12 + XTINFO_NAMESZ,
405 einfo (_("%P: %pB: warning: incompatible Xtensa configuration (%s)\n"),
409 einfo (_("%P: %pB: warning: cannot parse .xtensa.info section\n"), abfd);
415 /* This is called after the sections have been attached to output
416 sections, but before any sizes or addresses have been set. */
419 elf_xtensa_before_allocation (void)
421 asection *info_sec, *first_info_sec;
423 bool is_big_endian = XCHAL_HAVE_BE;
425 /* Check that the output endianness matches the Xtensa
426 configuration. The BFD library always includes both big and
427 little endian target vectors for Xtensa, but it only supports the
428 detailed instruction encode/decode operations (such as are
429 required to process relocations) for the selected Xtensa
433 && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
435 einfo (_("%F%P: little endian output does not match "
436 "Xtensa configuration\n"));
439 && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_BIG)
441 einfo (_("%F%P: big endian output does not match "
442 "Xtensa configuration\n"));
445 /* Keep track of the first input .xtensa.info section, and as a fallback,
446 the first input bfd where a .xtensa.info section could be created.
447 After the input .xtensa.info has been checked, the contents of the
448 first one will be replaced with the output .xtensa.info table. */
452 LANG_FOR_EACH_INPUT_STATEMENT (f)
454 /* Check that the endianness for each input file matches the output.
455 The merge_private_bfd_data hook has already reported any mismatches
456 as errors, but those errors are not fatal. At this point, we
457 cannot go any further if there are any mismatches. */
458 if ((is_big_endian && f->the_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
459 || (!is_big_endian && f->the_bfd->xvec->byteorder == BFD_ENDIAN_BIG))
460 einfo (_("%F%P: cross-endian linking for %pB not supported\n"),
464 first_bfd = f->the_bfd;
466 info_sec = bfd_get_section_by_name (f->the_bfd, ".xtensa.info");
470 if (! first_info_sec)
471 first_info_sec = info_sec;
473 /* Unpack the .xtensa.info section and check it against the current
474 Xtensa configuration. */
475 check_xtensa_info (f->the_bfd, info_sec);
477 /* Do not include this copy of .xtensa.info in the output. */
479 info_sec->flags |= SEC_EXCLUDE;
482 /* Reuse the first .xtensa.info input section to hold the output
483 .xtensa.info; or, if none were found, create a new section in the
484 first input bfd (assuming there is one). */
485 info_sec = first_info_sec;
486 if (! info_sec && first_bfd)
488 info_sec = bfd_make_section_with_flags (first_bfd, ".xtensa.info",
489 SEC_HAS_CONTENTS | SEC_READONLY);
491 einfo (_("%F%P: failed to create .xtensa.info section\n"));
495 int xtensa_info_size;
498 info_sec->flags &= ~SEC_EXCLUDE;
499 info_sec->flags |= SEC_IN_MEMORY;
502 = 1 + sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
503 XSHAL_USE_ABSOLUTE_LITERALS, xtensa_abi_choice ());
505 /* Add enough null terminators to pad to a word boundary. */
507 data[xtensa_info_size++] = 0;
508 while ((xtensa_info_size & 3) != 0);
510 info_sec->size = 12 + XTINFO_NAMESZ + xtensa_info_size;
511 info_sec->contents = xmalloc (info_sec->size);
512 bfd_put_32 (info_sec->owner, XTINFO_NAMESZ, info_sec->contents + 0);
513 bfd_put_32 (info_sec->owner, xtensa_info_size, info_sec->contents + 4);
514 bfd_put_32 (info_sec->owner, XTINFO_TYPE, info_sec->contents + 8);
515 memcpy (info_sec->contents + 12, XTINFO_NAME, XTINFO_NAMESZ);
516 memcpy (info_sec->contents + 12 + XTINFO_NAMESZ, data, xtensa_info_size);
519 /* Enable relaxation by default if the "--no-relax" option was not
520 specified. This is done here instead of in the before_parse hook
521 because there is a check in main() to prohibit use of --relax and
522 -r together and that combination should be allowed for Xtensa. */
523 if (RELAXATION_DISABLED_BY_DEFAULT)
526 xtensa_strip_inconsistent_linkonce_sections (stat_ptr);
528 gld${EMULATION_NAME}_before_allocation ();
530 xtensa_wild_group_interleave (stat_ptr->head);
532 if (RELAXATION_ENABLED)
533 xtensa_colocate_output_literals (stat_ptr->head);
535 /* TBD: We need to force the page alignments to here and only do
536 them as needed for the entire output section. Finally, if this
537 is a relocatable link then we need to add alignment notes so
538 that the literals can be separated later. */
542 typedef struct wildcard_list section_name_list;
544 typedef struct reloc_deps_e_t reloc_deps_e;
545 typedef struct reloc_deps_section_t reloc_deps_section;
546 typedef struct reloc_deps_graph_t reloc_deps_graph;
549 struct reloc_deps_e_t
551 asection *src; /* Contains l32rs. */
552 asection *tgt; /* Contains literals. */
556 /* Place these in the userdata field. */
557 struct reloc_deps_section_t
561 bool is_only_literal;
565 struct reloc_deps_graph_t
572 static void xtensa_layout_wild
573 (const reloc_deps_graph *, lang_wild_statement_type *);
575 typedef void (*deps_callback_t) (asection *, /* src_sec */
576 bfd_vma, /* src_offset */
577 asection *, /* target_sec */
578 bfd_vma, /* target_offset */
579 void *); /* closure */
581 extern bool xtensa_callback_required_dependence
582 (bfd *, asection *, struct bfd_link_info *, deps_callback_t, void *);
583 static void xtensa_ldlang_clear_addresses (lang_statement_union_type *);
584 static bool ld_local_file_relocations_fit
585 (lang_statement_union_type *, const reloc_deps_graph *);
586 static bfd_vma ld_assign_relative_paged_dot
587 (bfd_vma, lang_statement_union_type *, const reloc_deps_graph *,
589 static bfd_vma ld_xtensa_insert_page_offsets
590 (bfd_vma, lang_statement_union_type *, reloc_deps_graph *, bool);
592 static size_t ld_count_children (lang_statement_union_type *);
595 extern lang_statement_list_type constructor_list;
597 static reloc_deps_section *
598 xtensa_get_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
601 /* We have a separate function for this so that
602 we could in the future keep a completely independent
603 structure that maps a section to its dependence edges.
604 For now, we place these in the sec->userdata field.
605 This doesn't clash with ldlang.c use of userdata for output
606 sections, and during map output for input sections, since the
607 xtensa use is only for input sections and only extant in
608 before_allocation. */
609 reloc_deps_section *sec_deps = bfd_section_userdata (sec);
614 xtensa_set_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
616 reloc_deps_section *deps_section)
618 bfd_set_section_userdata (sec, deps_section);
622 /* This is used to keep a list of all of the sections participating in
623 the graph so we can clean them up quickly. */
626 xtensa_append_section_deps (reloc_deps_graph *deps, asection *sec)
628 if (deps->size <= deps->count)
630 asection **new_sections;
634 new_size = deps->size * 2;
638 new_sections = xmalloc (sizeof (asection *) * new_size);
639 memset (new_sections, 0, sizeof (asection *) * new_size);
640 for (i = 0; i < deps->count; i++)
642 new_sections[i] = deps->sections[i];
644 free (deps->sections);
645 deps->sections = new_sections;
646 deps->size = new_size;
648 deps->sections[deps->count] = sec;
654 free_reloc_deps_graph (reloc_deps_graph *deps)
657 for (i = 0; i < deps->count; i++)
659 asection *sec = deps->sections[i];
660 reloc_deps_section *sec_deps;
661 sec_deps = xtensa_get_section_deps (deps, sec);
665 while (sec_deps->succs != NULL)
667 next = sec_deps->succs->next;
668 free (sec_deps->succs);
669 sec_deps->succs = next;
672 while (sec_deps->preds != NULL)
674 next = sec_deps->preds->next;
675 free (sec_deps->preds);
676 sec_deps->preds = next;
680 xtensa_set_section_deps (deps, sec, NULL);
682 free (deps->sections);
688 section_is_source (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
689 lang_statement_union_type *s)
692 const reloc_deps_section *sec_deps;
694 if (s->header.type != lang_input_section_enum)
696 sec = s->input_section.section;
698 sec_deps = xtensa_get_section_deps (deps, sec);
699 return sec_deps && sec_deps->succs != NULL;
704 section_is_target (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
705 lang_statement_union_type *s)
708 const reloc_deps_section *sec_deps;
710 if (s->header.type != lang_input_section_enum)
712 sec = s->input_section.section;
714 sec_deps = xtensa_get_section_deps (deps, sec);
715 return sec_deps && sec_deps->preds != NULL;
720 section_is_source_or_target (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
721 lang_statement_union_type *s)
723 return (section_is_source (deps, s)
724 || section_is_target (deps, s));
728 typedef struct xtensa_ld_iter_stack_t xtensa_ld_iter_stack;
729 typedef struct xtensa_ld_iter_t xtensa_ld_iter;
731 struct xtensa_ld_iter_t
733 lang_statement_union_type *parent; /* Parent of the list. */
734 lang_statement_list_type *l; /* List that holds it. */
735 lang_statement_union_type **loc; /* Place in the list. */
738 struct xtensa_ld_iter_stack_t
740 xtensa_ld_iter iterloc; /* List that hold it. */
742 xtensa_ld_iter_stack *next; /* Next in the stack. */
743 xtensa_ld_iter_stack *prev; /* Back pointer for stack. */
748 ld_xtensa_move_section_after (xtensa_ld_iter *to, xtensa_ld_iter *current)
750 lang_statement_union_type *to_next;
751 lang_statement_union_type *current_next;
752 lang_statement_union_type **e;
755 size_t old_to_count, new_to_count;
756 size_t old_current_count, new_current_count;
763 old_to_count = ld_count_children (to->parent);
764 old_current_count = ld_count_children (current->parent);
767 to_next = *(to->loc);
768 current_next = (*current->loc)->header.next;
770 *(to->loc) = *(current->loc);
772 *(current->loc) = current_next;
773 (*(to->loc))->header.next = to_next;
775 /* reset "to" list tail */
776 for (e = &to->l->head; *e != NULL; e = &(*e)->header.next)
780 /* reset "current" list tail */
781 for (e = ¤t->l->head; *e != NULL; e = &(*e)->header.next)
783 current->l->tail = e;
786 new_to_count = ld_count_children (to->parent);
787 new_current_count = ld_count_children (current->parent);
789 ASSERT ((old_to_count + old_current_count)
790 == (new_to_count + new_current_count));
795 /* Can only be called with lang_statements that have lists. Returns
796 FALSE if the list is empty. */
799 iter_stack_empty (xtensa_ld_iter_stack **stack_p)
801 return *stack_p == NULL;
806 iter_stack_push (xtensa_ld_iter_stack **stack_p,
807 lang_statement_union_type *parent)
809 xtensa_ld_iter_stack *stack;
810 lang_statement_list_type *l = NULL;
812 switch (parent->header.type)
814 case lang_output_section_statement_enum:
815 l = &parent->output_section_statement.children;
817 case lang_wild_statement_enum:
818 l = &parent->wild_statement.children;
820 case lang_group_statement_enum:
821 l = &parent->group_statement.children;
828 /* Empty. do not push. */
829 if (l->tail == &l->head)
832 stack = xmalloc (sizeof (xtensa_ld_iter_stack));
833 memset (stack, 0, sizeof (xtensa_ld_iter_stack));
834 stack->iterloc.parent = parent;
835 stack->iterloc.l = l;
836 stack->iterloc.loc = &l->head;
838 stack->next = *stack_p;
840 if (*stack_p != NULL)
841 (*stack_p)->prev = stack;
848 iter_stack_pop (xtensa_ld_iter_stack **stack_p)
850 xtensa_ld_iter_stack *stack;
856 ASSERT (stack != NULL);
860 if (stack->next != NULL)
861 stack->next->prev = NULL;
863 *stack_p = stack->next;
868 /* This MUST be called if, during iteration, the user changes the
869 underlying structure. It will check for a NULL current and advance
873 iter_stack_update (xtensa_ld_iter_stack **stack_p)
875 if (!iter_stack_empty (stack_p)
876 && (*(*stack_p)->iterloc.loc) == NULL)
878 iter_stack_pop (stack_p);
880 while (!iter_stack_empty (stack_p)
881 && ((*(*stack_p)->iterloc.loc)->header.next == NULL))
883 iter_stack_pop (stack_p);
885 if (!iter_stack_empty (stack_p))
886 (*stack_p)->iterloc.loc = &(*(*stack_p)->iterloc.loc)->header.next;
892 iter_stack_next (xtensa_ld_iter_stack **stack_p)
894 xtensa_ld_iter_stack *stack;
895 lang_statement_union_type *current;
898 current = *stack->iterloc.loc;
899 /* If we are on the first element. */
902 switch (current->header.type)
904 case lang_output_section_statement_enum:
905 case lang_wild_statement_enum:
906 case lang_group_statement_enum:
907 /* If the list if not empty, we are done. */
908 if (iter_stack_push (stack_p, *stack->iterloc.loc))
910 /* Otherwise increment the pointer as normal. */
917 while (!iter_stack_empty (stack_p)
918 && ((*(*stack_p)->iterloc.loc)->header.next == NULL))
920 iter_stack_pop (stack_p);
922 if (!iter_stack_empty (stack_p))
923 (*stack_p)->iterloc.loc = &(*(*stack_p)->iterloc.loc)->header.next;
927 static lang_statement_union_type *
928 iter_stack_current (xtensa_ld_iter_stack **stack_p)
930 return *((*stack_p)->iterloc.loc);
934 /* The iter stack is a preorder. */
937 iter_stack_create (xtensa_ld_iter_stack **stack_p,
938 lang_statement_union_type *parent)
940 iter_stack_push (stack_p, parent);
945 iter_stack_copy_current (xtensa_ld_iter_stack **stack_p, xtensa_ld_iter *front)
947 *front = (*stack_p)->iterloc;
952 xtensa_colocate_literals (reloc_deps_graph *deps,
953 lang_statement_union_type *statement)
955 /* Keep a stack of pointers to control iteration through the contours. */
956 xtensa_ld_iter_stack *stack = NULL;
957 xtensa_ld_iter_stack **stack_p = &stack;
959 xtensa_ld_iter front; /* Location where new insertion should occur. */
960 xtensa_ld_iter *front_p = NULL;
962 xtensa_ld_iter current; /* Location we are checking. */
963 xtensa_ld_iter *current_p = NULL;
964 bool in_literals = false;
966 if (deps->count == 0)
969 iter_stack_create (stack_p, statement);
971 while (!iter_stack_empty (stack_p))
973 bool skip_increment = false;
974 lang_statement_union_type *l = iter_stack_current (stack_p);
976 switch (l->header.type)
978 case lang_assignment_statement_enum:
979 /* Any assignment statement should block reordering across it. */
984 case lang_input_section_enum:
987 in_literals = (section_is_target (deps, l)
988 && !section_is_source (deps, l));
992 iter_stack_copy_current (stack_p, front_p);
998 current_p = ¤t;
999 iter_stack_copy_current (stack_p, current_p);
1000 is_target = (section_is_target (deps, l)
1001 && !section_is_source (deps, l));
1005 iter_stack_copy_current (stack_p, front_p);
1007 in_literals = false;
1013 /* Try to insert in place. */
1014 ld_xtensa_move_section_after (front_p, current_p);
1015 ld_assign_relative_paged_dot (0x100000,
1018 xtensa_use_literal_pages);
1020 /* We use this code because it's already written. */
1021 if (!ld_local_file_relocations_fit (statement, deps))
1024 ld_xtensa_move_section_after (current_p, front_p);
1025 /* Reset the literal placement. */
1026 iter_stack_copy_current (stack_p, front_p);
1030 /* Move front pointer up by one. */
1031 front_p->loc = &(*front_p->loc)->header.next;
1033 /* Do not increment the current pointer. */
1034 skip_increment = true;
1044 if (!skip_increment)
1045 iter_stack_next (stack_p);
1047 /* Be careful to update the stack_p if it now is a null. */
1048 iter_stack_update (stack_p);
1051 lang_for_each_statement_worker (xtensa_ldlang_clear_addresses, statement);
1056 xtensa_move_dependencies_to_front (reloc_deps_graph *deps,
1057 lang_wild_statement_type *w)
1059 /* Keep a front pointer and a current pointer. */
1060 lang_statement_union_type **front;
1061 lang_statement_union_type **current;
1063 /* Walk to the end of the targets. */
1064 for (front = &w->children.head;
1065 (*front != NULL) && section_is_source_or_target (deps, *front);
1066 front = &(*front)->header.next)
1072 current = &(*front)->header.next;
1073 while (*current != NULL)
1075 if (section_is_source_or_target (deps, *current))
1077 /* Insert in place. */
1078 xtensa_ld_iter front_iter;
1079 xtensa_ld_iter current_iter;
1081 front_iter.parent = (lang_statement_union_type *) w;
1082 front_iter.l = &w->children;
1083 front_iter.loc = front;
1085 current_iter.parent = (lang_statement_union_type *) w;
1086 current_iter.l = &w->children;
1087 current_iter.loc = current;
1089 ld_xtensa_move_section_after (&front_iter, ¤t_iter);
1090 front = &(*front)->header.next;
1094 current = &(*current)->header.next;
1101 deps_has_sec_edge (const reloc_deps_graph *deps, asection *src, asection *tgt)
1103 const reloc_deps_section *sec_deps;
1104 const reloc_deps_e *sec_deps_e;
1106 sec_deps = xtensa_get_section_deps (deps, src);
1107 if (sec_deps == NULL)
1110 for (sec_deps_e = sec_deps->succs;
1112 sec_deps_e = sec_deps_e->next)
1114 ASSERT (sec_deps_e->src == src);
1115 if (sec_deps_e->tgt == tgt)
1123 deps_has_edge (const reloc_deps_graph *deps,
1124 lang_statement_union_type *src,
1125 lang_statement_union_type *tgt)
1127 if (!section_is_source (deps, src))
1129 if (!section_is_target (deps, tgt))
1132 if (src->header.type != lang_input_section_enum)
1134 if (tgt->header.type != lang_input_section_enum)
1137 return deps_has_sec_edge (deps, src->input_section.section,
1138 tgt->input_section.section);
1143 add_deps_edge (reloc_deps_graph *deps, asection *src_sec, asection *tgt_sec)
1145 reloc_deps_section *src_sec_deps;
1146 reloc_deps_section *tgt_sec_deps;
1148 reloc_deps_e *src_edge;
1149 reloc_deps_e *tgt_edge;
1151 if (deps_has_sec_edge (deps, src_sec, tgt_sec))
1154 src_sec_deps = xtensa_get_section_deps (deps, src_sec);
1155 if (src_sec_deps == NULL)
1157 /* Add a section. */
1158 src_sec_deps = xmalloc (sizeof (reloc_deps_section));
1159 memset (src_sec_deps, 0, sizeof (reloc_deps_section));
1160 src_sec_deps->is_only_literal = 0;
1161 src_sec_deps->preds = NULL;
1162 src_sec_deps->succs = NULL;
1163 xtensa_set_section_deps (deps, src_sec, src_sec_deps);
1164 xtensa_append_section_deps (deps, src_sec);
1167 tgt_sec_deps = xtensa_get_section_deps (deps, tgt_sec);
1168 if (tgt_sec_deps == NULL)
1170 /* Add a section. */
1171 tgt_sec_deps = xmalloc (sizeof (reloc_deps_section));
1172 memset (tgt_sec_deps, 0, sizeof (reloc_deps_section));
1173 tgt_sec_deps->is_only_literal = 0;
1174 tgt_sec_deps->preds = NULL;
1175 tgt_sec_deps->succs = NULL;
1176 xtensa_set_section_deps (deps, tgt_sec, tgt_sec_deps);
1177 xtensa_append_section_deps (deps, tgt_sec);
1180 /* Add the edges. */
1181 src_edge = xmalloc (sizeof (reloc_deps_e));
1182 memset (src_edge, 0, sizeof (reloc_deps_e));
1183 src_edge->src = src_sec;
1184 src_edge->tgt = tgt_sec;
1185 src_edge->next = src_sec_deps->succs;
1186 src_sec_deps->succs = src_edge;
1188 tgt_edge = xmalloc (sizeof (reloc_deps_e));
1189 memset (tgt_edge, 0, sizeof (reloc_deps_e));
1190 tgt_edge->src = src_sec;
1191 tgt_edge->tgt = tgt_sec;
1192 tgt_edge->next = tgt_sec_deps->preds;
1193 tgt_sec_deps->preds = tgt_edge;
1198 build_deps_graph_callback (asection *src_sec,
1199 bfd_vma src_offset ATTRIBUTE_UNUSED,
1200 asection *target_sec,
1201 bfd_vma target_offset ATTRIBUTE_UNUSED,
1204 reloc_deps_graph *deps = closure;
1206 /* If the target is defined. */
1207 if (target_sec != NULL)
1208 add_deps_edge (deps, src_sec, target_sec);
1212 static reloc_deps_graph *
1213 ld_build_required_section_dependence (lang_statement_union_type *s)
1215 reloc_deps_graph *deps;
1216 xtensa_ld_iter_stack *stack = NULL;
1218 deps = xmalloc (sizeof (reloc_deps_graph));
1219 deps->sections = NULL;
1223 for (iter_stack_create (&stack, s);
1224 !iter_stack_empty (&stack);
1225 iter_stack_next (&stack))
1227 lang_statement_union_type *l = iter_stack_current (&stack);
1229 if (l == NULL && link_info.non_contiguous_regions)
1230 einfo (_("%F%P: Relaxation not supported with "
1231 "--enable-non-contiguous-regions.\n"));
1233 if (l->header.type == lang_input_section_enum)
1235 lang_input_section_type *input;
1236 input = &l->input_section;
1237 xtensa_callback_required_dependence (input->section->owner,
1240 /* Use the same closure. */
1241 build_deps_graph_callback,
1249 #if EXTRA_VALIDATION
1251 ld_count_children (lang_statement_union_type *s)
1254 xtensa_ld_iter_stack *stack = NULL;
1255 for (iter_stack_create (&stack, s);
1256 !iter_stack_empty (&stack);
1257 iter_stack_next (&stack))
1259 lang_statement_union_type *l = iter_stack_current (&stack);
1265 #endif /* EXTRA_VALIDATION */
1268 /* Check if a particular section is included in the link. This will only
1269 be true for one instance of a particular linkonce section. */
1271 static bool input_section_found = false;
1272 static asection *input_section_target = NULL;
1275 input_section_linked_worker (lang_statement_union_type *statement)
1277 if ((statement->header.type == lang_input_section_enum
1278 && (statement->input_section.section == input_section_target)))
1279 input_section_found = true;
1283 input_section_linked (asection *sec)
1285 input_section_found = false;
1286 input_section_target = sec;
1287 lang_for_each_statement_worker (input_section_linked_worker, stat_ptr->head);
1288 return input_section_found;
1292 /* Strip out any linkonce property tables or XCC exception tables where the
1293 associated linkonce text is from a different object file. Normally,
1294 a matching set of linkonce sections is taken from the same object file,
1295 but sometimes the files are compiled differently so that some of the
1296 linkonce sections are not present in all files. Stripping the
1297 inconsistent sections like this is not completely robust -- a much
1298 better solution is to use comdat groups. */
1300 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
1303 is_inconsistent_linkonce_section (asection *sec)
1305 bfd *abfd = sec->owner;
1306 const char *sec_name = bfd_section_name (sec);
1309 if ((bfd_section_flags (sec) & SEC_LINK_ONCE) == 0
1310 || strncmp (sec_name, ".gnu.linkonce.", linkonce_len) != 0)
1313 /* Check if this is an Xtensa property section or an exception table
1314 for Tensilica's XCC compiler. */
1315 name = sec_name + linkonce_len;
1316 if (startswith (name, "prop."))
1317 name = strchr (name + 5, '.') ? strchr (name + 5, '.') + 1 : name + 5;
1318 else if (name[1] == '.'
1319 && (name[0] == 'p' || name[0] == 'e' || name[0] == 'h'))
1326 char *dep_sec_name = xmalloc (strlen (sec_name) + 1);
1329 /* Get the associated linkonce text section and check if it is
1330 included in the link. If not, this section is inconsistent
1331 and should be stripped. */
1332 strcpy (dep_sec_name, ".gnu.linkonce.t.");
1333 strcat (dep_sec_name, name);
1334 dep_sec = bfd_get_section_by_name (abfd, dep_sec_name);
1335 if (dep_sec == NULL || ! input_section_linked (dep_sec))
1337 free (dep_sec_name);
1340 free (dep_sec_name);
1348 xtensa_strip_inconsistent_linkonce_sections (lang_statement_list_type *slist)
1350 lang_statement_union_type **s_p = &slist->head;
1353 lang_statement_union_type *s = *s_p;
1354 lang_statement_union_type *s_next = (*s_p)->header.next;
1356 switch (s->header.type)
1358 case lang_input_section_enum:
1359 if (is_inconsistent_linkonce_section (s->input_section.section))
1361 s->input_section.section->output_section = bfd_abs_section_ptr;
1367 case lang_constructors_statement_enum:
1368 xtensa_strip_inconsistent_linkonce_sections (&constructor_list);
1371 case lang_output_section_statement_enum:
1372 if (s->output_section_statement.children.head)
1373 xtensa_strip_inconsistent_linkonce_sections
1374 (&s->output_section_statement.children);
1377 case lang_wild_statement_enum:
1378 xtensa_strip_inconsistent_linkonce_sections
1379 (&s->wild_statement.children);
1382 case lang_group_statement_enum:
1383 xtensa_strip_inconsistent_linkonce_sections
1384 (&s->group_statement.children);
1387 case lang_data_statement_enum:
1388 case lang_reloc_statement_enum:
1389 case lang_object_symbols_statement_enum:
1390 case lang_output_statement_enum:
1391 case lang_target_statement_enum:
1392 case lang_input_statement_enum:
1393 case lang_assignment_statement_enum:
1394 case lang_padding_statement_enum:
1395 case lang_address_statement_enum:
1396 case lang_fill_statement_enum:
1404 s_p = &(*s_p)->header.next;
1407 /* Reset the tail of the list, in case the last entry was removed. */
1408 if (s_p != slist->tail)
1414 xtensa_wild_group_interleave_callback (lang_statement_union_type *statement)
1416 lang_wild_statement_type *w;
1417 reloc_deps_graph *deps;
1418 if (statement->header.type == lang_wild_statement_enum)
1420 #if EXTRA_VALIDATION
1421 size_t old_child_count;
1422 size_t new_child_count;
1426 w = &statement->wild_statement;
1430 /* If it has 0 or 1 section bound, then do not reorder. */
1431 if (w->children.head == NULL
1432 || (w->children.head->header.type == lang_input_section_enum
1433 && w->children.head->header.next == NULL))
1436 if (w->filenames_sorted)
1439 /* Check for sorting in a section list wildcard spec as well. */
1442 struct wildcard_list *l;
1443 for (l = w->section_list; l != NULL; l = l->next)
1445 if (l->spec.sorted == by_name)
1453 /* Special case until the NOREORDER linker directive is supported:
1454 *(.init) output sections and *(.fini) specs may NOT be reordered. */
1456 /* Check for sorting in a section list wildcard spec as well. */
1459 struct wildcard_list *l;
1460 for (l = w->section_list; l != NULL; l = l->next)
1463 && ((strcmp (".init", l->spec.name) == 0)
1464 || (strcmp (".fini", l->spec.name) == 0)))
1472 #if EXTRA_VALIDATION
1473 old_child_count = ld_count_children (statement);
1476 /* It is now officially a target. Build the graph of source
1477 section -> target section (kept as a list of edges). */
1478 deps = ld_build_required_section_dependence (statement);
1480 /* If this wildcard does not reorder.... */
1481 if (!no_reorder && deps->count != 0)
1483 /* First check for reverse dependences. Fix if possible. */
1484 xtensa_layout_wild (deps, w);
1486 xtensa_move_dependencies_to_front (deps, w);
1487 #if EXTRA_VALIDATION
1488 new_child_count = ld_count_children (statement);
1489 ASSERT (new_child_count == old_child_count);
1492 xtensa_colocate_literals (deps, statement);
1494 #if EXTRA_VALIDATION
1495 new_child_count = ld_count_children (statement);
1496 ASSERT (new_child_count == old_child_count);
1501 free_reloc_deps_graph (deps);
1507 xtensa_wild_group_interleave (lang_statement_union_type *s)
1509 lang_for_each_statement_worker (xtensa_wild_group_interleave_callback, s);
1514 xtensa_layout_wild (const reloc_deps_graph *deps, lang_wild_statement_type *w)
1516 /* If it does not fit initially, we need to do this step. Move all
1517 of the wild literal sections to a new list, then move each of
1518 them back in just before the first section they depend on. */
1519 lang_statement_union_type **s_p;
1520 #if EXTRA_VALIDATION
1521 size_t old_count, new_count;
1525 lang_wild_statement_type literal_wild;
1526 literal_wild.header.next = NULL;
1527 literal_wild.header.type = lang_wild_statement_enum;
1528 literal_wild.filename = NULL;
1529 literal_wild.filenames_sorted = false;
1530 literal_wild.section_list = NULL;
1531 literal_wild.keep_sections = false;
1532 literal_wild.children.head = NULL;
1533 literal_wild.children.tail = &literal_wild.children.head;
1535 #if EXTRA_VALIDATION
1536 old_count = ld_count_children ((lang_statement_union_type*) w);
1539 s_p = &w->children.head;
1540 while (*s_p != NULL)
1542 lang_statement_union_type *l = *s_p;
1543 if (l->header.type == lang_input_section_enum)
1545 if (section_is_target (deps, l)
1546 && ! section_is_source (deps, l))
1549 *s_p = l->header.next;
1551 w->children.tail = s_p;
1552 l->header.next = NULL;
1555 *literal_wild.children.tail = l;
1556 literal_wild.children.tail = &l->header.next;
1560 s_p = &(*s_p)->header.next;
1563 #if EXTRA_VALIDATION
1564 ct1 = ld_count_children ((lang_statement_union_type*) w);
1565 ct2 = ld_count_children ((lang_statement_union_type*) &literal_wild);
1567 ASSERT (old_count == (ct1 + ct2));
1570 /* Now place them back in front of their dependent sections. */
1572 while (literal_wild.children.head != NULL)
1574 lang_statement_union_type *lit = literal_wild.children.head;
1575 bool placed = false;
1577 #if EXTRA_VALIDATION
1583 literal_wild.children.head = lit->header.next;
1584 if (literal_wild.children.head == NULL)
1585 literal_wild.children.tail = &literal_wild.children.head;
1586 lit->header.next = NULL;
1588 /* Find a spot to place it. */
1589 for (s_p = &w->children.head; *s_p != NULL; s_p = &(*s_p)->header.next)
1591 lang_statement_union_type *src = *s_p;
1592 if (deps_has_edge (deps, src, lit))
1594 /* Place it here. */
1595 lit->header.next = *s_p;
1604 /* Put it at the end. */
1605 *w->children.tail = lit;
1606 w->children.tail = &lit->header.next;
1610 #if EXTRA_VALIDATION
1611 new_count = ld_count_children ((lang_statement_union_type*) w);
1612 ASSERT (new_count == old_count);
1618 xtensa_colocate_output_literals_callback (lang_statement_union_type *statement)
1620 reloc_deps_graph *deps;
1621 if (statement->header.type == lang_output_section_statement_enum)
1623 /* Now, we walk over the contours of the output section statement.
1625 First we build the literal section dependences as before.
1627 At the first uniquely_literal section, we mark it as a good
1628 spot to place other literals. Continue walking (and counting
1629 sizes) until we find the next literal section. If this
1630 section can be moved to the first one, then we move it. If
1631 we every find a modification of ".", start over. If we find
1632 a labeling of the current location, start over. Finally, at
1633 the end, if we require page alignment, add page alignments. */
1635 #if EXTRA_VALIDATION
1636 size_t old_child_count;
1637 size_t new_child_count;
1639 bool no_reorder = false;
1641 #if EXTRA_VALIDATION
1642 old_child_count = ld_count_children (statement);
1645 /* It is now officially a target. Build the graph of source
1646 section -> target section (kept as a list of edges). */
1648 deps = ld_build_required_section_dependence (statement);
1650 /* If this wildcard does not reorder.... */
1653 /* First check for reverse dependences. Fix if possible. */
1654 xtensa_colocate_literals (deps, statement);
1656 #if EXTRA_VALIDATION
1657 new_child_count = ld_count_children (statement);
1658 ASSERT (new_child_count == old_child_count);
1662 /* Insert align/offset assignment statement. */
1663 if (xtensa_use_literal_pages)
1665 ld_xtensa_insert_page_offsets (0, statement, deps,
1666 xtensa_use_literal_pages);
1667 lang_for_each_statement_worker (xtensa_ldlang_clear_addresses,
1672 free_reloc_deps_graph (deps);
1678 xtensa_colocate_output_literals (lang_statement_union_type *s)
1680 lang_for_each_statement_worker (xtensa_colocate_output_literals_callback, s);
1685 xtensa_ldlang_clear_addresses (lang_statement_union_type *statement)
1687 switch (statement->header.type)
1689 case lang_input_section_enum:
1691 asection *bfd_section = statement->input_section.section;
1692 bfd_section->output_offset = 0;
1702 ld_assign_relative_paged_dot (bfd_vma dot,
1703 lang_statement_union_type *s,
1704 const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
1707 /* Walk through all of the input statements in this wild statement
1708 assign dot to all of them. */
1710 xtensa_ld_iter_stack *stack = NULL;
1711 xtensa_ld_iter_stack **stack_p = &stack;
1713 bool first_section = false;
1714 bool in_literals = false;
1716 for (iter_stack_create (stack_p, s);
1717 !iter_stack_empty (stack_p);
1718 iter_stack_next (stack_p))
1720 lang_statement_union_type *l = iter_stack_current (stack_p);
1722 switch (l->header.type)
1724 case lang_input_section_enum:
1726 asection *section = l->input_section.section;
1727 size_t align_pow = section->alignment_power;
1728 bool do_xtensa_alignment = false;
1732 bool sec_is_target = section_is_target (deps, l);
1733 bool sec_is_source = section_is_source (deps, l);
1735 if (section->size != 0
1737 || (in_literals && !sec_is_target)
1738 || (!in_literals && sec_is_target)))
1740 do_xtensa_alignment = true;
1742 first_section = false;
1743 if (section->size != 0)
1744 in_literals = (sec_is_target && !sec_is_source);
1747 if (do_xtensa_alignment && xtensa_page_power != 0)
1748 dot += (1 << xtensa_page_power);
1750 dot = align_power (dot, align_pow);
1751 section->output_offset = dot;
1752 dot += section->size;
1755 case lang_fill_statement_enum:
1756 dot += l->fill_statement.size;
1758 case lang_padding_statement_enum:
1759 dot += l->padding_statement.size;
1770 ld_local_file_relocations_fit (lang_statement_union_type *statement,
1771 const reloc_deps_graph *deps ATTRIBUTE_UNUSED)
1773 /* Walk over all of the dependencies that we identified and make
1774 sure that IF the source and target are here (addr != 0):
1775 1) target addr < source addr
1776 2) (roundup(source + source_size, 4) - rounddown(target, 4))
1777 < (256K - (1 << bad align))
1778 Need a worst-case proof.... */
1780 xtensa_ld_iter_stack *stack = NULL;
1781 xtensa_ld_iter_stack **stack_p = &stack;
1782 size_t max_align_power = 0;
1783 size_t align_penalty = 256;
1787 /* Find the worst-case alignment requirement for this set of statements. */
1788 for (iter_stack_create (stack_p, statement);
1789 !iter_stack_empty (stack_p);
1790 iter_stack_next (stack_p))
1792 lang_statement_union_type *l = iter_stack_current (stack_p);
1793 if (l->header.type == lang_input_section_enum)
1795 lang_input_section_type *input = &l->input_section;
1796 asection *section = input->section;
1797 if (section->alignment_power > max_align_power)
1798 max_align_power = section->alignment_power;
1802 /* Now check that everything fits. */
1803 for (i = 0; i < deps->count; i++)
1805 asection *sec = deps->sections[i];
1806 const reloc_deps_section *deps_section =
1807 xtensa_get_section_deps (deps, sec);
1810 /* We choose to walk through the successors. */
1811 for (e = deps_section->succs; e != NULL; e = e->next)
1813 if (e->src != e->tgt
1814 && e->src->output_section == e->tgt->output_section
1815 && e->src->output_offset != 0
1816 && e->tgt->output_offset != 0)
1819 align_power (e->src->output_offset + e->src->size, 2);
1820 bfd_vma target_addr = e->tgt->output_offset & ~3;
1821 if (l32r_addr < target_addr)
1824 fprintf (stderr, "Warning: "
1825 "l32r target section before l32r\n");
1830 if (l32r_addr - target_addr > 256 * 1024 - align_penalty)
1842 ld_xtensa_insert_page_offsets (bfd_vma dot,
1843 lang_statement_union_type *s,
1844 reloc_deps_graph *deps,
1847 xtensa_ld_iter_stack *stack = NULL;
1848 xtensa_ld_iter_stack **stack_p = &stack;
1850 bool first_section = false;
1851 bool in_literals = false;
1856 for (iter_stack_create (stack_p, s);
1857 !iter_stack_empty (stack_p);
1858 iter_stack_next (stack_p))
1860 lang_statement_union_type *l = iter_stack_current (stack_p);
1862 switch (l->header.type)
1864 case lang_input_section_enum:
1866 asection *section = l->input_section.section;
1867 bool do_xtensa_alignment = false;
1871 if (section->size != 0
1873 || (in_literals && !section_is_target (deps, l))
1874 || (!in_literals && section_is_target (deps, l))))
1876 do_xtensa_alignment = true;
1878 first_section = false;
1879 if (section->size != 0)
1881 in_literals = (section_is_target (deps, l)
1882 && !section_is_source (deps, l));
1886 if (do_xtensa_alignment && xtensa_page_power != 0)
1888 /* Create an expression that increments the current address,
1889 i.e., "dot", by (1 << xtensa_align_power). */
1890 etree_type *name_op = exp_nameop (NAME, ".");
1891 etree_type *addend_op = exp_intop (1 << xtensa_page_power);
1892 etree_type *add_op = exp_binop ('+', name_op, addend_op);
1893 etree_type *assign_op = exp_assign (".", add_op, false);
1895 lang_assignment_statement_type *assign_stmt;
1896 lang_statement_union_type *assign_union;
1897 lang_statement_list_type tmplist;
1899 /* There is hidden state in "lang_add_assignment". It
1900 appends the new assignment statement to the stat_ptr
1901 list. Thus, we swap it before and after the call. */
1903 lang_list_init (&tmplist);
1904 push_stat_ptr (&tmplist);
1905 /* Warning: side effect; statement appended to stat_ptr. */
1906 assign_stmt = lang_add_assignment (assign_op);
1907 assign_union = (lang_statement_union_type *) assign_stmt;
1910 assign_union->header.next = l;
1911 *(*stack_p)->iterloc.loc = assign_union;
1912 iter_stack_next (stack_p);
1925 # Define some shell vars to insert bits of code into the standard ELF
1926 # parse_args and list_options functions.
1928 PARSE_AND_LIST_LONGOPTS='
1929 { "size-opt", no_argument, NULL, OPTION_OPT_SIZEOPT},
1930 { "literal-movement", no_argument, NULL, OPTION_LITERAL_MOVEMENT},
1931 { "no-literal-movement", no_argument, NULL, OPTION_NO_LITERAL_MOVEMENT},
1932 { "abi-windowed", no_argument, NULL, OPTION_ABI_WINDOWED},
1933 { "abi-call0", no_argument, NULL, OPTION_ABI_CALL0},
1936 PARSE_AND_LIST_OPTIONS='
1938 --size-opt When relaxing longcalls, prefer size\n\
1939 optimization over branch target alignment\n"));
1941 --abi-windowed Choose windowed ABI for the output object\n"));
1943 --abi-call0 Choose call0 ABI for the output object\n"));
1946 PARSE_AND_LIST_ARGS_CASES='
1947 case OPTION_OPT_SIZEOPT:
1948 elf32xtensa_size_opt = 1;
1950 case OPTION_LITERAL_MOVEMENT:
1951 elf32xtensa_no_literal_movement = 0;
1953 case OPTION_NO_LITERAL_MOVEMENT:
1954 elf32xtensa_no_literal_movement = 1;
1956 case OPTION_ABI_WINDOWED:
1957 elf32xtensa_abi = XTHAL_ABI_WINDOWED;
1959 case OPTION_ABI_CALL0:
1960 elf32xtensa_abi = XTHAL_ABI_CALL0;
1964 # Replace some of the standard ELF functions with our own versions.
1966 LDEMUL_BEFORE_PARSE=elf_xtensa_before_parse
1967 LDEMUL_AFTER_OPEN=elf_xtensa_after_open
1968 LDEMUL_CHOOSE_TARGET=elf_xtensa_choose_target
1969 LDEMUL_BEFORE_ALLOCATION=elf_xtensa_before_allocation