Blame SOURCES/gdb-rhbz1187581-power8-regs-4of7.patch

7bc85d
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
7bc85d
From: Jan Kratochvil <jan.kratochvil@redhat.com>
7bc85d
Date: Thu, 9 Aug 2018 17:17:16 +0200
7bc85d
Subject: gdb-rhbz1187581-power8-regs-4of7.patch
7bc85d
7bc85d
;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581).
7bc85d
7bc85d
commit 4277c4b87addb5354cc47b98d7a73e44cfaf22c2
7bc85d
Author: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
7bc85d
Date:   Mon Aug 6 16:24:55 2018 -0300
7bc85d
7bc85d
    Use remote register numbers in tracepoint mask
7bc85d
7bc85d
    Currently, tracepoint register masks in the QTDP packets include both
7bc85d
    internal and remote register numbers, as well as pseudo-register
7bc85d
    numbers.
7bc85d
7bc85d
    This patch changes this so that the mask only includes remote register
7bc85d
    numbers.
7bc85d
7bc85d
    Register numbers from agent expressions are already set in the mask
7bc85d
    using remote numbers.  Other tracepoint actions used internal numbers,
7bc85d
    e.g. "collect $regs" or "collect $<pseudoreg>".  To handle pseudoreg
7bc85d
    numbers, an empty agent expression is created and ax_reg_mask is
7bc85d
    called for this expression and the pseudoreg.  This will cause the ax
7bc85d
    to set its mask with the corresponding remote raw register
7bc85d
    numbers (using ax_regs_mask, which calls
7bc85d
    gdbarch_ax_pseudo_register_collect).
7bc85d
7bc85d
    If ax_regs_mask and gdbarch_ax_pseudo_register_collect also generate
7bc85d
    more ax bytecode, the ax is also appended to the collection list.  It
7bc85d
    isn't clear that this was the original intent for
7bc85d
    gdbarch_ax_pseudo_register_collect, and none of the arches seem to do
7bc85d
    this, but if this changes in the future, it should work.
7bc85d
7bc85d
    The patch also refactors the code used by validate_action line to
7bc85d
    validate axs into a function that is now called from every place that
7bc85d
    generates axs.  Previously, some parts of tracepoint.c that generated
7bc85d
    axs didn't check if the ax length was greater than MAX_AGENT_EXPR_LEN.
7bc85d
7bc85d
    gdb/ChangeLog:
7bc85d
    2018-08-06  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
7bc85d
7bc85d
            * tracepoint.h (class collection_list) <add_register>: Remove.
7bc85d
            <add_remote_register, add_ax_registers, add_local_register>:
7bc85d
            Declare.
7bc85d
            <add_memrange>: Add scope parameter.
7bc85d
            * tracepoint.c (encode_actions_1): Likewise.
7bc85d
            (collection_list::add_register): Rename to ...
7bc85d
            (collection_list::add_remote_register): ... this.  Update
7bc85d
            comment.
7bc85d
            (collection_list::add_ax_registers, add_local_register): New
7bc85d
            methods.
7bc85d
            (collection_list::add_memrange): Add scope parameter.  Call
7bc85d
            add_local_register instead of add_register.
7bc85d
            (finalize_tracepoint_aexpr): New function.
7bc85d
            (collection_list::collect_symbol): Update calls to add_memrange.
7bc85d
            Call add_local_register instead of add_register.  Call
7bc85d
            add_ax_registers.  Call finalize_tracepoint_aexpr.
7bc85d
            (encode_actions_1): Get remote regnos for $reg action.  Call
7bc85d
            add_remote_register, add_ax_registers, and add_local_register.
7bc85d
            Update call to add_memrange.  Call finalize_tracepoint_aexpr.
7bc85d
            (validate_actionline): Call finalize_tracepoint_aexpr.
7bc85d
7bc85d
+2018-08-06  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
7bc85d
+
7bc85d
+	* tracepoint.h (class collection_list) <add_register>: Remove.
7bc85d
+	<add_remote_register, add_ax_registers, add_local_register>:
7bc85d
+	Declare.
7bc85d
+	<add_memrange>: Add scope parameter.
7bc85d
+	* tracepoint.c (encode_actions_1): Likewise.
7bc85d
+	(collection_list::add_register): Rename to ...
7bc85d
+	(collection_list::add_remote_register): ... this.  Update
7bc85d
+	comment.
7bc85d
+	(collection_list::add_ax_registers, add_local_register): New
7bc85d
+	methods.
7bc85d
+	(collection_list::add_memrange): Add scope parameter.  Call
7bc85d
+	add_local_register instead of add_register.
7bc85d
+	(finalize_tracepoint_aexpr): New function.
7bc85d
+	(collection_list::collect_symbol): Update calls to add_memrange.
7bc85d
+	Call add_local_register instead of add_register.  Call
7bc85d
+	add_ax_registers.  Call finalize_tracepoint_aexpr.
7bc85d
+	(encode_actions_1): Get remote regnos for $reg action.  Call
7bc85d
+	add_remote_register, add_ax_registers, and add_local_register.
7bc85d
+	Update call to add_memrange.  Call finalize_tracepoint_aexpr.
7bc85d
+	(validate_actionline): Call finalize_tracepoint_aexpr.
7bc85d
+
7bc85d
 2018-08-06  Pedro Franco de Carvalho  <pedromfc@linux.ibm.com>
7bc85d
7bc85d
 	* remote.c (remote_target::download_tracepoint): Remove BUF_SIZE.
7bc85d
7bc85d
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
7bc85d
--- a/gdb/tracepoint.c
7bc85d
+++ b/gdb/tracepoint.c
7bc85d
@@ -615,6 +615,19 @@ report_agent_reqs_errors (struct agent_expr *aexpr)
7bc85d
     error (_("Expression is too complicated."));
7bc85d
 }
7bc85d
 
7bc85d
+/* Call ax_reqs on AEXPR and raise an error if something is wrong.  */
7bc85d
+
7bc85d
+static void
7bc85d
+finalize_tracepoint_aexpr (struct agent_expr *aexpr)
7bc85d
+{
7bc85d
+  ax_reqs (aexpr);
7bc85d
+
7bc85d
+  if (aexpr->len > MAX_AGENT_EXPR_LEN)
7bc85d
+    error (_("Expression is too complicated."));
7bc85d
+
7bc85d
+  report_agent_reqs_errors (aexpr);
7bc85d
+}
7bc85d
+
7bc85d
 /* worker function */
7bc85d
 void
7bc85d
 validate_actionline (const char *line, struct breakpoint *b)
7bc85d
@@ -699,12 +712,7 @@ validate_actionline (const char *line, struct breakpoint *b)
7bc85d
 							exp.get (),
7bc85d
 							trace_string);
7bc85d
 
7bc85d
-	      if (aexpr->len > MAX_AGENT_EXPR_LEN)
7bc85d
-		error (_("Expression is too complicated."));
7bc85d
-
7bc85d
-	      ax_reqs (aexpr.get ());
7bc85d
-
7bc85d
-	      report_agent_reqs_errors (aexpr.get ());
7bc85d
+	      finalize_tracepoint_aexpr (aexpr.get ());
7bc85d
 	    }
7bc85d
 	}
7bc85d
       while (p && *p++ == ',');
7bc85d
@@ -731,11 +739,7 @@ validate_actionline (const char *line, struct breakpoint *b)
7bc85d
 		 long.  */
7bc85d
 	      agent_expr_up aexpr = gen_eval_for_expr (loc->address, exp.get ());
7bc85d
 
7bc85d
-	      if (aexpr->len > MAX_AGENT_EXPR_LEN)
7bc85d
-		error (_("Expression is too complicated."));
7bc85d
-
7bc85d
-	      ax_reqs (aexpr.get ());
7bc85d
-	      report_agent_reqs_errors (aexpr.get ());
7bc85d
+	      finalize_tracepoint_aexpr (aexpr.get ());
7bc85d
 	    }
7bc85d
 	}
7bc85d
       while (p && *p++ == ',');
7bc85d
@@ -811,10 +815,10 @@ memrange_sortmerge (std::vector<memrange> &memranges)
7bc85d
     }
7bc85d
 }
7bc85d
 
7bc85d
-/* Add a register to a collection list.  */
7bc85d
+/* Add remote register number REGNO to the collection list mask.  */
7bc85d
 
7bc85d
 void
7bc85d
-collection_list::add_register (unsigned int regno)
7bc85d
+collection_list::add_remote_register (unsigned int regno)
7bc85d
 {
7bc85d
   if (info_verbose)
7bc85d
     printf_filtered ("collect register %d\n", regno);
7bc85d
@@ -824,12 +828,74 @@ collection_list::add_register (unsigned int regno)
7bc85d
   m_regs_mask[regno / 8] |= 1 << (regno % 8);
7bc85d
 }
7bc85d
 
7bc85d
+/* Add all the registers from the mask in AEXPR to the mask in the
7bc85d
+   collection list.  Registers in the AEXPR mask are already remote
7bc85d
+   register numbers.  */
7bc85d
+
7bc85d
+void
7bc85d
+collection_list::add_ax_registers (struct agent_expr *aexpr)
7bc85d
+{
7bc85d
+  if (aexpr->reg_mask_len > 0)
7bc85d
+    {
7bc85d
+      for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
7bc85d
+	{
7bc85d
+	  QUIT;	/* Allow user to bail out with ^C.  */
7bc85d
+	  if (aexpr->reg_mask[ndx1] != 0)
7bc85d
+	    {
7bc85d
+	      /* Assume chars have 8 bits.  */
7bc85d
+	      for (int ndx2 = 0; ndx2 < 8; ndx2++)
7bc85d
+		if (aexpr->reg_mask[ndx1] & (1 << ndx2))
7bc85d
+		  /* It's used -- record it.  */
7bc85d
+		  add_remote_register (ndx1 * 8 + ndx2);
7bc85d
+	    }
7bc85d
+	}
7bc85d
+    }
7bc85d
+}
7bc85d
+
7bc85d
+/* If REGNO is raw, add its corresponding remote register number to
7bc85d
+   the mask.  If REGNO is a pseudo-register, figure out the necessary
7bc85d
+   registers using a temporary agent expression, and add it to the
7bc85d
+   list if it needs more than just a mask.  */
7bc85d
+
7bc85d
+void
7bc85d
+collection_list::add_local_register (struct gdbarch *gdbarch,
7bc85d
+				     unsigned int regno,
7bc85d
+				     CORE_ADDR scope)
7bc85d
+{
7bc85d
+  if (regno < gdbarch_num_regs (gdbarch))
7bc85d
+    {
7bc85d
+      int remote_regno = gdbarch_remote_register_number (gdbarch, regno);
7bc85d
+
7bc85d
+      if (remote_regno < 0)
7bc85d
+	error (_("Can't collect register %d"), regno);
7bc85d
+
7bc85d
+      add_remote_register (remote_regno);
7bc85d
+    }
7bc85d
+  else
7bc85d
+    {
7bc85d
+      agent_expr_up aexpr (new agent_expr (gdbarch, scope));
7bc85d
+
7bc85d
+      ax_reg_mask (aexpr.get (), regno);
7bc85d
+
7bc85d
+      finalize_tracepoint_aexpr (aexpr.get ());
7bc85d
+
7bc85d
+      add_ax_registers (aexpr.get ());
7bc85d
+
7bc85d
+      /* Usually ax_reg_mask for a pseudo-regiser only sets the
7bc85d
+	 corresponding raw registers in the ax mask, but if this isn't
7bc85d
+	 the case add the expression that is generated to the
7bc85d
+	 collection list.  */
7bc85d
+      if (aexpr->len > 0)
7bc85d
+	add_aexpr (std::move (aexpr));
7bc85d
+    }
7bc85d
+}
7bc85d
+
7bc85d
 /* Add a memrange to a collection list.  */
7bc85d
 
7bc85d
 void
7bc85d
 collection_list::add_memrange (struct gdbarch *gdbarch,
7bc85d
 			       int type, bfd_signed_vma base,
7bc85d
-			       ULONGEST len)
7bc85d
+			       ULONGEST len, CORE_ADDR scope)
7bc85d
 {
7bc85d
   if (info_verbose)
7bc85d
     printf_filtered ("(%d,%s,%s)\n", type, paddress (gdbarch, base), pulongest (len));
7bc85d
@@ -840,7 +906,7 @@ collection_list::add_memrange (struct gdbarch *gdbarch,
7bc85d
   m_memranges.emplace_back (type, base, base + len);
7bc85d
 
7bc85d
   if (type != memrange_absolute)    /* Better collect the base register!  */
7bc85d
-    add_register (type);
7bc85d
+    add_local_register (gdbarch, type, scope);
7bc85d
 }
7bc85d
 
7bc85d
 /* Add a symbol to a collection list.  */
7bc85d
@@ -882,19 +948,19 @@ collection_list::collect_symbol (struct symbol *sym,
7bc85d
       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
7bc85d
 	treat_as_expr = 1;
7bc85d
       else
7bc85d
-	add_memrange (gdbarch, memrange_absolute, offset, len);
7bc85d
+	add_memrange (gdbarch, memrange_absolute, offset, len, scope);
7bc85d
       break;
7bc85d
     case LOC_REGISTER:
7bc85d
       reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
7bc85d
       if (info_verbose)
7bc85d
 	printf_filtered ("LOC_REG[parm] %s: ", 
7bc85d
 			 SYMBOL_PRINT_NAME (sym));
7bc85d
-      add_register (reg);
7bc85d
+      add_local_register (gdbarch, reg, scope);
7bc85d
       /* Check for doubles stored in two registers.  */
7bc85d
       /* FIXME: how about larger types stored in 3 or more regs?  */
7bc85d
       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
7bc85d
 	  len > register_size (gdbarch, reg))
7bc85d
-	add_register (reg + 1);
7bc85d
+	add_local_register (gdbarch, reg + 1, scope);
7bc85d
       break;
7bc85d
     case LOC_REF_ARG:
7bc85d
       printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
7bc85d
@@ -911,7 +977,7 @@ collection_list::collect_symbol (struct symbol *sym,
7bc85d
 			   SYMBOL_PRINT_NAME (sym), pulongest (len),
7bc85d
 			   paddress (gdbarch, offset), reg);
7bc85d
 	}
7bc85d
-      add_memrange (gdbarch, reg, offset, len);
7bc85d
+      add_memrange (gdbarch, reg, offset, len, scope);
7bc85d
       break;
7bc85d
     case LOC_REGPARM_ADDR:
7bc85d
       reg = SYMBOL_VALUE (sym);
7bc85d
@@ -923,7 +989,7 @@ collection_list::collect_symbol (struct symbol *sym,
7bc85d
 			   SYMBOL_PRINT_NAME (sym), pulongest (len),
7bc85d
 			   paddress (gdbarch, offset), reg);
7bc85d
 	}
7bc85d
-      add_memrange (gdbarch, reg, offset, len);
7bc85d
+      add_memrange (gdbarch, reg, offset, len, scope);
7bc85d
       break;
7bc85d
     case LOC_LOCAL:
7bc85d
       reg = frame_regno;
7bc85d
@@ -935,7 +1001,7 @@ collection_list::collect_symbol (struct symbol *sym,
7bc85d
 			   SYMBOL_PRINT_NAME (sym), pulongest (len),
7bc85d
 			   paddress (gdbarch, offset), reg);
7bc85d
 	}
7bc85d
-      add_memrange (gdbarch, reg, offset, len);
7bc85d
+      add_memrange (gdbarch, reg, offset, len, scope);
7bc85d
       break;
7bc85d
 
7bc85d
     case LOC_UNRESOLVED:
7bc85d
@@ -968,26 +1034,10 @@ collection_list::collect_symbol (struct symbol *sym,
7bc85d
 	  return;
7bc85d
 	}
7bc85d
 
7bc85d
-      ax_reqs (aexpr.get ());
7bc85d
-
7bc85d
-      report_agent_reqs_errors (aexpr.get ());
7bc85d
+      finalize_tracepoint_aexpr (aexpr.get ());
7bc85d
 
7bc85d
       /* Take care of the registers.  */
7bc85d
-      if (aexpr->reg_mask_len > 0)
7bc85d
-	{
7bc85d
-	  for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
7bc85d
-	    {
7bc85d
-	      QUIT;	/* Allow user to bail out with ^C.  */
7bc85d
-	      if (aexpr->reg_mask[ndx1] != 0)
7bc85d
-		{
7bc85d
-		  /* Assume chars have 8 bits.  */
7bc85d
-		  for (int ndx2 = 0; ndx2 < 8; ndx2++)
7bc85d
-		    if (aexpr->reg_mask[ndx1] & (1 << ndx2))
7bc85d
-		      /* It's used -- record it.  */
7bc85d
-		      add_register (ndx1 * 8 + ndx2);
7bc85d
-		}
7bc85d
-	    }
7bc85d
-	}
7bc85d
+      add_ax_registers (aexpr.get ());
7bc85d
 
7bc85d
       add_aexpr (std::move (aexpr));
7bc85d
     }
7bc85d
@@ -1257,8 +1307,18 @@ encode_actions_1 (struct command_line *action,
7bc85d
 
7bc85d
 	      if (0 == strncasecmp ("$reg", action_exp, 4))
7bc85d
 		{
7bc85d
-		  for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
7bc85d
-		    collect->add_register (i);
7bc85d
+		  for (i = 0; i < gdbarch_num_regs (target_gdbarch ());
7bc85d
+		       i++)
7bc85d
+		    {
7bc85d
+		      int remote_regno = (gdbarch_remote_register_number
7bc85d
+					  (target_gdbarch (), i));
7bc85d
+
7bc85d
+		      /* Ignore arch regnos without a corresponding
7bc85d
+			 remote regno.  This can happen for regnos not
7bc85d
+			 in the tdesc.  */
7bc85d
+		      if (remote_regno >= 0)
7bc85d
+			collect->add_remote_register (remote_regno);
7bc85d
+		    }
7bc85d
 		  action_exp = strchr (action_exp, ',');	/* more? */
7bc85d
 		}
7bc85d
 	      else if (0 == strncasecmp ("$arg", action_exp, 4))
7bc85d
@@ -1288,27 +1348,10 @@ encode_actions_1 (struct command_line *action,
7bc85d
 						    target_gdbarch (),
7bc85d
 						    trace_string);
7bc85d
 
7bc85d
-		  ax_reqs (aexpr.get ());
7bc85d
-		  report_agent_reqs_errors (aexpr.get ());
7bc85d
+		  finalize_tracepoint_aexpr (aexpr.get ());
7bc85d
 
7bc85d
 		  /* take care of the registers */
7bc85d
-		  if (aexpr->reg_mask_len > 0)
7bc85d
-		    {
7bc85d
-		      for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
7bc85d
-			{
7bc85d
-			  QUIT;	/* allow user to bail out with ^C */
7bc85d
-			  if (aexpr->reg_mask[ndx1] != 0)
7bc85d
-			    {
7bc85d
-			      /* assume chars have 8 bits */
7bc85d
-			      for (int ndx2 = 0; ndx2 < 8; ndx2++)
7bc85d
-				if (aexpr->reg_mask[ndx1] & (1 << ndx2))
7bc85d
-				  {
7bc85d
-				    /* It's used -- record it.  */
7bc85d
-				    collect->add_register (ndx1 * 8 + ndx2);
7bc85d
-				  }
7bc85d
-			    }
7bc85d
-			}
7bc85d
-		    }
7bc85d
+		  collect->add_ax_registers (aexpr.get ());
7bc85d
 
7bc85d
 		  collect->add_aexpr (std::move (aexpr));
7bc85d
 		  action_exp = strchr (action_exp, ',');	/* more? */
7bc85d
@@ -1340,7 +1383,8 @@ encode_actions_1 (struct command_line *action,
7bc85d
 					  name);
7bc85d
 			if (info_verbose)
7bc85d
 			  printf_filtered ("OP_REGISTER: ");
7bc85d
-			collect->add_register (i);
7bc85d
+			collect->add_local_register (target_gdbarch (),
7bc85d
+						     i, tloc->address);
7bc85d
 			break;
7bc85d
 		      }
7bc85d
 
7bc85d
@@ -1352,7 +1396,8 @@ encode_actions_1 (struct command_line *action,
7bc85d
 		      check_typedef (exp->elts[1].type);
7bc85d
 		      collect->add_memrange (target_gdbarch (),
7bc85d
 					     memrange_absolute, addr,
7bc85d
-					     TYPE_LENGTH (exp->elts[1].type));
7bc85d
+					     TYPE_LENGTH (exp->elts[1].type),
7bc85d
+					     tloc->address);
7bc85d
 		      collect->append_exp (exp.get ());
7bc85d
 		      break;
7bc85d
 
7bc85d
@@ -1376,28 +1421,10 @@ encode_actions_1 (struct command_line *action,
7bc85d
 								exp.get (),
7bc85d
 								trace_string);
7bc85d
 
7bc85d
-		      ax_reqs (aexpr.get ());
7bc85d
-
7bc85d
-		      report_agent_reqs_errors (aexpr.get ());
7bc85d
+		      finalize_tracepoint_aexpr (aexpr.get ());
7bc85d
 
7bc85d
 		      /* Take care of the registers.  */
7bc85d
-		      if (aexpr->reg_mask_len > 0)
7bc85d
-			{
7bc85d
-			  for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
7bc85d
-			    {
7bc85d
-			      QUIT;	/* Allow user to bail out with ^C.  */
7bc85d
-			      if (aexpr->reg_mask[ndx1] != 0)
7bc85d
-				{
7bc85d
-				  /* Assume chars have 8 bits.  */
7bc85d
-				  for (int ndx2 = 0; ndx2 < 8; ndx2++)
7bc85d
-				    if (aexpr->reg_mask[ndx1] & (1 << ndx2))
7bc85d
-				      {
7bc85d
-					/* It's used -- record it.  */
7bc85d
-					collect->add_register (ndx1 * 8 + ndx2);
7bc85d
-				      }
7bc85d
-				}
7bc85d
-			    }
7bc85d
-			}
7bc85d
+		      collect->add_ax_registers (aexpr.get ());
7bc85d
 
7bc85d
 		      collect->add_aexpr (std::move (aexpr));
7bc85d
 		      collect->append_exp (exp.get ());
7bc85d
@@ -1422,8 +1449,7 @@ encode_actions_1 (struct command_line *action,
7bc85d
 		  agent_expr_up aexpr = gen_eval_for_expr (tloc->address,
7bc85d
 							   exp.get ());
7bc85d
 
7bc85d
-		  ax_reqs (aexpr.get ());
7bc85d
-		  report_agent_reqs_errors (aexpr.get ());
7bc85d
+		  finalize_tracepoint_aexpr (aexpr.get ());
7bc85d
 
7bc85d
 		  /* Even though we're not officially collecting, add
7bc85d
 		     to the collect list anyway.  */
7bc85d
diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h
7bc85d
--- a/gdb/tracepoint.h
7bc85d
+++ b/gdb/tracepoint.h
7bc85d
@@ -263,9 +263,14 @@ public:
7bc85d
   void add_aexpr (agent_expr_up aexpr);
7bc85d
 
7bc85d
   void add_register (unsigned int regno);
7bc85d
+  void add_remote_register (unsigned int regno);
7bc85d
+  void add_ax_registers (struct agent_expr *aexpr);
7bc85d
+  void add_local_register (struct gdbarch *gdbarch,
7bc85d
+			   unsigned int regno,
7bc85d
+			   CORE_ADDR scope);
7bc85d
   void add_memrange (struct gdbarch *gdbarch,
7bc85d
 		     int type, bfd_signed_vma base,
7bc85d
-		     ULONGEST len);
7bc85d
+		     ULONGEST len, CORE_ADDR scope);
7bc85d
   void collect_symbol (struct symbol *sym,
7bc85d
 		       struct gdbarch *gdbarch,
7bc85d
 		       long frame_regno, long frame_offset,