diff options
Diffstat (limited to 'ld/mri.c')
-rw-r--r-- | ld/mri.c | 350 |
1 files changed, 164 insertions, 186 deletions
@@ -1,5 +1,6 @@ /* mri.c -- handle MRI style linker scripts - Copyright (C) 1991, 92, 93, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc. + Copyright 1991, 92, 93, 94, 95, 96, 1997, 1998, 2000 + Free Software Foundation, Inc. This file is part of GLD, the Gnu Linker. @@ -16,16 +17,12 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GLD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA -02111-1307, USA. */ +02111-1307, USA. + This bit does the tree decoration when MRI style link scripts + are parsed. -/* This bit does the tree decoration when MRI style link scripts are parsed */ - -/* - contributed by Steve Chamberlain - sac@cygnus.com - -*/ + Contributed by Steve Chamberlain <sac@cygnus.com>. */ #include "bfd.h" #include "sysdep.h" @@ -37,7 +34,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "ldgram.h" #include "libiberty.h" -struct section_name_struct { +struct section_name_struct +{ struct section_name_struct *next; CONST char *name; CONST char *alias; @@ -45,7 +43,7 @@ struct section_name_struct { etree_type *align; etree_type *subalign; int ok_to_load; -} ; +}; unsigned int symbol_truncate = 10000; struct section_name_struct *order; @@ -68,21 +66,19 @@ lookup (name, list) CONST char *name; struct section_name_struct **list; { - struct section_name_struct **ptr = list; + while (*ptr) - { - if (strcmp(name, (*ptr)->name) == 0) { - /* If this is a match, delete it, we only keep the last instance - of any name */ - *ptr = (*ptr)->next; - } - else { - ptr = &((*ptr)->next); + { + if (strcmp (name, (*ptr)->name) == 0) + /* If this is a match, delete it, we only keep the last instance + of any name. */ + *ptr = (*ptr)->next; + else + ptr = &((*ptr)->next); } - } - *ptr = (struct section_name_struct *)xmalloc(sizeof(struct section_name_struct)); + *ptr = (struct section_name_struct *) xmalloc (sizeof (struct section_name_struct)); return ptr; } @@ -95,36 +91,35 @@ mri_add_to_list (list, name, vma, zalias, align, subalign) etree_type *align; etree_type *subalign; { - struct section_name_struct **ptr = lookup(name,list); + struct section_name_struct **ptr = lookup (name,list); + (*ptr)->name = name; (*ptr)->vma = vma; - (*ptr)->next = (struct section_name_struct *)NULL; + (*ptr)->next = (struct section_name_struct *) NULL; (*ptr)->ok_to_load = 0; (*ptr)->alias = zalias; (*ptr)->align = align; (*ptr)->subalign = subalign; } - void mri_output_section (name, vma) CONST char *name; etree_type *vma; { - mri_add_to_list(&address, name, vma, 0,0,0); + mri_add_to_list (& address, name, vma, 0,0,0); } -/* if any ABSOLUTE <name> are in the script, only load those files -marked thus */ +/* If any ABSOLUTE <name> are in the script, only load those files + marked thus. */ void mri_only_load (name) CONST char *name; { - mri_add_to_list(&only_load, name, 0, 0,0,0); + mri_add_to_list (&only_load, name, 0, 0,0,0); } - void mri_base (exp) etree_type *exp; @@ -137,162 +132,149 @@ static int done_tree = 0; void mri_draw_tree () { - if (done_tree) return; - - /* We don't bother with memory regions. */ -#if 0 - /* Create the regions */ - { - lang_memory_region_type *r; - r = lang_memory_region_lookup("long"); - r->current = r->origin = exp_get_vma(base, (bfd_vma)0, "origin", - lang_first_phase_enum); - r->length = (bfd_size_type) exp_get_vma(0, (bfd_vma) ~((bfd_size_type)0), - "length", lang_first_phase_enum); - } + if (done_tree) + return; + +#if 0 /* We don't bother with memory regions. */ + /* Create the regions. */ + { + lang_memory_region_type *r; + + r = lang_memory_region_lookup("long"); + r->current = r->origin = exp_get_vma (base, (bfd_vma)0, "origin", + lang_first_phase_enum); + r->length = (bfd_size_type) exp_get_vma (0, (bfd_vma) ~((bfd_size_type)0), + "length", lang_first_phase_enum); + } #endif - /* Now build the statements for the ldlang machine */ - + /* Now build the statements for the ldlang machine. */ - /* Attatch the addresses of any which have addresses, and add the - ones not mentioned */ - if (address != (struct section_name_struct *)NULL) { - struct section_name_struct *alist; - struct section_name_struct *olist; - if (order == (struct section_name_struct *)NULL) { - order = address; - } - - for (alist = address; - alist != (struct section_name_struct*)NULL; - alist = alist->next) + /* Attatch the addresses of any which have addresses, + and add the ones not mentioned. */ + if (address != (struct section_name_struct *)NULL) { - int done = 0; - for (olist = order; - done == 0 && - olist != (struct section_name_struct *)NULL; - olist = olist->next) - { - if (strcmp(alist->name, olist->name) == 0) + struct section_name_struct *alist; + struct section_name_struct *olist; + + if (order == (struct section_name_struct *)NULL) + order = address; + + for (alist = address; + alist != (struct section_name_struct*)NULL; + alist = alist->next) { - olist->vma = alist->vma; - done = 1; + int done = 0; + + for (olist = order; + done == 0 && + olist != (struct section_name_struct *)NULL; + olist = olist->next) + { + if (strcmp (alist->name, olist->name) == 0) + { + olist->vma = alist->vma; + done = 1; + } + } + + if (!done) + { + /* Add this onto end of order list. */ + mri_add_to_list (& order, alist->name, alist->vma, 0,0,0); + } } - } - if (!done) { - /* add this onto end of order list */ - mri_add_to_list(&order, alist->name, alist->vma, 0,0,0); - } - } - } - /* If we're only supposed to load a subset of them in, then prune the list. */ - if (only_load != (struct section_name_struct *)NULL) - { - struct section_name_struct *ptr1; - struct section_name_struct *ptr2; - if (order == (struct section_name_struct*)NULL) - order = only_load; - - /* See if this name is in the list, if it is then we can load it - */ - for (ptr1 = only_load; ptr1; ptr1 = ptr1->next) { - for (ptr2= order; ptr2; ptr2=ptr2->next) - { - if (strcmp(ptr2->name, ptr1->name)==0) { - ptr2->ok_to_load = 1; - } - } + struct section_name_struct *ptr1; + struct section_name_struct *ptr2; + + if (order == (struct section_name_struct*)NULL) + order = only_load; + + /* See if this name is in the list, if it is then we can load it. */ + for (ptr1 = only_load; ptr1; ptr1 = ptr1->next) + for (ptr2 = order; ptr2; ptr2 = ptr2->next) + if (strcmp (ptr2->name, ptr1->name) == 0) + ptr2->ok_to_load = 1; } - } else - { - /* No only load list, so everything is ok to load */ - struct section_name_struct *ptr; - for (ptr = order; ptr; ptr=ptr->next) { - ptr->ok_to_load = 1; - } + { + /* No only load list, so everything is ok to load. */ + struct section_name_struct *ptr; + + for (ptr = order; ptr; ptr=ptr->next) + ptr->ok_to_load = 1; } - - - /* Create the order of sections to load */ + /* Create the order of sections to load. */ if (order != (struct section_name_struct *)NULL) - { - /* Been told to output the sections in a certain order */ - struct section_name_struct *p = order; - while (p) { - struct section_name_struct *aptr; - etree_type *align = 0; - etree_type *subalign = 0; - /* See if an alignment has been specified */ - - for (aptr = alignment; aptr; aptr= aptr->next) - { - if (strcmp(aptr->name, p->name)==0) { - align = aptr->align; - } - } - - for (aptr = subalignment; aptr; aptr= aptr->next) - { - if (strcmp(aptr->name, p->name)==0) { - subalign = aptr->subalign; - } - } - - if (base == 0) { - base = p->vma ? p->vma :exp_nameop(NAME, "."); - } - lang_enter_output_section_statement (p->name, base, - p->ok_to_load ? 0 : noload_section, - 1, align, subalign, - (etree_type *) NULL); - base = 0; - lang_add_wild (p->name, false, (char *)NULL, false, false, NULL); - /* If there is an alias for this section, add it too */ - for (aptr = alias; aptr; aptr = aptr->next) { - - if (strcmp(aptr->alias, p->name)== 0) { - lang_add_wild (aptr->name, false, (char *)NULL, false, false, NULL); + /* Been told to output the sections in a certain order. */ + struct section_name_struct *p = order; + + while (p) + { + struct section_name_struct *aptr; + etree_type *align = 0; + etree_type *subalign = 0; + + /* See if an alignment has been specified. */ + for (aptr = alignment; aptr; aptr= aptr->next) + if (strcmp (aptr->name, p->name) == 0) + align = aptr->align; + + for (aptr = subalignment; aptr; aptr= aptr->next) + if (strcmp (aptr->name, p->name) == 0) + subalign = aptr->subalign; + + if (base == 0) + base = p->vma ? p->vma :exp_nameop (NAME, "."); + + lang_enter_output_section_statement (p->name, base, + p->ok_to_load ? 0 : noload_section, + 1, align, subalign, + (etree_type *) NULL); + base = 0; + lang_add_wild (p->name, false, (char *)NULL, false, false, NULL); + + /* If there is an alias for this section, add it too. */ + for (aptr = alias; aptr; aptr = aptr->next) + if (strcmp (aptr->alias, p->name) == 0) + lang_add_wild (aptr->name, false, (char *)NULL, false, false, NULL); + + lang_leave_output_section_statement + (0, "*default*", (struct lang_output_section_phdr_list *) NULL, + "*default*"); + + p = p->next; } - } - - lang_leave_output_section_statement - (0, "*default*", (struct lang_output_section_phdr_list *) NULL, - "*default*"); - - p = p->next; } - } - done_tree = 1; - } + void mri_load (name) CONST char *name; { base = 0; - lang_add_input_file(name, - lang_input_file_is_file_enum, (char *)NULL); - /* lang_leave_output_section_statement(0,"*default*");*/ + lang_add_input_file (name, + lang_input_file_is_file_enum, (char *)NULL); +#if 0 + lang_leave_output_section_statement (0,"*default*"); +#endif } - void mri_order (name) CONST char *name; { - mri_add_to_list(&order, name, 0, 0,0,0); + mri_add_to_list (& order, name, 0, 0,0,0); } void @@ -301,56 +283,52 @@ mri_alias (want, is, isn) CONST char *is; int isn; { - if (!is) { - /* Some sections are digits - */ - char buf[20]; - sprintf(buf, "%d", isn); - is = xstrdup (buf); - if (is == NULL) - abort (); - } - mri_add_to_list(&alias, is, 0, want,0,0); - + if (!is) + { + char buf[20]; + + /* Some sections are digits. */ + sprintf (buf, "%d", isn); + + is = xstrdup (buf); + + if (is == NULL) + abort (); + } + + mri_add_to_list (& alias, is, 0, want,0,0); } - void mri_name (name) CONST char *name; { - lang_add_output(name, 1); - + lang_add_output (name, 1); } - void mri_format (name) CONST char *name; { - if (strcmp(name, "S") == 0) - { - lang_add_output_format("srec", (char *) NULL, (char *) NULL, 1); - } - else if (strcmp(name, "IEEE") == 0) - { - lang_add_output_format("ieee", (char *) NULL, (char *) NULL, 1); - } - else if (strcmp(name, "COFF") == 0) - { - lang_add_output_format("coff-m68k", (char *) NULL, (char *) NULL, 1); - } - else { - einfo(_("%P%F: unknown format type %s\n"), name); - } + if (strcmp (name, "S") == 0) + lang_add_output_format ("srec", (char *) NULL, (char *) NULL, 1); + + else if (strcmp (name, "IEEE") == 0) + lang_add_output_format ("ieee", (char *) NULL, (char *) NULL, 1); + + else if (strcmp (name, "COFF") == 0) + lang_add_output_format ("coff-m68k", (char *) NULL, (char *) NULL, 1); + + else + einfo (_("%P%F: unknown format type %s\n"), name); } - void mri_public (name, exp) CONST char *name; etree_type *exp; { - lang_add_assignment(exp_assop('=', name, exp)); + lang_add_assignment (exp_assop ('=', name, exp)); } void @@ -358,7 +336,7 @@ mri_align (name, exp) CONST char *name; etree_type *exp; { - mri_add_to_list(&alignment, name,0,0,exp,0); + mri_add_to_list (& alignment, name, 0, 0, exp, 0); } void @@ -366,13 +344,13 @@ mri_alignmod (name, exp) CONST char *name; etree_type *exp; { - mri_add_to_list(&subalignment, name,0,0,0,exp); + mri_add_to_list (& subalignment, name, 0, 0, 0, exp); } - void mri_truncate (exp) unsigned int exp; { symbol_truncate = exp; } + |