(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.
Testsuite:
* gdb.base/pc-fp.exp, gdb.base/pc-fp.c: New test.
+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.
+
2002-09-24 Jim Blandy <jimb@redhat.com>
Fix from Paul Breed:
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)
{
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);
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;
}
#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>
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;
#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. */
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);
+}
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) */
++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;
#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"
\f
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. */
/* 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;
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. */
+2002-09-04 Andrew Cagney <ac131313@redhat.com>
+
+ * gdb.base/pc-fp.exp, gdb.base/pc-fp.c: New test.
+
2002-09-03 Keith Seitz <keiths@redhat.com>
* lib/gdb.exp (gdb_compile_pthreads): Fix "build_bin" typo.