1# This shell script emits a C file. -*- C -*- 2# It does some substitutions. 3fragment <<EOF 4/* intel coff loader emulation specific stuff 5 Copyright (C) 1991-2014 Free Software Foundation, Inc. 6 Written by Steve Chamberlain steve@cygnus.com 7 8 This file is part of the GNU Binutils. 9 10 This program is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 3 of the License, or 13 (at your option) any later version. 14 15 This program is distributed in the hope that it will be useful, 16 but WITHOUT ANY WARRANTY; without even the implied warranty of 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 GNU General Public License for more details. 19 20 You should have received a copy of the GNU General Public License 21 along with this program; if not, write to the Free Software 22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 23 MA 02110-1301, USA. */ 24 25#include "sysdep.h" 26#include "libiberty.h" 27#include "bfd.h" 28#include "bfdlink.h" 29 30/*#include "archures.h"*/ 31#include "ld.h" 32#include "ldmain.h" 33#include "ldmisc.h" 34#include "ldexp.h" 35#include "ldlang.h" 36#include "ldfile.h" 37#include "ldemul.h" 38 39typedef struct lib_list { 40 char *name; 41 struct lib_list *next; 42} lib_list_type; 43 44static lib_list_type *hll_list; 45static lib_list_type **hll_list_tail = &hll_list; 46 47static lib_list_type *syslib_list; 48static lib_list_type **syslib_list_tail = &syslib_list; 49 50 51static void 52append (lib_list_type ***list, char *name) 53{ 54 lib_list_type *element = (lib_list_type *) xmalloc (sizeof (lib_list_type)); 55 56 element->name = name; 57 element->next = (lib_list_type *) NULL; 58 **list = element; 59 *list = &element->next; 60 61} 62 63static bfd_boolean had_hll = FALSE; 64static bfd_boolean had_hll_name = FALSE; 65 66static void 67lnk960_hll (char *name) 68{ 69 had_hll = TRUE; 70 if (name != (char *) NULL) 71 { 72 had_hll_name = TRUE; 73 append (&hll_list_tail, name); 74 } 75} 76 77static void 78lnk960_syslib (char *name) 79{ 80 append (&syslib_list_tail, name); 81} 82 83 84static void 85lnk960_before_parse (void) 86{ 87 char *name = getenv ("I960BASE"); 88 89 if (name == (char *) NULL) 90 { 91 name = getenv("G960BASE"); 92 if (name == (char *) NULL) 93 einfo ("%P%F I960BASE and G960BASE not set\n"); 94 } 95 96 ldfile_add_library_path (concat (name, "/lib", (const char *) NULL), FALSE); 97 ldfile_output_architecture = bfd_arch_i960; 98 ldfile_output_machine = bfd_mach_i960_core; 99} 100 101static void 102add_on (lib_list_type *list, lang_input_file_enum_type search) 103{ 104 while (list) 105 { 106 lang_add_input_file (list->name, search, (char *) NULL); 107 list = list->next; 108 } 109} 110 111static void 112lnk960_after_parse (void) 113{ 114 /* If there has been no arch, default to -KB */ 115 if (ldfile_output_machine_name[0] == 0) 116 ldfile_add_arch ("KB"); 117 118 /* if there has been no hll list then add our own */ 119 120 if (had_hll && !had_hll_name) 121 { 122 append (&hll_list_tail, "cg"); 123 if (ldfile_output_machine == bfd_mach_i960_ka_sa 124 || ldfile_output_machine == bfd_mach_i960_ca) 125 append (&hll_list_tail, "fpg"); 126 } 127 128 add_on (hll_list, lang_input_file_is_l_enum); 129 add_on (syslib_list, lang_input_file_is_search_file_enum); 130} 131 132static void 133lnk960_after_allocation (void) 134{ 135 if (!link_info.relocatable) 136 { 137 lang_abs_symbol_at_end_of (".text", "_etext"); 138 lang_abs_symbol_at_end_of (".data", "_edata"); 139 lang_abs_symbol_at_beginning_of (".bss", "_bss_start"); 140 lang_abs_symbol_at_end_of (".bss", "_end"); 141 } 142} 143 144 145static struct 146 { 147 unsigned long number; 148 char *name; 149 } 150machine_table[] = 151{ 152 { bfd_mach_i960_core ,"CORE" }, 153 { bfd_mach_i960_kb_sb ,"KB" }, 154 { bfd_mach_i960_kb_sb ,"SB" }, 155 { bfd_mach_i960_mc ,"MC" }, 156 { bfd_mach_i960_xa ,"XA" }, 157 { bfd_mach_i960_ca ,"CA" }, 158 { bfd_mach_i960_ka_sa ,"KA" }, 159 { bfd_mach_i960_ka_sa ,"SA" }, 160 { bfd_mach_i960_jx ,"JX" }, 161 { bfd_mach_i960_hx ,"HX" }, 162 163 { bfd_mach_i960_core ,"core" }, 164 { bfd_mach_i960_kb_sb ,"kb" }, 165 { bfd_mach_i960_kb_sb ,"sb" }, 166 { bfd_mach_i960_mc ,"mc" }, 167 { bfd_mach_i960_xa ,"xa" }, 168 { bfd_mach_i960_ca ,"ca" }, 169 { bfd_mach_i960_ka_sa ,"ka" }, 170 { bfd_mach_i960_ka_sa ,"sa" }, 171 { bfd_mach_i960_jx ,"jx" }, 172 { bfd_mach_i960_hx ,"hx" }, 173 174 { 0, (char *) NULL } 175}; 176 177static void 178lnk960_set_output_arch (void) 179{ 180 /* Set the output architecture and machine if possible */ 181 unsigned int i; 182 ldfile_output_machine = bfd_mach_i960_core; 183 for (i= 0; machine_table[i].name != (char*) NULL; i++) 184 { 185 if (strcmp (ldfile_output_machine_name, machine_table[i].name) == 0) 186 { 187 ldfile_output_machine = machine_table[i].number; 188 break; 189 } 190 } 191 bfd_set_arch_mach (link_info.output_bfd, ldfile_output_architecture, 192 ldfile_output_machine); 193} 194 195static char * 196lnk960_choose_target (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) 197{ 198 char *from_outside = getenv (TARGET_ENVIRON); 199 if (from_outside != (char *) NULL) 200 return from_outside; 201#ifdef LNK960_LITTLE 202 return "coff-Intel-little"; 203#else 204 return "coff-Intel-big"; 205#endif 206} 207 208static char * 209lnk960_get_script (int *isfile) 210EOF 211 212if test x"$COMPILE_IN" = xyes 213then 214# Scripts compiled in. 215 216# sed commands to quote an ld script as a C string. 217sc="-f stringify.sed" 218 219fragment <<EOF 220{ 221 *isfile = 0; 222 223 if (link_info.relocatable && config.build_constructors) 224 return 225EOF 226sed $sc ldscripts/${EMULATION_NAME}.xu >> e${EMULATION_NAME}.c 227echo ' ; else if (link_info.relocatable) return' >> e${EMULATION_NAME}.c 228sed $sc ldscripts/${EMULATION_NAME}.xr >> e${EMULATION_NAME}.c 229echo ' ; else if (!config.text_read_only) return' >> e${EMULATION_NAME}.c 230sed $sc ldscripts/${EMULATION_NAME}.xbn >> e${EMULATION_NAME}.c 231echo ' ; else if (!config.magic_demand_paged) return' >> e${EMULATION_NAME}.c 232sed $sc ldscripts/${EMULATION_NAME}.xn >> e${EMULATION_NAME}.c 233echo ' ; else return' >> e${EMULATION_NAME}.c 234sed $sc ldscripts/${EMULATION_NAME}.x >> e${EMULATION_NAME}.c 235echo '; }' >> e${EMULATION_NAME}.c 236 237else 238# Scripts read from the filesystem. 239 240fragment <<EOF 241{ 242 *isfile = 1; 243 244 if (link_info.relocatable && config.build_constructors) 245 return "ldscripts/${EMULATION_NAME}.xu"; 246 else if (link_info.relocatable) 247 return "ldscripts/${EMULATION_NAME}.xr"; 248 else if (!config.text_read_only) 249 return "ldscripts/${EMULATION_NAME}.xbn"; 250 else if (!config.magic_demand_paged) 251 return "ldscripts/${EMULATION_NAME}.xn"; 252 else 253 return "ldscripts/${EMULATION_NAME}.x"; 254} 255EOF 256 257fi 258 259fragment <<EOF 260 261struct ld_emulation_xfer_struct ld_lnk960_emulation = 262{ 263 lnk960_before_parse, 264 lnk960_syslib, 265 lnk960_hll, 266 lnk960_after_parse, 267 after_open_default, 268 lnk960_after_allocation, 269 lnk960_set_output_arch, 270 lnk960_choose_target, 271 before_allocation_default, 272 lnk960_get_script, 273 "lnk960", 274 "", 275 finish_default, 276 NULL, /* create output section statements */ 277 NULL, /* open dynamic archive */ 278 NULL, /* place orphan */ 279 NULL, /* set symbols */ 280 NULL, /* parse args */ 281 NULL, /* add_options */ 282 NULL, /* handle_option */ 283 NULL, /* unrecognized file */ 284 NULL, /* list options */ 285 NULL, /* recognized file */ 286 NULL, /* find_potential_libraries */ 287 NULL, /* new_vers_pattern */ 288 NULL /* extra_map_file_text */ 289}; 290EOF 291