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

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [bfd/] [cpu-sh.c] - Blame information for rev 213

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

Line No. Rev Author Line
1 14 khays
/* BFD library support routines for the Renesas / SuperH SH architecture.
2
   Copyright 1993, 1994, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005,
3
   2007 Free Software Foundation, Inc.
4
   Hacked by Steve Chamberlain of Cygnus Support.
5
 
6
   This file is part of BFD, the Binary File Descriptor library.
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
#include "sysdep.h"
24
#include "bfd.h"
25
#include "libbfd.h"
26
#include "../opcodes/sh-opc.h"
27
 
28
#define SH_NEXT                            arch_info_struct + 0
29
#define SH2_NEXT                           arch_info_struct + 1
30
#define SH2E_NEXT                          arch_info_struct + 2
31
#define SH_DSP_NEXT                        arch_info_struct + 3
32
#define SH3_NEXT                           arch_info_struct + 4
33
#define SH3_NOMMU_NEXT                     arch_info_struct + 5
34
#define SH3_DSP_NEXT                       arch_info_struct + 6
35
#define SH3E_NEXT                          arch_info_struct + 7
36
#define SH4_NEXT                           arch_info_struct + 8
37
#define SH4A_NEXT                          arch_info_struct + 9
38
#define SH4AL_DSP_NEXT                     arch_info_struct + 10
39
#define SH4_NOFPU_NEXT                     arch_info_struct + 11
40
#define SH4_NOMMU_NOFPU_NEXT               arch_info_struct + 12
41
#define SH4A_NOFPU_NEXT                    arch_info_struct + 13
42
#define SH2A_NEXT                          arch_info_struct + 14
43
#define SH2A_NOFPU_NEXT                    arch_info_struct + 15
44
#define SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT arch_info_struct + 16
45
#define SH2A_NOFPU_OR_SH3_NOMMU_NEXT       arch_info_struct + 17
46
#define SH2A_OR_SH4_NEXT                   arch_info_struct + 18
47
#define SH2A_OR_SH3E_NEXT                  arch_info_struct + 19
48
#define SH64_NEXT                          NULL
49
 
50
static const bfd_arch_info_type arch_info_struct[] =
51
{
52
  {
53
    32,                         /* 32 bits in a word.  */
54
    32,                         /* 32 bits in an address.  */
55
    8,                          /* 8 bits in a byte.  */
56
    bfd_arch_sh,
57
    bfd_mach_sh2,
58
    "sh",                       /* Architecture name.  */
59
    "sh2",                      /* Machine name.  */
60
    1,
61
    FALSE,                      /* Not the default.  */
62
    bfd_default_compatible,
63
    bfd_default_scan,
64 166 khays
    bfd_arch_default_fill,
65 14 khays
    SH2_NEXT
66
  },
67
  {
68
    32,                         /* 32 bits in a word.  */
69
    32,                         /* 32 bits in an address.  */
70
    8,                          /* 8 bits in a byte.  */
71
    bfd_arch_sh,
72
    bfd_mach_sh2e,
73
    "sh",                       /* Architecture name.  */
74
    "sh2e",                     /* Machine name.  */
75
    1,
76
    FALSE,                      /* Not the default.  */
77
    bfd_default_compatible,
78
    bfd_default_scan,
79 166 khays
    bfd_arch_default_fill,
80 14 khays
    SH2E_NEXT
81
  },
82
  {
83
    32,                         /* 32 bits in a word.  */
84
    32,                         /* 32 bits in an address.  */
85
    8,                          /* 8 bits in a byte.  */
86
    bfd_arch_sh,
87
    bfd_mach_sh_dsp,
88
    "sh",                       /* Architecture name.   */
89
    "sh-dsp",                   /* Machine name.  */
90
    1,
91
    FALSE,                      /* Not the default.  */
92
    bfd_default_compatible,
93
    bfd_default_scan,
94 166 khays
    bfd_arch_default_fill,
95 14 khays
    SH_DSP_NEXT
96
  },
97
  {
98
    32,                         /* 32 bits in a word.  */
99
    32,                         /* 32 bits in an address.  */
100
    8,                          /* 8 bits in a byte.  */
101
    bfd_arch_sh,
102
    bfd_mach_sh3,
103
    "sh",                       /* Architecture name.   */
104
    "sh3",                      /* Machine name.  */
105
    1,
106
    FALSE,                      /* Not the default.  */
107
    bfd_default_compatible,
108
    bfd_default_scan,
109 166 khays
    bfd_arch_default_fill,
110 14 khays
    SH3_NEXT
111
  },
112
  {
113
    32,                         /* 32 bits in a word.  */
114
    32,                         /* 32 bits in an address.  */
115
    8,                          /* 8 bits in a byte.  */
116
    bfd_arch_sh,
117
    bfd_mach_sh3_nommu,
118
    "sh",                       /* Architecture name.   */
119
    "sh3-nommu",                /* Machine name.  */
120
    1,
121
    FALSE,                      /* Not the default.  */
122
    bfd_default_compatible,
123
    bfd_default_scan,
124 166 khays
    bfd_arch_default_fill,
125 14 khays
    SH3_NOMMU_NEXT
126
  },
127
  {
128
    32,                         /* 32 bits in a word.  */
129
    32,                         /* 32 bits in an address.  */
130
    8,                          /* 8 bits in a byte.  */
131
    bfd_arch_sh,
132
    bfd_mach_sh3_dsp,
133
    "sh",                       /* Architecture name.   */
134
    "sh3-dsp",                  /* Machine name.  */
135
    1,
136
    FALSE,                      /* Not the default.  */
137
    bfd_default_compatible,
138
    bfd_default_scan,
139 166 khays
    bfd_arch_default_fill,
140 14 khays
    SH3_DSP_NEXT
141
  },
142
  {
143
    32,                         /* 32 bits in a word.  */
144
    32,                         /* 32 bits in an address.  */
145
    8,                          /* 8 bits in a byte.  */
146
    bfd_arch_sh,
147
    bfd_mach_sh3e,
148
    "sh",                       /* Architecture name.   */
149
    "sh3e",                     /* Machine name.  */
150
    1,
151
    FALSE,                      /* Not the default.  */
152
    bfd_default_compatible,
153
    bfd_default_scan,
154 166 khays
    bfd_arch_default_fill,
155 14 khays
    SH3E_NEXT
156
  },
157
  {
158
    32,                         /* 32 bits in a word.  */
159
    32,                         /* 32 bits in an address.  */
160
    8,                          /* 8 bits in a byte.  */
161
    bfd_arch_sh,
162
    bfd_mach_sh4,
163
    "sh",                       /* Architecture name.   */
164
    "sh4",                      /* Machine name.  */
165
    1,
166
    FALSE,                      /* Not the default.  */
167
    bfd_default_compatible,
168
    bfd_default_scan,
169 166 khays
    bfd_arch_default_fill,
170 14 khays
    SH4_NEXT
171
  },
172
  {
173
    32,                         /* 32 bits in a word.  */
174
    32,                         /* 32 bits in an address.  */
175
    8,                          /* 8 bits in a byte.  */
176
    bfd_arch_sh,
177
    bfd_mach_sh4a,
178
    "sh",                       /* Architecture name.   */
179
    "sh4a",                     /* Machine name.  */
180
    1,
181
    FALSE,                      /* Not the default.  */
182
    bfd_default_compatible,
183
    bfd_default_scan,
184 166 khays
    bfd_arch_default_fill,
185 14 khays
    SH4A_NEXT
186
  },
187
  {
188
    32,                         /* 32 bits in a word.  */
189
    32,                         /* 32 bits in an address.  */
190
    8,                          /* 8 bits in a byte.  */
191
    bfd_arch_sh,
192
    bfd_mach_sh4al_dsp,
193
    "sh",                       /* Architecture name.   */
194
    "sh4al-dsp",                /* Machine name.  */
195
    1,
196
    FALSE,                      /* Not the default.  */
197
    bfd_default_compatible,
198
    bfd_default_scan,
199 166 khays
    bfd_arch_default_fill,
200 14 khays
    SH4AL_DSP_NEXT
201
  },
202
  {
203
    32,                         /* 32 bits in a word.  */
204
    32,                         /* 32 bits in an address.  */
205
    8,                          /* 8 bits in a byte.  */
206
    bfd_arch_sh,
207
    bfd_mach_sh4_nofpu,
208
    "sh",                       /* Architecture name.   */
209
    "sh4-nofpu",                /* Machine name.  */
210
    1,
211
    FALSE,                      /* Not the default.  */
212
    bfd_default_compatible,
213
    bfd_default_scan,
214 166 khays
    bfd_arch_default_fill,
215 14 khays
    SH4_NOFPU_NEXT
216
  },
217
  {
218
    32,                         /* 32 bits in a word.  */
219
    32,                         /* 32 bits in an address.  */
220
    8,                          /* 8 bits in a byte.  */
221
    bfd_arch_sh,
222
    bfd_mach_sh4_nommu_nofpu,
223
    "sh",                       /* Architecture name.   */
224
    "sh4-nommu-nofpu",          /* Machine name.  */
225
    1,
226
    FALSE,                      /* Not the default.  */
227
    bfd_default_compatible,
228
    bfd_default_scan,
229 166 khays
    bfd_arch_default_fill,
230 14 khays
    SH4_NOMMU_NOFPU_NEXT
231
  },
232
  {
233
    32,                         /* 32 bits in a word.  */
234
    32,                         /* 32 bits in an address.  */
235
    8,                          /* 8 bits in a byte.  */
236
    bfd_arch_sh,
237
    bfd_mach_sh4a_nofpu,
238
    "sh",                       /* Architecture name.   */
239
    "sh4a-nofpu",               /* Machine name.  */
240
    1,
241
    FALSE,                      /* Not the default.  */
242
    bfd_default_compatible,
243
    bfd_default_scan,
244 166 khays
    bfd_arch_default_fill,
245 14 khays
    SH4A_NOFPU_NEXT
246
  },
247
  {
248
    32,                         /* 32 bits in a word.  */
249
    32,                         /* 32 bits in an address.  */
250
    8,                          /* 8 bits in a byte.  */
251
    bfd_arch_sh,
252
    bfd_mach_sh2a,
253
    "sh",                       /* Architecture name.  */
254
    "sh2a",                     /* Machine name.  */
255
    1,
256
    FALSE,                      /* Not the default.  */
257
    bfd_default_compatible,
258
    bfd_default_scan,
259 166 khays
    bfd_arch_default_fill,
260 14 khays
    SH2A_NEXT
261
  },
262
  {
263
    32,                         /* 32 bits in a word.  */
264
    32,                         /* 32 bits in an address.  */
265
    8,                          /* 8 bits in a byte.  */
266
    bfd_arch_sh,
267
    bfd_mach_sh2a_nofpu,
268
    "sh",                       /* Architecture name.  */
269
    "sh2a-nofpu",               /* Machine name.  */
270
    1,
271
    FALSE,                      /* Not the default.  */
272
    bfd_default_compatible,
273
    bfd_default_scan,
274 166 khays
    bfd_arch_default_fill,
275 14 khays
    SH2A_NOFPU_NEXT
276
  },
277
  {
278
    32,                         /* 32 bits in a word.  */
279
    32,                         /* 32 bits in an address.  */
280
    8,                          /* 8 bits in a byte.  */
281
    bfd_arch_sh,
282
    bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu,
283
    "sh",                       /* Architecture name.  */
284
    "sh2a-nofpu-or-sh4-nommu-nofpu",            /* Machine name.  */
285
    1,
286
    FALSE,                      /* Not the default.  */
287
    bfd_default_compatible,
288
    bfd_default_scan,
289 166 khays
    bfd_arch_default_fill,
290 14 khays
    SH2A_NOFPU_OR_SH4_NOMMU_NOFPU_NEXT
291
  },
292
  {
293
    32,                         /* 32 bits in a word.  */
294
    32,                         /* 32 bits in an address.  */
295
    8,                          /* 8 bits in a byte.  */
296
    bfd_arch_sh,
297
    bfd_mach_sh2a_nofpu_or_sh3_nommu,
298
    "sh",                       /* Architecture name. .  */
299
    "sh2a-nofpu-or-sh3-nommu",  /* Machine name.  */
300
    1,
301
    FALSE,                      /* Not the default.  */
302
    bfd_default_compatible,
303
    bfd_default_scan,
304 166 khays
    bfd_arch_default_fill,
305 14 khays
    SH2A_NOFPU_OR_SH3_NOMMU_NEXT
306
  },
307
  {
308
    32,                         /* 32 bits in a word.  */
309
    32,                         /* 32 bits in an address.  */
310
    8,                          /* 8 bits in a byte.  */
311
    bfd_arch_sh,
312
    bfd_mach_sh2a_or_sh4,
313
    "sh",                       /* Architecture name.  */
314
    "sh2a-or-sh4",              /* Machine name.  */
315
    1,
316
    FALSE,                      /* Not the default.  */
317
    bfd_default_compatible,
318
    bfd_default_scan,
319 166 khays
    bfd_arch_default_fill,
320 14 khays
    SH2A_OR_SH4_NEXT
321
  },
322
  {
323
    32,                         /* 32 bits in a word.  */
324
    32,                         /* 32 bits in an address.  */
325
    8,                          /* 8 bits in a byte.  */
326
    bfd_arch_sh,
327
    bfd_mach_sh2a_or_sh3e,
328
    "sh",                       /* Architecture name.  */
329
    "sh2a-or-sh3e",             /* Machine name.  */
330
    1,
331
    FALSE,                      /* Not the default.  */
332
    bfd_default_compatible,
333
    bfd_default_scan,
334 166 khays
    bfd_arch_default_fill,
335 14 khays
    SH2A_OR_SH3E_NEXT
336
  },
337
  {
338
    64,                         /* 64 bits in a word.  */
339
    64,                         /* 64 bits in an address.  */
340
    8,                          /* 8 bits in a byte.  */
341
    bfd_arch_sh,
342
    bfd_mach_sh5,
343
    "sh",                       /* Architecture name.   */
344
    "sh5",                      /* Machine name.  */
345
    1,
346
    FALSE,                      /* Not the default.  */
347
    bfd_default_compatible,
348
    bfd_default_scan,
349 166 khays
    bfd_arch_default_fill,
350 14 khays
    SH64_NEXT
351
  },
352
};
353
 
354
const bfd_arch_info_type bfd_sh_arch =
355
{
356
  32,                           /* 32 bits in a word.  */
357
  32,                           /* 32 bits in an address.  */
358
  8,                            /* 8 bits in a byte.  */
359
  bfd_arch_sh,
360
  bfd_mach_sh,
361
  "sh",                         /* Architecture name.   */
362
  "sh",                         /* Machine name.  */
363
  1,
364
  TRUE,                         /* The default machine.  */
365
  bfd_default_compatible,
366
  bfd_default_scan,
367 166 khays
  bfd_arch_default_fill,
368 14 khays
  SH_NEXT
369
};
370
 
371
 
372
/* This table defines the mappings from the BFD internal numbering
373
   system to the opcodes internal flags system.
374
   It is used by the functions defined below.
375
   The prototypes for these SH specific functions are found in
376
   sh-opc.h .  */
377
 
378
static struct { unsigned long bfd_mach, arch, arch_up; } bfd_to_arch_table[] =
379
{
380
  { bfd_mach_sh,              arch_sh1,             arch_sh_up },
381
  { bfd_mach_sh2,             arch_sh2,             arch_sh2_up },
382
  { bfd_mach_sh2e,            arch_sh2e,            arch_sh2e_up },
383
  { bfd_mach_sh_dsp,          arch_sh_dsp,          arch_sh_dsp_up },
384
  { bfd_mach_sh2a,            arch_sh2a,            arch_sh2a_up },
385
  { bfd_mach_sh2a_nofpu,      arch_sh2a_nofpu,      arch_sh2a_nofpu_up },
386
 
387
  { bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu,         arch_sh2a_nofpu_or_sh4_nommu_nofpu,   arch_sh2a_nofpu_or_sh4_nommu_nofpu_up },
388
  { bfd_mach_sh2a_nofpu_or_sh3_nommu,               arch_sh2a_nofpu_or_sh3_nommu,         arch_sh2a_nofpu_or_sh3_nommu_up },
389
  { bfd_mach_sh2a_or_sh4,     arch_sh2a_or_sh4,     arch_sh2a_or_sh4_up },
390
  { bfd_mach_sh2a_or_sh3e,    arch_sh2a_or_sh3e,    arch_sh2a_or_sh3e_up },
391
 
392
  { bfd_mach_sh3,             arch_sh3,             arch_sh3_up },
393
  { bfd_mach_sh3_nommu,       arch_sh3_nommu,       arch_sh3_nommu_up },
394
  { bfd_mach_sh3_dsp,         arch_sh3_dsp,         arch_sh3_dsp_up },
395
  { bfd_mach_sh3e,            arch_sh3e,            arch_sh3e_up },
396
  { bfd_mach_sh4,             arch_sh4,             arch_sh4_up },
397
  { bfd_mach_sh4a,            arch_sh4a,            arch_sh4a_up },
398
  { bfd_mach_sh4al_dsp,       arch_sh4al_dsp,       arch_sh4al_dsp_up },
399
  { bfd_mach_sh4_nofpu,       arch_sh4_nofpu,       arch_sh4_nofpu_up },
400
  { bfd_mach_sh4_nommu_nofpu, arch_sh4_nommu_nofpu, arch_sh4_nommu_nofpu_up },
401
  { bfd_mach_sh4a_nofpu,      arch_sh4a_nofpu,      arch_sh4a_nofpu_up },
402
  { 0, 0, 0 }   /* Terminator.  */
403
};
404
 
405
 
406
/* Convert a BFD mach number into the right opcodes arch flags
407
   using the table above.  */
408
 
409
unsigned int
410
sh_get_arch_from_bfd_mach (unsigned long mach)
411
{
412
  int i = 0;
413
 
414
  while (bfd_to_arch_table[i].bfd_mach != 0)
415
    if (bfd_to_arch_table[i].bfd_mach == mach)
416
      return bfd_to_arch_table[i].arch;
417
    else
418
      i++;
419
 
420
  /* Machine not found.   */
421
  BFD_FAIL();
422
 
423
  return SH_ARCH_UNKNOWN_ARCH;
424
}
425
 
426
 
427
/* Convert a BFD mach number into a set of opcodes arch flags
428
   describing all the compatible architectures (i.e. arch_up)
429
   using the table above.  */
430
 
431
unsigned int
432
sh_get_arch_up_from_bfd_mach (unsigned long mach)
433
{
434
  int i = 0;
435
 
436
  while (bfd_to_arch_table[i].bfd_mach != 0)
437
    if (bfd_to_arch_table[i].bfd_mach == mach)
438
      return bfd_to_arch_table[i].arch_up;
439
    else
440
      i++;
441
 
442
  /* Machine not found.  */
443
  BFD_FAIL();
444
 
445
  return SH_ARCH_UNKNOWN_ARCH;
446
}
447
 
448
 
449
/* Convert an arbitary arch_set - not necessarily corresponding
450
   directly to anything in the table above - to the most generic
451
   architecture which supports all the required features, and
452
   return the corresponding BFD mach.  */
453
 
454
unsigned long
455
sh_get_bfd_mach_from_arch_set (unsigned int arch_set)
456
{
457
  unsigned long result = 0;
458
  unsigned int best = ~arch_set;
459
  unsigned int co_mask = ~0;
460
  int i = 0;
461
 
462
  /* If arch_set permits variants with no coprocessor then do not allow
463
     the other irrelevant co-processor bits to influence the choice:
464
       e.g. if dsp is disallowed by arch_set, then the algorithm would
465
       prefer fpu variants over nofpu variants because they also disallow
466
       dsp - even though the nofpu would be the most correct choice.
467
     This assumes that EVERY fpu/dsp variant has a no-coprocessor
468
     counter-part, or their non-fpu/dsp instructions do not have the
469
     no co-processor bit set.  */
470
  if (arch_set & arch_sh_no_co)
471
    co_mask = ~(arch_sh_sp_fpu | arch_sh_dp_fpu | arch_sh_has_dsp);
472
 
473
  while (bfd_to_arch_table[i].bfd_mach != 0)
474
    {
475
      unsigned int try = bfd_to_arch_table[i].arch_up & co_mask;
476
 
477
      /* Conceptually: Find the architecture with the least number
478
         of extra features or, if they have the same number, then
479
         the greatest number of required features.  Disregard
480
         architectures where the required features alone do
481
         not describe a valid architecture.  */
482
      if (((try & ~arch_set) < (best & ~arch_set)
483
           || ((try & ~arch_set) == (best & ~arch_set)
484
               && (~try & arch_set) < (~best & arch_set)))
485
          && SH_MERGE_ARCH_SET_VALID (try, arch_set))
486
        {
487
          result = bfd_to_arch_table[i].bfd_mach;
488
          best = try;
489
        }
490
 
491
      i++;
492
    }
493
 
494
  /* This might happen if a new variant is added to sh-opc.h
495
     but no corresponding entry is added to the table above.  */
496
  BFD_ASSERT (result != 0);
497
 
498
  return result;
499
}
500
 
501
 
502
/* Merge the architecture type of two BFD files, such that the
503
   resultant architecture supports all the features required
504
   by the two input BFDs.
505
   If the input BFDs are multually incompatible - i.e. one uses
506
   DSP while the other uses FPU - or there is no known architecture
507
   that fits the requirements then an error is emitted.  */
508
 
509
bfd_boolean
510
sh_merge_bfd_arch (bfd *ibfd, bfd *obfd)
511
{
512
  unsigned int old_arch, new_arch, merged_arch;
513
 
514
  if (! _bfd_generic_verify_endian_match (ibfd, obfd))
515
    return FALSE;
516
 
517
  old_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (obfd));
518
  new_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (ibfd));
519
 
520
  merged_arch = SH_MERGE_ARCH_SET (old_arch, new_arch);
521
 
522
  if (!SH_VALID_CO_ARCH_SET (merged_arch))
523
    {
524
      (*_bfd_error_handler)
525
        ("%B: uses %s instructions while previous modules use %s instructions",
526
         ibfd,
527
         SH_ARCH_SET_HAS_DSP (new_arch) ? "dsp" : "floating point",
528
         SH_ARCH_SET_HAS_DSP (new_arch) ? "floating point" : "dsp");
529
      bfd_set_error (bfd_error_bad_value);
530
      return FALSE;
531
    }
532
  else if (!SH_VALID_ARCH_SET (merged_arch))
533
    {
534
      (*_bfd_error_handler)
535
        ("internal error: merge of architecture '%s' with architecture '%s' produced unknown architecture\n",
536
         bfd_printable_name (obfd),
537
         bfd_printable_name (ibfd));
538
      bfd_set_error (bfd_error_bad_value);
539
      return FALSE;
540
    }
541
 
542
  bfd_default_set_arch_mach (obfd, bfd_arch_sh,
543
                             sh_get_bfd_mach_from_arch_set (merged_arch));
544
 
545
  return TRUE;
546
}

powered by: WebSVN 2.1.0

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