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