* config.bfd: Support crisv32-*-* like cris-*-*.
[deliverable/binutils-gdb.git] / bfd / cpu-cris.c
index 9e60ff062f3058f2c49d3a64dbc826f3c8a9603b..d15a2756aa833dc4d37fbea14c236e687d78e218 100644 (file)
@@ -23,8 +23,58 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include "sysdep.h"
 #include "libbfd.h"
 
-const bfd_arch_info_type
-bfd_cris_arch =
+/* This routine is provided two arch_infos and returns the lowest common
+   denominator.  CRIS v0..v10 vs. v32 are not compatible in general, but
+   there's a compatible subset for which we provide an arch_info.  */
+
+static const bfd_arch_info_type * get_compatible
+  PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *));
+
+static const bfd_arch_info_type *
+get_compatible (a,b)
+     const bfd_arch_info_type *a;
+     const bfd_arch_info_type *b;
+{
+  /* Arches must match.  */
+  if (a->arch != b->arch)
+   return NULL;
+
+  /* If either is the compatible mach, return the other.  */
+  if (a->mach == bfd_mach_cris_v10_v32)
+    return b;
+  if (b->mach == bfd_mach_cris_v10_v32)
+    return a;
+
+#if 0
+  /* See ldlang.c:lang_check.  Quite illogically, incompatible arches
+     (as signalled by this function) are only *warned* about, while with
+     this function signalling compatible ones, we can have the
+     cris_elf_merge_private_bfd_data function return an error.  This is
+     undoubtedly a FIXME: in general.  Also, the
+     command_line.warn_mismatch flag and the --no-warn-mismatch option
+     are misnamed for the multitude of ports that signal compatibility:
+     it is there an error, not a warning.  We work around it by
+     pretending matching machs here.  */
+
+  /* Except for the compatible mach, machs must match.  */
+  if (a->mach != b->mach)
+    return NULL;
+#endif
+
+  return a;
+}
+
+#define N(NUMBER, PRINT, NEXT)  \
+ { 32, 32, 8, bfd_arch_cris, NUMBER, "cris", PRINT, 1, FALSE, \
+   get_compatible, bfd_default_scan, NEXT }
+
+static const bfd_arch_info_type bfd_cris_arch_compat_v10_v32 =
+ N (bfd_mach_cris_v10_v32, "cris:common_v10_v32", NULL);
+
+static const bfd_arch_info_type bfd_cris_arch_v32 =
+ N (bfd_mach_cris_v32, "crisv32", &bfd_cris_arch_compat_v10_v32);
+
+const bfd_arch_info_type bfd_cris_arch =
 {
   32,                          /* There's 32 bits_per_word.  */
   32,                          /* There's 32 bits_per_address.  */
@@ -32,20 +82,20 @@ bfd_cris_arch =
   bfd_arch_cris,               /* One of enum bfd_architecture, defined
                                   in archures.c and provided in
                                   generated header files.  */
-  0xff,                                /* Only 1 machine, but #255 for
-                                  historical reasons.  */
+  bfd_mach_cris_v0_v10,                /* Random BFD-internal number for this
+                                  machine, similarly listed in
+                                  archures.c.  Not emitted in output.  */
   "cris",                      /* The arch_name.  */
   "cris",                      /* The printable name is the same.  */
   1,                           /* Section alignment power; each section
                                   is aligned to (only) 2^1 bytes.  */
-  TRUE,                                /* This is the default "machine", since
-                                  there's only one.  */
-  bfd_default_compatible,      /* A default function for testing
+  TRUE,                                /* This is the default "machine".  */
+  get_compatible,              /* A function for testing
                                   "machine" compatibility of two
                                   bfd_arch_info_type.  */
   bfd_default_scan,            /* Check if a bfd_arch_info_type is a
                                   match.  */
-  NULL                         /* Pointer to next bfd_arch_info_type in
+  &bfd_cris_arch_v32           /* Pointer to next bfd_arch_info_type in
                                   the same family.  */
 };
 
This page took 0.023841 seconds and 4 git commands to generate.