This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[patch/5,3/rfc] $pc fix?
- From: Andrew Cagney <ac131313 at ges dot redhat dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Tue, 03 Sep 2002 16:47:42 -0400
- Subject: [patch/5,3/rfc] $pc fix?
Hello,
This is a work-in-progress patch to fix CGF's $pc problem. It adds a
builtin-regnum -> builtin-regname method and a pair of frame based
regnum<->name methods. I've also added more things to include in my
work-in-progress registers doco.
I need to come up with a test case before I'm convinced it works.
I've also come up with a think-o bug. Say an architecture (e.g., i386)
doesn't have a $pc (so $pc == frame->pc), what should:
info registers pc
print? Assuming selected_frame->pc, then who should print it?
I'll see that this gets onto the branch,
enjoy,
Andrew
2002-09-03 Andrew Cagney <ac131313@redhat.com>
* frame.c: Include "gdb_string.h" and "builtin-regs.h".
(frame_map_regnum_to_name): New function.
(frame_map_name_to_regnum): New function.
* frame.h (frame_map_name_to_regnum): Declare.
(frame_map_regnum_to_name): Declare.
* builtin-regs.c (builtin_reg_map_regnum_to_name): New function.
* builtin-regs.h (builtin_reg_map_regnum_to_name): Declare.
* parse.c: Do not include "builtin-regs.h".
(target_map_name_to_register): Delete function.
(write_dollar_variable): Use frame_map_name_to_regnum.
* parser-defs.h (target_map_name_to_register): Delete declaration.
* expprint.c: Include "frame.h".
(print_subexp): Use frame_map_regnum_to_name.
* eval.c (evaluate_subexp_standard): Use frame_map_regnum_to_name.
* infcmd.c (registers_info): Use frame_map_name_to_regnum.
Index: builtin-regs.c
===================================================================
RCS file: /cvs/src/src/gdb/builtin-regs.c,v
retrieving revision 1.2
diff -u -r1.2 builtin-regs.c
--- builtin-regs.c 13 May 2002 16:25:08 -0000 1.2
+++ builtin-regs.c 3 Sep 2002 20:29:09 -0000
@@ -68,6 +68,15 @@
return -1;
}
+const char *
+builtin_reg_map_regnum_to_name (int regnum)
+{
+ int reg = regnum - (NUM_REGS + NUM_PSEUDO_REGS);
+ if (reg < 0 || reg >= nr_builtin_regs)
+ return NULL;
+ return builtin_regs[reg].name;
+}
+
struct value *
value_of_builtin_reg (int regnum, struct frame_info *frame)
{
Index: builtin-regs.h
===================================================================
RCS file: /cvs/src/src/gdb/builtin-regs.h,v
retrieving revision 1.1
diff -u -r1.1 builtin-regs.h
--- builtin-regs.h 9 Apr 2002 03:06:13 -0000 1.1
+++ builtin-regs.h 3 Sep 2002 20:29:09 -0000
@@ -26,6 +26,8 @@
extern int builtin_reg_map_name_to_regnum (const char *str, int len);
+extern const char *builtin_reg_map_regnum_to_name (int regnum);
+
extern struct value *value_of_builtin_reg (int regnum,
struct frame_info *frame);
Index: eval.c
===================================================================
RCS file: /cvs/src/src/gdb/eval.c,v
retrieving revision 1.23
diff -u -r1.23 eval.c
--- eval.c 1 Aug 2002 17:18:32 -0000 1.23
+++ eval.c 3 Sep 2002 20:29:11 -0000
@@ -448,7 +448,8 @@
struct value *val = value_of_register (regno, selected_frame);
(*pos) += 2;
if (val == NULL)
- error ("Value of register %s not available.", REGISTER_NAME (regno));
+ error ("Value of register %s not available.",
+ frame_map_regnum_to_name (regno));
else
return val;
}
Index: expprint.c
===================================================================
RCS file: /cvs/src/src/gdb/expprint.c,v
retrieving revision 1.8
diff -u -r1.8 expprint.c
--- expprint.c 1 Aug 2002 17:18:32 -0000 1.8
+++ expprint.c 3 Sep 2002 20:29:11 -0000
@@ -26,6 +26,7 @@
#include "value.h"
#include "language.h"
#include "parser-defs.h"
+#include "frame.h" /* For frame_map_regnum_to_name. */
#ifdef HAVE_CTYPE_H
#include <ctype.h>
@@ -119,10 +120,12 @@
return;
case OP_REGISTER:
- (*pos) += 2;
- fprintf_filtered (stream, "$%s",
- REGISTER_NAME (longest_to_int (exp->elts[pc + 1].longconst)));
- return;
+ {
+ int regnum = longest_to_int (exp->elts[pc + 1].longconst);
+ (*pos) += 2;
+ fprintf_filtered (stream, "$%s", frame_map_regnum_to_name (regnum));
+ return;
+ }
case OP_BOOL:
(*pos) += 2;
Index: frame.c
===================================================================
RCS file: /cvs/src/src/gdb/frame.c,v
retrieving revision 1.15
diff -u -r1.15 frame.c
--- frame.c 21 Aug 2002 03:34:22 -0000 1.15
+++ frame.c 3 Sep 2002 20:29:12 -0000
@@ -27,6 +27,8 @@
#include "inferior.h" /* for inferior_ptid */
#include "regcache.h"
#include "gdb_assert.h"
+#include "gdb_string.h"
+#include "builtin-regs.h"
/* Return a frame uniq ID that can be used to, later re-find the
frame. */
@@ -242,4 +244,45 @@
return 0; /* register value not available */
return !optim;
+}
+
+
+/* Map between a frame register number and its name. A frame register
+ space is a superset of the cooked register space --- it also
+ includes builtin registers. */
+
+int
+frame_map_name_to_regnum (const char *name, int len)
+{
+ int i;
+
+ /* Search register name space. */
+ for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
+ if (REGISTER_NAME (i) && len == strlen (REGISTER_NAME (i))
+ && strncmp (name, REGISTER_NAME (i), len) == 0)
+ {
+ return i;
+ }
+
+ /* Try builtin registers. */
+ i = builtin_reg_map_name_to_regnum (name, len);
+ if (i >= 0)
+ {
+ /* A builtin register doesn't fall into the architecture's
+ register range. */
+ gdb_assert (i >= NUM_REGS + NUM_PSEUDO_REGS);
+ return i;
+ }
+
+ return -1;
+}
+
+const char *
+frame_map_regnum_to_name (int regnum)
+{
+ if (regnum < 0)
+ return NULL;
+ if (regnum < NUM_REGS + NUM_PSEUDO_REGS)
+ return REGISTER_NAME (regnum);
+ return builtin_reg_map_regnum_to_name (regnum);
}
Index: frame.h
===================================================================
RCS file: /cvs/src/src/gdb/frame.h,v
retrieving revision 1.22
diff -u -r1.22 frame.h
--- frame.h 2 Jul 2002 19:08:53 -0000 1.22
+++ frame.h 3 Sep 2002 20:29:12 -0000
@@ -356,4 +356,11 @@
extern int frame_register_read (struct frame_info *frame, int regnum,
void *buf);
+/* Map between a frame register number and its name. A frame register
+ space is a superset of the cooked register space --- it also
+ includes builtin registers. */
+
+extern int frame_map_name_to_regnum (const char *name, int strlen);
+extern const char *frame_map_regnum_to_name (int regnum);
+
#endif /* !defined (FRAME_H) */
Index: infcmd.c
===================================================================
RCS file: /cvs/src/src/gdb/infcmd.c,v
retrieving revision 1.54
diff -u -r1.54 infcmd.c
--- infcmd.c 21 Aug 2002 16:34:09 -0000 1.54
+++ infcmd.c 3 Sep 2002 20:29:12 -0000
@@ -1701,7 +1701,7 @@
++end;
numregs = NUM_REGS + NUM_PSEUDO_REGS;
- regnum = target_map_name_to_register (addr_exp, end - addr_exp);
+ regnum = frame_map_name_to_regnum (addr_exp, end - addr_exp);
if (regnum >= 0)
goto found;
Index: parse.c
===================================================================
RCS file: /cvs/src/src/gdb/parse.c,v
retrieving revision 1.25
diff -u -r1.25 parse.c
--- parse.c 21 Jun 2002 14:32:10 -0000 1.25
+++ parse.c 3 Sep 2002 20:29:12 -0000
@@ -47,7 +47,6 @@
#include "inferior.h" /* for NUM_PSEUDO_REGS. NOTE: replace
with "gdbarch.h" when appropriate. */
#include "doublest.h"
-#include "builtin-regs.h"
#include "gdb_assert.h"
@@ -106,42 +105,6 @@
static struct funcall *funcall_chain;
-/* The generic method for targets to specify how their registers are
- named. The mapping can be derived from two sources: REGISTER_NAME;
- or builtin regs. */
-
-int
-target_map_name_to_register (char *str, int len)
-{
- int i;
-
- /* Search register name space. */
- for (i = 0; i < NUM_REGS + NUM_PSEUDO_REGS; i++)
- if (REGISTER_NAME (i) && len == strlen (REGISTER_NAME (i))
- && STREQN (str, REGISTER_NAME (i), len))
- {
- return i;
- }
-
- /* Try builtin registers. */
- i = builtin_reg_map_name_to_regnum (str, len);
- if (i >= 0)
- {
- gdb_assert (i >= NUM_REGS + NUM_PSEUDO_REGS);
- return i;
- }
-
- /* Try builtin registers. */
- i = builtin_reg_map_name_to_regnum (str, len);
- if (i >= 0)
- {
- gdb_assert (i >= NUM_REGS + NUM_PSEUDO_REGS);
- return i;
- }
-
- return -1;
-}
-
/* Begin counting arguments for a function call,
saving the data about any containing call. */
@@ -491,7 +454,7 @@
/* Handle tokens that refer to machine registers:
$ followed by a register name. */
- i = target_map_name_to_register (str.ptr + 1, str.length - 1);
+ i = frame_map_name_to_regnum (str.ptr + 1, str.length - 1);
if (i >= 0)
goto handle_register;
Index: parser-defs.h
===================================================================
RCS file: /cvs/src/src/gdb/parser-defs.h,v
retrieving revision 1.11
diff -u -r1.11 parser-defs.h
--- parser-defs.h 24 Jul 2002 03:03:52 -0000 1.11
+++ parser-defs.h 3 Sep 2002 20:29:13 -0000
@@ -210,12 +210,6 @@
int right_assoc;
};
-/* The generic method for targets to specify how their registers are
- named. The mapping can be derived from two sources: REGISTER_NAME;
- and builtin regs. */
-
-extern int target_map_name_to_register (char *, int);
-
/* Function used to avoid direct calls to fprintf
in the code generated by the bison parser. */