Applied Stephane Carrez <Stephane.Carrez@worldnet.fr> patches to add support
[binutils-gdb.git] / bfd / archures.c
index 5090291e75bc2f64d5ecbf23ede43aefc019f16a..ffc79377e88d6256b15cb3b0eef22ea27aa63999 100644 (file)
@@ -1,5 +1,6 @@
 /* BFD library support routines for architectures.
-   Copyright (C) 1990, 91, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999, 2000
+   Free Software Foundation, Inc.
    Hacked by John Gilmore and Steve Chamberlain of Cygnus Support.
 
 This file is part of BFD, the Binary File Descriptor library.
@@ -70,6 +71,14 @@ DESCRIPTION
 .  bfd_arch_unknown,   {* File arch not known *}
 .  bfd_arch_obscure,   {* Arch known, not one of these *}
 .  bfd_arch_m68k,      {* Motorola 68xxx *}
+.#define bfd_mach_m68000 1
+.#define bfd_mach_m68008 2
+.#define bfd_mach_m68010 3
+.#define bfd_mach_m68020 4
+.#define bfd_mach_m68030 5
+.#define bfd_mach_m68040 6
+.#define bfd_mach_m68060 7
+.#define bfd_mach_cpu32  8
 .  bfd_arch_vax,       {* DEC Vax *}   
 .  bfd_arch_i960,      {* Intel 960 *}
 .    {* The order of the following is important.
@@ -97,18 +106,36 @@ DESCRIPTION
 .#define bfd_mach_sparc_sparclite      3
 .#define bfd_mach_sparc_v8plus         4
 .#define bfd_mach_sparc_v8plusa                5 {* with ultrasparc add'ns *}
-.#define bfd_mach_sparc_v9             6
-.#define bfd_mach_sparc_v9a            7 {* with ultrasparc add'ns *}
+.#define bfd_mach_sparc_sparclite_le   6
+.#define bfd_mach_sparc_v9             7
+.#define bfd_mach_sparc_v9a            8 {* with ultrasparc add'ns *}
 .{* Nonzero if MACH has the v9 instruction set.  *}
 .#define bfd_mach_sparc_v9_p(mach) \
 .  ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9a)
 .  bfd_arch_mips,      {* MIPS Rxxxx *}
+.#define bfd_mach_mips3000             3000
+.#define bfd_mach_mips3900             3900
+.#define bfd_mach_mips4000             4000
+.#define bfd_mach_mips4010             4010
+.#define bfd_mach_mips4100             4100
+.#define bfd_mach_mips4111             4111
+.#define bfd_mach_mips4300             4300
+.#define bfd_mach_mips4400             4400
+.#define bfd_mach_mips4600             4600
+.#define bfd_mach_mips4650             4650
+.#define bfd_mach_mips5000             5000
+.#define bfd_mach_mips6000             6000
+.#define bfd_mach_mips8000             8000
+.#define bfd_mach_mips10000            10000
+.#define bfd_mach_mips16               16
 .  bfd_arch_i386,      {* Intel 386 *}
 .#define bfd_mach_i386_i386 0
 .#define bfd_mach_i386_i8086 1
+.#define bfd_mach_i386_i386_intel_syntax 2
 .  bfd_arch_we32k,     {* AT&T WE32xxx *}
 .  bfd_arch_tahoe,     {* CCI/Harris Tahoe *}
 .  bfd_arch_i860,      {* Intel 860 *}
+.  bfd_arch_i370,      {* IBM 360/370 Mainframes *}
 .  bfd_arch_romp,      {* IBM ROMP PC/RT *}
 .  bfd_arch_alliant,   {* Alliant *}
 .  bfd_arch_convex,    {* Convex *}
@@ -119,35 +146,89 @@ DESCRIPTION
 .#define bfd_mach_h8300h  2
 .#define bfd_mach_h8300s  3
 .  bfd_arch_powerpc,   {* PowerPC *}
+.#define bfd_mach_ppc          0
+.#define bfd_mach_ppc_403      403
+.#define bfd_mach_ppc_403gc    4030
+.#define bfd_mach_ppc_505      505
+.#define bfd_mach_ppc_601      601
+.#define bfd_mach_ppc_602      602
+.#define bfd_mach_ppc_603      603
+.#define bfd_mach_ppc_ec603e   6031
+.#define bfd_mach_ppc_604      604
+.#define bfd_mach_ppc_620      620
+.#define bfd_mach_ppc_630      630
+.#define bfd_mach_ppc_750      750
+.#define bfd_mach_ppc_860      860
+.#define bfd_mach_ppc_a35      35
+.#define bfd_mach_ppc_rs64ii   642
+.#define bfd_mach_ppc_rs64iii  643
+.#define bfd_mach_ppc_7400     7400
 .  bfd_arch_rs6000,    {* IBM RS/6000 *}
+.#define bfd_mach_rs6k         0
+.#define bfd_mach_rs6k_rs1     6001
+.#define bfd_mach_rs6k_rsc     6003
+.#define bfd_mach_rs6k_rs2     6002
 .  bfd_arch_hppa,      {* HP PA RISC *}
-. {* start-sanitize-d10v *}
 .  bfd_arch_d10v,      {* Mitsubishi D10V *}
-. {* end-sanitize-d10v *}
+.#define bfd_mach_d10v         0
+.#define bfd_mach_d10v_ts2     2
+.#define bfd_mach_d10v_ts3     3
+.  bfd_arch_d30v,      {* Mitsubishi D30V *}
+.  bfd_arch_m68hc11,   {* Motorola 68HC11 *}
+.  bfd_arch_m68hc12,   {* Motorola 68HC12 *}
 .  bfd_arch_z8k,       {* Zilog Z8000 *}
 .#define bfd_mach_z8001                1
 .#define bfd_mach_z8002                2
 .  bfd_arch_h8500,     {* Hitachi H8/500 *}
 .  bfd_arch_sh,        {* Hitachi SH *}
+.#define bfd_mach_sh            0
+.#define bfd_mach_sh2        0x20
+.#define bfd_mach_sh_dsp     0x2d
+.#define bfd_mach_sh3        0x30
+.#define bfd_mach_sh3_dsp    0x3d
+.#define bfd_mach_sh3e       0x3e
+.#define bfd_mach_sh4        0x40
 .  bfd_arch_alpha,     {* Dec Alpha *}
+.#define bfd_mach_alpha_ev4  0x10
+.#define bfd_mach_alpha_ev5  0x20
+.#define bfd_mach_alpha_ev6  0x30
 .  bfd_arch_arm,       {* Advanced Risc Machines ARM *}
+.#define bfd_mach_arm_2                1
+.#define bfd_mach_arm_2a       2
+.#define bfd_mach_arm_3                3
+.#define bfd_mach_arm_3M       4
+.#define bfd_mach_arm_4        5
+.#define bfd_mach_arm_4T       6
+.#define bfd_mach_arm_5        7
+.#define bfd_mach_arm_5T       8
 .  bfd_arch_ns32k,     {* National Semiconductors ns32000 *}
 .  bfd_arch_w65,       {* WDC 65816 *}
-. {* start-sanitize-v850 *}
+.  bfd_arch_tic30,     {* Texas Instruments TMS320C30 *}
+.  bfd_arch_tic54x,    {* Texas Instruments TMS320C54X *}
+.  bfd_arch_tic80,     {* TI TMS320c80 (MVP) *}
 .  bfd_arch_v850,      {* NEC V850 *}
-. {* end-sanitize-v850 *}
-. {* start-sanitize-arc *}
+.#define bfd_mach_v850          0
+.#define bfd_mach_v850e        'E'
+.#define bfd_mach_v850ea       'A'
 .  bfd_arch_arc,       {* Argonaut RISC Core *}
 .#define bfd_mach_arc_base 0
-.#define bfd_mach_arc_host 1
-.#define bfd_mach_arc_graphics 2
-.#define bfd_mach_arc_audio 3
-. {* end-sanitize-arc *}
-. {* start-sanitize-m32r *}
-.  bfd_arch_m32r,      {* Mitsubishi M32R *}
-. {* end-sanitize-m32r *}
+.  bfd_arch_m32r,      {* Mitsubishi M32R/D *}
+.#define bfd_mach_m32r         0 {* backwards compatibility *}
+.#define bfd_mach_m32rx                'x'
 .  bfd_arch_mn10200,   {* Matsushita MN10200 *}
 .  bfd_arch_mn10300,   {* Matsushita MN10300 *}
+.#define bfd_mach_mn10300              300
+.#define bfd_mach_am33         330
+.  bfd_arch_fr30,
+.#define bfd_mach_fr30         0x46523330
+.  bfd_arch_mcore,
+.  bfd_arch_ia64,      {* HP/Intel ia64 *}
+.  bfd_arch_pj,
+.  bfd_arch_avr,       {* Atmel AVR microcontrollers *}
+.#define bfd_mach_avr1         1
+.#define bfd_mach_avr2         2
+.#define bfd_mach_avr3         3
+.#define bfd_mach_avr4         4
 .  bfd_arch_last
 .  };
 
@@ -188,22 +269,20 @@ DESCRIPTION
 
 extern const bfd_arch_info_type bfd_a29k_arch;
 extern const bfd_arch_info_type bfd_alpha_arch;
-/* start-sanitize-arc */
 extern const bfd_arch_info_type bfd_arc_arch;
-/* end-sanitize-arc */
 extern const bfd_arch_info_type bfd_arm_arch;
-/* start-sanitize-d10v */
 extern const bfd_arch_info_type bfd_d10v_arch;
-/* end-sanitize-d10v */
+extern const bfd_arch_info_type bfd_d30v_arch;
 extern const bfd_arch_info_type bfd_h8300_arch;
 extern const bfd_arch_info_type bfd_h8500_arch;
 extern const bfd_arch_info_type bfd_hppa_arch;
+extern const bfd_arch_info_type bfd_i370_arch;
 extern const bfd_arch_info_type bfd_i386_arch;
 extern const bfd_arch_info_type bfd_i860_arch;
 extern const bfd_arch_info_type bfd_i960_arch;
-/* start-sanitize-m32r */
 extern const bfd_arch_info_type bfd_m32r_arch;
-/* end-sanitize-m32r */
+extern const bfd_arch_info_type bfd_m68hc11_arch;
+extern const bfd_arch_info_type bfd_m68hc12_arch;
 extern const bfd_arch_info_type bfd_m68k_arch;
 extern const bfd_arch_info_type bfd_m88k_arch;
 extern const bfd_arch_info_type bfd_mips_arch;
@@ -211,19 +290,22 @@ extern const bfd_arch_info_type bfd_mn10200_arch;
 extern const bfd_arch_info_type bfd_mn10300_arch;
 extern const bfd_arch_info_type bfd_powerpc_arch;
 extern const bfd_arch_info_type bfd_rs6000_arch;
+extern const bfd_arch_info_type bfd_pj_arch;
 extern const bfd_arch_info_type bfd_sh_arch;
 extern const bfd_arch_info_type bfd_sparc_arch;
-/* start-sanitize-tic80 */
+extern const bfd_arch_info_type bfd_tic30_arch;
+extern const bfd_arch_info_type bfd_tic54x_arch;
 extern const bfd_arch_info_type bfd_tic80_arch;
-/* end-sanitize-tic80 */
 extern const bfd_arch_info_type bfd_vax_arch;
 extern const bfd_arch_info_type bfd_we32k_arch;
 extern const bfd_arch_info_type bfd_z8k_arch;
 extern const bfd_arch_info_type bfd_ns32k_arch;
 extern const bfd_arch_info_type bfd_w65_arch;
-/* start-sanitize-v850 */
 extern const bfd_arch_info_type bfd_v850_arch;
-/* end-sanitize-v850 */
+extern const bfd_arch_info_type bfd_fr30_arch;
+extern const bfd_arch_info_type bfd_mcore_arch;
+extern const bfd_arch_info_type bfd_avr_arch;
+extern const bfd_arch_info_type bfd_ia64_arch;
 
 static const bfd_arch_info_type * const bfd_archures_list[] =
 {
@@ -232,22 +314,20 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
 #else
   &bfd_a29k_arch,
   &bfd_alpha_arch,
-/* start-sanitize-arc */
   &bfd_arc_arch,
-/* end-sanitize-arc */
   &bfd_arm_arch,
-/* start-sanitize-d10v */
   &bfd_d10v_arch,
-/* end-sanitize-d10v */
+  &bfd_d30v_arch,
   &bfd_h8300_arch,
   &bfd_h8500_arch,
   &bfd_hppa_arch,
+  &bfd_i370_arch,
   &bfd_i386_arch,
   &bfd_i860_arch,
   &bfd_i960_arch,
-/* start-sanitize-m32r */
   &bfd_m32r_arch,
-/* end-sanitize-m32r */
+  &bfd_m68hc11_arch,
+  &bfd_m68hc12_arch,
   &bfd_m68k_arch,
   &bfd_m88k_arch,
   &bfd_mips_arch,
@@ -257,14 +337,19 @@ static const bfd_arch_info_type * const bfd_archures_list[] =
   &bfd_rs6000_arch,
   &bfd_sh_arch,
   &bfd_sparc_arch,
+  &bfd_tic30_arch,
+  &bfd_tic54x_arch,
+  &bfd_tic80_arch,
   &bfd_vax_arch,
   &bfd_we32k_arch,
   &bfd_z8k_arch,
   &bfd_ns32k_arch,
   &bfd_w65_arch,
-/* start-sanitize-v850*/
   &bfd_v850_arch,
-/* end-sanitize-v850 */
+  &bfd_fr30_arch,
+  &bfd_mcore_arch,
+  &bfd_avr_arch,
+  &bfd_ia64_arch,
 #endif
   0
 };
@@ -326,6 +411,61 @@ bfd_scan_arch (string)
 
 
 
+/*
+FUNCTION
+       bfd_arch_list
+
+SYNOPSIS
+       const char **bfd_arch_list(void);
+
+DESCRIPTION
+       Return a freshly malloced NULL-terminated vector of the names
+       of all the valid BFD architectures.  Do not modify the names.
+
+*/
+
+const char **
+bfd_arch_list ()
+{
+  int vec_length = 0;
+  const char **name_ptr;
+  const char **name_list;
+  const bfd_arch_info_type * const *app;
+
+  /* Determine the number of architectures */
+  vec_length = 0;
+  for (app = bfd_archures_list; *app != NULL; app++)
+    {
+      const bfd_arch_info_type *ap;
+      for (ap = *app; ap != NULL; ap = ap->next)
+       {
+         vec_length++;
+       }
+    }
+
+  name_list = (CONST char **)
+    bfd_malloc ((vec_length + 1) * sizeof (char **));
+  if (name_list == NULL)
+    return NULL;
+
+  /* Point the list at each of the names */
+  name_ptr = name_list;
+  for (app = bfd_archures_list; *app != NULL; app++)
+    {
+      const bfd_arch_info_type *ap;
+      for (ap = *app; ap != NULL; ap = ap->next)
+       {
+         *name_ptr = ap->printable_name;
+         name_ptr++;
+       }
+    }
+  *name_ptr = NULL;
+
+  return name_list;
+}
+
+
+
 /*
 FUNCTION
        bfd_arch_get_compatible
@@ -577,11 +717,59 @@ bfd_default_scan (info, string)
   const char *ptr_tst;
   unsigned long number;
   enum bfd_architecture arch;
+  const char *printable_name_colon;
 
-  /* First test for an exact match */
-  if (strcmp (string, info->printable_name) == 0)
+  /* Exact match of the architecture name (ARCH_NAME) and also the
+     default architecture? */
+  if (strcasecmp (string, info->arch_name) == 0
+      && info->the_default)
     return true;
 
+  /* Exact match of the machine name (PRINTABLE_NAME)? */
+  if (strcasecmp (string, info->printable_name) == 0)
+    return true;
+     
+  /* Given that printable_name contains no colon, attempt to match:
+     ARCH_NAME [ ":" ] PRINTABLE_NAME? */
+  printable_name_colon = strchr (info->printable_name, ':');
+  if (printable_name_colon == NULL)
+    {
+      int strlen_arch_name = strlen (info->arch_name);
+      if (strncasecmp (string, info->arch_name, strlen_arch_name) == 0)
+       {
+         if (string[strlen_arch_name] == ':')
+           {
+             if (strcasecmp (string + strlen_arch_name + 1,
+                             info->printable_name) == 0)
+               return true;
+           }
+         else
+           {
+             if (strcasecmp (string + strlen_arch_name,
+                             info->printable_name) == 0)
+               return true;
+           }
+       }
+    }
+
+  /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>;
+     Attempt to match: <arch> <mach>? */
+  if (printable_name_colon != NULL)
+    {
+      int colon_index = printable_name_colon - info->printable_name;
+      if (strncasecmp (string, info->printable_name, colon_index) == 0
+         && strcasecmp (string + colon_index,
+                        info->printable_name + colon_index + 1) == 0)
+       return true;
+    }
+
+  /* Given that PRINTABLE_NAME has the form: <arch> ":" <mach>; Do not
+     attempt to match just <mach>, it could be ambigious.  This test
+     is left until later. */
+
+  /* NOTE: The below is retained for compatibility only. Please do not
+     add to this code */
+
   /* See how much of the supplied string matches with the
      architecture, eg the string m68k:68020 would match the 68k entry
      up to the :, then we get left with the machine number */
@@ -606,75 +794,85 @@ bfd_default_scan (info, string)
     }
 
   number = 0;
-  while (isdigit(*ptr_src))
+  while (isdigit ((unsigned char) *ptr_src))
     {
       number = number * 10 + *ptr_src  - '0';
       ptr_src++;
     }
 
+  /* NOTE: The below is retained for compatibility only.
+     PLEASE DO NOT ADD TO THIS CODE. */
+
   switch (number) 
     {
-    case 65:
-      arch = bfd_arch_w65;
-      break;
-
-    case 300:
-      arch = bfd_arch_h8300;
-      break;
-
-    case 500:
-      arch = bfd_arch_h8500;
+      /* FIXME: These are needed to parse IEEE objects.  */
+    case 68000: 
+      arch = bfd_arch_m68k;
+      number = bfd_mach_m68000;
       break;
-
     case 68010:
+      arch = bfd_arch_m68k;
+      number = bfd_mach_m68010;
+      break;
     case 68020:
+      arch = bfd_arch_m68k;
+      number = bfd_mach_m68020;
+      break;
     case 68030:
-    case 68040:
-    case 68332:
-    case 68050:        
-    case 68000: 
-      arch = bfd_arch_m68k; 
+      arch = bfd_arch_m68k;
+      number = bfd_mach_m68030;
       break;
-
-    case 386: 
-    case 80386:
-    case 486:
-    case 80486:
-      arch = bfd_arch_i386;
+    case 68040:
+      arch = bfd_arch_m68k;
+      number = bfd_mach_m68040;
       break;
-
-    case 29000: 
-      arch = bfd_arch_a29k;
+    case 68060:
+      arch = bfd_arch_m68k;
+      number = bfd_mach_m68060;
       break;
-
-    case 8000:
-      arch = bfd_arch_z8k;
+    case 68332:
+      arch = bfd_arch_m68k;
+      number = bfd_mach_cpu32;
       break;
 
     case 32000:
       arch = bfd_arch_we32k;
       break;
 
-    case 860:
-    case 80860: 
-      arch = bfd_arch_i860; 
-      break;
-    case 960:
-    case 80960:
-      arch = bfd_arch_i960;
+    case 3000:
+      arch = bfd_arch_mips;
+      number = bfd_mach_mips3000;
       break;
 
-    case 2000:
-    case 3000:
     case 4000:
-    case 4400:
       arch = bfd_arch_mips;
+      number = bfd_mach_mips4000;
       break;
 
     case 6000:
       arch = bfd_arch_rs6000;
       break;
 
+    case 7410:
+      arch = bfd_arch_sh;
+      number = bfd_mach_sh_dsp;
+      break;
+
+    case 7708:
+      arch = bfd_arch_sh;
+      number = bfd_mach_sh3;
+      break;
+
+    case 7729:
+      arch = bfd_arch_sh;
+      number = bfd_mach_sh3_dsp;
+      break;
+
+    case 7750:
+      arch = bfd_arch_sh;
+      number = bfd_mach_sh4;
+      break;
+
     default:  
       return false;
     }
@@ -767,9 +965,58 @@ bfd_printable_arch_mach (arch, machine)
      enum bfd_architecture arch;
      unsigned long machine;
 {
-    const bfd_arch_info_type *ap = bfd_lookup_arch (arch, machine);
+    const bfd_arch_info_type * ap = bfd_lookup_arch (arch, machine);
 
     if (ap)
       return ap->printable_name;
     return "UNKNOWN!";
 }
+
+/*
+FUNCTION
+       bfd_octets_per_byte
+
+SYNOPSIS
+       unsigned int bfd_octets_per_byte(bfd *abfd);
+
+DESCRIPTION
+       Return the number of octets (8-bit quantities) per target byte
+        (minimum addressable unit).  In most cases, this will be one, but some
+        DSP targets have 16, 32, or even 48 bits per byte.
+
+*/
+
+unsigned int
+bfd_octets_per_byte (abfd)
+     bfd * abfd;
+{
+    return bfd_arch_mach_octets_per_byte (bfd_get_arch (abfd), 
+                                          bfd_get_mach (abfd));
+}
+
+/*
+FUNCTION
+       bfd_arch_mach_octets_per_byte
+
+SYNOPSIS
+       unsigned int bfd_arch_mach_octets_per_byte(enum bfd_architecture arch,
+                                                   unsigned long machine);
+
+DESCRIPTION
+       See bfd_octets_per_byte.
+        
+        This routine is provided for those cases where a bfd * is not
+        available
+*/
+
+unsigned int
+bfd_arch_mach_octets_per_byte (arch, mach)
+    enum bfd_architecture arch;
+    unsigned long mach;
+{
+    const bfd_arch_info_type * ap = bfd_lookup_arch (arch, mach);
+    
+    if (ap)
+      return ap->bits_per_byte / 8;
+    return 1;
+}