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