Introduce gdbarch_num_cooked_regs

Message ID 20181021190133.10362-1-simon.marchi@polymtl.ca
State New, archived
Headers

Commit Message

Simon Marchi Oct. 21, 2018, 7:01 p.m. UTC
  From: Simon Marchi <simon.marchi@ericsson.com>

This was part of another patchset I'm working on, but I thought it could
be a good cleanup on its own.

The expression

  gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch)

is used quite often to find the number of cooked registers (raw + pseudo
registers).  This patch introduces gdbarch_num_cooked_regs, which does
the equivalent.  It substantially reduces required wrapping in some
places, so should improve readability.

gdb/ChangeLog:

	* gdbarch.sh (gdbarch_num_cooked_regs): New.
	* gdbarch.h: Re-generate.
	* ax-gdb.c (gen_expr): Use gdbarch_num_cooked_regs.
	* dwarf2-frame.c (dwarf2_frame_cache): Likewise.
	* eval.c (evaluate_subexp_standard): Likewise.
	* findvar.c (value_of_register): Likewise.
	(value_of_register_lazy): Likewise.
	(address_from_register): Likewise.
	* frame.c (get_frame_register_bytes): Likewise.
	* gdbarch-selftests.c (register_to_value_test): Likewise.
	* h8300-tdep.c (h8300_register_type): Likewise.
	* i386-tdep.c (i386_dbx_reg_to_regnum): Likewise.
	(i386_svr4_reg_to_regnum): Likewise.
	* infcmd.c (default_print_registers_info): Likewise.
	(registers_info): Likewise.
	(print_vector_info): Likewise.
	(default_print_float_info): Likewise.
	* m68hc11-tdep.c (m68hc11_frame_unwind_cache): Likewise.
	* mdebugread.c (mdebug_reg_to_regnum): Likewise.
	* mi/mi-main.c (mi_cmd_data_list_register_names): Likewise.
	(mi_cmd_data_list_changed_registers): Likewise.
	(mi_cmd_data_list_register_values): Likewise.
	(mi_cmd_data_write_register_values): Likewise.
	(mi_cmd_trace_frame_collected): Likewise.
	* mips-tdep.c (print_gp_register_row): Likewise.
	(mips_print_registers_info): Likewise.
	* nds32-tdep.c (nds32_gdbarch_init): Likewise.
	* regcache.c (init_regcache_descr): Likewise.
	(register_size): Likewise.
	(register_dump::dump): Likewise.
	(cooked_read_test): Likewise.
	(cooked_write_test): Likewise.
	* rs6000-tdep.c (rs6000_register_sim_regno): Likewise.
	(rs6000_gdbarch_init): Likewise.
	* stabsread.c (stab_reg_to_regnum): Likewise.
	* stack.c (info_frame_command): Likewise.
	* target-descriptions.c (tdesc_register_name): Likewise.
	* trad-frame.c (trad_frame_alloc_saved_regs): Likewise.
	* tui/tui-regs.c (tui_show_register_group): Likewise.
	* user-regs.c (user_reg_map_name_to_regnum): Likewise.
	(user_reg_map_regnum_to_name): Likewise.
	(value_of_user_reg): Likewise.
	(maintenance_print_user_registers): Likewise.
	* xtensa-tdep.c (xtensa_find_register_by_name): Likewise.
	(xtensa_register_name): Likewise.
	(xtensa_register_type): Likewise.
	(xtensa_reg_to_regnum): Likewise.
	(xtensa_pseudo_register_read): Likewise.
	(xtensa_pseudo_register_write): Likewise.
---
 gdb/ax-gdb.c              |  3 +--
 gdb/dwarf2-frame.c        |  3 +--
 gdb/eval.c                |  3 +--
 gdb/findvar.c             |  9 +++------
 gdb/frame.c               |  2 +-
 gdb/gdbarch-selftests.c   |  3 +--
 gdb/gdbarch.h             |  8 ++++++++
 gdb/gdbarch.sh            |  8 ++++++++
 gdb/h8300-tdep.c          |  3 +--
 gdb/i386-tdep.c           |  4 ++--
 gdb/infcmd.c              | 19 +++++--------------
 gdb/m68hc11-tdep.c        |  5 +----
 gdb/mdebugread.c          |  8 ++------
 gdb/mi/mi-main.c          | 10 +++++-----
 gdb/mips-tdep.c           |  9 +++------
 gdb/nds32-tdep.c          |  2 +-
 gdb/regcache.c            | 21 ++++++---------------
 gdb/rs6000-tdep.c         |  7 ++-----
 gdb/stabsread.c           |  8 ++------
 gdb/stack.c               |  3 +--
 gdb/target-descriptions.c |  3 +--
 gdb/trad-frame.c          |  2 +-
 gdb/tui/tui-regs.c        | 10 ++--------
 gdb/user-regs.c           | 14 +++++---------
 gdb/xtensa-tdep.c         | 22 ++++++----------------
 25 files changed, 70 insertions(+), 119 deletions(-)
  

Comments

Kevin Buettner Oct. 21, 2018, 9:26 p.m. UTC | #1
Hi Simon,

On Sun, 21 Oct 2018 15:01:33 -0400
Simon Marchi <simon.marchi@polymtl.ca> wrote:

> From: Simon Marchi <simon.marchi@ericsson.com>
> 
> This was part of another patchset I'm working on, but I thought it could
> be a good cleanup on its own.
> 
> The expression
> 
>   gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch)
> 
> is used quite often to find the number of cooked registers (raw + pseudo
> registers).  This patch introduces gdbarch_num_cooked_regs, which does
> the equivalent.  It substantially reduces required wrapping in some
> places, so should improve readability.

LGTM, aside from a question and one formatting problem...

> diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
> index 1490ee28668a..b6e8f00a0ba1 100644
> --- a/gdb/m68hc11-tdep.c
> +++ b/gdb/m68hc11-tdep.c
> @@ -854,10 +854,7 @@ m68hc11_frame_unwind_cache (struct frame_info *this_frame,
>  
>    /* Adjust all the saved registers so that they contain addresses and not
>       offsets.  */
> -  for (i = 0;
> -       i < gdbarch_num_regs (gdbarch)
> -	   + gdbarch_num_pseudo_regs (gdbarch) - 1;
> -       i++)
> +  for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
>      if (trad_frame_addr_p (info->saved_regs, i))
>        {
>          info->saved_regs[i].addr += this_base;

The " - 1" in the original expression was a mistake, right?  (I spent
a few minutes looking at the mc68hc11's pseudo register layout but can't
find a reason for subtracting one.)

> diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
> index 12382cddb357..9c34a070ae14 100644
> --- a/gdb/tui/tui-regs.c
> +++ b/gdb/tui/tui-regs.c
> @@ -206,10 +206,7 @@ tui_show_register_group (struct reggroup *group,
>  
>    /* See how many registers must be displayed.  */
>    nr_regs = 0;
> -  for (regnum = 0;
> -       regnum < gdbarch_num_regs (gdbarch)
> -		+ gdbarch_num_pseudo_regs (gdbarch);
> -       regnum++)
> +  for (regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); regnum++)
>      {
>        const char *name;
>  
> @@ -253,10 +250,7 @@ tui_show_register_group (struct reggroup *group,
>  
>        /* Now set the register names and values.  */
>        pos = 0;
> -      for (regnum = 0;
> -	   regnum < gdbarch_num_regs (gdbarch)
> -		    + gdbarch_num_pseudo_regs (gdbarch);
> -	   regnum++)
> +      for (regnum = 0;regnum < gdbarch_num_cooked_regs (gdbarch); regnum++)

Missing space between ; and "regnum".

Kevin
  
Simon Marchi Oct. 22, 2018, 2:26 a.m. UTC | #2
On 2018-10-21 17:26, Kevin Buettner wrote:
> Hi Simon,
> 

Hi Kevin,

> LGTM, aside from a question and one formatting problem...
> 
>> diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
>> index 1490ee28668a..b6e8f00a0ba1 100644
>> --- a/gdb/m68hc11-tdep.c
>> +++ b/gdb/m68hc11-tdep.c
>> @@ -854,10 +854,7 @@ m68hc11_frame_unwind_cache (struct frame_info 
>> *this_frame,
>> 
>>    /* Adjust all the saved registers so that they contain addresses 
>> and not
>>       offsets.  */
>> -  for (i = 0;
>> -       i < gdbarch_num_regs (gdbarch)
>> -	   + gdbarch_num_pseudo_regs (gdbarch) - 1;
>> -       i++)
>> +  for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
>>      if (trad_frame_addr_p (info->saved_regs, i))
>>        {
>>          info->saved_regs[i].addr += this_base;
> 
> The " - 1" in the original expression was a mistake, right?  (I spent
> a few minutes looking at the mc68hc11's pseudo register layout but 
> can't
> find a reason for subtracting one.)

I don't think I had noticed it, thanks for pointing it out.  I took a 
look too and don't see any reason either.  The saved_regs array is 
allocated with a size equal to the number of cooked registers.  I dug up 
the patch that introduced this code, no comment about it:

https://sourceware.org/ml/gdb-patches/2003-07/msg00483.html

I'll add a comment about it in the commit log.

>> diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
>> index 12382cddb357..9c34a070ae14 100644
>> --- a/gdb/tui/tui-regs.c
>> +++ b/gdb/tui/tui-regs.c
>> @@ -206,10 +206,7 @@ tui_show_register_group (struct reggroup *group,
>> 
>>    /* See how many registers must be displayed.  */
>>    nr_regs = 0;
>> -  for (regnum = 0;
>> -       regnum < gdbarch_num_regs (gdbarch)
>> -		+ gdbarch_num_pseudo_regs (gdbarch);
>> -       regnum++)
>> +  for (regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); 
>> regnum++)
>>      {
>>        const char *name;
>> 
>> @@ -253,10 +250,7 @@ tui_show_register_group (struct reggroup *group,
>> 
>>        /* Now set the register names and values.  */
>>        pos = 0;
>> -      for (regnum = 0;
>> -	   regnum < gdbarch_num_regs (gdbarch)
>> -		    + gdbarch_num_pseudo_regs (gdbarch);
>> -	   regnum++)
>> +      for (regnum = 0;regnum < gdbarch_num_cooked_regs (gdbarch); 
>> regnum++)
> 
> Missing space between ; and "regnum".

Fixed, thanks.

I'm pushing the patch with those fixed.

Simon
  

Patch

diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c
index 9abd939e235f..ef053f75c610 100644
--- a/gdb/ax-gdb.c
+++ b/gdb/ax-gdb.c
@@ -2036,8 +2036,7 @@  gen_expr (struct expression *exp, union exp_element **pc,
 	  internal_error (__FILE__, __LINE__,
 			  _("Register $%s not available"), name);
 	/* No support for tracing user registers yet.  */
-	if (reg >= gdbarch_num_regs (ax->gdbarch)
-	    + gdbarch_num_pseudo_regs (ax->gdbarch))
+	if (reg >= gdbarch_num_cooked_regs (ax->gdbarch))
 	  error (_("'%s' is a user-register; "
 		   "GDB cannot yet trace user-register contents."),
 		 name);
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c
index 2d6116775eff..2201c636590d 100644
--- a/gdb/dwarf2-frame.c
+++ b/gdb/dwarf2-frame.c
@@ -972,8 +972,7 @@  static struct dwarf2_frame_cache *
 dwarf2_frame_cache (struct frame_info *this_frame, void **this_cache)
 {
   struct gdbarch *gdbarch = get_frame_arch (this_frame);
-  const int num_regs = gdbarch_num_regs (gdbarch)
-		       + gdbarch_num_pseudo_regs (gdbarch);
+  const int num_regs = gdbarch_num_cooked_regs (gdbarch);
   struct dwarf2_frame_cache *cache;
   struct dwarf2_fde *fde;
   CORE_ADDR entry_pc;
diff --git a/gdb/eval.c b/gdb/eval.c
index 5ee59908ba34..047aba59ae93 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1395,8 +1395,7 @@  evaluate_subexp_standard (struct type *expect_type,
            So for these registers, we fetch the register value regardless
            of the evaluation mode.  */
 	if (noside == EVAL_AVOID_SIDE_EFFECTS
-	    && regno < gdbarch_num_regs (exp->gdbarch)
-			+ gdbarch_num_pseudo_regs (exp->gdbarch))
+	    && regno < gdbarch_num_cooked_regs (exp->gdbarch))
 	  val = value_zero (register_type (exp->gdbarch, regno), not_lval);
 	else
 	  val = value_of_register (regno, get_selected_frame (NULL));
diff --git a/gdb/findvar.c b/gdb/findvar.c
index 41ffedd330fa..3169348ecc73 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -267,8 +267,7 @@  value_of_register (int regnum, struct frame_info *frame)
 
   /* User registers lie completely outside of the range of normal
      registers.  Catch them early so that the target never sees them.  */
-  if (regnum >= gdbarch_num_regs (gdbarch)
-		+ gdbarch_num_pseudo_regs (gdbarch))
+  if (regnum >= gdbarch_num_cooked_regs (gdbarch))
     return value_of_user_reg (regnum, frame);
 
   reg_val = value_of_register_lazy (frame, regnum);
@@ -287,8 +286,7 @@  value_of_register_lazy (struct frame_info *frame, int regnum)
   struct value *reg_val;
   struct frame_info *next_frame;
 
-  gdb_assert (regnum < (gdbarch_num_regs (gdbarch)
-			+ gdbarch_num_pseudo_regs (gdbarch)));
+  gdb_assert (regnum < gdbarch_num_cooked_regs (gdbarch));
 
   gdb_assert (frame != NULL);
 
@@ -957,8 +955,7 @@  address_from_register (int regnum, struct frame_info *frame)
   struct type *type = builtin_type (gdbarch)->builtin_data_ptr;
   struct value *value;
   CORE_ADDR result;
-  int regnum_max_excl = (gdbarch_num_regs (gdbarch)
-			 + gdbarch_num_pseudo_regs (gdbarch));
+  int regnum_max_excl = gdbarch_num_cooked_regs (gdbarch);
 
   if (regnum < 0 || regnum >= regnum_max_excl)
     error (_("Invalid register #%d, expecting 0 <= # < %d"), regnum,
diff --git a/gdb/frame.c b/gdb/frame.c
index 0dc2cb7e7160..4624eada87b2 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -1416,7 +1416,7 @@  get_frame_register_bytes (struct frame_info *frame, int regnum,
   /* Ensure that we will not read beyond the end of the register file.
      This can only ever happen if the debug information is bad.  */
   maxsize = -offset;
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
   for (i = regnum; i < numregs; i++)
     {
       int thissize = register_size (gdbarch, i);
diff --git a/gdb/gdbarch-selftests.c b/gdb/gdbarch-selftests.c
index 73a31244b452..448605621d1b 100644
--- a/gdb/gdbarch-selftests.c
+++ b/gdb/gdbarch-selftests.c
@@ -116,8 +116,7 @@  register_to_value_test (struct gdbarch *gdbarch)
     = make_scoped_restore (&inferior_ptid, mock_ptid);
 
   struct frame_info *frame = get_current_frame ();
-  const int num_regs = (gdbarch_num_regs (gdbarch)
-			+ gdbarch_num_pseudo_regs (gdbarch));
+  const int num_regs = gdbarch_num_cooked_regs (gdbarch);
 
   /* Test gdbarch methods register_to_value and value_to_register with
      different combinations of register numbers and types.  */
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
index fc2f1a84a1ca..2cb69610837d 100644
--- a/gdb/gdbarch.h
+++ b/gdb/gdbarch.h
@@ -1806,4 +1806,12 @@  extern unsigned int gdbarch_debug;
 
 extern void gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file);
 
+/* Return the number of cooked registers (raw + pseudo) for ARCH.  */
+
+static inline int
+gdbarch_num_cooked_regs (gdbarch *arch)
+{
+  return gdbarch_num_regs (arch) + gdbarch_num_pseudo_regs (arch);
+}
+
 #endif
diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh
index 670ac30c0303..bbfa8d220583 100755
--- a/gdb/gdbarch.sh
+++ b/gdb/gdbarch.sh
@@ -1632,6 +1632,14 @@  extern unsigned int gdbarch_debug;
 
 extern void gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file);
 
+/* Return the number of cooked registers (raw + pseudo) for ARCH.  */
+
+static inline int
+gdbarch_num_cooked_regs (gdbarch *arch)
+{
+  return gdbarch_num_regs (arch) + gdbarch_num_pseudo_regs (arch);
+}
+
 #endif
 EOF
 exec 1>&2
diff --git a/gdb/h8300-tdep.c b/gdb/h8300-tdep.c
index 5a4802cfe598..2334582260d3 100644
--- a/gdb/h8300-tdep.c
+++ b/gdb/h8300-tdep.c
@@ -1128,8 +1128,7 @@  h8300_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
 static struct type *
 h8300_register_type (struct gdbarch *gdbarch, int regno)
 {
-  if (regno < 0 || regno >= gdbarch_num_regs (gdbarch)
-			    + gdbarch_num_pseudo_regs (gdbarch))
+  if (regno < 0 || regno >= gdbarch_num_cooked_regs (gdbarch))
     internal_error (__FILE__, __LINE__,
 		    _("h8300_register_type: illegal register number %d"),
 		    regno);
diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index a6994aaf1266..a34a3374a4d7 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -518,7 +518,7 @@  i386_dbx_reg_to_regnum (struct gdbarch *gdbarch, int reg)
     }
 
   /* This will hopefully provoke a warning.  */
-  return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  return gdbarch_num_cooked_regs (gdbarch);
 }
 
 /* Convert SVR4 DWARF register number REG to the appropriate register number
@@ -575,7 +575,7 @@  i386_svr4_reg_to_regnum (struct gdbarch *gdbarch, int reg)
   int regnum = i386_svr4_dwarf_reg_to_regnum (gdbarch, reg);
 
   if (regnum == -1)
-    return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+    return gdbarch_num_cooked_regs (gdbarch);
   return regnum;
 }
 
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index da0cb340ac36..27177a475053 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -2387,8 +2387,7 @@  default_print_registers_info (struct gdbarch *gdbarch,
 			      int regnum, int print_all)
 {
   int i;
-  const int numregs = gdbarch_num_regs (gdbarch)
-		      + gdbarch_num_pseudo_regs (gdbarch);
+  const int numregs = gdbarch_num_cooked_regs (gdbarch);
 
   for (i = 0; i < numregs; i++)
     {
@@ -2475,8 +2474,7 @@  registers_info (const char *addr_exp, int fpregs)
 	    /* User registers lie completely outside of the range of
 	       normal registers.  Catch them early so that the target
 	       never sees them.  */
-	    if (regnum >= gdbarch_num_regs (gdbarch)
-			  + gdbarch_num_pseudo_regs (gdbarch))
+	    if (regnum >= gdbarch_num_cooked_regs (gdbarch))
 	      {
 		struct value *regval = value_of_user_reg (regnum, frame);
 		const char *regname = user_reg_map_regnum_to_name (gdbarch,
@@ -2515,8 +2513,7 @@  registers_info (const char *addr_exp, int fpregs)
 	    int regnum;
 
 	    for (regnum = 0;
-		 regnum < gdbarch_num_regs (gdbarch)
-			  + gdbarch_num_pseudo_regs (gdbarch);
+		 regnum < gdbarch_num_cooked_regs (gdbarch);
 		 regnum++)
 	      {
 		if (gdbarch_register_reggroup_p (gdbarch, regnum, group))
@@ -2558,10 +2555,7 @@  print_vector_info (struct ui_file *file,
       int regnum;
       int printed_something = 0;
 
-      for (regnum = 0;
-	   regnum < gdbarch_num_regs (gdbarch)
-		    + gdbarch_num_pseudo_regs (gdbarch);
-	   regnum++)
+      for (regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); regnum++)
 	{
 	  if (gdbarch_register_reggroup_p (gdbarch, regnum, vector_reggroup))
 	    {
@@ -3110,10 +3104,7 @@  default_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
   int regnum;
   int printed_something = 0;
 
-  for (regnum = 0;
-       regnum < gdbarch_num_regs (gdbarch)
-	 + gdbarch_num_pseudo_regs (gdbarch);
-       regnum++)
+  for (regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); regnum++)
     {
       if (gdbarch_register_reggroup_p (gdbarch, regnum, float_reggroup))
 	{
diff --git a/gdb/m68hc11-tdep.c b/gdb/m68hc11-tdep.c
index 1490ee28668a..b6e8f00a0ba1 100644
--- a/gdb/m68hc11-tdep.c
+++ b/gdb/m68hc11-tdep.c
@@ -854,10 +854,7 @@  m68hc11_frame_unwind_cache (struct frame_info *this_frame,
 
   /* Adjust all the saved registers so that they contain addresses and not
      offsets.  */
-  for (i = 0;
-       i < gdbarch_num_regs (gdbarch)
-	   + gdbarch_num_pseudo_regs (gdbarch) - 1;
-       i++)
+  for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
     if (trad_frame_addr_p (info->saved_regs, i))
       {
         info->saved_regs[i].addr += this_base;
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 62de80ee1e6d..26687f6c8dcb 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -537,13 +537,9 @@  mdebug_reg_to_regnum (struct symbol *sym, struct gdbarch *gdbarch)
 {
   int regno = gdbarch_ecoff_reg_to_regnum (gdbarch, SYMBOL_VALUE (sym));
 
-  if (regno < 0
-      || regno >= (gdbarch_num_regs (gdbarch)
-		   + gdbarch_num_pseudo_regs (gdbarch)))
+  if (regno < 0 || regno >= gdbarch_num_cooked_regs (gdbarch))
     {
-      reg_value_complaint (regno,
-			   gdbarch_num_regs (gdbarch)
-			     + gdbarch_num_pseudo_regs (gdbarch),
+      reg_value_complaint (regno, gdbarch_num_cooked_regs (gdbarch),
 			   SYMBOL_PRINT_NAME (sym));
 
       regno = gdbarch_sp_regnum (gdbarch); /* Known safe, though useless.  */
diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c
index f6fbebcf7929..5562935102e1 100644
--- a/gdb/mi/mi-main.c
+++ b/gdb/mi/mi-main.c
@@ -890,7 +890,7 @@  mi_cmd_data_list_register_names (const char *command, char **argv, int argc)
      debugged.  */
 
   gdbarch = get_current_arch ();
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
 
   ui_out_emit_list list_emitter (uiout, "register-names");
 
@@ -949,7 +949,7 @@  mi_cmd_data_list_changed_registers (const char *command, char **argv, int argc)
      debugged.  */
 
   gdbarch = this_regs->arch ();
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
 
   ui_out_emit_list list_emitter (uiout, "changed-registers");
 
@@ -1076,7 +1076,7 @@  mi_cmd_data_list_register_values (const char *command, char **argv, int argc)
 
   frame = get_selected_frame (NULL);
   gdbarch = get_frame_arch (frame);
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
 
   ui_out_emit_list list_emitter (uiout, "register-values");
 
@@ -1164,7 +1164,7 @@  mi_cmd_data_write_register_values (const char *command, char **argv, int argc)
 
   regcache = get_current_regcache ();
   gdbarch = regcache->arch ();
-  numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  numregs = gdbarch_num_cooked_regs (gdbarch);
 
   if (argc == 0)
     error (_("-data-write-register-values: Usage: -data-write-register-"
@@ -2638,7 +2638,7 @@  mi_cmd_trace_frame_collected (const char *command, char **argv, int argc)
 
     frame = get_selected_frame (NULL);
     gdbarch = get_frame_arch (frame);
-    numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+    numregs = gdbarch_num_cooked_regs (gdbarch);
 
     for (regnum = 0; regnum < numregs; regnum++)
       {
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c
index bf44c52f5d2a..2c8726214f39 100644
--- a/gdb/mips-tdep.c
+++ b/gdb/mips-tdep.c
@@ -6497,8 +6497,7 @@  print_gp_register_row (struct ui_file *file, struct frame_info *frame,
 
   /* For GP registers, we print a separate row of names above the vals.  */
   for (col = 0, regnum = start_regnum;
-       col < ncols && regnum < gdbarch_num_regs (gdbarch)
-			       + gdbarch_num_pseudo_regs (gdbarch);
+       col < ncols && regnum < gdbarch_num_cooked_regs (gdbarch);
        regnum++)
     {
       if (*gdbarch_register_name (gdbarch, regnum) == '\0')
@@ -6536,8 +6535,7 @@  print_gp_register_row (struct ui_file *file, struct frame_info *frame,
 
   /* Now print the values in hex, 4 or 8 to the row.  */
   for (col = 0, regnum = start_regnum;
-       col < ncols && regnum < gdbarch_num_regs (gdbarch)
-			       + gdbarch_num_pseudo_regs (gdbarch);
+       col < ncols && regnum < gdbarch_num_cooked_regs (gdbarch);
        regnum++)
     {
       if (*gdbarch_register_name (gdbarch, regnum) == '\0')
@@ -6603,8 +6601,7 @@  mips_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
     /* Do all (or most) registers.  */
     {
       regnum = gdbarch_num_regs (gdbarch);
-      while (regnum < gdbarch_num_regs (gdbarch)
-		      + gdbarch_num_pseudo_regs (gdbarch))
+      while (regnum < gdbarch_num_cooked_regs (gdbarch))
 	{
 	  if (mips_float_register_p (gdbarch, regnum))
 	    {
diff --git a/gdb/nds32-tdep.c b/gdb/nds32-tdep.c
index b616cc9b2ced..05b82def0261 100644
--- a/gdb/nds32-tdep.c
+++ b/gdb/nds32-tdep.c
@@ -2099,7 +2099,7 @@  nds32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 
   /* Add NDS32 register aliases.  To avoid search in user register name space,
      user_reg_map_name_to_regnum is not used.  */
-  maxregs = (gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch));
+  maxregs = gdbarch_num_cooked_regs (gdbarch);
   for (i = 0; i < ARRAY_SIZE (nds32_register_aliases); i++)
     {
       int regnum, j;
diff --git a/gdb/regcache.c b/gdb/regcache.c
index b2f9b0558c48..38ad7ba3f1b6 100644
--- a/gdb/regcache.c
+++ b/gdb/regcache.c
@@ -86,8 +86,7 @@  init_regcache_descr (struct gdbarch *gdbarch)
   /* Total size of the register space.  The raw registers are mapped
      directly onto the raw register cache while the pseudo's are
      either mapped onto raw-registers or memory.  */
-  descr->nr_cooked_registers = gdbarch_num_regs (gdbarch)
-			       + gdbarch_num_pseudo_regs (gdbarch);
+  descr->nr_cooked_registers = gdbarch_num_cooked_regs (gdbarch);
 
   /* Fill in a table of register types.  */
   descr->register_type
@@ -163,9 +162,7 @@  register_size (struct gdbarch *gdbarch, int regnum)
   struct regcache_descr *descr = regcache_descr (gdbarch);
   int size;
 
-  gdb_assert (regnum >= 0
-	      && regnum < (gdbarch_num_regs (gdbarch)
-			   + gdbarch_num_pseudo_regs (gdbarch)));
+  gdb_assert (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch));
   size = descr->sizeof_register[regnum];
   return size;
 }
@@ -1311,8 +1308,7 @@  register_dump::dump (ui_file *file)
   long register_offset = 0;
 
   gdb_assert (descr->nr_cooked_registers
-	      == (gdbarch_num_regs (m_gdbarch)
-		  + gdbarch_num_pseudo_regs (m_gdbarch)));
+	      == gdbarch_num_cooked_regs (m_gdbarch));
 
   for (regnum = -1; regnum < descr->nr_cooked_registers; regnum++)
     {
@@ -1637,9 +1633,7 @@  cooked_read_test (struct gdbarch *gdbarch)
   mock_target.reset ();
   /* Then, read all raw and pseudo registers, and don't expect calling
      to_{fetch,store}_registers.  */
-  for (int regnum = 0;
-       regnum < gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
-       regnum++)
+  for (int regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); regnum++)
     {
       if (register_size (gdbarch, regnum) == 0)
 	continue;
@@ -1665,9 +1659,7 @@  cooked_read_test (struct gdbarch *gdbarch)
      readonly regcache.  */
   mock_target.reset ();
 
-  for (int regnum = 0;
-       regnum < gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
-       regnum++)
+  for (int regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); regnum++)
     {
       if (register_size (gdbarch, regnum) == 0)
 	continue;
@@ -1762,8 +1754,7 @@  cooked_write_test (struct gdbarch *gdbarch)
 
   readwrite_regcache readwrite (gdbarch);
 
-  const int num_regs = (gdbarch_num_regs (gdbarch)
-			+ gdbarch_num_pseudo_regs (gdbarch));
+  const int num_regs = gdbarch_num_cooked_regs (gdbarch);
 
   for (auto regnum = 0; regnum < num_regs; regnum++)
     {
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index ce01be5eb807..80d8504b2334 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -357,9 +357,7 @@  rs6000_register_sim_regno (struct gdbarch *gdbarch, int reg)
   if (tdep->sim_regno == NULL)
     init_sim_regno_table (gdbarch);
 
-  gdb_assert (0 <= reg 
-	      && reg <= gdbarch_num_regs (gdbarch)
-			+ gdbarch_num_pseudo_regs (gdbarch));
+  gdb_assert (0 <= reg && reg <= gdbarch_num_cooked_regs (gdbarch));
   sim_regno = tdep->sim_regno[reg];
 
   if (sim_regno >= 0)
@@ -6475,8 +6473,7 @@  rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       cur_reg += 32;
     }
 
-  gdb_assert (gdbarch_num_regs (gdbarch)
-	      + gdbarch_num_pseudo_regs (gdbarch) == cur_reg);
+  gdb_assert (gdbarch_num_cooked_regs (gdbarch) == cur_reg);
 
   /* Register the ravenscar_arch_ops.  */
   if (mach == bfd_mach_ppc_e500)
diff --git a/gdb/stabsread.c b/gdb/stabsread.c
index 368293d24fe0..d355e541483e 100644
--- a/gdb/stabsread.c
+++ b/gdb/stabsread.c
@@ -616,13 +616,9 @@  stab_reg_to_regnum (struct symbol *sym, struct gdbarch *gdbarch)
 {
   int regno = gdbarch_stab_reg_to_regnum (gdbarch, SYMBOL_VALUE (sym));
 
-  if (regno < 0
-      || regno >= (gdbarch_num_regs (gdbarch)
-		   + gdbarch_num_pseudo_regs (gdbarch)))
+  if (regno < 0 || regno >= gdbarch_num_cooked_regs (gdbarch))
     {
-      reg_value_complaint (regno,
-			   gdbarch_num_regs (gdbarch)
-			     + gdbarch_num_pseudo_regs (gdbarch),
+      reg_value_complaint (regno, gdbarch_num_cooked_regs (gdbarch),
 			   SYMBOL_PRINT_NAME (sym));
 
       regno = gdbarch_sp_regnum (gdbarch); /* Known safe, though useless.  */
diff --git a/gdb/stack.c b/gdb/stack.c
index 9b0e740beb50..87b493f79017 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -1553,8 +1553,7 @@  info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
       }
 
     count = 0;
-    numregs = gdbarch_num_regs (gdbarch)
-	      + gdbarch_num_pseudo_regs (gdbarch);
+    numregs = gdbarch_num_cooked_regs (gdbarch);
     for (i = 0; i < numregs; i++)
       if (i != sp_regnum
 	  && gdbarch_register_reggroup_p (gdbarch, i, all_reggroup))
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index 087de141f7f9..bdd29c0f2b59 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -854,12 +854,11 @@  tdesc_register_name (struct gdbarch *gdbarch, int regno)
 {
   struct tdesc_reg *reg = tdesc_find_register (gdbarch, regno);
   int num_regs = gdbarch_num_regs (gdbarch);
-  int num_pseudo_regs = gdbarch_num_pseudo_regs (gdbarch);
 
   if (reg != NULL)
     return reg->name.c_str ();
 
-  if (regno >= num_regs && regno < num_regs + num_pseudo_regs)
+  if (regno >= num_regs && regno < gdbarch_num_cooked_regs (gdbarch))
     {
       struct tdesc_arch_data *data
 	= (struct tdesc_arch_data *) gdbarch_data (gdbarch, tdesc_data);
diff --git a/gdb/trad-frame.c b/gdb/trad-frame.c
index a3484d2b3991..cced08a8d310 100644
--- a/gdb/trad-frame.c
+++ b/gdb/trad-frame.c
@@ -48,7 +48,7 @@  struct trad_frame_saved_reg *
 trad_frame_alloc_saved_regs (struct gdbarch *gdbarch)
 {
   int regnum;
-  int numregs = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  int numregs = gdbarch_num_cooked_regs (gdbarch);
   struct trad_frame_saved_reg *this_saved_regs
     = FRAME_OBSTACK_CALLOC (numregs, struct trad_frame_saved_reg);
 
diff --git a/gdb/tui/tui-regs.c b/gdb/tui/tui-regs.c
index 12382cddb357..9c34a070ae14 100644
--- a/gdb/tui/tui-regs.c
+++ b/gdb/tui/tui-regs.c
@@ -206,10 +206,7 @@  tui_show_register_group (struct reggroup *group,
 
   /* See how many registers must be displayed.  */
   nr_regs = 0;
-  for (regnum = 0;
-       regnum < gdbarch_num_regs (gdbarch)
-		+ gdbarch_num_pseudo_regs (gdbarch);
-       regnum++)
+  for (regnum = 0; regnum < gdbarch_num_cooked_regs (gdbarch); regnum++)
     {
       const char *name;
 
@@ -253,10 +250,7 @@  tui_show_register_group (struct reggroup *group,
 
       /* Now set the register names and values.  */
       pos = 0;
-      for (regnum = 0;
-	   regnum < gdbarch_num_regs (gdbarch)
-		    + gdbarch_num_pseudo_regs (gdbarch);
-	   regnum++)
+      for (regnum = 0;regnum < gdbarch_num_cooked_regs (gdbarch); regnum++)
         {
 	  struct tui_gen_win_info *data_item_win;
           struct tui_data_element *data;
diff --git a/gdb/user-regs.c b/gdb/user-regs.c
index 4dd67a64191d..c9e8c0d67f7b 100644
--- a/gdb/user-regs.c
+++ b/gdb/user-regs.c
@@ -138,8 +138,7 @@  user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name,
      specific register override the user registers.  */
   {
     int i;
-    int maxregs = (gdbarch_num_regs (gdbarch)
-		   + gdbarch_num_pseudo_regs (gdbarch));
+    int maxregs = gdbarch_num_cooked_regs (gdbarch);
 
     for (i = 0; i < maxregs; i++)
       {
@@ -165,8 +164,7 @@  user_reg_map_name_to_regnum (struct gdbarch *gdbarch, const char *name,
 	if ((len < 0 && strcmp (reg->name, name))
 	    || (len == strlen (reg->name)
 		&& strncmp (reg->name, name, len) == 0))
-	  return gdbarch_num_regs (gdbarch)
-		 + gdbarch_num_pseudo_regs (gdbarch) + nr;
+	  return gdbarch_num_cooked_regs (gdbarch) + nr;
       }
   }
 
@@ -192,8 +190,7 @@  usernum_to_user_reg (struct gdbarch *gdbarch, int usernum)
 const char *
 user_reg_map_regnum_to_name (struct gdbarch *gdbarch, int regnum)
 {
-  int maxregs = (gdbarch_num_regs (gdbarch)
-		 + gdbarch_num_pseudo_regs (gdbarch));
+  int maxregs = gdbarch_num_cooked_regs (gdbarch);
 
   if (regnum < 0)
     return NULL;
@@ -213,8 +210,7 @@  struct value *
 value_of_user_reg (int regnum, struct frame_info *frame)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  int maxregs = (gdbarch_num_regs (gdbarch)
-		 + gdbarch_num_pseudo_regs (gdbarch));
+  int maxregs = gdbarch_num_cooked_regs (gdbarch);
   struct user_reg *reg = usernum_to_user_reg (gdbarch, regnum - maxregs);
 
   gdb_assert (reg != NULL);
@@ -230,7 +226,7 @@  maintenance_print_user_registers (const char *args, int from_tty)
   int regnum;
 
   regs = (struct gdb_user_regs *) gdbarch_data (gdbarch, user_regs_data);
-  regnum = gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
+  regnum = gdbarch_num_cooked_regs (gdbarch);
 
   fprintf_unfiltered (gdb_stdout, " %-11s %3s\n", "Name", "Nr");
   for (reg = regs->first; reg != NULL; reg = reg->next, ++regnum)
diff --git a/gdb/xtensa-tdep.c b/gdb/xtensa-tdep.c
index 3b32bcfc8278..4f29557fbf65 100644
--- a/gdb/xtensa-tdep.c
+++ b/gdb/xtensa-tdep.c
@@ -234,9 +234,7 @@  xtensa_find_register_by_name (struct gdbarch *gdbarch, const char *name)
 {
   int i;
 
-  for (i = 0; i < gdbarch_num_regs (gdbarch)
-	 + gdbarch_num_pseudo_regs (gdbarch);
-       i++)
+  for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
 
     if (strcasecmp (gdbarch_tdep (gdbarch)->regmap[i].name, name) == 0)
       return i;
@@ -249,8 +247,7 @@  static const char *
 xtensa_register_name (struct gdbarch *gdbarch, int regnum)
 {
   /* Return the name stored in the register map.  */
-  if (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch)
-			      + gdbarch_num_pseudo_regs (gdbarch))
+  if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     return gdbarch_tdep (gdbarch)->regmap[regnum].name;
 
   internal_error (__FILE__, __LINE__, _("invalid register %d"), regnum);
@@ -276,8 +273,7 @@  xtensa_register_type (struct gdbarch *gdbarch, int regnum)
     return builtin_type (gdbarch)->builtin_data_ptr;
 
   /* Return the stored type for all other registers.  */
-  else if (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch)
-				   + gdbarch_num_pseudo_regs (gdbarch))
+  else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     {
       xtensa_register_t* reg = &tdep->regmap[regnum];
 
@@ -352,9 +348,7 @@  xtensa_reg_to_regnum (struct gdbarch *gdbarch, int regnum)
   if (regnum >= 0 && regnum < 16)
     return gdbarch_tdep (gdbarch)->a0_base + regnum;
 
-  for (i = 0;
-       i < gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
-       i++)
+  for (i = 0; i < gdbarch_num_cooked_regs (gdbarch); i++)
     if (regnum == gdbarch_tdep (gdbarch)->regmap[i].target_number)
       return i;
 
@@ -585,9 +579,7 @@  xtensa_pseudo_register_read (struct gdbarch *gdbarch,
       return REG_VALID;
     }
   /* Pseudo registers.  */
-  else if (regnum >= 0
-	    && regnum < gdbarch_num_regs (gdbarch)
-			+ gdbarch_num_pseudo_regs (gdbarch))
+  else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     {
       xtensa_register_t *reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
       xtensa_register_type_t type = reg->type;
@@ -670,9 +662,7 @@  xtensa_pseudo_register_write (struct gdbarch *gdbarch,
       return;
     }
   /* Pseudo registers.  */
-  else if (regnum >= 0
-	   && regnum < gdbarch_num_regs (gdbarch)
-		       + gdbarch_num_pseudo_regs (gdbarch))
+  else if (regnum >= 0 && regnum < gdbarch_num_cooked_regs (gdbarch))
     {
       xtensa_register_t *reg = &gdbarch_tdep (gdbarch)->regmap[regnum];
       xtensa_register_type_t type = reg->type;