Automatic date update in version.in
[deliverable/binutils-gdb.git] / bfd / cpu-sh.c
index 98d72882dbc9d86da396a799bdc68344b281b6d9..dfef3ec6b6ca7638babaded10e46378a8fd67593 100644 (file)
@@ -1,13 +1,12 @@
 /* BFD library support routines for the Renesas / SuperH SH architecture.
 /* BFD library support routines for the Renesas / SuperH SH architecture.
-   Copyright 1993, 1994, 1997, 1998, 2000, 2001, 2002, 2003, 2004
-   Free Software Foundation, Inc.
+   Copyright (C) 1993-2020 Free Software Foundation, Inc.
    Hacked by Steve Chamberlain of Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    Hacked by Steve Chamberlain of Cygnus Support.
 
    This file is part of BFD, the Binary File Descriptor library.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 
-#include "bfd.h"
 #include "sysdep.h"
 #include "sysdep.h"
+#include "bfd.h"
 #include "libbfd.h"
 #include "../opcodes/sh-opc.h"
 
 #include "libbfd.h"
 #include "../opcodes/sh-opc.h"
 
-#define SH_NEXT      &arch_info_struct[0]
-#define SH2_NEXT     &arch_info_struct[1]
-#define SH2E_NEXT    &arch_info_struct[2]
-#define SH_DSP_NEXT  &arch_info_struct[3]
-#define SH3_NEXT     &arch_info_struct[4]
-#define SH3_NOMMU_NEXT &arch_info_struct[5]
-#define SH3_DSP_NEXT &arch_info_struct[6]
-#define SH3E_NEXT    &arch_info_struct[7]
-#define SH4_NEXT     &arch_info_struct[8]
-#define SH4A_NEXT    &arch_info_struct[9]
-#define SH4AL_DSP_NEXT &arch_info_struct[10]
-#define SH4_NOFPU_NEXT &arch_info_struct[11]
-#define SH4_NOMMU_NOFPU_NEXT &arch_info_struct[12]
-#define SH4A_NOFPU_NEXT &arch_info_struct[13]
-#define SH64_NEXT    NULL
+
+#define N(NUMBER, PRINT, DEFAULT, NEXT)                        \
+  {                                                    \
+    32,     /* Bits in a word.  */                     \
+    32,     /* Bits in an address.  */                 \
+    8,     /* Bits in a byte.  */                      \
+    bfd_arch_sh,                                       \
+    NUMBER,                                            \
+    "sh",                                              \
+    PRINT,                                             \
+    1,         /* Section alignment power.  */         \
+    DEFAULT,                                           \
+    bfd_default_compatible,                            \
+    bfd_default_scan,                                  \
+    bfd_arch_default_fill,                             \
+    NEXT,                                              \
+    0 /* Maximum offset of a reloc from the start of an insn.  */ \
+  }
 
 static const bfd_arch_info_type arch_info_struct[] =
 {
 
 static const bfd_arch_info_type arch_info_struct[] =
 {
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh2,
-    "sh",                      /* arch_name  */
-    "sh2",                     /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH2_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh2e,
-    "sh",                      /* arch_name  */
-    "sh2e",                    /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH2E_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh_dsp,
-    "sh",                      /* arch_name  */
-    "sh-dsp",                  /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH_DSP_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh3,
-    "sh",                      /* arch_name  */
-    "sh3",                     /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH3_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh3_nommu,
-    "sh",                      /* arch_name  */
-    "sh3-nommu",               /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH3_NOMMU_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh3_dsp,
-    "sh",                      /* arch_name  */
-    "sh3-dsp",                 /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH3_DSP_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh3e,
-    "sh",                      /* arch_name  */
-    "sh3e",                    /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH3E_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh4,
-    "sh",                      /* arch_name  */
-    "sh4",                     /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH4_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh4a,
-    "sh",                      /* arch_name  */
-    "sh4a",                    /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH4A_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh4al_dsp,
-    "sh",                      /* arch_name  */
-    "sh4al-dsp",               /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH4AL_DSP_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh4_nofpu,
-    "sh",                      /* arch_name  */
-    "sh4-nofpu",               /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH4_NOFPU_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh4_nommu_nofpu,
-    "sh",                      /* arch_name  */
-    "sh4-nommu-nofpu",         /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH4_NOMMU_NOFPU_NEXT
-  },
-  {
-    32,                                /* 32 bits in a word */
-    32,                                /* 32 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh4a_nofpu,
-    "sh",                      /* arch_name  */
-    "sh4a-nofpu",              /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH4A_NOFPU_NEXT
-  },
-  {
-    64,                                /* 64 bits in a word */
-    64,                                /* 64 bits in an address */
-    8,                         /* 8 bits in a byte */
-    bfd_arch_sh,
-    bfd_mach_sh5,
-    "sh",                      /* arch_name  */
-    "sh5",                     /* printable name */
-    1,
-    FALSE,                     /* not the default */
-    bfd_default_compatible,
-    bfd_default_scan,
-    SH64_NEXT
-  },
+  N (bfd_mach_sh2,          "sh2",       FALSE, arch_info_struct + 1),
+  N (bfd_mach_sh2e,         "sh2e",      FALSE, arch_info_struct + 2),
+  N (bfd_mach_sh_dsp,       "sh-dsp",    FALSE, arch_info_struct + 3),
+  N (bfd_mach_sh3,          "sh3",       FALSE, arch_info_struct + 4),
+  N (bfd_mach_sh3_nommu,    "sh3-nommu", FALSE, arch_info_struct + 5),
+  N (bfd_mach_sh3_dsp,      "sh3-dsp",   FALSE, arch_info_struct + 6),
+  N (bfd_mach_sh3e,         "sh3e",      FALSE, arch_info_struct + 7),
+  N (bfd_mach_sh4,          "sh4",       FALSE, arch_info_struct + 8),
+  N (bfd_mach_sh4a,         "sh4a",      FALSE, arch_info_struct + 9),
+  N (bfd_mach_sh4al_dsp,    "sh4al-dsp", FALSE, arch_info_struct + 10),
+  N (bfd_mach_sh4_nofpu,    "sh4-nofpu", FALSE, arch_info_struct + 11),
+  N (bfd_mach_sh4_nommu_nofpu, "sh4-nommu-nofpu", FALSE, arch_info_struct + 12),
+  N (bfd_mach_sh4a_nofpu,   "sh4a-nofpu", FALSE, arch_info_struct + 13),
+  N (bfd_mach_sh2a,         "sh2a",       FALSE, arch_info_struct + 14),
+  N (bfd_mach_sh2a_nofpu,   "sh2a-nofpu", FALSE, arch_info_struct + 15),
+  N (bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu, "sh2a-nofpu-or-sh4-nommu-nofpu", FALSE, arch_info_struct + 16),
+  N (bfd_mach_sh2a_nofpu_or_sh3_nommu, "sh2a-nofpu-or-sh3-nommu", FALSE, arch_info_struct + 17),
+  N (bfd_mach_sh2a_or_sh4,  "sh2a-or-sh4",  FALSE, arch_info_struct + 18),
+  N (bfd_mach_sh2a_or_sh3e, "sh2a-or-sh3e", FALSE, NULL)
 };
 
 const bfd_arch_info_type bfd_sh_arch =
 };
 
 const bfd_arch_info_type bfd_sh_arch =
-{
-  32,                          /* 32 bits in a word */
-  32,                          /* 32 bits in an address */
-  8,                           /* 8 bits in a byte */
-  bfd_arch_sh,
-  bfd_mach_sh,
-  "sh",                                /* arch_name  */
-  "sh",                                /* printable name */
-  1,
-  TRUE,                                /* the default machine */
-  bfd_default_compatible,
-  bfd_default_scan,
-  SH_NEXT
-};
-
+  N (bfd_mach_sh, "sh", TRUE, arch_info_struct + 0);
 
 /* This table defines the mappings from the BFD internal numbering
    system to the opcodes internal flags system.
 
 /* This table defines the mappings from the BFD internal numbering
    system to the opcodes internal flags system.
@@ -265,21 +77,29 @@ const bfd_arch_info_type bfd_sh_arch =
 
 static struct { unsigned long bfd_mach, arch, arch_up; } bfd_to_arch_table[] =
 {
 
 static struct { unsigned long bfd_mach, arch, arch_up; } bfd_to_arch_table[] =
 {
-  { bfd_mach_sh,              arch_sh1,             arch_sh1_up },
-  { bfd_mach_sh2,             arch_sh2,             arch_sh2_up },
-  { bfd_mach_sh2e,            arch_sh2e,            arch_sh2e_up },
-  { bfd_mach_sh_dsp,          arch_sh_dsp,          arch_sh_dsp_up },
-  { bfd_mach_sh3,             arch_sh3,             arch_sh3_up },
-  { bfd_mach_sh3_nommu,       arch_sh3_nommu,       arch_sh3_nommu_up },
-  { bfd_mach_sh3_dsp,         arch_sh3_dsp,         arch_sh3_dsp_up },
-  { bfd_mach_sh3e,            arch_sh3e,            arch_sh3e_up },
-  { bfd_mach_sh4,             arch_sh4,             arch_sh4_up },
-  { bfd_mach_sh4a,            arch_sh4a,            arch_sh4a_up },
-  { bfd_mach_sh4al_dsp,       arch_sh4al_dsp,       arch_sh4al_dsp_up },
-  { bfd_mach_sh4_nofpu,       arch_sh4_nofpu,       arch_sh4_nofp_up },
+  { bfd_mach_sh,             arch_sh1,             arch_sh_up },
+  { bfd_mach_sh2,            arch_sh2,             arch_sh2_up },
+  { bfd_mach_sh2e,           arch_sh2e,            arch_sh2e_up },
+  { bfd_mach_sh_dsp,         arch_sh_dsp,          arch_sh_dsp_up },
+  { bfd_mach_sh2a,           arch_sh2a,            arch_sh2a_up },
+  { bfd_mach_sh2a_nofpu,      arch_sh2a_nofpu,     arch_sh2a_nofpu_up },
+
+  { bfd_mach_sh2a_nofpu_or_sh4_nommu_nofpu,        arch_sh2a_nofpu_or_sh4_nommu_nofpu,   arch_sh2a_nofpu_or_sh4_nommu_nofpu_up },
+  { bfd_mach_sh2a_nofpu_or_sh3_nommu,              arch_sh2a_nofpu_or_sh3_nommu,         arch_sh2a_nofpu_or_sh3_nommu_up },
+  { bfd_mach_sh2a_or_sh4,     arch_sh2a_or_sh4,            arch_sh2a_or_sh4_up },
+  { bfd_mach_sh2a_or_sh3e,    arch_sh2a_or_sh3e,    arch_sh2a_or_sh3e_up },
+
+  { bfd_mach_sh3,            arch_sh3,             arch_sh3_up },
+  { bfd_mach_sh3_nommu,              arch_sh3_nommu,       arch_sh3_nommu_up },
+  { bfd_mach_sh3_dsp,        arch_sh3_dsp,         arch_sh3_dsp_up },
+  { bfd_mach_sh3e,           arch_sh3e,            arch_sh3e_up },
+  { bfd_mach_sh4,            arch_sh4,             arch_sh4_up },
+  { bfd_mach_sh4a,           arch_sh4a,            arch_sh4a_up },
+  { bfd_mach_sh4al_dsp,              arch_sh4al_dsp,       arch_sh4al_dsp_up },
+  { bfd_mach_sh4_nofpu,              arch_sh4_nofpu,       arch_sh4_nofpu_up },
   { bfd_mach_sh4_nommu_nofpu, arch_sh4_nommu_nofpu, arch_sh4_nommu_nofpu_up },
   { bfd_mach_sh4_nommu_nofpu, arch_sh4_nommu_nofpu, arch_sh4_nommu_nofpu_up },
-  { bfd_mach_sh4a_nofpu,      arch_sh4a_nofpu,      arch_sh4a_nofp_up },
-  { 0, 0, 0 }   /* Terminator.  */
+  { bfd_mach_sh4a_nofpu,      arch_sh4a_nofpu,     arch_sh4a_nofpu_up },
+  { 0, 0, 0 }  /* Terminator.  */
 };
 
 
 };
 
 
@@ -290,14 +110,14 @@ unsigned int
 sh_get_arch_from_bfd_mach (unsigned long mach)
 {
   int i = 0;
 sh_get_arch_from_bfd_mach (unsigned long mach)
 {
   int i = 0;
-  
+
   while (bfd_to_arch_table[i].bfd_mach != 0)
     if (bfd_to_arch_table[i].bfd_mach == mach)
       return bfd_to_arch_table[i].arch;
     else
       i++;
 
   while (bfd_to_arch_table[i].bfd_mach != 0)
     if (bfd_to_arch_table[i].bfd_mach == mach)
       return bfd_to_arch_table[i].arch;
     else
       i++;
 
-  /* mach not found.  */
+  /* Machine not found.   */
   BFD_FAIL();
 
   return SH_ARCH_UNKNOWN_ARCH;
   BFD_FAIL();
 
   return SH_ARCH_UNKNOWN_ARCH;
@@ -312,14 +132,14 @@ unsigned int
 sh_get_arch_up_from_bfd_mach (unsigned long mach)
 {
   int i = 0;
 sh_get_arch_up_from_bfd_mach (unsigned long mach)
 {
   int i = 0;
-  
+
   while (bfd_to_arch_table[i].bfd_mach != 0)
     if (bfd_to_arch_table[i].bfd_mach == mach)
       return bfd_to_arch_table[i].arch_up;
     else
       i++;
 
   while (bfd_to_arch_table[i].bfd_mach != 0)
     if (bfd_to_arch_table[i].bfd_mach == mach)
       return bfd_to_arch_table[i].arch_up;
     else
       i++;
 
-  /* mach not found.  */
+  /* Machine not found.  */
   BFD_FAIL();
 
   return SH_ARCH_UNKNOWN_ARCH;
   BFD_FAIL();
 
   return SH_ARCH_UNKNOWN_ARCH;
@@ -357,7 +177,7 @@ sh_get_bfd_mach_from_arch_set (unsigned int arch_set)
       /* Conceptually: Find the architecture with the least number
         of extra features or, if they have the same number, then
         the greatest number of required features.  Disregard
       /* Conceptually: Find the architecture with the least number
         of extra features or, if they have the same number, then
         the greatest number of required features.  Disregard
-         architectures where the required features alone do
+        architectures where the required features alone do
         not describe a valid architecture.  */
       if (((try & ~arch_set) < (best & ~arch_set)
           || ((try & ~arch_set) == (best & ~arch_set)
         not describe a valid architecture.  */
       if (((try & ~arch_set) < (best & ~arch_set)
           || ((try & ~arch_set) == (best & ~arch_set)
@@ -377,50 +197,3 @@ sh_get_bfd_mach_from_arch_set (unsigned int arch_set)
 
   return result;
 }
 
   return result;
 }
-
-
-/* Merge the architecture type of two BFD files, such that the
-   resultant architecture supports all the features required
-   by the two input BFDs.
-   If the input BFDs are multually incompatible - i.e. one uses
-   DSP while the other uses FPU - or there is no known architecture
-   that fits the requirements then an error is emitted.  */
-
-bfd_boolean
-sh_merge_bfd_arch (bfd *ibfd, bfd *obfd)
-{
-  unsigned int old_arch, new_arch, merged_arch;
-
-  if (! _bfd_generic_verify_endian_match (ibfd, obfd))
-    return FALSE;
-
-  old_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (obfd));
-  new_arch = sh_get_arch_up_from_bfd_mach (bfd_get_mach (ibfd));
-
-  merged_arch = SH_MERGE_ARCH_SET (old_arch, new_arch);
-
-  if (!SH_VALID_CO_ARCH_SET (merged_arch))
-    {
-      (*_bfd_error_handler)
-       ("%s: uses %s instructions while previous modules use %s instructions",
-        bfd_archive_filename (ibfd),
-        SH_ARCH_SET_HAS_DSP (new_arch) ? "dsp" : "floating point",
-        SH_ARCH_SET_HAS_DSP (new_arch) ? "floating point" : "dsp");
-      bfd_set_error (bfd_error_bad_value);
-      return FALSE;
-    }
-  else if (!SH_VALID_ARCH_SET (merged_arch))
-    {
-      (*_bfd_error_handler)
-       ("internal error: merge of architecture '%s' with architecture '%s' produced unknown architecture\n",
-        bfd_printable_name (obfd),
-        bfd_printable_name (ibfd));
-      bfd_set_error (bfd_error_bad_value);
-      return FALSE;
-    }
-
-  bfd_default_set_arch_mach (obfd, bfd_arch_sh,
-                            sh_get_bfd_mach_from_arch_set (merged_arch));
-  
-  return TRUE;
-}
This page took 0.02844 seconds and 4 git commands to generate.