]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gdb/tic6x-tdep.c
gdb: add names to unwinders, add debug messages when looking for unwinder
[thirdparty/binutils-gdb.git] / gdb / tic6x-tdep.c
index b83074aa23f44387122694480011416e4a8b929f..fb18b798db2f508295a3acfd9ea6aaceb325bc13 100644 (file)
@@ -1,6 +1,6 @@
 /* Target dependent code for GDB on TI C6x systems.
 
-   Copyright (C) 2010-2018 Free Software Foundation, Inc.
+   Copyright (C) 2010-2021 Free Software Foundation, Inc.
    Contributed by Andrew Jenner <andrew@codesourcery.com>
    Contributed by Yao Qi <yao@codesourcery.com>
 
@@ -24,7 +24,7 @@
 #include "frame-unwind.h"
 #include "frame-base.h"
 #include "trad-frame.h"
-#include "dwarf2-frame.h"
+#include "dwarf2/frame.h"
 #include "symtab.h"
 #include "inferior.h"
 #include "gdbtypes.h"
@@ -376,15 +376,6 @@ tic6x_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
   return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
 }
 
-/* This is the implementation of gdbarch method unwind_sp.  */
-
-static CORE_ADDR
-tic6x_unwind_sp (struct gdbarch *gdbarch, struct frame_info *this_frame)
-{
-  return frame_unwind_register_unsigned (this_frame, TIC6X_SP_REGNUM);
-}
-
-
 /* Frame base handling.  */
 
 static struct tic6x_unwind_cache*
@@ -466,6 +457,7 @@ tic6x_frame_base_address (struct frame_info *this_frame, void **this_cache)
 
 static const struct frame_unwind tic6x_frame_unwind =
 {
+  "tic6x prologue",
   NORMAL_FRAME,
   default_frame_unwind_stop_reason,
   tic6x_frame_this_id,
@@ -528,6 +520,7 @@ tic6x_stub_unwind_sniffer (const struct frame_unwind *self,
 
 static const struct frame_unwind tic6x_stub_unwind =
 {
+  "tic6x stub",
   NORMAL_FRAME,
   default_frame_unwind_stop_reason,
   tic6x_stub_this_id,
@@ -793,7 +786,7 @@ tic6x_return_value (struct gdbarch *gdbarch, struct value *function,
       if (type != NULL)
        {
          type = check_typedef (type);
-         if (language_pass_by_reference (type))
+         if (!(language_pass_by_reference (type).trivially_copyable))
            return RETURN_VALUE_STRUCT_CONVENTION;
        }
     }
@@ -811,23 +804,13 @@ tic6x_return_value (struct gdbarch *gdbarch, struct value *function,
   return RETURN_VALUE_REGISTER_CONVENTION;
 }
 
-/* This is the implementation of gdbarch method dummy_id.  */
-
-static struct frame_id
-tic6x_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
-{
-  return frame_id_build
-    (get_frame_register_unsigned (this_frame, TIC6X_SP_REGNUM),
-     get_frame_pc (this_frame));
-}
-
 /* Get the alignment requirement of TYPE.  */
 
 static int
 tic6x_arg_type_alignment (struct type *type)
 {
   int len = TYPE_LENGTH (check_typedef (type));
-  enum type_code typecode = TYPE_CODE (check_typedef (type));
+  enum type_code typecode = check_typedef (type)->code ();
 
   if (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION)
     {
@@ -900,16 +883,16 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
 
   /* Determine the type of this function.  */
   func_type = check_typedef (func_type);
-  if (TYPE_CODE (func_type) == TYPE_CODE_PTR)
+  if (func_type->code () == TYPE_CODE_PTR)
     func_type = check_typedef (TYPE_TARGET_TYPE (func_type));
 
-  gdb_assert (TYPE_CODE (func_type) == TYPE_CODE_FUNC
-             || TYPE_CODE (func_type) == TYPE_CODE_METHOD);
+  gdb_assert (func_type->code () == TYPE_CODE_FUNC
+             || func_type->code () == TYPE_CODE_METHOD);
 
   /* For a variadic C function, the last explicitly declared argument and all
      remaining arguments are passed on the stack.  */
-  if (TYPE_VARARGS (func_type))
-    first_arg_on_stack = TYPE_NFIELDS (func_type) - 1;
+  if (func_type->has_varargs ())
+    first_arg_on_stack = func_type->num_fields () - 1;
 
   /* Now make space on the stack for the args.  */
   for (argnum = 0; argnum < nargs; argnum++)
@@ -934,12 +917,12 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
       struct value *arg = args[argnum];
       struct type *arg_type = check_typedef (value_type (arg));
       int len = TYPE_LENGTH (arg_type);
-      enum type_code typecode = TYPE_CODE (arg_type);
+      enum type_code typecode = arg_type->code ();
 
       val = value_contents (arg);
 
       /* Copy the argument to general registers or the stack in
-         register-sized pieces.  */
+        register-sized pieces.  */
       if (argreg < first_arg_on_stack)
        {
          if (len <= 4)
@@ -979,10 +962,10 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                      || typecode == TYPE_CODE_UNION)
                    {
                      /* For a 5-8 byte structure or union in big-endian, the
-                        first byte occupies byte 3 (the MSB) of the upper (odd)
-                        register and the remaining bytes fill the decreasingly
-                        significant bytes.  5-7 byte structures or unions have
-                        padding in the LSBs of the lower (even) register.  */
+                        first byte occupies byte 3 (the MSB) of the upper (odd)
+                        register and the remaining bytes fill the decreasingly
+                        significant bytes.  5-7 byte structures or unions have
+                        padding in the LSBs of the lower (even) register.  */
                      if (byte_order == BFD_ENDIAN_BIG)
                        {
                          regcache->cooked_write (arg_regs[argreg] + 1, val);
@@ -999,7 +982,7 @@ tic6x_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
                  else
                    {
                      /* The argument is being passed by value in a pair of
-                        registers.  */
+                        registers.  */
                      ULONGEST regval = extract_unsigned_integer (val, len,
                                                                  byte_order);
 
@@ -1159,7 +1142,7 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 {
   struct gdbarch *gdbarch;
   struct gdbarch_tdep *tdep;
-  struct tdesc_arch_data *tdesc_data = NULL;
+  tdesc_arch_data_up tdesc_data;
   const struct target_desc *tdesc = info.target_desc;
   int has_gp = 0;
 
@@ -1178,20 +1161,17 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
       valid_p = 1;
       for (i = 0; i < 32; i++) /* A0 - A15, B0 - B15 */
-       valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
+       valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i,
                                            tic6x_register_names[i]);
 
       /* CSR */
-      valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
+      valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i++,
                                          tic6x_register_names[TIC6X_CSR_REGNUM]);
-      valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
+      valid_p &= tdesc_numbered_register (feature, tdesc_data.get (), i++,
                                          tic6x_register_names[TIC6X_PC_REGNUM]);
 
       if (!valid_p)
-       {
-         tdesc_data_cleanup (tdesc_data);
-         return NULL;
-       }
+       return NULL;
 
       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.gp");
       if (feature)
@@ -1208,28 +1188,25 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
          has_gp = 1;
          valid_p = 1;
          for (j = 0; j < 32; j++)      /* A16 - A31, B16 - B31 */
-           valid_p &= tdesc_numbered_register (feature, tdesc_data, i++,
-                                               gp[j]);
+           valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+                                               i++, gp[j]);
 
          if (!valid_p)
-           {
-             tdesc_data_cleanup (tdesc_data);
-             return NULL;
-           }
+           return NULL;
        }
 
       feature = tdesc_find_feature (tdesc, "org.gnu.gdb.tic6x.c6xp");
       if (feature)
        {
-         valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "TSR");
-         valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "ILC");
-         valid_p &= tdesc_numbered_register (feature, tdesc_data, i++, "RILC");
+         valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+                                             i++, "TSR");
+         valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+                                             i++, "ILC");
+         valid_p &= tdesc_numbered_register (feature, tdesc_data.get (),
+                                             i++, "RILC");
 
          if (!valid_p)
-           {
-             tdesc_data_cleanup (tdesc_data);
-             return NULL;
-           }
+           return NULL;
        }
 
     }
@@ -1283,7 +1260,6 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
                                       tic6x_sw_breakpoint_from_kind);
 
   set_gdbarch_unwind_pc (gdbarch, tic6x_unwind_pc);
-  set_gdbarch_unwind_sp (gdbarch, tic6x_unwind_sp);
 
   /* Unwinding.  */
   dwarf2_append_unwinders (gdbarch);
@@ -1302,8 +1278,6 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   set_gdbarch_return_value (gdbarch, tic6x_return_value);
 
-  set_gdbarch_dummy_id (gdbarch, tic6x_dummy_id);
-
   /* Enable inferior call support.  */
   set_gdbarch_push_dummy_call (gdbarch, tic6x_push_dummy_call);
 
@@ -1317,14 +1291,15 @@ tic6x_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Hook in ABI-specific overrides, if they have been registered.  */
   gdbarch_init_osabi (info, gdbarch);
 
-  if (tdesc_data)
-    tdesc_use_registers (gdbarch, tdesc, tdesc_data);
+  if (tdesc_data != nullptr)
+    tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data));
 
   return gdbarch;
 }
 
+void _initialize_tic6x_tdep ();
 void
-_initialize_tic6x_tdep (void)
+_initialize_tic6x_tdep ()
 {
   register_gdbarch_init (bfd_arch_tic6x, tic6x_gdbarch_init);
 }