00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "bfd.h"
00032 #include "sysdep.h"
00033 #include "ld.h"
00034 #include "ldexp.h"
00035 #include "ldlang.h"
00036 #include "ldmisc.h"
00037 #include "mri.h"
00038 #include <ldgram.h>
00039 #include "libiberty.h"
00040
00041 struct section_name_struct {
00042 struct section_name_struct *next;
00043 const char *name;
00044 const char *alias;
00045 etree_type *vma;
00046 etree_type *align;
00047 etree_type *subalign;
00048 int ok_to_load;
00049 };
00050
00051 unsigned int symbol_truncate = 10000;
00052 struct section_name_struct *order;
00053 struct section_name_struct *only_load;
00054 struct section_name_struct *address;
00055 struct section_name_struct *alias;
00056
00057 struct section_name_struct *alignment;
00058 struct section_name_struct *subalignment;
00059
00060 static struct section_name_struct **
00061 lookup (const char *name, struct section_name_struct **list)
00062 {
00063 struct section_name_struct **ptr = list;
00064
00065 while (*ptr)
00066 {
00067 if (strcmp (name, (*ptr)->name) == 0)
00068
00069
00070 *ptr = (*ptr)->next;
00071 else
00072 ptr = &((*ptr)->next);
00073 }
00074
00075 *ptr = xmalloc (sizeof (struct section_name_struct));
00076 return ptr;
00077 }
00078
00079 static void
00080 mri_add_to_list (struct section_name_struct **list,
00081 const char *name,
00082 etree_type *vma,
00083 const char *zalias,
00084 etree_type *align,
00085 etree_type *subalign)
00086 {
00087 struct section_name_struct **ptr = lookup (name, list);
00088
00089 (*ptr)->name = name;
00090 (*ptr)->vma = vma;
00091 (*ptr)->next = NULL;
00092 (*ptr)->ok_to_load = 0;
00093 (*ptr)->alias = zalias;
00094 (*ptr)->align = align;
00095 (*ptr)->subalign = subalign;
00096 }
00097
00098 void
00099 mri_output_section (const char *name, etree_type *vma)
00100 {
00101 mri_add_to_list (&address, name, vma, 0, 0, 0);
00102 }
00103
00104
00105
00106
00107 void
00108 mri_only_load (const char *name)
00109 {
00110 mri_add_to_list (&only_load, name, 0, 0, 0, 0);
00111 }
00112
00113 void
00114 mri_base (etree_type *exp)
00115 {
00116 base = exp;
00117 }
00118
00119 static int done_tree = 0;
00120
00121 void
00122 mri_draw_tree (void)
00123 {
00124 if (done_tree)
00125 return;
00126
00127
00128
00129
00130
00131 if (address != NULL)
00132 {
00133 struct section_name_struct *alist;
00134 struct section_name_struct *olist;
00135
00136 if (order == NULL)
00137 order = address;
00138
00139 for (alist = address;
00140 alist != NULL;
00141 alist = alist->next)
00142 {
00143 int done = 0;
00144
00145 for (olist = order; done == 0 && olist != NULL; olist = olist->next)
00146 {
00147 if (strcmp (alist->name, olist->name) == 0)
00148 {
00149 olist->vma = alist->vma;
00150 done = 1;
00151 }
00152 }
00153
00154 if (!done)
00155 {
00156
00157 mri_add_to_list (&order, alist->name, alist->vma, 0, 0, 0);
00158 }
00159 }
00160 }
00161
00162
00163
00164 if (only_load != NULL)
00165 {
00166 struct section_name_struct *ptr1;
00167 struct section_name_struct *ptr2;
00168
00169 if (order == NULL)
00170 order = only_load;
00171
00172
00173 for (ptr1 = only_load; ptr1; ptr1 = ptr1->next)
00174 for (ptr2 = order; ptr2; ptr2 = ptr2->next)
00175 if (strcmp (ptr2->name, ptr1->name) == 0)
00176 ptr2->ok_to_load = 1;
00177 }
00178 else
00179 {
00180
00181 struct section_name_struct *ptr;
00182
00183 for (ptr = order; ptr; ptr = ptr->next)
00184 ptr->ok_to_load = 1;
00185 }
00186
00187
00188 if (order != NULL)
00189 {
00190
00191 struct section_name_struct *p = order;
00192
00193 while (p)
00194 {
00195 struct section_name_struct *aptr;
00196 etree_type *align = 0;
00197 etree_type *subalign = 0;
00198 struct wildcard_list *tmp;
00199
00200
00201 for (aptr = alignment; aptr; aptr = aptr->next)
00202 if (strcmp (aptr->name, p->name) == 0)
00203 align = aptr->align;
00204
00205 for (aptr = subalignment; aptr; aptr = aptr->next)
00206 if (strcmp (aptr->name, p->name) == 0)
00207 subalign = aptr->subalign;
00208
00209 if (base == 0)
00210 base = p->vma ? p->vma : exp_nameop (NAME, ".");
00211
00212 lang_enter_output_section_statement (p->name, base,
00213 p->ok_to_load ? 0 : noload_section,
00214 align, subalign, NULL, 0);
00215 base = 0;
00216 tmp = xmalloc (sizeof *tmp);
00217 tmp->next = NULL;
00218 tmp->spec.name = p->name;
00219 tmp->spec.exclude_name_list = NULL;
00220 tmp->spec.sorted = none;
00221 lang_add_wild (NULL, tmp, FALSE);
00222
00223
00224 for (aptr = alias; aptr; aptr = aptr->next)
00225 if (strcmp (aptr->alias, p->name) == 0)
00226 {
00227 tmp = xmalloc (sizeof *tmp);
00228 tmp->next = NULL;
00229 tmp->spec.name = aptr->name;
00230 tmp->spec.exclude_name_list = NULL;
00231 tmp->spec.sorted = none;
00232 lang_add_wild (NULL, tmp, FALSE);
00233 }
00234
00235 lang_leave_output_section_statement (0, "*default*", NULL, NULL);
00236
00237 p = p->next;
00238 }
00239 }
00240
00241 done_tree = 1;
00242 }
00243
00244 void
00245 mri_load (const char *name)
00246 {
00247 base = 0;
00248 lang_add_input_file (name, lang_input_file_is_file_enum, NULL);
00249 }
00250
00251 void
00252 mri_order (const char *name)
00253 {
00254 mri_add_to_list (&order, name, 0, 0, 0, 0);
00255 }
00256
00257 void
00258 mri_alias (const char *want, const char *is, int isn)
00259 {
00260 if (!is)
00261 {
00262 char buf[20];
00263
00264
00265 sprintf (buf, "%d", isn);
00266
00267 is = xstrdup (buf);
00268
00269 if (is == NULL)
00270 abort ();
00271 }
00272
00273 mri_add_to_list (&alias, is, 0, want, 0, 0);
00274 }
00275
00276 void
00277 mri_name (const char *name)
00278 {
00279 lang_add_output (name, 1);
00280 }
00281
00282 void
00283 mri_format (const char *name)
00284 {
00285 if (strcmp (name, "S") == 0)
00286 lang_add_output_format ("srec", NULL, NULL, 1);
00287
00288 else if (strcmp (name, "IEEE") == 0)
00289 lang_add_output_format ("ieee", NULL, NULL, 1);
00290
00291 else if (strcmp (name, "COFF") == 0)
00292 lang_add_output_format ("coff-m68k", NULL, NULL, 1);
00293
00294 else
00295 einfo (_("%P%F: unknown format type %s\n"), name);
00296 }
00297
00298 void
00299 mri_public (const char *name, etree_type *exp)
00300 {
00301 lang_add_assignment (exp_assop ('=', name, exp));
00302 }
00303
00304 void
00305 mri_align (const char *name, etree_type *exp)
00306 {
00307 mri_add_to_list (&alignment, name, 0, 0, exp, 0);
00308 }
00309
00310 void
00311 mri_alignmod (const char *name, etree_type *exp)
00312 {
00313 mri_add_to_list (&subalignment, name, 0, 0, 0, exp);
00314 }
00315
00316 void
00317 mri_truncate (unsigned int exp)
00318 {
00319 symbol_truncate = exp;
00320 }