1 # This shell script emits a C file. -*- C -*-
2 # It does some substitutions.
4 /* This file is is generated by a shell script. DO NOT EDIT! */
6 /* Emulate the original gld for the given ${EMULATION_NAME}
7 Copyright (C) 2014-2019 Free Software Foundation, Inc.
8 Written by Steve Chamberlain steve@cygnus.com
9 Extended for the MSP430 by Nick Clifton nickc@redhat.com
11 This file is part of the GNU Binutils.
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 3 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
26 MA 02110-1301, USA. */
28 #define TARGET_IS_${EMULATION_NAME}
42 #include "libiberty.h"
53 enum either_placement_stage
61 static int data_region = REGION_NONE;
62 static int code_region = REGION_NONE;
63 static bfd_boolean disable_sec_transformation = FALSE;
65 #define MAX_PREFIX_LENGTH 7
69 # Import any needed special functions and/or overrides.
71 if test -n "$EXTRA_EM_FILE" ; then
72 source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
75 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
79 gld${EMULATION_NAME}_before_parse (void)
81 #ifndef TARGET_ /* I.e., if not generic. */
82 ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
83 #endif /* not TARGET_ */
85 /* The MSP430 port *needs* linker relaxtion in order to cope with large
86 functions where conditional branches do not fit into a +/- 1024 byte range. */
87 if (!bfd_link_relocatable (&link_info))
88 TARGET_ENABLE_RELAXATION;
94 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
98 gld${EMULATION_NAME}_get_script (int *isfile)
101 if test x"$COMPILE_IN" = xyes
103 # Scripts compiled in.
105 # sed commands to quote an ld script as a C string.
106 sc="-f stringify.sed"
112 if (bfd_link_relocatable (&link_info) && config.build_constructors)
115 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
116 echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
117 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
118 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
119 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
120 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
121 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
122 echo ' ; else return' >> e${EMULATION_NAME}.c
123 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
124 echo '; }' >> e${EMULATION_NAME}.c
127 # Scripts read from the filesystem.
133 if (bfd_link_relocatable (&link_info) && config.build_constructors)
134 return "ldscripts/${EMULATION_NAME}.xu";
135 else if (bfd_link_relocatable (&link_info))
136 return "ldscripts/${EMULATION_NAME}.xr";
137 else if (!config.text_read_only)
138 return "ldscripts/${EMULATION_NAME}.xbn";
139 else if (!config.magic_demand_paged)
140 return "ldscripts/${EMULATION_NAME}.xn";
142 return "ldscripts/${EMULATION_NAME}.x";
148 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
152 data_statement_size (lang_data_statement_type *d)
154 unsigned int size = 0;
171 einfo (_("%P: error: unhandled data_statement size\n"));
177 /* Helper function for place_orphan that computes the size
178 of sections already mapped to the given statement. */
181 scan_children (lang_statement_union_type * l)
183 bfd_size_type amount = 0;
187 switch (l->header.type)
189 case lang_input_section_enum:
190 if (l->input_section.section->flags & SEC_ALLOC)
191 amount += l->input_section.section->size;
194 case lang_constructors_statement_enum:
195 case lang_assignment_statement_enum:
196 case lang_padding_statement_enum:
199 case lang_wild_statement_enum:
200 amount += scan_children (l->wild_statement.children.head);
203 case lang_data_statement_enum:
204 amount += data_statement_size (&l->data_statement);
208 fprintf (stderr, "msp430 orphan placer: unhandled lang type %d\n", l->header.type);
223 #define WARN_RODATA 3
225 /* Warn only once per output section.
226 * NAME starts with ".upper." or ".lower.". */
228 warn_no_output_section (const char *name)
230 static bfd_boolean warned[2][4] = {{FALSE, FALSE, FALSE, FALSE},
231 {FALSE, FALSE, FALSE, FALSE}};
234 if (strncmp (name, ".upper.", 7) == 0)
237 if (!warned[i][WARN_TEXT] && strcmp (name + 6, ".text") == 0)
238 warned[i][WARN_TEXT] = TRUE;
239 else if (!warned[i][WARN_DATA] && strcmp (name + 6, ".data") == 0)
240 warned[i][WARN_DATA] = TRUE;
241 else if (!warned[i][WARN_BSS] && strcmp (name + 6, ".bss") == 0)
242 warned[i][WARN_BSS] = TRUE;
243 else if (!warned[i][WARN_RODATA] && strcmp (name + 6, ".rodata") == 0)
244 warned[i][WARN_RODATA] = TRUE;
247 einfo ("%P: warning: no input section rule matches %s in linker script\n",
252 /* Place an orphan section. We use this to put .either sections
253 into either their lower or their upper equivalents. */
255 static lang_output_section_statement_type *
256 gld${EMULATION_NAME}_place_orphan (asection * s,
257 const char * secname,
264 lang_output_section_statement_type * lower;
265 lang_output_section_statement_type * upper;
267 if ((s->flags & SEC_ALLOC) == 0)
270 if (bfd_link_relocatable (&link_info))
273 /* If constraints are involved let the linker handle the placement normally. */
277 if (strncmp (secname, ".upper.", 7) == 0
278 || strncmp (secname, ".lower.", 7) == 0)
280 warn_no_output_section (secname);
284 /* We only need special handling for .either sections. */
285 if (strncmp (secname, ".either.", 8) != 0)
288 /* Skip the .either prefix. */
291 /* Compute the names of the corresponding upper and lower
292 sections. If the input section name contains another period,
293 only use the part of the name before the second dot. */
294 if (strchr (secname + 1, '.') != NULL)
296 buf = name = xstrdup (secname);
298 * strchr (name + 1, '.') = 0;
301 name = (char *) secname;
303 lower_name = concat (".lower", name, NULL);
304 upper_name = concat (".upper", name, NULL);
306 /* Find the corresponding lower and upper sections. */
307 lower = lang_output_section_find (lower_name);
308 upper = lang_output_section_find (upper_name);
310 if (lower == NULL && upper == NULL)
312 einfo (_("%P: error: no section named %s or %s in linker script\n"),
313 lower_name, upper_name);
316 else if (lower == NULL)
318 lower = lang_output_section_find (name);
321 einfo (_("%P: error: no section named %s in linker script\n"), name);
326 /* Always place orphaned sections in lower. Optimal placement of either
327 sections is performed later, once section sizes have been finalized. */
328 lang_add_section (& lower->children, s, NULL, lower);
342 change_output_section (lang_statement_union_type ** head,
344 lang_output_section_statement_type * new_output_section)
347 lang_statement_union_type * prev = NULL;
348 lang_statement_union_type * curr;
353 switch (curr->header.type)
355 case lang_input_section_enum:
356 is = curr->input_section.section;
359 s->output_section = NULL;
360 lang_add_section (& (new_output_section->children), s, NULL,
362 /* Remove the section from the old output section. */
364 *head = curr->header.next;
366 prev->header.next = curr->header.next;
370 case lang_wild_statement_enum:
371 if (change_output_section (&(curr->wild_statement.children.head),
372 s, new_output_section))
379 curr = curr->header.next;
385 add_region_prefix (bfd *abfd, asection *s,
386 ATTRIBUTE_UNUSED void *unused)
388 const char *curr_name = bfd_get_section_name (abfd, s);
389 int region = REGION_NONE;
391 if (strncmp (curr_name, ".text", 5) == 0)
392 region = code_region;
393 else if (strncmp (curr_name, ".data", 5) == 0)
394 region = data_region;
395 else if (strncmp (curr_name, ".bss", 4) == 0)
396 region = data_region;
397 else if (strncmp (curr_name, ".rodata", 7) == 0)
398 region = data_region;
407 bfd_rename_section (abfd, s, concat (".upper", curr_name, NULL));
410 bfd_rename_section (abfd, s, concat (".lower", curr_name, NULL));
413 s->name = concat (".either", curr_name, NULL);
423 msp430_elf_after_open (void)
427 gld${EMULATION_NAME}_after_open ();
429 /* If neither --code-region or --data-region have been passed, do not
430 transform sections names. */
431 if ((code_region == REGION_NONE && data_region == REGION_NONE)
432 || disable_sec_transformation)
435 for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
436 bfd_map_over_sections (abfd, add_region_prefix, NULL);
439 #define OPTION_CODE_REGION 321
440 #define OPTION_DATA_REGION (OPTION_CODE_REGION + 1)
441 #define OPTION_DISABLE_TRANS (OPTION_CODE_REGION + 2)
444 gld${EMULATION_NAME}_add_options
445 (int ns, char **shortopts, int nl, struct option **longopts,
446 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
448 static const char xtra_short[] = { };
450 static const struct option xtra_long[] =
452 { "code-region", required_argument, NULL, OPTION_CODE_REGION },
453 { "data-region", required_argument, NULL, OPTION_DATA_REGION },
454 { "disable-sec-transformation", no_argument, NULL,
455 OPTION_DISABLE_TRANS },
456 { NULL, no_argument, NULL, 0 }
459 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
460 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
461 *longopts = (struct option *)
462 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
463 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
467 gld${EMULATION_NAME}_list_options (FILE * file)
469 fprintf (file, _(" --code-region={either,lower,upper,none}\n\
470 Transform .text* sections to {either,lower,upper,none}.text* sections\n"));
471 fprintf (file, _(" --data-region={either,lower,upper,none}\n\
472 Transform .data*, .rodata* and .bss* sections to\n\
473 {either,lower,upper,none}.{bss,data,rodata}* sections\n"));
474 fprintf (file, _(" --disable-sec-transformation\n\
475 Disable transformation of .{text,data,bss,rodata}* sections to\n\
476 add the {either,lower,upper,none} prefixes\n"));
480 gld${EMULATION_NAME}_handle_option (int optc)
484 case OPTION_CODE_REGION:
485 if (strcmp (optarg, "upper") == 0)
486 code_region = REGION_UPPER;
487 else if (strcmp (optarg, "lower") == 0)
488 code_region = REGION_LOWER;
489 else if (strcmp (optarg, "either") == 0)
490 code_region = REGION_EITHER;
491 else if (strcmp (optarg, "none") == 0)
492 code_region = REGION_NONE;
493 else if (strlen (optarg) == 0)
495 einfo (_("%P: --code-region requires an argument: "
496 "{upper,lower,either,none}\n"));
501 einfo (_("%P: error: unrecognized argument to --code-region= option: "
502 "\"%s\"\n"), optarg);
507 case OPTION_DATA_REGION:
508 if (strcmp (optarg, "upper") == 0)
509 data_region = REGION_UPPER;
510 else if (strcmp (optarg, "lower") == 0)
511 data_region = REGION_LOWER;
512 else if (strcmp (optarg, "either") == 0)
513 data_region = REGION_EITHER;
514 else if (strcmp (optarg, "none") == 0)
515 data_region = REGION_NONE;
516 else if (strlen (optarg) == 0)
518 einfo (_("%P: --data-region requires an argument: "
519 "{upper,lower,either,none}\n"));
524 einfo (_("%P: error: unrecognized argument to --data-region= option: "
525 "\"%s\"\n"), optarg);
530 case OPTION_DISABLE_TRANS:
531 disable_sec_transformation = TRUE;
541 eval_upper_either_sections (bfd *abfd, asection *s, void *data)
543 const char * base_sec_name;
544 const char * curr_name;
548 lang_output_section_statement_type * lower;
549 lang_output_section_statement_type * upper;
550 static bfd_size_type *lower_size = 0;
551 static bfd_size_type *upper_size = 0;
552 static bfd_size_type lower_size_rom = 0;
553 static bfd_size_type lower_size_ram = 0;
554 static bfd_size_type upper_size_rom = 0;
555 static bfd_size_type upper_size_ram = 0;
557 if ((s->flags & SEC_ALLOC) == 0)
559 if (bfd_link_relocatable (&link_info))
562 base_sec_name = (const char *) data;
563 curr_name = bfd_get_section_name (abfd, s);
565 /* Only concerned with .either input sections in the upper output section. */
566 either_name = concat (".either", base_sec_name, NULL);
567 if (strncmp (curr_name, either_name, strlen (either_name)) != 0
568 || strncmp (s->output_section->name, ".upper", 6) != 0)
571 lower = lang_output_section_find (concat (".lower", base_sec_name, NULL));
572 upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
574 if (upper == NULL || upper->region == NULL)
576 else if (lower == NULL)
577 lower = lang_output_section_find (base_sec_name);
578 if (lower == NULL || lower->region == NULL)
581 if (strcmp (base_sec_name, ".text") == 0
582 || strcmp (base_sec_name, ".rodata") == 0)
587 if (curr_region == ROM)
589 if (lower_size_rom == 0)
591 lower_size_rom = lower->region->current - lower->region->origin;
592 upper_size_rom = upper->region->current - upper->region->origin;
594 lower_size = &lower_size_rom;
595 upper_size = &upper_size_rom;
597 else if (curr_region == RAM)
599 if (lower_size_ram == 0)
601 lower_size_ram = lower->region->current - lower->region->origin;
602 upper_size_ram = upper->region->current - upper->region->origin;
604 lower_size = &lower_size_ram;
605 upper_size = &upper_size_ram;
608 /* Move sections in the upper region that would fit in the lower
609 region to the lower region. */
610 if (*lower_size + s->size < lower->region->length)
612 if (change_output_section (&(upper->children.head), s, lower))
614 *upper_size -= s->size;
615 *lower_size += s->size;
623 eval_lower_either_sections (bfd *abfd, asection *s, void *data)
625 const char * base_sec_name;
626 const char * curr_name;
629 lang_output_section_statement_type * output_sec;
630 lang_output_section_statement_type * lower;
631 lang_output_section_statement_type * upper;
633 static bfd_size_type *lower_size = 0;
634 static bfd_size_type lower_size_rom = 0;
635 static bfd_size_type lower_size_ram = 0;
637 if ((s->flags & SEC_ALLOC) == 0)
639 if (bfd_link_relocatable (&link_info))
642 base_sec_name = (const char *) data;
643 curr_name = bfd_get_section_name (abfd, s);
645 /* Only concerned with .either input sections in the lower or "default"
646 output section i.e. not in the upper output section. */
647 either_name = concat (".either", base_sec_name, NULL);
648 if (strncmp (curr_name, either_name, strlen (either_name)) != 0
649 || strncmp (s->output_section->name, ".upper", 6) == 0)
652 if (strcmp (base_sec_name, ".text") == 0
653 || strcmp (base_sec_name, ".rodata") == 0)
658 output_sec = lang_output_section_find (s->output_section->name);
660 /* If the output_section doesn't exist, this has already been reported in
661 place_orphan, so don't need to warn again. */
662 if (output_sec == NULL || output_sec->region == NULL)
665 /* lower and output_sec might be the same, but in some cases an .either
666 section can end up in base_sec_name if it hasn't been placed by
668 lower = lang_output_section_find (concat (".lower", base_sec_name, NULL));
669 upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
673 if (curr_region == ROM)
675 if (lower_size_rom == 0)
677 /* Get the size of other items in the lower region that aren't the
678 sections to be moved around. */
680 = (output_sec->region->current - output_sec->region->origin)
681 - scan_children (output_sec->children.head);
682 if (output_sec != lower && lower != NULL)
683 lower_size_rom -= scan_children (lower->children.head);
685 lower_size = &lower_size_rom;
687 else if (curr_region == RAM)
689 if (lower_size_ram == 0)
692 = (output_sec->region->current - output_sec->region->origin)
693 - scan_children (output_sec->children.head);
694 if (output_sec != lower && lower != NULL)
695 lower_size_ram -= scan_children (lower->children.head);
697 lower_size = &lower_size_ram;
699 /* Move sections that cause the lower region to overflow to the upper region. */
700 if (*lower_size + s->size > output_sec->region->length)
701 change_output_section (&(output_sec->children.head), s, upper);
703 *lower_size += s->size;
708 /* This function is similar to lang_relax_sections, but without the size
709 evaluation code that is always executed after relaxation. */
711 intermediate_relax_sections (void)
713 int i = link_info.relax_pass;
715 /* The backend can use it to determine the current pass. */
716 link_info.relax_pass = 0;
720 bfd_boolean relax_again;
722 link_info.relax_trip = -1;
725 link_info.relax_trip++;
727 lang_do_assignments (lang_assigning_phase_enum);
729 lang_reset_memory_regions ();
732 lang_size_sections (&relax_again, FALSE);
736 link_info.relax_pass++;
741 msp430_elf_after_allocation (void)
745 /* Go over each section twice, once to place either sections that don't fit
746 in lower into upper, and then again to move any sections in upper that
747 fit in lower into lower. */
748 for (i = 0; i < 8; i++)
750 int placement_stage = (i < 4) ? LOWER_TO_UPPER : UPPER_TO_LOWER;
751 const char * base_sec_name;
752 lang_output_section_statement_type * upper;
758 base_sec_name = ".text";
761 base_sec_name = ".data";
764 base_sec_name = ".bss";
767 base_sec_name = ".rodata";
770 upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
773 /* Can't just use one iteration over the all the sections to make
774 both lower->upper and upper->lower transformations because the
775 iterator encounters upper sections before all lower sections have
779 if (placement_stage == LOWER_TO_UPPER)
781 /* Perform relaxation and get the final size of sections
782 before trying to fit .either sections in the correct
784 if (relax_count == 0)
786 intermediate_relax_sections ();
789 for (abfd = link_info.input_bfds; abfd != NULL;
790 abfd = abfd->link.next)
792 bfd_map_over_sections (abfd, eval_lower_either_sections,
793 (void *) base_sec_name);
796 else if (placement_stage == UPPER_TO_LOWER)
798 /* Relax again before moving upper->lower. */
799 if (relax_count == 1)
801 intermediate_relax_sections ();
804 for (abfd = link_info.input_bfds; abfd != NULL;
805 abfd = abfd->link.next)
807 bfd_map_over_sections (abfd, eval_upper_either_sections,
808 (void *) base_sec_name);
814 gld${EMULATION_NAME}_after_allocation ();
817 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
819 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
820 ${LDEMUL_SYSLIB-syslib_default},
821 ${LDEMUL_HLL-hll_default},
822 ${LDEMUL_AFTER_PARSE-after_parse_default},
823 msp430_elf_after_open,
824 after_check_relocs_default,
825 msp430_elf_after_allocation,
826 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
827 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
828 ${LDEMUL_BEFORE_ALLOCATION-before_allocation_default},
829 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
832 ${LDEMUL_FINISH-finish_default},
833 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
834 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-NULL},
835 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
836 ${LDEMUL_SET_SYMBOLS-NULL},
837 ${LDEMUL_PARSE_ARGS-NULL},
838 gld${EMULATION_NAME}_add_options,
839 gld${EMULATION_NAME}_handle_option,
840 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
841 gld${EMULATION_NAME}_list_options,
842 ${LDEMUL_RECOGNIZED_FILE-NULL},
843 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
844 ${LDEMUL_NEW_VERS_PATTERN-NULL},
845 ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}