[gdb/contrib] Fix shellcheck warnings in spellcheck.sh
[binutils-gdb.git] / ld / emultempl / xtensaelf.em
blob3508eb7f503180bc6780fa7ed732cba98f5428c7
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,
19 # MA 02110-1301, USA.
22 # This file is sourced from elf.em, and defines extra xtensa-elf
23 # specific routines.
25 fragment <<EOF
27 #include <xtensa-dynconfig.h>
28 #include "../bfd/elf-bfd.h"
29 #include "elf/xtensa.h"
30 #include "bfd.h"
32 /* Provide default values for new configuration settings.  */
33 #ifndef XTHAL_ABI_UNDEFINED
34 #define XTHAL_ABI_UNDEFINED -1
35 #endif
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
55 /* Xtensa ABI.
56    This option is defined in BDF library.  */
57 extern int elf32xtensa_abi;
60 static char *
61 elf_xtensa_choose_target (int argc ATTRIBUTE_UNUSED,
62                           char **argv ATTRIBUTE_UNUSED)
64   if (XCHAL_HAVE_BE)
65     return "${BIG_OUTPUT_FORMAT}";
66   else
67     return "${LITTLE_OUTPUT_FORMAT}";
71 static void
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 ();
80 static void
81 remove_section (bfd *abfd, asection *os)
83   asection **spp;
84   for (spp = &abfd->sections; *spp; spp = &(*spp)->next)
85     if (*spp == os)
86       {
87         *spp = os->next;
88         os->owner->section_count--;
89         break;
90       }
94 static bool
95 replace_insn_sec_with_prop_sec (bfd *abfd,
96                                 const char *insn_sec_name,
97                                 const char *prop_sec_name,
98                                 char **error_message)
100   asection *insn_sec;
101   asection *prop_sec;
102   bfd_byte *prop_contents = NULL;
103   bfd_byte *insn_contents = NULL;
104   unsigned entry_count;
105   unsigned entry;
106   Elf_Internal_Shdr *rel_hdr;
107   Elf_Internal_Rela *internal_relocs = NULL;
108   unsigned reloc_count;
110   *error_message = "";
111   insn_sec = bfd_get_section_by_name (abfd, insn_sec_name);
112   if (insn_sec == NULL)
113     return true;
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)
118     {
119       *error_message = _("file already has property tables");
120       return false;
121     }
123   if (insn_sec->size != 0)
124     {
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))
128         {
129           *error_message = _("failed to read section contents");
130           goto cleanup;
131         }
132     }
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));
138   if (prop_sec == NULL
139       || !bfd_set_section_alignment (prop_sec, 2))
140     {
141       *error_message = _("could not create new section");
142       goto cleanup;
143     }
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)
156     {
157       *error_message = _("could not allocate section contents");
158       goto cleanup;
159     }
161   /* Read the relocations.  */
162   reloc_count = insn_sec->reloc_count;
163   if (reloc_count != 0)
164     {
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;
170       internal_relocs =
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)
175         {
176           *error_message = _("out of memory");
177           goto cleanup;
178         }
179     }
181   /* Create a relocation section for the property section.  */
182   if (internal_relocs != NULL)
183     {
184       elf_section_data (prop_sec)->relocs = internal_relocs;
185       prop_sec->reloc_count = reloc_count;
186     }
188   /* Now copy each insn table entry to the prop table entry with
189      appropriate flags.  */
190   for (entry = 0; entry < entry_count; ++entry)
191     {
192       unsigned value;
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);
200     }
202   /* Now copy all of the relocations.  Change offsets for the
203      instruction table section to offsets in the property table
204      section.  */
205   if (internal_relocs)
206     {
207       unsigned i;
209       for (i = 0; i < reloc_count; i++)
210         {
211           Elf_Internal_Rela *rela;
212           unsigned r_offset;
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;
221         }
222     }
224   remove_section (abfd, insn_sec);
226   free (insn_contents);
228   return true;
230  cleanup:
231   if (prop_sec && prop_sec->owner)
232     remove_section (abfd, prop_sec);
233   free (insn_contents);
234   free (internal_relocs);
236   return false;
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."
245 static void
246 replace_instruction_table_sections (bfd *abfd, asection *sec)
248   char *message = "";
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)
256     {
257       insn_sec_name = INSN_SEC_BASE_NAME;
258       prop_sec_name = PROP_SEC_BASE_NAME;
259     }
260   else if (startswith (sec_name, LINKONCE_SEC_OLD_TEXT_BASE_NAME))
261     {
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));
268     }
269   if (insn_sec_name != NULL)
270     {
271       if (! replace_insn_sec_with_prop_sec (abfd, insn_sec_name, prop_sec_name,
272                                             &message))
273         {
274           einfo (_("%P: warning: failed to convert %s table in %pB (%s); subsequent disassembly may be incomplete\n"),
275                  insn_sec_name, abfd, message);
276         }
277     }
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.  */
286 static void
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)
294     {
295       asection *sec = f->the_bfd->sections;
296       asection *next_sec;
298       /* Do not use bfd_map_over_sections here since we are removing
299          sections as we iterate.  */
300       while (sec != NULL)
301         {
302           next_sec = sec->next;
303           replace_instruction_table_sections (f->the_bfd, sec);
304           sec = next_sec;
305         }
306     }
310 static bool
311 xt_config_info_unpack_and_check (char *data,
312                                  bool *pmismatch,
313                                  char **pmsg)
315   char *d, *key;
316   int num;
318   *pmismatch = false;
320   d = data;
321   while (*d)
322     {
323       key = d;
324       d = strchr (d, '=');
325       if (! d)
326         goto error;
328       /* Overwrite the equal sign.  */
329       *d++ = 0;
331       /* Check if this is a quoted string or a number.  */
332       if (*d == '"')
333         {
334           /* No string values are currently checked by LD;
335              just skip over the quotes.  */
336           d++;
337           d = strchr (d, '"');
338           if (! d)
339             goto error;
340           /* Overwrite the trailing quote.  */
341           *d++ = 0;
342         }
343       else
344         {
345           if (*d == 0)
346             goto error;
347           num = strtoul (d, &d, 0);
349           if (! strcmp (key, "ABI"))
350             {
351               if (elf32xtensa_abi == XTHAL_ABI_UNDEFINED)
352                 {
353                   elf32xtensa_abi = num;
354                 }
355               else if (num != elf32xtensa_abi)
356                 {
357                   *pmismatch = true;
358                   *pmsg = "ABI does not match";
359                 }
360             }
361           else if (! strcmp (key, "USE_ABSOLUTE_LITERALS"))
362             {
363               if (num != XSHAL_USE_ABSOLUTE_LITERALS)
364                 {
365                   *pmismatch = true;
366                   *pmsg = "incompatible use of the Extended L32R option";
367                 }
368             }
369         }
371       if (*d++ != '\n')
372         goto error;
373     }
375   return true;
377  error:
378   return false;
382 #define XTINFO_NAME "Xtensa_Info"
383 #define XTINFO_NAMESZ 12
384 #define XTINFO_TYPE 1
386 static void
387 check_xtensa_info (bfd *abfd, asection *info_sec)
389   char *data, *errmsg = "";
390   bool mismatch;
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,
402                                           &mismatch, &errmsg))
403     {
404       if (mismatch)
405         einfo (_("%P: %pB: warning: incompatible Xtensa configuration (%s)\n"),
406                abfd, errmsg);
407     }
408   else
409     einfo (_("%P: %pB: warning: cannot parse .xtensa.info section\n"), abfd);
411   free (data);
415 /* This is called after the sections have been attached to output
416    sections, but before any sizes or addresses have been set.  */
418 static void
419 elf_xtensa_before_allocation (void)
421   asection *info_sec, *first_info_sec;
422   bfd *first_bfd;
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
430      configuration.  */
432   if (is_big_endian
433       && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_LITTLE)
434     {
435       einfo (_("%F%P: little endian output does not match "
436                "Xtensa configuration\n"));
437     }
438   if (!is_big_endian
439       && link_info.output_bfd->xvec->byteorder == BFD_ENDIAN_BIG)
440     {
441       einfo (_("%F%P: big endian output does not match "
442                "Xtensa configuration\n"));
443     }
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.  */
449   first_info_sec = 0;
450   first_bfd = 0;
452   LANG_FOR_EACH_INPUT_STATEMENT (f)
453     {
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"),
461                f->the_bfd);
463       if (! first_bfd)
464         first_bfd = f->the_bfd;
466       info_sec = bfd_get_section_by_name (f->the_bfd, ".xtensa.info");
467       if (! info_sec)
468         continue;
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.  */
478       info_sec->size = 0;
479       info_sec->flags |= SEC_EXCLUDE;
480     }
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)
487     {
488       info_sec = bfd_make_section_with_flags (first_bfd, ".xtensa.info",
489                                               SEC_HAS_CONTENTS | SEC_READONLY);
490       if (! info_sec)
491         einfo (_("%F%P: failed to create .xtensa.info section\n"));
492     }
493   if (info_sec)
494     {
495       int xtensa_info_size;
496       char data[100];
498       info_sec->flags &= ~SEC_EXCLUDE;
499       info_sec->flags |= SEC_IN_MEMORY;
501       xtensa_info_size
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.  */
506       do
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);
517     }
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)
524     ENABLE_RELAXATION;
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.  */
553   reloc_deps_e *next;
556 /* Place these in the userdata field.  */
557 struct reloc_deps_section_t
559   reloc_deps_e *preds;
560   reloc_deps_e *succs;
561   bool is_only_literal;
565 struct reloc_deps_graph_t
567   size_t count;
568   size_t size;
569   asection **sections;
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 *,
588    bool);
589 static bfd_vma ld_xtensa_insert_page_offsets
590   (bfd_vma, lang_statement_union_type *, reloc_deps_graph *, bool);
591 #if EXTRA_VALIDATION
592 static size_t ld_count_children (lang_statement_union_type *);
593 #endif
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,
599                          asection *sec)
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);
610   return sec_deps;
613 static void
614 xtensa_set_section_deps (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
615                          asection *sec,
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.  */
625 static void
626 xtensa_append_section_deps (reloc_deps_graph *deps, asection *sec)
628   if (deps->size <= deps->count)
629     {
630       asection **new_sections;
631       size_t i;
632       size_t new_size;
634       new_size = deps->size * 2;
635       if (new_size == 0)
636         new_size = 20;
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++)
641         {
642           new_sections[i] = deps->sections[i];
643         }
644       free (deps->sections);
645       deps->sections = new_sections;
646       deps->size = new_size;
647     }
648   deps->sections[deps->count] = sec;
649   deps->count++;
653 static void
654 free_reloc_deps_graph (reloc_deps_graph *deps)
656   size_t i;
657   for (i = 0; i < deps->count; i++)
658     {
659       asection *sec = deps->sections[i];
660       reloc_deps_section *sec_deps;
661       sec_deps = xtensa_get_section_deps (deps, sec);
662       if (sec_deps)
663         {
664           reloc_deps_e *next;
665           while (sec_deps->succs != NULL)
666             {
667               next = sec_deps->succs->next;
668               free (sec_deps->succs);
669               sec_deps->succs = next;
670             }
672           while (sec_deps->preds != NULL)
673             {
674               next = sec_deps->preds->next;
675               free (sec_deps->preds);
676               sec_deps->preds = next;
677             }
678           free (sec_deps);
679         }
680       xtensa_set_section_deps (deps, sec, NULL);
681     }
682   free (deps->sections);
683   free (deps);
687 static bool
688 section_is_source (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
689                    lang_statement_union_type *s)
691   asection *sec;
692   const reloc_deps_section *sec_deps;
694   if (s->header.type != lang_input_section_enum)
695     return false;
696   sec = s->input_section.section;
698   sec_deps = xtensa_get_section_deps (deps, sec);
699   return sec_deps && sec_deps->succs != NULL;
703 static bool
704 section_is_target (const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
705                    lang_statement_union_type *s)
707   asection *sec;
708   const reloc_deps_section *sec_deps;
710   if (s->header.type != lang_input_section_enum)
711     return false;
712   sec = s->input_section.section;
714   sec_deps = xtensa_get_section_deps (deps, sec);
715   return sec_deps && sec_deps->preds != NULL;
719 static bool
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.  */
747 static void
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;
754 #if EXTRA_VALIDATION
755   size_t old_to_count, new_to_count;
756   size_t old_current_count, new_current_count;
757 #endif
759   if (to == current)
760     return;
762 #if EXTRA_VALIDATION
763   old_to_count = ld_count_children (to->parent);
764   old_current_count = ld_count_children (current->parent);
765 #endif
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)
777     ;
778   to->l->tail = e;
780   /* reset "current" list tail */
781   for (e = &current->l->head; *e != NULL; e = &(*e)->header.next)
782     ;
783   current->l->tail = e;
785 #if EXTRA_VALIDATION
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));
791 #endif
795 /* Can only be called with lang_statements that have lists.  Returns
796    FALSE if the list is empty.  */
798 static bool
799 iter_stack_empty (xtensa_ld_iter_stack **stack_p)
801   return *stack_p == NULL;
805 static bool
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)
813     {
814     case lang_output_section_statement_enum:
815       l = &parent->output_section_statement.children;
816       break;
817     case lang_wild_statement_enum:
818       l = &parent->wild_statement.children;
819       break;
820     case lang_group_statement_enum:
821       l = &parent->group_statement.children;
822       break;
823     default:
824       ASSERT (0);
825       return false;
826     }
828   /* Empty. do not push.  */
829   if (l->tail == &l->head)
830     return false;
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;
839   stack->prev = NULL;
840   if (*stack_p != NULL)
841     (*stack_p)->prev = stack;
842   *stack_p = stack;
843   return true;
847 static void
848 iter_stack_pop (xtensa_ld_iter_stack **stack_p)
850   xtensa_ld_iter_stack *stack;
852   stack = *stack_p;
854   if (stack == NULL)
855     {
856       ASSERT (stack != NULL);
857       return;
858     }
860   if (stack->next != NULL)
861     stack->next->prev = NULL;
863   *stack_p = stack->next;
864   free (stack);
868 /* This MUST be called if, during iteration, the user changes the
869    underlying structure.  It will check for a NULL current and advance
870    accordingly.  */
872 static void
873 iter_stack_update (xtensa_ld_iter_stack **stack_p)
875   if (!iter_stack_empty (stack_p)
876       && (*(*stack_p)->iterloc.loc) == NULL)
877     {
878       iter_stack_pop (stack_p);
880       while (!iter_stack_empty (stack_p)
881              && ((*(*stack_p)->iterloc.loc)->header.next == NULL))
882         {
883           iter_stack_pop (stack_p);
884         }
885       if (!iter_stack_empty (stack_p))
886         (*stack_p)->iterloc.loc = &(*(*stack_p)->iterloc.loc)->header.next;
887     }
891 static void
892 iter_stack_next (xtensa_ld_iter_stack **stack_p)
894   xtensa_ld_iter_stack *stack;
895   lang_statement_union_type *current;
896   stack = *stack_p;
898   current = *stack->iterloc.loc;
899   /* If we are on the first element.  */
900   if (current != NULL)
901     {
902       switch (current->header.type)
903         {
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))
909             return;
910           /* Otherwise increment the pointer as normal.  */
911           break;
912         default:
913           break;
914         }
915     }
917   while (!iter_stack_empty (stack_p)
918          && ((*(*stack_p)->iterloc.loc)->header.next == NULL))
919     {
920       iter_stack_pop (stack_p);
921     }
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.  */
936 static void
937 iter_stack_create (xtensa_ld_iter_stack **stack_p,
938                    lang_statement_union_type *parent)
940   iter_stack_push (stack_p, parent);
944 static void
945 iter_stack_copy_current (xtensa_ld_iter_stack **stack_p, xtensa_ld_iter *front)
947   *front = (*stack_p)->iterloc;
951 static void
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)
967     return;
969   iter_stack_create (stack_p, statement);
971   while (!iter_stack_empty (stack_p))
972     {
973       bool skip_increment = false;
974       lang_statement_union_type *l = iter_stack_current (stack_p);
976       switch (l->header.type)
977         {
978         case lang_assignment_statement_enum:
979           /* Any assignment statement should block reordering across it.  */
980           front_p = NULL;
981           in_literals = false;
982           break;
984         case lang_input_section_enum:
985           if (front_p == NULL)
986             {
987               in_literals = (section_is_target (deps, l)
988                              && !section_is_source (deps, l));
989               if (in_literals)
990                 {
991                   front_p = &front;
992                   iter_stack_copy_current (stack_p, front_p);
993                 }
994             }
995           else
996             {
997               bool is_target;
998               current_p = &current;
999               iter_stack_copy_current (stack_p, current_p);
1000               is_target = (section_is_target (deps, l)
1001                            && !section_is_source (deps, l));
1003               if (in_literals)
1004                 {
1005                   iter_stack_copy_current (stack_p, front_p);
1006                   if (!is_target)
1007                     in_literals = false;
1008                 }
1009               else
1010                 {
1011                   if (is_target)
1012                     {
1013                       /* Try to insert in place.  */
1014                       ld_xtensa_move_section_after (front_p, current_p);
1015                       ld_assign_relative_paged_dot (0x100000,
1016                                                     statement,
1017                                                     deps,
1018                                                     xtensa_use_literal_pages);
1020                       /* We use this code because it's already written.  */
1021                       if (!ld_local_file_relocations_fit (statement, deps))
1022                         {
1023                           /* Move it back.  */
1024                           ld_xtensa_move_section_after (current_p, front_p);
1025                           /* Reset the literal placement.  */
1026                           iter_stack_copy_current (stack_p, front_p);
1027                         }
1028                       else
1029                         {
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;
1035                         }
1036                     }
1037                 }
1038             }
1039           break;
1040         default:
1041           break;
1042         }
1044       if (!skip_increment)
1045         iter_stack_next (stack_p);
1046       else
1047         /* Be careful to update the stack_p if it now is a null.  */
1048         iter_stack_update (stack_p);
1049     }
1051   lang_for_each_statement_worker (xtensa_ldlang_clear_addresses, statement);
1055 static void
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)
1067     ;
1069   if (*front == NULL)
1070     return;
1072   current = &(*front)->header.next;
1073   while (*current != NULL)
1074     {
1075       if (section_is_source_or_target (deps, *current))
1076         {
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, &current_iter);
1090           front = &(*front)->header.next;
1091         }
1092       else
1093         {
1094           current = &(*current)->header.next;
1095         }
1096     }
1100 static bool
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)
1108     return false;
1110   for (sec_deps_e = sec_deps->succs;
1111        sec_deps_e != NULL;
1112        sec_deps_e = sec_deps_e->next)
1113     {
1114       ASSERT (sec_deps_e->src == src);
1115       if (sec_deps_e->tgt == tgt)
1116         return true;
1117     }
1118   return false;
1122 static bool
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))
1128     return false;
1129   if (!section_is_target (deps, tgt))
1130     return false;
1132   if (src->header.type != lang_input_section_enum)
1133     return false;
1134   if (tgt->header.type != lang_input_section_enum)
1135     return false;
1137   return deps_has_sec_edge (deps, src->input_section.section,
1138                             tgt->input_section.section);
1142 static void
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))
1152     return;
1154   src_sec_deps = xtensa_get_section_deps (deps, src_sec);
1155   if (src_sec_deps == NULL)
1156     {
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);
1165     }
1167   tgt_sec_deps = xtensa_get_section_deps (deps, tgt_sec);
1168   if (tgt_sec_deps == NULL)
1169     {
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);
1178     }
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;
1197 static void
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,
1202                            void *closure)
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;
1220   deps->count = 0;
1221   deps->size = 0;
1223   for (iter_stack_create (&stack, s);
1224        !iter_stack_empty (&stack);
1225        iter_stack_next (&stack))
1226     {
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)
1234         {
1235           lang_input_section_type *input;
1236           input = &l->input_section;
1237           xtensa_callback_required_dependence (input->section->owner,
1238                                                input->section,
1239                                                &link_info,
1240                                                /* Use the same closure.  */
1241                                                build_deps_graph_callback,
1242                                                deps);
1243         }
1244     }
1245   return deps;
1249 #if EXTRA_VALIDATION
1250 static size_t
1251 ld_count_children (lang_statement_union_type *s)
1253   size_t count = 0;
1254   xtensa_ld_iter_stack *stack = NULL;
1255   for (iter_stack_create (&stack, s);
1256        !iter_stack_empty (&stack);
1257        iter_stack_next (&stack))
1258     {
1259       lang_statement_union_type *l = iter_stack_current (&stack);
1260       ASSERT (l != NULL);
1261       count++;
1262     }
1263   return count;
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;
1274 static void
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;
1282 static bool
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;
1302 static bool
1303 is_inconsistent_linkonce_section (asection *sec)
1305   bfd *abfd = sec->owner;
1306   const char *sec_name = bfd_section_name (sec);
1307   const char *name;
1309   if ((bfd_section_flags (sec) & SEC_LINK_ONCE) == 0
1310       || strncmp (sec_name, ".gnu.linkonce.", linkonce_len) != 0)
1311     return false;
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'))
1320     name += 2;
1321   else
1322     name = 0;
1324   if (name)
1325     {
1326       char *dep_sec_name = xmalloc (strlen (sec_name) + 1);
1327       asection *dep_sec;
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))
1336         {
1337           free (dep_sec_name);
1338           return true;
1339         }
1340       free (dep_sec_name);
1341     }
1343   return false;
1347 static void
1348 xtensa_strip_inconsistent_linkonce_sections (lang_statement_list_type *slist)
1350   lang_statement_union_type **s_p = &slist->head;
1351   while (*s_p)
1352     {
1353       lang_statement_union_type *s = *s_p;
1354       lang_statement_union_type *s_next = (*s_p)->header.next;
1356       switch (s->header.type)
1357         {
1358         case lang_input_section_enum:
1359           if (is_inconsistent_linkonce_section (s->input_section.section))
1360             {
1361               s->input_section.section->output_section = bfd_abs_section_ptr;
1362               *s_p = s_next;
1363               continue;
1364             }
1365           break;
1367         case lang_constructors_statement_enum:
1368           xtensa_strip_inconsistent_linkonce_sections (&constructor_list);
1369           break;
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);
1375           break;
1377         case lang_wild_statement_enum:
1378           xtensa_strip_inconsistent_linkonce_sections
1379             (&s->wild_statement.children);
1380           break;
1382         case lang_group_statement_enum:
1383           xtensa_strip_inconsistent_linkonce_sections
1384             (&s->group_statement.children);
1385           break;
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:
1397           break;
1399         default:
1400           FAIL ();
1401           break;
1402         }
1404       s_p = &(*s_p)->header.next;
1405     }
1407   /* Reset the tail of the list, in case the last entry was removed.  */
1408   if (s_p != slist->tail)
1409     slist->tail = s_p;
1413 static void
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)
1419     {
1420 #if EXTRA_VALIDATION
1421       size_t old_child_count;
1422       size_t new_child_count;
1423 #endif
1424       bool no_reorder;
1426       w = &statement->wild_statement;
1428       no_reorder = false;
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))
1434         no_reorder = true;
1436       if (w->filenames_sorted)
1437         no_reorder = true;
1439       /* Check for sorting in a section list wildcard spec as well.  */
1440       if (!no_reorder)
1441         {
1442           struct wildcard_list *l;
1443           for (l = w->section_list; l != NULL; l = l->next)
1444             {
1445               if (l->spec.sorted == by_name)
1446                 {
1447                   no_reorder = true;
1448                   break;
1449                 }
1450             }
1451         }
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.  */
1457       if (!no_reorder)
1458         {
1459           struct wildcard_list *l;
1460           for (l = w->section_list; l != NULL; l = l->next)
1461             {
1462               if (l->spec.name
1463                   && ((strcmp (".init", l->spec.name) == 0)
1464                       || (strcmp (".fini", l->spec.name) == 0)))
1465                 {
1466                   no_reorder = true;
1467                   break;
1468                 }
1469             }
1470         }
1472 #if EXTRA_VALIDATION
1473       old_child_count = ld_count_children (statement);
1474 #endif
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)
1482         {
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);
1490 #endif
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);
1497 #endif
1498         }
1500       /* Clean up.  */
1501       free_reloc_deps_graph (deps);
1502     }
1506 static void
1507 xtensa_wild_group_interleave (lang_statement_union_type *s)
1509   lang_for_each_statement_worker (xtensa_wild_group_interleave_callback, s);
1513 static void
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;
1522   size_t ct1, ct2;
1523 #endif
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);
1537 #endif
1539   s_p = &w->children.head;
1540   while (*s_p != NULL)
1541     {
1542       lang_statement_union_type *l = *s_p;
1543       if (l->header.type == lang_input_section_enum)
1544         {
1545           if (section_is_target (deps, l)
1546               && ! section_is_source (deps, l))
1547             {
1548               /* Detach.  */
1549               *s_p = l->header.next;
1550               if (*s_p == NULL)
1551                 w->children.tail = s_p;
1552               l->header.next = NULL;
1554               /* Append.  */
1555               *literal_wild.children.tail = l;
1556               literal_wild.children.tail = &l->header.next;
1557               continue;
1558             }
1559         }
1560       s_p = &(*s_p)->header.next;
1561     }
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));
1568 #endif
1570   /* Now place them back in front of their dependent sections.  */
1572   while (literal_wild.children.head != NULL)
1573     {
1574       lang_statement_union_type *lit = literal_wild.children.head;
1575       bool placed = false;
1577 #if EXTRA_VALIDATION
1578       ASSERT (ct2 > 0);
1579       ct2--;
1580 #endif
1582       /* Detach.  */
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)
1590         {
1591           lang_statement_union_type *src = *s_p;
1592           if (deps_has_edge (deps, src, lit))
1593             {
1594               /* Place it here.  */
1595               lit->header.next = *s_p;
1596               *s_p = lit;
1597               placed = true;
1598               break;
1599             }
1600         }
1602       if (!placed)
1603         {
1604           /* Put it at the end.  */
1605           *w->children.tail = lit;
1606           w->children.tail = &lit->header.next;
1607         }
1608     }
1610 #if EXTRA_VALIDATION
1611   new_count = ld_count_children ((lang_statement_union_type*) w);
1612   ASSERT (new_count == old_count);
1613 #endif
1617 static void
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)
1622     {
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;
1638 #endif
1639       bool no_reorder = false;
1641 #if EXTRA_VALIDATION
1642       old_child_count = ld_count_children (statement);
1643 #endif
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....  */
1651       if (!no_reorder)
1652         {
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);
1659 #endif
1660         }
1662       /* Insert align/offset assignment statement.  */
1663       if (xtensa_use_literal_pages)
1664         {
1665           ld_xtensa_insert_page_offsets (0, statement, deps,
1666                                          xtensa_use_literal_pages);
1667           lang_for_each_statement_worker (xtensa_ldlang_clear_addresses,
1668                                           statement);
1669         }
1671       /* Clean up.  */
1672       free_reloc_deps_graph (deps);
1673     }
1677 static void
1678 xtensa_colocate_output_literals (lang_statement_union_type *s)
1680   lang_for_each_statement_worker (xtensa_colocate_output_literals_callback, s);
1684 static void
1685 xtensa_ldlang_clear_addresses (lang_statement_union_type *statement)
1687   switch (statement->header.type)
1688     {
1689     case lang_input_section_enum:
1690       {
1691         asection *bfd_section = statement->input_section.section;
1692         bfd_section->output_offset = 0;
1693       }
1694       break;
1695     default:
1696       break;
1697     }
1701 static bfd_vma
1702 ld_assign_relative_paged_dot (bfd_vma dot,
1703                               lang_statement_union_type *s,
1704                               const reloc_deps_graph *deps ATTRIBUTE_UNUSED,
1705                               bool lit_align)
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))
1719     {
1720       lang_statement_union_type *l = iter_stack_current (stack_p);
1722       switch (l->header.type)
1723         {
1724         case lang_input_section_enum:
1725           {
1726             asection *section = l->input_section.section;
1727             size_t align_pow = section->alignment_power;
1728             bool do_xtensa_alignment = false;
1730             if (lit_align)
1731               {
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
1736                     && (first_section
1737                         || (in_literals && !sec_is_target)
1738                         || (!in_literals && sec_is_target)))
1739                   {
1740                     do_xtensa_alignment = true;
1741                   }
1742                 first_section = false;
1743                 if (section->size != 0)
1744                   in_literals = (sec_is_target && !sec_is_source);
1745               }
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;
1753           }
1754           break;
1755         case lang_fill_statement_enum:
1756           dot += l->fill_statement.size;
1757           break;
1758         case lang_padding_statement_enum:
1759           dot += l->padding_statement.size;
1760           break;
1761         default:
1762           break;
1763         }
1764     }
1765   return dot;
1769 static bool
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;
1784   reloc_deps_e *e;
1785   size_t i;
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))
1791     {
1792       lang_statement_union_type *l = iter_stack_current (stack_p);
1793       if (l->header.type == lang_input_section_enum)
1794         {
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;
1799         }
1800     }
1802   /* Now check that everything fits.  */
1803   for (i = 0; i < deps->count; i++)
1804     {
1805       asection *sec = deps->sections[i];
1806       const reloc_deps_section *deps_section =
1807         xtensa_get_section_deps (deps, sec);
1808       if (deps_section)
1809         {
1810           /* We choose to walk through the successors.  */
1811           for (e = deps_section->succs; e != NULL; e = e->next)
1812             {
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)
1817                 {
1818                   bfd_vma l32r_addr =
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)
1822                     {
1823                       fflush (stdout);
1824                       fprintf (stderr, "Warning: "
1825                                "l32r target section before l32r\n");
1826                       fflush (stderr);
1827                       return false;
1828                     }
1830                   if (l32r_addr - target_addr > 256 * 1024 - align_penalty)
1831                     return false;
1832                 }
1833             }
1834         }
1835     }
1837   return true;
1841 static bfd_vma
1842 ld_xtensa_insert_page_offsets (bfd_vma dot,
1843                                lang_statement_union_type *s,
1844                                reloc_deps_graph *deps,
1845                                bool lit_align)
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;
1853   if (!lit_align)
1854     return false;
1856   for (iter_stack_create (stack_p, s);
1857        !iter_stack_empty (stack_p);
1858        iter_stack_next (stack_p))
1859     {
1860       lang_statement_union_type *l = iter_stack_current (stack_p);
1862       switch (l->header.type)
1863         {
1864         case lang_input_section_enum:
1865           {
1866             asection *section = l->input_section.section;
1867             bool do_xtensa_alignment = false;
1869             if (lit_align)
1870               {
1871                 if (section->size != 0
1872                     && (first_section
1873                         || (in_literals && !section_is_target (deps, l))
1874                         || (!in_literals && section_is_target (deps, l))))
1875                   {
1876                     do_xtensa_alignment = true;
1877                   }
1878                 first_section = false;
1879                 if (section->size != 0)
1880                   {
1881                     in_literals = (section_is_target (deps, l)
1882                                    && !section_is_source (deps, l));
1883                   }
1884               }
1886             if (do_xtensa_alignment && xtensa_page_power != 0)
1887               {
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;
1908                 pop_stat_ptr ();
1910                 assign_union->header.next = l;
1911                 *(*stack_p)->iterloc.loc = assign_union;
1912                 iter_stack_next (stack_p);
1913               }
1914           }
1915           break;
1916         default:
1917           break;
1918         }
1919     }
1920   return dot;
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='
1937   fprintf (file, _("\
1938   --size-opt                  When relaxing longcalls, prefer size\n\
1939                                 optimization over branch target alignment\n"));
1940   fprintf (file, _("\
1941   --abi-windowed              Choose windowed ABI for the output object\n"));
1942   fprintf (file, _("\
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;
1949       break;
1950     case OPTION_LITERAL_MOVEMENT:
1951       elf32xtensa_no_literal_movement = 0;
1952       break;
1953     case OPTION_NO_LITERAL_MOVEMENT:
1954       elf32xtensa_no_literal_movement = 1;
1955       break;
1956     case OPTION_ABI_WINDOWED:
1957       elf32xtensa_abi = XTHAL_ABI_WINDOWED;
1958       break;
1959     case OPTION_ABI_CALL0:
1960       elf32xtensa_abi = XTHAL_ABI_CALL0;
1961       break;
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