Home | History | Annotate | Download | only in emultempl
      1 # This shell script emits a C file. -*- C -*-
      2 # It does some substitutions.
      3 fragment <<EOF
      4 /* This file is is generated by a shell script.  DO NOT EDIT! */
      5 
      6 /* Emulate the original gld for the given ${EMULATION_NAME}
      7    Copyright (C) 2014-2016 Free Software Foundation, Inc.
      8    Written by Steve Chamberlain steve (a] cygnus.com
      9    Extended for the MSP430 by Nick Clifton  nickc (a] redhat.com
     10    
     11    This file is part of the GNU Binutils.
     12 
     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.
     17 
     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.
     22 
     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.  */
     27 
     28 #define TARGET_IS_${EMULATION_NAME}
     29 
     30 #include "sysdep.h"
     31 #include "bfd.h"
     32 #include "bfdlink.h"
     33 
     34 #include "ld.h"
     35 #include "ldmain.h"
     36 #include "ldmisc.h"
     37 #include "ldexp.h"
     38 #include "ldlang.h"
     39 #include "ldfile.h"
     40 #include "ldemul.h"
     41 #include "libiberty.h"
     42 
     43 EOF
     44 
     45 # Import any needed special functions and/or overrides.
     46 #
     47 if test -n "$EXTRA_EM_FILE" ; then
     48   source_em ${srcdir}/emultempl/${EXTRA_EM_FILE}.em
     49 fi
     50 
     51 if test x"$LDEMUL_BEFORE_PARSE" != xgld"$EMULATION_NAME"_before_parse; then
     52 fragment <<EOF
     53 
     54 static void
     55 gld${EMULATION_NAME}_before_parse (void)
     56 {
     57 #ifndef TARGET_			/* I.e., if not generic.  */
     58   ldfile_set_output_arch ("`echo ${ARCH}`", bfd_arch_unknown);
     59 #endif /* not TARGET_ */
     60 
     61   /* The MSP430 port *needs* linker relaxtion in order to cope with large
     62      functions where conditional branches do not fit into a +/- 1024 byte range.  */
     63   if (!bfd_link_relocatable (&link_info))
     64     TARGET_ENABLE_RELAXATION;
     65 }
     66 
     67 EOF
     68 fi
     69 
     70 if test x"$LDEMUL_GET_SCRIPT" != xgld"$EMULATION_NAME"_get_script; then
     71 fragment <<EOF
     72 
     73 static char *
     74 gld${EMULATION_NAME}_get_script (int *isfile)
     75 EOF
     76 
     77 if test x"$COMPILE_IN" = xyes
     78 then
     79 # Scripts compiled in.
     80 
     81 # sed commands to quote an ld script as a C string.
     82 sc="-f stringify.sed"
     83 
     84 fragment <<EOF
     85 {
     86   *isfile = 0;
     87 
     88   if (bfd_link_relocatable (&link_info) && config.build_constructors)
     89     return
     90 EOF
     91 sed $sc ldscripts/${EMULATION_NAME}.xu                 >> e${EMULATION_NAME}.c
     92 echo '  ; else if (bfd_link_relocatable (&link_info)) return' >> e${EMULATION_NAME}.c
     93 sed $sc ldscripts/${EMULATION_NAME}.xr                 >> e${EMULATION_NAME}.c
     94 echo '  ; else if (!config.text_read_only) return'     >> e${EMULATION_NAME}.c
     95 sed $sc ldscripts/${EMULATION_NAME}.xbn                >> e${EMULATION_NAME}.c
     96 echo '  ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c
     97 sed $sc ldscripts/${EMULATION_NAME}.xn                 >> e${EMULATION_NAME}.c
     98 echo '  ; else return'                                 >> e${EMULATION_NAME}.c
     99 sed $sc ldscripts/${EMULATION_NAME}.x                  >> e${EMULATION_NAME}.c
    100 echo '; }'                                             >> e${EMULATION_NAME}.c
    101 
    102 else
    103 # Scripts read from the filesystem.
    104 
    105 fragment <<EOF
    106 {
    107   *isfile = 1;
    108 
    109   if (bfd_link_relocatable (&link_info) && config.build_constructors)
    110     return "ldscripts/${EMULATION_NAME}.xu";
    111   else if (bfd_link_relocatable (&link_info))
    112     return "ldscripts/${EMULATION_NAME}.xr";
    113   else if (!config.text_read_only)
    114     return "ldscripts/${EMULATION_NAME}.xbn";
    115   else if (!config.magic_demand_paged)
    116     return "ldscripts/${EMULATION_NAME}.xn";
    117   else
    118     return "ldscripts/${EMULATION_NAME}.x";
    119 }
    120 EOF
    121 fi
    122 fi
    123 
    124 if test x"$LDEMUL_PLACE_ORPHAN" != xgld"$EMULATION_NAME"_place_orphan; then
    125 fragment <<EOF
    126 
    127 /* Helper function for place_orphan that computes the size
    128    of sections already mapped to the given statement.  */
    129 
    130 static bfd_size_type
    131 scan_children (lang_statement_union_type * l)
    132 {
    133   bfd_size_type amount = 0;
    134 
    135   while (l != NULL)
    136     {
    137       switch (l->header.type)
    138 	{
    139 	case lang_input_section_enum:
    140 	  if (l->input_section.section->flags & SEC_ALLOC)
    141 	    amount += l->input_section.section->size;
    142 	  break;
    143 
    144 	case lang_constructors_statement_enum:
    145 	case lang_assignment_statement_enum:
    146 	  break;
    147 
    148 	case lang_wild_statement_enum:
    149 	  amount += scan_children (l->wild_statement.children.head);	  
    150 	  break;
    151 
    152 	default:
    153 	  fprintf (stderr, "msp430 orphan placer: unhandled lang type %d\n", l->header.type);
    154 	  break;
    155 	}
    156 
    157       l = l->header.next;
    158     }
    159 
    160   return amount;
    161 }
    162   
    163 /* Place an orphan section.  We use this to put .either sections
    164    into either their lower or their upper equivalents.  */
    165 
    166 static lang_output_section_statement_type *
    167 gld${EMULATION_NAME}_place_orphan (asection * s,
    168 				   const char * secname,
    169 				   int constraint)
    170 {
    171   char * lower_name;
    172   char * upper_name;
    173   char * name;
    174   char * buf = NULL;
    175   lang_output_section_statement_type * lower;
    176   lang_output_section_statement_type * upper;
    177   lang_output_section_statement_type * os;
    178 
    179   if ((s->flags & SEC_ALLOC) == 0)
    180     return NULL;
    181 
    182   if (bfd_link_relocatable (&link_info))
    183     return NULL;
    184 
    185   /* If constraints are involved let the linker handle the placement normally.  */
    186   if (constraint != 0)
    187     return NULL;
    188 
    189   /* We only need special handling for .either sections.  */
    190   if (strncmp (secname, ".either.", 8) != 0)
    191     return NULL;
    192 
    193   /* Skip the .either prefix.  */
    194   secname += 7;
    195 
    196   /* Compute the names of the corresponding upper and lower
    197      sections.  If the input section name contains another period,
    198      only use the part of the name before the second dot.  */
    199   if (strchr (secname + 1, '.') != NULL)
    200     {
    201       buf = name = xstrdup (secname);
    202 
    203       * strchr (name + 1, '.') = 0;
    204     }
    205   else
    206     name = (char *) secname;
    207   
    208   lower_name = concat (".lower", name, NULL);
    209   upper_name = concat (".upper", name, NULL);
    210 
    211   /* Find the corresponding lower and upper sections.  */
    212   lower = lang_output_section_find (lower_name);
    213   upper = lang_output_section_find (upper_name);
    214   /* If the upper section does not exist, try again without the suffix.  */
    215   if (upper == NULL)
    216     upper = lang_output_section_find (name);
    217 
    218   if (lower == NULL)
    219     {
    220       os = upper;
    221       if (upper == NULL)
    222         {
    223           einfo ("%P: error: no section named %s or %s in linker script\n", lower_name, upper_name);
    224 	  goto end;
    225 	}
    226     }
    227   else if (upper == NULL)
    228     os = lower;
    229   else if (lower->region == NULL)
    230     os = lower;
    231   /* If the section is too big for the region containing
    232      the lower section then do not even try to use it.  */
    233   else if (lower->region->length < s->size)
    234     os = upper;
    235   else
    236     {
    237       bfd_size_type amount = 0;
    238       struct lang_output_section_statement_struct * p;
    239 
    240       amount += scan_children (lower->children.head);
    241 
    242       /* Also check forwards for other statements assigned to the same region.  */
    243       for (p = lower->next; p != NULL; p = p->next)
    244 	if (p->region == lower->region)
    245 	  amount += scan_children (p->children.head);
    246 
    247       /* Scan backwards as well.  */      
    248       for (p = lower->prev; p != NULL; p = p->prev)
    249 	if (p->region == lower->region)
    250 	  amount += scan_children (p->children.head);
    251 
    252       if (amount + s->size >= lower->region->length)
    253 	os = upper;
    254       else
    255 	os = lower;
    256     }
    257 
    258   lang_add_section (& os->children, s, NULL, os);
    259  end:
    260   free (upper_name);
    261   free (lower_name);
    262   if (buf)
    263     free (buf);
    264   return os;
    265 }
    266 EOF
    267 fi
    268 
    269 fragment <<EOF
    270 
    271 struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
    272 {
    273   ${LDEMUL_BEFORE_PARSE-gld${EMULATION_NAME}_before_parse},
    274   ${LDEMUL_SYSLIB-syslib_default},
    275   ${LDEMUL_HLL-hll_default},
    276   ${LDEMUL_AFTER_PARSE-after_parse_default},
    277   ${LDEMUL_AFTER_OPEN-after_open_default},
    278   ${LDEMUL_AFTER_ALLOCATION-after_allocation_default},
    279   ${LDEMUL_SET_OUTPUT_ARCH-set_output_arch_default},
    280   ${LDEMUL_CHOOSE_TARGET-ldemul_default_target},
    281   ${LDEMUL_BEFORE_ALLOCATION-before_allocation_default},
    282   ${LDEMUL_GET_SCRIPT-gld${EMULATION_NAME}_get_script},
    283   "${EMULATION_NAME}",
    284   "${OUTPUT_FORMAT}",
    285   ${LDEMUL_FINISH-finish_default},
    286   ${LDEMUL_CREATE_OUTPUT_SECTION_STATEMENTS-NULL},
    287   ${LDEMUL_OPEN_DYNAMIC_ARCHIVE-NULL},
    288   ${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
    289   ${LDEMUL_SET_SYMBOLS-NULL},
    290   ${LDEMUL_PARSE_ARGS-NULL},
    291   ${LDEMUL_ADD_OPTIONS-NULL},
    292   ${LDEMUL_HANDLE_OPTION-NULL},
    293   ${LDEMUL_UNRECOGNIZED_FILE-NULL},
    294   ${LDEMUL_LIST_OPTIONS-NULL},
    295   ${LDEMUL_RECOGNIZED_FILE-NULL},
    296   ${LDEMUL_FIND_POTENTIAL_LIBRARIES-NULL},
    297   ${LDEMUL_NEW_VERS_PATTERN-NULL},
    298   ${LDEMUL_EXTRA_MAP_FILE_TEXT-NULL}
    299 };
    300 EOF
    301 # 
    303 # Local Variables:
    304 # mode: c
    305 # End:
    306