Fix crash with "maint print arc"
[binutils-gdb.git] / gdb / microblaze-tdep.c
index 17871229c8074eb4247f22e38130ded50778cc95..3d5dd66934131d7c8d49cec83928244a0e93d80a 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for Xilinx MicroBlaze.
 
-   Copyright (C) 2009-2020 Free Software Foundation, Inc.
+   Copyright (C) 2009-2022 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -31,7 +31,7 @@
 #include "target.h"
 #include "frame-base.h"
 #include "frame-unwind.h"
-#include "dwarf2-frame.h"
+#include "dwarf2/frame.h"
 #include "osabi.h"
 #include "target-descriptions.h"
 #include "opcodes/microblaze-opcm.h"
@@ -65,7 +65,7 @@
 
 /* The registers of the Xilinx microblaze processor.  */
 
-static const char *microblaze_register_names[] =
+static const char * const microblaze_register_names[] =
 {
   "r0",   "r1",  "r2",    "r3",   "r4",   "r5",   "r6",   "r7",
   "r8",   "r9",  "r10",   "r11",  "r12",  "r13",  "r14",  "r15",
@@ -82,19 +82,10 @@ static const char *microblaze_register_names[] =
 \f
 static unsigned int microblaze_debug_flag = 0;
 
-static void ATTRIBUTE_PRINTF (1, 2)
-microblaze_debug (const char *fmt, ...)
-{ 
-  if (microblaze_debug_flag)
-    {
-       va_list args;
+#define microblaze_debug(fmt, ...) \
+  debug_prefixed_printf_cond_nofunc (microblaze_debug_flag, "MICROBLAZE", \
+                                    fmt, ## __VA_ARGS__)
 
-       va_start (args, fmt);
-       printf_unfiltered ("MICROBLAZE: ");
-       vprintf_unfiltered (fmt, args);
-       va_end (args);
-    }
-}
 \f
 /* Return the name of register REGNUM.  */
 
@@ -204,7 +195,6 @@ microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
   unsigned long insn;
   int rd, ra, rb, imm;
   enum microblaze_instr op;
-  int flags = 0;
   int save_hidden_pointer_found = 0;
   int non_stack_instruction_found = 0;
 
@@ -302,9 +292,7 @@ microblaze_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
       else if (IS_SETUP_FP(op, ra, rb))
        {
          /* We have a frame pointer.  Note the register which is 
-             acting as the frame pointer.  */
-         flags |= MICROBLAZE_MY_FRAME_IN_FP;
-         flags &= ~MICROBLAZE_MY_FRAME_IN_SP;
+            acting as the frame pointer.  */
          cache->fp_regnum = rd;
          microblaze_debug ("Found a frame pointer: r%d\n", cache->fp_regnum);
          save_hidden_pointer_found = 0;
@@ -478,9 +466,9 @@ microblaze_frame_prev_register (struct frame_info *this_frame,
   if (cache->frameless_p)
     {
       if (regnum == MICROBLAZE_PC_REGNUM)
-        regnum = 15;
+       regnum = 15;
       if (regnum == MICROBLAZE_SP_REGNUM)
-        regnum = 1;
+       regnum = 1;
       return trad_frame_get_prev_register (this_frame,
                                           cache->saved_regs, regnum);
     }
@@ -492,6 +480,7 @@ microblaze_frame_prev_register (struct frame_info *this_frame,
 
 static const struct frame_unwind microblaze_frame_unwind =
 {
+  "microblaze prologue",
   NORMAL_FRAME,
   default_frame_unwind_stop_reason,
   microblaze_frame_this_id,
@@ -638,20 +627,19 @@ static void
 microblaze_register_g_packet_guesses (struct gdbarch *gdbarch)
 {
   register_remote_g_packet_guess (gdbarch,
-                                  4 * MICROBLAZE_NUM_CORE_REGS,
-                                  tdesc_microblaze);
+                                 4 * MICROBLAZE_NUM_CORE_REGS,
+                                 tdesc_microblaze);
 
   register_remote_g_packet_guess (gdbarch,
-                                  4 * MICROBLAZE_NUM_REGS,
-                                  tdesc_microblaze_with_stack_protect);
+                                 4 * MICROBLAZE_NUM_REGS,
+                                 tdesc_microblaze_with_stack_protect);
 }
 
 static struct gdbarch *
 microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
-  struct gdbarch_tdep *tdep;
   struct gdbarch *gdbarch;
-  struct tdesc_arch_data *tdesc_data = NULL;
+  tdesc_arch_data_up tdesc_data;
   const struct target_desc *tdesc = info.target_desc;
 
   /* If there is already a candidate, use it.  */
@@ -669,37 +657,34 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       int i;
 
       feature = tdesc_find_feature (tdesc,
-                                    "org.gnu.gdb.microblaze.core");
+                                   "org.gnu.gdb.microblaze.core");
       if (feature == NULL)
-        return NULL;
+       return NULL;
       tdesc_data = tdesc_data_alloc ();
 
       valid_p = 1;
       for (i = 0; i < MICROBLAZE_NUM_CORE_REGS; i++)
-        valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
-                                            microblaze_register_names[i]);
+       valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
+                                           microblaze_register_names[i]);
       feature = tdesc_find_feature (tdesc,
-                                    "org.gnu.gdb.microblaze.stack-protect");
+                                   "org.gnu.gdb.microblaze.stack-protect");
       if (feature != NULL)
-        {
-          valid_p = 1;
-          valid_p &= tdesc_numbered_register (feature, tdesc_data,
-                                              MICROBLAZE_SLR_REGNUM,
-                                              "rslr");
-          valid_p &= tdesc_numbered_register (feature, tdesc_data,
-                                              MICROBLAZE_SHR_REGNUM,
-                                              "rshr");
-        }
+       {
+         valid_p = 1;
+         valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+                                             MICROBLAZE_SLR_REGNUM,
+                                             "rslr");
+         valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+                                             MICROBLAZE_SHR_REGNUM,
+                                             "rshr");
+       }
 
       if (!valid_p)
-        {
-          tdesc_data_cleanup (tdesc_data);
-          return NULL;
-        }
+       return NULL;
     }
 
   /* Allocate space for the new architecture.  */
-  tdep = XCNEW (struct gdbarch_tdep);
+  microblaze_gdbarch_tdep *tdep = new microblaze_gdbarch_tdep;
   gdbarch = gdbarch_alloc (&info, tdep);
 
   set_gdbarch_long_double_bit (gdbarch, 128);
@@ -748,13 +733,14 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   frame_unwind_append_unwinder (gdbarch, &microblaze_frame_unwind);
   frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer);
   if (tdesc_data != NULL)
-    tdesc_use_registers (gdbarch, tdesc, tdesc_data);
+    tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
 
   return gdbarch;
 }
 
+void _initialize_microblaze_tdep ();
 void
-_initialize_microblaze_tdep (void)
+_initialize_microblaze_tdep ()
 {
   register_gdbarch_init (bfd_arch_microblaze, microblaze_gdbarch_init);