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}
43 #include "libiberty.h"
54 enum either_placement_stage
62 static int data_region = REGION_NONE;
63 static int code_region = REGION_NONE;
64 static bfd_boolean disable_sec_transformation = FALSE;
66 #define MAX_PREFIX_LENGTH 7
70 # Import any needed special functions and/or overrides.
72 if test -n "$EXTRA_EM_FILE" ; then
73 source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
76 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
80 gld${EMULATION_NAME}_before_parse (void)
82 #ifndef TARGET_ /* I.e., if not generic. */
83 ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
84 #endif /* not TARGET_ */
86 /* The MSP430 port *needs* linker relaxtion in order to cope with large
87 functions where conditional branches do not fit into a +/- 1024 byte range. */
88 if (!bfd_link_relocatable (&link_info))
89 TARGET_ENABLE_RELAXATION;
95 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
99 gld${EMULATION_NAME}_get_script (int *isfile)
102 if test x"$COMPILE_IN" = xyes
104 # Scripts compiled in.
106 # sed commands to quote an ld script as a C string.
107 sc="-f stringify.sed"
113 if (bfd_link_relocatable (&link_info) && config.build_constructors)
116 sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c
117 echo ' ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
118 sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c
119 echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c
120 sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c
121 echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
122 sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c
123 echo ' ; else return' >> e${EMULATION_NAME}.c
124 sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c
125 echo '; }' >> e${EMULATION_NAME}.c
128 # Scripts read from the filesystem.
134 if (bfd_link_relocatable (&link_info) && config.build_constructors)
135 return "ldscripts/${EMULATION_NAME}.xu";
136 else if (bfd_link_relocatable (&link_info))
137 return "ldscripts/${EMULATION_NAME}.xr";
138 else if (!config.text_read_only)
139 return "ldscripts/${EMULATION_NAME}.xbn";
140 else if (!config.magic_demand_paged)
141 return "ldscripts/${EMULATION_NAME}.xn";
143 return "ldscripts/${EMULATION_NAME}.x";
149 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
153 data_statement_size (lang_data_statement_type *d)
155 unsigned int size = 0;
172 einfo (_("%P: error: unhandled data_statement size\n"));
178 /* Helper function for place_orphan that computes the size
179 of sections already mapped to the given statement. */
182 scan_children (lang_statement_union_type * l)
184 bfd_size_type amount = 0;
188 switch (l->header.type)
190 case lang_input_section_enum:
191 if (l->input_section.section->flags & SEC_ALLOC)
192 amount += l->input_section.section->size;
195 case lang_constructors_statement_enum:
196 case lang_assignment_statement_enum:
197 case lang_padding_statement_enum:
200 case lang_wild_statement_enum:
201 amount += scan_children (l->wild_statement.children.head);
204 case lang_data_statement_enum:
205 amount += data_statement_size (&l->data_statement);
209 fprintf (stderr, "msp430 orphan placer: unhandled lang type %d\n", l->header.type);
224 #define WARN_RODATA 3
226 /* Warn only once per output section.
227 * NAME starts with ".upper." or ".lower.". */
229 warn_no_output_section (const char *name)
231 static bfd_boolean warned[2][4] = {{FALSE, FALSE, FALSE, FALSE},
232 {FALSE, FALSE, FALSE, FALSE}};
235 if (strncmp (name, ".upper.", 7) == 0)
238 if (!warned[i][WARN_TEXT] && strcmp (name + 6, ".text") == 0)
239 warned[i][WARN_TEXT] = TRUE;
240 else if (!warned[i][WARN_DATA] && strcmp (name + 6, ".data") == 0)
241 warned[i][WARN_DATA] = TRUE;
242 else if (!warned[i][WARN_BSS] && strcmp (name + 6, ".bss") == 0)
243 warned[i][WARN_BSS] = TRUE;
244 else if (!warned[i][WARN_RODATA] && strcmp (name + 6, ".rodata") == 0)
245 warned[i][WARN_RODATA] = TRUE;
248 einfo ("%P: warning: no input section rule matches %s in linker script\n",
253 /* Place an orphan section. We use this to put .either sections
254 into either their lower or their upper equivalents. */
256 static lang_output_section_statement_type *
257 gld${EMULATION_NAME}_place_orphan (asection * s,
258 const char * secname,
265 lang_output_section_statement_type * lower;
266 lang_output_section_statement_type * upper;
268 if ((s->flags & SEC_ALLOC) == 0)
271 if (bfd_link_relocatable (&link_info))
274 /* If constraints are involved let the linker handle the placement normally. */
278 if (strncmp (secname, ".upper.", 7) == 0
279 || strncmp (secname, ".lower.", 7) == 0)
281 warn_no_output_section (secname);
285 /* We only need special handling for .either sections. */
286 if (strncmp (secname, ".either.", 8) != 0)
289 /* Skip the .either prefix. */
292 /* Compute the names of the corresponding upper and lower
293 sections. If the input section name contains another period,
294 only use the part of the name before the second dot. */
295 if (strchr (secname + 1, '.') != NULL)
297 buf = name = xstrdup (secname);
299 * strchr (name + 1, '.') = 0;
302 name = (char *) secname;
304 lower_name = concat (".lower", name, NULL);
305 upper_name = concat (".upper", name, NULL);
307 /* Find the corresponding lower and upper sections. */
308 lower = lang_output_section_find (lower_name);
309 upper = lang_output_section_find (upper_name);
311 if (lower == NULL && upper == NULL)
313 einfo (_("%P: error: no section named %s or %s in linker script\n"),
314 lower_name, upper_name);
317 else if (lower == NULL)
319 lower = lang_output_section_find (name);
322 einfo (_("%P: error: no section named %s in linker script\n"), name);
327 /* Always place orphaned sections in lower. Optimal placement of either
328 sections is performed later, once section sizes have been finalized. */
329 lang_add_section (& lower->children, s, NULL, lower);
343 change_output_section (lang_statement_union_type ** head,
345 lang_output_section_statement_type * new_output_section)
348 lang_statement_union_type * prev = NULL;
349 lang_statement_union_type * curr;
354 switch (curr->header.type)
356 case lang_input_section_enum:
357 is = curr->input_section.section;
360 s->output_section = NULL;
361 lang_add_section (& (new_output_section->children), s, NULL,
363 /* Remove the section from the old output section. */
365 *head = curr->header.next;
367 prev->header.next = curr->header.next;
371 case lang_wild_statement_enum:
372 if (change_output_section (&(curr->wild_statement.children.head),
373 s, new_output_section))
380 curr = curr->header.next;
386 add_region_prefix (bfd *abfd ATTRIBUTE_UNUSED, asection *s,
387 void *unused ATTRIBUTE_UNUSED)
389 const char *curr_name = bfd_section_name (s);
390 int region = REGION_NONE;
392 if (strncmp (curr_name, ".text", 5) == 0)
393 region = code_region;
394 else if (strncmp (curr_name, ".data", 5) == 0)
395 region = data_region;
396 else if (strncmp (curr_name, ".bss", 4) == 0)
397 region = data_region;
398 else if (strncmp (curr_name, ".rodata", 7) == 0)
399 region = data_region;
408 bfd_rename_section (s, concat (".upper", curr_name, NULL));
411 bfd_rename_section (s, concat (".lower", curr_name, NULL));
414 s->name = concat (".either", curr_name, NULL);
424 msp430_elf_after_open (void)
428 gld${EMULATION_NAME}_after_open ();
430 /* If neither --code-region or --data-region have been passed, do not
431 transform sections names. */
432 if ((code_region == REGION_NONE && data_region == REGION_NONE)
433 || disable_sec_transformation)
436 for (abfd = link_info.input_bfds; abfd != NULL; abfd = abfd->link.next)
437 bfd_map_over_sections (abfd, add_region_prefix, NULL);
440 #define OPTION_CODE_REGION 321
441 #define OPTION_DATA_REGION (OPTION_CODE_REGION + 1)
442 #define OPTION_DISABLE_TRANS (OPTION_CODE_REGION + 2)
445 gld${EMULATION_NAME}_add_options
446 (int ns, char **shortopts, int nl, struct option **longopts,
447 int nrl ATTRIBUTE_UNUSED, struct option **really_longopts ATTRIBUTE_UNUSED)
449 static const char xtra_short[] = { };
451 static const struct option xtra_long[] =
453 { "code-region", required_argument, NULL, OPTION_CODE_REGION },
454 { "data-region", required_argument, NULL, OPTION_DATA_REGION },
455 { "disable-sec-transformation", no_argument, NULL,
456 OPTION_DISABLE_TRANS },
457 { NULL, no_argument, NULL, 0 }
460 *shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
461 memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
462 *longopts = (struct option *)
463 xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
464 memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
468 gld${EMULATION_NAME}_list_options (FILE * file)
470 fprintf (file, _(" --code-region={either,lower,upper,none}\n\
471 Transform .text* sections to {either,lower,upper,none}.text* sections\n"));
472 fprintf (file, _(" --data-region={either,lower,upper,none}\n\
473 Transform .data*, .rodata* and .bss* sections to\n\
474 {either,lower,upper,none}.{bss,data,rodata}* sections\n"));
475 fprintf (file, _(" --disable-sec-transformation\n\
476 Disable transformation of .{text,data,bss,rodata}* sections to\n\
477 add the {either,lower,upper,none} prefixes\n"));
481 gld${EMULATION_NAME}_handle_option (int optc)
485 case OPTION_CODE_REGION:
486 if (strcmp (optarg, "upper") == 0)
487 code_region = REGION_UPPER;
488 else if (strcmp (optarg, "lower") == 0)
489 code_region = REGION_LOWER;
490 else if (strcmp (optarg, "either") == 0)
491 code_region = REGION_EITHER;
492 else if (strcmp (optarg, "none") == 0)
493 code_region = REGION_NONE;
494 else if (strlen (optarg) == 0)
496 einfo (_("%P: --code-region requires an argument: "
497 "{upper,lower,either,none}\n"));
502 einfo (_("%P: error: unrecognized argument to --code-region= option: "
503 "\"%s\"\n"), optarg);
508 case OPTION_DATA_REGION:
509 if (strcmp (optarg, "upper") == 0)
510 data_region = REGION_UPPER;
511 else if (strcmp (optarg, "lower") == 0)
512 data_region = REGION_LOWER;
513 else if (strcmp (optarg, "either") == 0)
514 data_region = REGION_EITHER;
515 else if (strcmp (optarg, "none") == 0)
516 data_region = REGION_NONE;
517 else if (strlen (optarg) == 0)
519 einfo (_("%P: --data-region requires an argument: "
520 "{upper,lower,either,none}\n"));
525 einfo (_("%P: error: unrecognized argument to --data-region= option: "
526 "\"%s\"\n"), optarg);
531 case OPTION_DISABLE_TRANS:
532 disable_sec_transformation = TRUE;
542 eval_upper_either_sections (bfd *abfd ATTRIBUTE_UNUSED,
543 asection *s, void *data)
545 const char * base_sec_name;
546 const char * curr_name;
550 lang_output_section_statement_type * lower;
551 lang_output_section_statement_type * upper;
552 static bfd_size_type *lower_size = 0;
553 static bfd_size_type *upper_size = 0;
554 static bfd_size_type lower_size_rom = 0;
555 static bfd_size_type lower_size_ram = 0;
556 static bfd_size_type upper_size_rom = 0;
557 static bfd_size_type upper_size_ram = 0;
559 if ((s->flags & SEC_ALLOC) == 0)
561 if (bfd_link_relocatable (&link_info))
564 base_sec_name = (const char *) data;
565 curr_name = bfd_section_name (s);
567 /* Only concerned with .either input sections in the upper output section. */
568 either_name = concat (".either", base_sec_name, NULL);
569 if (strncmp (curr_name, either_name, strlen (either_name)) != 0
570 || strncmp (s->output_section->name, ".upper", 6) != 0)
573 lower = lang_output_section_find (concat (".lower", base_sec_name, NULL));
574 upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
576 if (upper == NULL || upper->region == NULL)
578 else if (lower == NULL)
579 lower = lang_output_section_find (base_sec_name);
580 if (lower == NULL || lower->region == NULL)
583 if (strcmp (base_sec_name, ".text") == 0
584 || strcmp (base_sec_name, ".rodata") == 0)
589 if (curr_region == ROM)
591 if (lower_size_rom == 0)
593 lower_size_rom = lower->region->current - lower->region->origin;
594 upper_size_rom = upper->region->current - upper->region->origin;
596 lower_size = &lower_size_rom;
597 upper_size = &upper_size_rom;
599 else if (curr_region == RAM)
601 if (lower_size_ram == 0)
603 lower_size_ram = lower->region->current - lower->region->origin;
604 upper_size_ram = upper->region->current - upper->region->origin;
606 lower_size = &lower_size_ram;
607 upper_size = &upper_size_ram;
610 /* Move sections in the upper region that would fit in the lower
611 region to the lower region. */
612 if (*lower_size + s->size < lower->region->length)
614 if (change_output_section (&(upper->children.head), s, lower))
616 *upper_size -= s->size;
617 *lower_size += s->size;
625 eval_lower_either_sections (bfd *abfd ATTRIBUTE_UNUSED,
626 asection *s, void *data)
628 const char * base_sec_name;
629 const char * curr_name;
632 lang_output_section_statement_type * output_sec;
633 lang_output_section_statement_type * lower;
634 lang_output_section_statement_type * upper;
636 static bfd_size_type *lower_size = 0;
637 static bfd_size_type lower_size_rom = 0;
638 static bfd_size_type lower_size_ram = 0;
640 if ((s->flags & SEC_ALLOC) == 0)
642 if (bfd_link_relocatable (&link_info))
645 base_sec_name = (const char *) data;
646 curr_name = bfd_section_name (s);
648 /* Only concerned with .either input sections in the lower or "default"
649 output section i.e. not in the upper output section. */
650 either_name = concat (".either", base_sec_name, NULL);
651 if (strncmp (curr_name, either_name, strlen (either_name)) != 0
652 || strncmp (s->output_section->name, ".upper", 6) == 0)
655 if (strcmp (base_sec_name, ".text") == 0
656 || strcmp (base_sec_name, ".rodata") == 0)
661 output_sec = lang_output_section_find (s->output_section->name);
663 /* If the output_section doesn't exist, this has already been reported in
664 place_orphan, so don't need to warn again. */
665 if (output_sec == NULL || output_sec->region == NULL)
668 /* lower and output_sec might be the same, but in some cases an .either
669 section can end up in base_sec_name if it hasn't been placed by
671 lower = lang_output_section_find (concat (".lower", base_sec_name, NULL));
672 upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
676 if (curr_region == ROM)
678 if (lower_size_rom == 0)
680 /* Get the size of other items in the lower region that aren't the
681 sections to be moved around. */
683 = (output_sec->region->current - output_sec->region->origin)
684 - scan_children (output_sec->children.head);
685 if (output_sec != lower && lower != NULL)
686 lower_size_rom -= scan_children (lower->children.head);
688 lower_size = &lower_size_rom;
690 else if (curr_region == RAM)
692 if (lower_size_ram == 0)
695 = (output_sec->region->current - output_sec->region->origin)
696 - scan_children (output_sec->children.head);
697 if (output_sec != lower && lower != NULL)
698 lower_size_ram -= scan_children (lower->children.head);
700 lower_size = &lower_size_ram;
702 /* Move sections that cause the lower region to overflow to the upper region. */
703 if (*lower_size + s->size > output_sec->region->length)
704 change_output_section (&(output_sec->children.head), s, upper);
706 *lower_size += s->size;
711 /* This function is similar to lang_relax_sections, but without the size
712 evaluation code that is always executed after relaxation. */
714 intermediate_relax_sections (void)
716 int i = link_info.relax_pass;
718 /* The backend can use it to determine the current pass. */
719 link_info.relax_pass = 0;
723 bfd_boolean relax_again;
725 link_info.relax_trip = -1;
728 link_info.relax_trip++;
730 lang_do_assignments (lang_assigning_phase_enum);
732 lang_reset_memory_regions ();
735 lang_size_sections (&relax_again, FALSE);
739 link_info.relax_pass++;
744 msp430_elf_after_allocation (void)
748 /* Go over each section twice, once to place either sections that don't fit
749 in lower into upper, and then again to move any sections in upper that
750 fit in lower into lower. */
751 for (i = 0; i < 8; i++)
753 int placement_stage = (i < 4) ? LOWER_TO_UPPER : UPPER_TO_LOWER;
754 const char * base_sec_name;
755 lang_output_section_statement_type * upper;
761 base_sec_name = ".text";
764 base_sec_name = ".data";
767 base_sec_name = ".bss";
770 base_sec_name = ".rodata";
773 upper = lang_output_section_find (concat (".upper", base_sec_name, NULL));
776 /* Can't just use one iteration over the all the sections to make
777 both lower->upper and upper->lower transformations because the
778 iterator encounters upper sections before all lower sections have
782 if (placement_stage == LOWER_TO_UPPER)
784 /* Perform relaxation and get the final size of sections
785 before trying to fit .either sections in the correct
787 if (relax_count == 0)
789 intermediate_relax_sections ();
792 for (abfd = link_info.input_bfds; abfd != NULL;
793 abfd = abfd->link.next)
795 bfd_map_over_sections (abfd, eval_lower_either_sections,
796 (void *) base_sec_name);
799 else if (placement_stage == UPPER_TO_LOWER)
801 /* Relax again before moving upper->lower. */
802 if (relax_count == 1)
804 intermediate_relax_sections ();
807 for (abfd = link_info.input_bfds; abfd != NULL;
808 abfd = abfd->link.next)
810 bfd_map_over_sections (abfd, eval_upper_either_sections,
811 (void *) base_sec_name);
817 gld${EMULATION_NAME}_after_allocation ();
820 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
822 ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
823 ${LDEMUL_SYSLIB-syslib_default},
824 ${LDEMUL_HLL-hll_default},
825 ${LDEMUL_AFTER_PARSE-after_parse_default},
826 msp430_elf_after_open,
827 after_check_relocs_default,
828 msp430_elf_after_allocation,
829 ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
830 ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
831 ${LDEMUL_BEFORE_ALLOCATION-before_allocation_default},
832 ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
835 ${LDEMUL_FINISH-finish_default},
836 ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
837 ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-NULL},
838 ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
839 ${LDEMUL_SET_SYMBOLS-NULL},
840 ${LDEMUL_PARSE_ARGS-NULL},
841 gld${EMULATION_NAME}_add_options,
842 gld${EMULATION_NAME}_handle_option,
843 ${LDEMUL_UNRECOGNIZED_FILE-NULL},
844 gld${EMULATION_NAME}_list_options,
845 ${LDEMUL_RECOGNIZED_FILE-NULL},
846 ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
847 ${LDEMUL_NEW_VERS_PATTERN-NULL},
848 ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL},
849 ${LDEMUL_EMIT_CTF_EARLY-NULL},
850 ${LDEMUL_EXAMINE_STRTAB_FOR_CTF-NULL}