[gdb/testsuite] Fix incorrect string concat in jit-elf.exp
[deliverable/binutils-gdb.git] / gdb / riscv-tdep.c
index 2978b9e2d576909f48652602a81b5f233196b94e..1bb824eef54716c4c5ea8ebe8d8a1133d6f3d5b4 100644 (file)
@@ -284,47 +284,11 @@ show_use_compressed_breakpoints (struct ui_file *file, int from_tty,
 static struct cmd_list_element *setriscvcmdlist = NULL;
 static struct cmd_list_element *showriscvcmdlist = NULL;
 
-/* The show callback for the 'show riscv' prefix command.  */
-
-static void
-show_riscv_command (const char *args, int from_tty)
-{
-  help_list (showriscvcmdlist, "show riscv ", all_commands, gdb_stdout);
-}
-
-/* The set callback for the 'set riscv' prefix command.  */
-
-static void
-set_riscv_command (const char *args, int from_tty)
-{
-  printf_unfiltered
-    (_("\"set riscv\" must be followed by an appropriate subcommand.\n"));
-  help_list (setriscvcmdlist, "set riscv ", all_commands, gdb_stdout);
-}
-
 /* The set and show lists for 'set riscv' and 'show riscv' prefixes.  */
 
 static struct cmd_list_element *setdebugriscvcmdlist = NULL;
 static struct cmd_list_element *showdebugriscvcmdlist = NULL;
 
-/* The show callback for the 'show debug riscv' prefix command.  */
-
-static void
-show_debug_riscv_command (const char *args, int from_tty)
-{
-  help_list (showdebugriscvcmdlist, "show debug riscv ", all_commands, gdb_stdout);
-}
-
-/* The set callback for the 'set debug riscv' prefix command.  */
-
-static void
-set_debug_riscv_command (const char *args, int from_tty)
-{
-  printf_unfiltered
-    (_("\"set debug riscv\" must be followed by an appropriate subcommand.\n"));
-  help_list (setdebugriscvcmdlist, "set debug riscv ", all_commands, gdb_stdout);
-}
-
 /* The show callback for all 'show debug riscv VARNAME' variables.  */
 
 static void
@@ -1727,8 +1691,9 @@ struct riscv_arg_info
        will go.  */
     int c_length;
 
-    /* The offset within CONTENTS for this part of the argument.  Will
-       always be 0 for the first part.  For the second part of the
+    /* The offset within CONTENTS for this part of the argument.  This can
+       be non-zero even for the first part (the first field of a struct can
+       have a non-zero offset due to padding).  For the second part of the
        argument, this might be the C_LENGTH value of the first part,
        however, if we are passing a structure in two registers, and there's
        is padding between the first and second field, then this offset
@@ -2417,6 +2382,26 @@ riscv_print_arg_location (ui_file *stream, struct gdbarch *gdbarch,
     }
 }
 
+/* Wrapper around REGCACHE->cooked_write.  Places the LEN bytes of DATA
+   into a buffer that is at least as big as the register REGNUM, padding
+   out the DATA with either 0x00, or 0xff.  For floating point registers
+   0xff is used, for everyone else 0x00 is used.  */
+
+static void
+riscv_regcache_cooked_write (int regnum, const gdb_byte *data, int len,
+                            struct regcache *regcache, int flen)
+{
+  gdb_byte tmp [sizeof (ULONGEST)];
+
+  /* FP values in FP registers must be NaN-boxed.  */
+  if (riscv_is_fp_regno_p (regnum) && len < flen)
+    memset (tmp, -1, sizeof (tmp));
+  else
+    memset (tmp, 0, sizeof (tmp));
+  memcpy (tmp, data, len);
+  regcache->cooked_write (regnum, tmp);
+}
+
 /* Implement the push dummy call gdbarch callback.  */
 
 static CORE_ADDR
@@ -2526,18 +2511,13 @@ riscv_push_dummy_call (struct gdbarch *gdbarch,
        {
        case riscv_arg_info::location::in_reg:
          {
-           gdb_byte tmp [sizeof (ULONGEST)];
-
            gdb_assert (info->argloc[0].c_length <= info->length);
-           /* FP values in FP registers must be NaN-boxed.  */
-           if (riscv_is_fp_regno_p (info->argloc[0].loc_data.regno)
-               && info->argloc[0].c_length < call_info.flen)
-             memset (tmp, -1, sizeof (tmp));
-           else
-             memset (tmp, 0, sizeof (tmp));
-           memcpy (tmp, (info->contents + info->argloc[0].c_offset),
-                   info->argloc[0].c_length);
-           regcache->cooked_write (info->argloc[0].loc_data.regno, tmp);
+
+           riscv_regcache_cooked_write (info->argloc[0].loc_data.regno,
+                                        (info->contents
+                                         + info->argloc[0].c_offset),
+                                        info->argloc[0].c_length,
+                                        regcache, call_info.flen);
            second_arg_length =
              (((info->argloc[0].c_length + info->argloc[0].c_offset) < info->length)
               ? info->argloc[1].c_length : 0);
@@ -2569,19 +2549,13 @@ riscv_push_dummy_call (struct gdbarch *gdbarch,
            {
            case riscv_arg_info::location::in_reg:
              {
-               gdb_byte tmp [sizeof (ULONGEST)];
-
                gdb_assert ((riscv_is_fp_regno_p (info->argloc[1].loc_data.regno)
                             && second_arg_length <= call_info.flen)
                            || second_arg_length <= call_info.xlen);
-               /* FP values in FP registers must be NaN-boxed.  */
-               if (riscv_is_fp_regno_p (info->argloc[1].loc_data.regno)
-                   && second_arg_length < call_info.flen)
-                 memset (tmp, -1, sizeof (tmp));
-               else
-                 memset (tmp, 0, sizeof (tmp));
-               memcpy (tmp, second_arg_data, second_arg_length);
-               regcache->cooked_write (info->argloc[1].loc_data.regno, tmp);
+               riscv_regcache_cooked_write (info->argloc[1].loc_data.regno,
+                                            second_arg_data,
+                                            second_arg_length,
+                                            regcache, call_info.flen);
              }
              break;
 
@@ -2701,9 +2675,9 @@ riscv_return_value (struct gdbarch  *gdbarch,
              if (writebuf)
                {
                  const gdb_byte *ptr = writebuf + info.argloc[0].c_offset;
-                 regcache->cooked_write_part (regnum, 0,
+                 riscv_regcache_cooked_write (regnum, ptr,
                                               info.argloc[0].c_length,
-                                              ptr);
+                                              regcache, call_info.flen);
                }
 
              /* A return value in register can have a second part in a
@@ -2730,10 +2704,11 @@ riscv_return_value (struct gdbarch  *gdbarch,
 
                      if (writebuf)
                        {
-                         writebuf += info.argloc[1].c_offset;
-                         regcache->cooked_write_part (regnum, 0,
-                                                      info.argloc[1].c_length,
-                                                      writebuf);
+                         const gdb_byte *ptr
+                           = writebuf + info.argloc[1].c_offset;
+                         riscv_regcache_cooked_write
+                           (regnum, ptr, info.argloc[1].c_length,
+                            regcache, call_info.flen);
                        }
                      break;
 
@@ -3516,15 +3491,15 @@ _initialize_riscv_tdep ()
 
   /* Add root prefix command for all "set debug riscv" and "show debug
      riscv" commands.  */
-  add_prefix_cmd ("riscv", no_class, set_debug_riscv_command,
-                 _("RISC-V specific debug commands."),
-                 &setdebugriscvcmdlist, "set debug riscv ", 0,
-                 &setdebuglist);
+  add_basic_prefix_cmd ("riscv", no_class,
+                       _("RISC-V specific debug commands."),
+                       &setdebugriscvcmdlist, "set debug riscv ", 0,
+                       &setdebuglist);
 
-  add_prefix_cmd ("riscv", no_class, show_debug_riscv_command,
-                 _("RISC-V specific debug commands."),
-                 &showdebugriscvcmdlist, "show debug riscv ", 0,
-                 &showdebuglist);
+  add_show_prefix_cmd ("riscv", no_class,
+                      _("RISC-V specific debug commands."),
+                      &showdebugriscvcmdlist, "show debug riscv ", 0,
+                      &showdebuglist);
 
   add_setshow_zuinteger_cmd ("breakpoints", class_maintenance,
                             &riscv_debug_breakpoints,  _("\
@@ -3567,13 +3542,13 @@ initialisation process."),
                             &setdebugriscvcmdlist, &showdebugriscvcmdlist);
 
   /* Add root prefix command for all "set riscv" and "show riscv" commands.  */
-  add_prefix_cmd ("riscv", no_class, set_riscv_command,
-                 _("RISC-V specific commands."),
-                 &setriscvcmdlist, "set riscv ", 0, &setlist);
+  add_basic_prefix_cmd ("riscv", no_class,
+                       _("RISC-V specific commands."),
+                       &setriscvcmdlist, "set riscv ", 0, &setlist);
 
-  add_prefix_cmd ("riscv", no_class, show_riscv_command,
-                 _("RISC-V specific commands."),
-                 &showriscvcmdlist, "show riscv ", 0, &showlist);
+  add_show_prefix_cmd ("riscv", no_class,
+                      _("RISC-V specific commands."),
+                      &showriscvcmdlist, "show riscv ", 0, &showlist);
 
 
   use_compressed_breakpoints = AUTO_BOOLEAN_AUTO;
This page took 0.033466 seconds and 4 git commands to generate.