gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / bfd / cpu-cris.c
index 10d779f6c9dfd66da45fee6925c2471b5379ffd6..e64eca626fae40b010c29d2e382a8cf2f97dbcec 100644 (file)
@@ -1,30 +1,81 @@
 /* BFD support for the Axis CRIS architecture.
-   Copyright 2000 Free Software Foundation, Inc.
+   Copyright (C) 2000-2020 Free Software Foundation, Inc.
    Contributed by Axis Communications AB.
    Written by Hans-Peter Nilsson.
 
-This file is part of BFD, the Binary File Descriptor library.
+   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
-(at your option) any later version.
+   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 3 of the License, or
+   (at your option) any later version.
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
-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.  */
+   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., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
-#include "bfd.h"
 #include "sysdep.h"
+#include "bfd.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
+  (const bfd_arch_info_type *, const bfd_arch_info_type *);
+
+static const bfd_arch_info_type *
+get_compatible (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
+  /* The code below is disabled but kept as a warning.
+     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, bfd_arch_default_fill, NEXT, 0 }
+
+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,21 +83,23 @@ 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 an bfd_arch_info_type is a
+  bfd_default_scan,            /* Check if a bfd_arch_info_type is a
                                   match.  */
-  NULL                         /* Pointer to next bfd_arch_info_type in
+  bfd_arch_default_fill,       /* Default fill.  */
+  &bfd_cris_arch_v32,          /* Pointer to next bfd_arch_info_type in
                                   the same family.  */
+  0 /* Maximum offset of a reloc from the start of an insn.  */
 };
 
 /*
This page took 0.024513 seconds and 4 git commands to generate.