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