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