summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2003-11-15 17:56:45 +0000
committerMark Kettenis <kettenis@gnu.org>2003-11-15 17:56:45 +0000
commitcb3c93a37d3ef53c67f5d4d4734a973ac249d2da (patch)
treed54a93f4fbd14e692ca332c375b25b5021a14d75
parent2ccc90d21884abb7ec551eb0df1830f361928177 (diff)
downloadgdb-cb3c93a37d3ef53c67f5d4d4734a973ac249d2da.tar.gz
* sparc-tdep.c (sparc32_register_names): Remove trailing comma.
(sparc32_pseudo_register_names): New variable. (SPARC32_NUM_PSEUDO_REGS): New define. (sparc32_register_name): Add support for psuedo-registers. (sparc32_register_type): Add support double precision floating-point registers. (sparc32_pseudo_register_read, sparc32_pseudo_register_write): New functions. (sparc32_gdbarch_init): Set num_pseudo_regs, pseudo_register_read and pseudo_register_write. * sparc-tdep.h (sparc32_regnum): Add SPARC32_D0_REGNUM and SPARC32_D30_REGNUM.
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/sparc-tdep.c48
-rw-r--r--gdb/sparc-tdep.h7
3 files changed, 66 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b2eebeba3ec..407144280b4 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,18 @@
2003-11-15 Mark Kettenis <kettenis@gnu.org>
+ * sparc-tdep.c (sparc32_register_names): Remove trailing comma.
+ (sparc32_pseudo_register_names): New variable.
+ (SPARC32_NUM_PSEUDO_REGS): New define.
+ (sparc32_register_name): Add support for psuedo-registers.
+ (sparc32_register_type): Add support double precision
+ floating-point registers.
+ (sparc32_pseudo_register_read, sparc32_pseudo_register_write): New
+ functions.
+ (sparc32_gdbarch_init): Set num_pseudo_regs, pseudo_register_read
+ and pseudo_register_write.
+ * sparc-tdep.h (sparc32_regnum): Add SPARC32_D0_REGNUM and
+ SPARC32_D30_REGNUM.
+
* sparc-linux-tdep.c (sparc32_linux_sigtramp_frame_cache): Fix.
2003-11-14 Mark Kettenis <kettenis@gnu.org>
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
index 3388a7b7411..76237d76353 100644
--- a/gdb/sparc-tdep.c
+++ b/gdb/sparc-tdep.c
@@ -197,12 +197,24 @@ static const char *sparc32_register_names[] =
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
- "y", "psr", "wim", "tbr", "pc", "npc", "fsr", "csr",
+ "y", "psr", "wim", "tbr", "pc", "npc", "fsr", "csr"
};
/* Total number of registers. */
#define SPARC32_NUM_REGS ARRAY_SIZE (sparc32_register_names)
+/* We provide the aliases %d0..%d30 for the floating registers as
+ "psuedo" registers. */
+
+static const char *sparc32_pseudo_register_names[] =
+{
+ "d0", "d2", "d4", "d6", "d8", "d10", "d12", "d14",
+ "d16", "d18", "d20", "d22", "d24", "d26", "d28", "d30"
+};
+
+/* Total number of pseudo registers. */
+#define SPARC32_NUM_PSEUDO_REGS ARRAY_SIZE (sparc32_pseudo_register_names)
+
/* Return the name of register REGNUM. */
static const char *
@@ -211,6 +223,9 @@ sparc32_register_name (int regnum)
if (regnum >= 0 && regnum < SPARC32_NUM_REGS)
return sparc32_register_names[regnum];
+ if (regnum < SPARC32_NUM_REGS + SPARC32_NUM_PSEUDO_REGS)
+ return sparc32_pseudo_register_names[regnum - SPARC32_NUM_REGS];
+
return NULL;
}
@@ -223,6 +238,9 @@ sparc32_register_type (struct gdbarch *gdbarch, int regnum)
if (regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
return builtin_type_float;
+ if (regnum >= SPARC32_D0_REGNUM && regnum <= SPARC32_D30_REGNUM)
+ return builtin_type_double;
+
if (regnum == SPARC_SP_REGNUM || regnum == SPARC_FP_REGNUM)
return builtin_type_void_data_ptr;
@@ -232,6 +250,31 @@ sparc32_register_type (struct gdbarch *gdbarch, int regnum)
return builtin_type_int32;
}
+static void
+sparc32_pseudo_register_read (struct gdbarch *gdbarch,
+ struct regcache *regcache,
+ int regnum, void *buf)
+{
+ gdb_assert (regnum >= SPARC32_D0_REGNUM && regnum <= SPARC32_D30_REGNUM);
+
+ regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC32_D0_REGNUM);
+ regcache_raw_read (regcache, regnum, buf);
+ regcache_raw_read (regcache, regnum + 1, ((char *)buf) + 4);
+}
+
+static void
+sparc32_pseudo_register_write (struct gdbarch *gdbarch,
+ struct regcache *regcache,
+ int regnum, const void *buf)
+{
+ gdb_assert (regnum >= SPARC32_D0_REGNUM && regnum <= SPARC32_D30_REGNUM);
+
+ regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC32_D0_REGNUM);
+ regcache_raw_write (regcache, regnum, buf);
+ regcache_raw_write (regcache, regnum + 1, ((const char *)buf) + 4);
+}
+
+
static CORE_ADDR
sparc32_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
CORE_ADDR funcaddr, int using_gcc,
@@ -934,6 +977,9 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
set_gdbarch_num_regs (gdbarch, SPARC32_NUM_REGS);
set_gdbarch_register_name (gdbarch, sparc32_register_name);
set_gdbarch_register_type (gdbarch, sparc32_register_type);
+ set_gdbarch_num_pseudo_regs (gdbarch, SPARC32_NUM_PSEUDO_REGS);
+ set_gdbarch_pseudo_register_read (gdbarch, sparc32_pseudo_register_read);
+ set_gdbarch_pseudo_register_write (gdbarch, sparc32_pseudo_register_write);
/* Register numbers of various important registers. */
set_gdbarch_sp_regnum (gdbarch, SPARC_SP_REGNUM); /* %sp */
diff --git a/gdb/sparc-tdep.h b/gdb/sparc-tdep.h
index a683092f113..65c68d6e18c 100644
--- a/gdb/sparc-tdep.h
+++ b/gdb/sparc-tdep.h
@@ -111,7 +111,12 @@ enum sparc32_regnum
SPARC32_PC_REGNUM, /* %pc */
SPARC32_NPC_REGNUM, /* %npc */
SPARC32_FSR_REGNUM, /* %fsr */
- SPARC32_CSR_REGNUM /* %csr */
+ SPARC32_CSR_REGNUM, /* %csr */
+
+ /* Pseudo registers. */
+ SPARC32_D0_REGNUM, /* %d0 */
+ SPARC32_D30_REGNUM /* %d30 */
+ = SPARC32_D0_REGNUM + 15
};