OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.18.50/] [ld/] [mri.c] - Blame information for rev 327

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
/* mri.c -- handle MRI style linker scripts
2
   Copyright 1991, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001,
3
   2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
4
   Contributed by Steve Chamberlain <sac@cygnus.com>.
5
 
6
   This file is part of the GNU Binutils.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 3 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21
   MA 02110-1301, USA.  */
22
 
23
 
24
/* This bit does the tree decoration when MRI style link scripts
25
   are parsed.  */
26
 
27
#include "sysdep.h"
28
#include "bfd.h"
29
#include "ld.h"
30
#include "ldexp.h"
31
#include "ldlang.h"
32
#include "ldmisc.h"
33
#include "mri.h"
34
#include <ldgram.h>
35
#include "libiberty.h"
36
 
37
struct section_name_struct {
38
  struct section_name_struct *next;
39
  const char *name;
40
  const char *alias;
41
  etree_type *vma;
42
  etree_type *align;
43
  etree_type *subalign;
44
  int ok_to_load;
45
};
46
 
47
static unsigned int symbol_truncate = 10000;
48
static struct section_name_struct *order;
49
static struct section_name_struct *only_load;
50
static struct section_name_struct *address;
51
static struct section_name_struct *alias;
52
 
53
static struct section_name_struct *alignment;
54
static struct section_name_struct *subalignment;
55
 
56
static struct section_name_struct **
57
lookup (const char *name, struct section_name_struct **list)
58
{
59
  struct section_name_struct **ptr = list;
60
 
61
  while (*ptr)
62
    {
63
      if (strcmp (name, (*ptr)->name) == 0)
64
        /* If this is a match, delete it, we only keep the last instance
65
           of any name.  */
66
        *ptr = (*ptr)->next;
67
      else
68
        ptr = &((*ptr)->next);
69
    }
70
 
71
  *ptr = xmalloc (sizeof (struct section_name_struct));
72
  return ptr;
73
}
74
 
75
static void
76
mri_add_to_list (struct section_name_struct **list,
77
                 const char *name,
78
                 etree_type *vma,
79
                 const char *zalias,
80
                 etree_type *align,
81
                 etree_type *subalign)
82
{
83
  struct section_name_struct **ptr = lookup (name, list);
84
 
85
  (*ptr)->name = name;
86
  (*ptr)->vma = vma;
87
  (*ptr)->next = NULL;
88
  (*ptr)->ok_to_load = 0;
89
  (*ptr)->alias = zalias;
90
  (*ptr)->align = align;
91
  (*ptr)->subalign = subalign;
92
}
93
 
94
void
95
mri_output_section (const char *name, etree_type *vma)
96
{
97
  mri_add_to_list (&address, name, vma, 0, 0, 0);
98
}
99
 
100
/* If any ABSOLUTE <name> are in the script, only load those files
101
   marked thus.  */
102
 
103
void
104
mri_only_load (const char *name)
105
{
106
  mri_add_to_list (&only_load, name, 0, 0, 0, 0);
107
}
108
 
109
void
110
mri_base (etree_type *exp)
111
{
112
  base = exp;
113
}
114
 
115
static int done_tree = 0;
116
 
117
void
118
mri_draw_tree (void)
119
{
120
  if (done_tree)
121
    return;
122
 
123
  /* Now build the statements for the ldlang machine.  */
124
 
125
  /* Attach the addresses of any which have addresses,
126
     and add the ones not mentioned.  */
127
  if (address != NULL)
128
    {
129
      struct section_name_struct *alist;
130
      struct section_name_struct *olist;
131
 
132
      if (order == NULL)
133
        order = address;
134
 
135
      for (alist = address;
136
           alist != NULL;
137
           alist = alist->next)
138
        {
139
          int done = 0;
140
 
141
          for (olist = order; done == 0 && olist != NULL; olist = olist->next)
142
            {
143
              if (strcmp (alist->name, olist->name) == 0)
144
                {
145
                  olist->vma = alist->vma;
146
                  done = 1;
147
                }
148
            }
149
 
150
          if (!done)
151
            {
152
              /* Add this onto end of order list.  */
153
              mri_add_to_list (&order, alist->name, alist->vma, 0, 0, 0);
154
            }
155
        }
156
    }
157
 
158
  /* If we're only supposed to load a subset of them in, then prune
159
     the list.  */
160
  if (only_load != NULL)
161
    {
162
      struct section_name_struct *ptr1;
163
      struct section_name_struct *ptr2;
164
 
165
      if (order == NULL)
166
        order = only_load;
167
 
168
      /* See if this name is in the list, if it is then we can load it.  */
169
      for (ptr1 = only_load; ptr1; ptr1 = ptr1->next)
170
        for (ptr2 = order; ptr2; ptr2 = ptr2->next)
171
          if (strcmp (ptr2->name, ptr1->name) == 0)
172
            ptr2->ok_to_load = 1;
173
    }
174
  else
175
    {
176
      /* No only load list, so everything is ok to load.  */
177
      struct section_name_struct *ptr;
178
 
179
      for (ptr = order; ptr; ptr = ptr->next)
180
        ptr->ok_to_load = 1;
181
    }
182
 
183
  /* Create the order of sections to load.  */
184
  if (order != NULL)
185
    {
186
      /* Been told to output the sections in a certain order.  */
187
      struct section_name_struct *p = order;
188
 
189
      while (p)
190
        {
191
          struct section_name_struct *aptr;
192
          etree_type *align = 0;
193
          etree_type *subalign = 0;
194
          struct wildcard_list *tmp;
195
 
196
          /* See if an alignment has been specified.  */
197
          for (aptr = alignment; aptr; aptr = aptr->next)
198
            if (strcmp (aptr->name, p->name) == 0)
199
              align = aptr->align;
200
 
201
          for (aptr = subalignment; aptr; aptr = aptr->next)
202
            if (strcmp (aptr->name, p->name) == 0)
203
              subalign = aptr->subalign;
204
 
205
          if (base == 0)
206
            base = p->vma ? p->vma : exp_nameop (NAME, ".");
207
 
208
          lang_enter_output_section_statement (p->name, base,
209
                                               p->ok_to_load ? 0 : noload_section,
210
                                               align, subalign, NULL, 0);
211
          base = 0;
212
          tmp = xmalloc (sizeof *tmp);
213
          tmp->next = NULL;
214
          tmp->spec.name = p->name;
215
          tmp->spec.exclude_name_list = NULL;
216
          tmp->spec.sorted = none;
217
          lang_add_wild (NULL, tmp, FALSE);
218
 
219
          /* If there is an alias for this section, add it too.  */
220
          for (aptr = alias; aptr; aptr = aptr->next)
221
            if (strcmp (aptr->alias, p->name) == 0)
222
              {
223
                tmp = xmalloc (sizeof *tmp);
224
                tmp->next = NULL;
225
                tmp->spec.name = aptr->name;
226
                tmp->spec.exclude_name_list = NULL;
227
                tmp->spec.sorted = none;
228
                lang_add_wild (NULL, tmp, FALSE);
229
              }
230
 
231
          lang_leave_output_section_statement (0, "*default*", NULL, NULL);
232
 
233
          p = p->next;
234
        }
235
    }
236
 
237
  done_tree = 1;
238
}
239
 
240
void
241
mri_load (const char *name)
242
{
243
  base = 0;
244
  lang_add_input_file (name, lang_input_file_is_file_enum, NULL);
245
}
246
 
247
void
248
mri_order (const char *name)
249
{
250
  mri_add_to_list (&order, name, 0, 0, 0, 0);
251
}
252
 
253
void
254
mri_alias (const char *want, const char *is, int isn)
255
{
256
  if (!is)
257
    {
258
      char buf[20];
259
 
260
      /* Some sections are digits.  */
261
      sprintf (buf, "%d", isn);
262
 
263
      is = xstrdup (buf);
264
 
265
      if (is == NULL)
266
        abort ();
267
    }
268
 
269
  mri_add_to_list (&alias, is, 0, want, 0, 0);
270
}
271
 
272
void
273
mri_name (const char *name)
274
{
275
  lang_add_output (name, 1);
276
}
277
 
278
void
279
mri_format (const char *name)
280
{
281
  if (strcmp (name, "S") == 0)
282
    lang_add_output_format ("srec", NULL, NULL, 1);
283
 
284
  else if (strcmp (name, "IEEE") == 0)
285
    lang_add_output_format ("ieee", NULL, NULL, 1);
286
 
287
  else if (strcmp (name, "COFF") == 0)
288
    lang_add_output_format ("coff-m68k", NULL, NULL, 1);
289
 
290
  else
291
    einfo (_("%P%F: unknown format type %s\n"), name);
292
}
293
 
294
void
295
mri_public (const char *name, etree_type *exp)
296
{
297
  lang_add_assignment (exp_assop ('=', name, exp));
298
}
299
 
300
void
301
mri_align (const char *name, etree_type *exp)
302
{
303
  mri_add_to_list (&alignment, name, 0, 0, exp, 0);
304
}
305
 
306
void
307
mri_alignmod (const char *name, etree_type *exp)
308
{
309
  mri_add_to_list (&subalignment, name, 0, 0, 0, exp);
310
}
311
 
312
void
313
mri_truncate (unsigned int exp)
314
{
315
  symbol_truncate = exp;
316
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.