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