+2009-10-15 Michael Snyder <msnyder@vmware.com>
+
+ * record.c (struct record_reg_entry): Replace ptr with union
+ of ptr and buf.
+ (struct record_mem_entry): Ditto.
+ (record_reg_alloc): Don't alloc ptr if reg will fit into buf.
+ (record_mem_alloc): Ditto.
+ (record_reg_release): Don't free ptr if reg was stored in buf.
+ (record_mem_release): Ditto.
+ (record_get_loc): New function. Return a pointer to where the
+ value (mem or reg) is to be stored.
+ (record_arch_list_add_reg): Call record_get_loc instead of using ptr.
+ (record_arch_list_add_mem): Ditto.
+ (record_wait): Ditto.
+
2009-10-16 Michael Eager <eager@eagercon.com>
* microblaze-linux-tdep.c:
Each struct record_entry is linked to "record_list" by "prev" and
"next" pointers. */
-struct record_reg_entry
-{
- int num;
- gdb_byte *val;
-};
-
struct record_mem_entry
{
CORE_ADDR addr;
/* Set this flag if target memory for this entry
can no longer be accessed. */
int mem_entry_not_accessible;
- gdb_byte *val;
+ union
+ {
+ gdb_byte *ptr;
+ gdb_byte buf[sizeof (gdb_byte *)];
+ } u;
+};
+
+struct record_reg_entry
+{
+ unsigned short num;
+ unsigned short len;
+ union
+ {
+ gdb_byte *ptr;
+ gdb_byte buf[2 * sizeof (gdb_byte *)];
+ } u;
};
struct record_end_entry
rec = (struct record_entry *) xcalloc (1, sizeof (struct record_entry));
rec->type = record_reg;
rec->u.reg.num = regnum;
- rec->u.reg.val = (gdb_byte *) xmalloc (MAX_REGISTER_SIZE);
+ rec->u.reg.len = register_size (gdbarch, regnum);
+ if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
+ rec->u.reg.u.ptr = (gdb_byte *) xmalloc (rec->u.reg.len);
return rec;
}
record_reg_release (struct record_entry *rec)
{
gdb_assert (rec->type == record_reg);
- xfree (rec->u.reg.val);
+ if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
+ xfree (rec->u.reg.u.ptr);
xfree (rec);
}
rec->type = record_mem;
rec->u.mem.addr = addr;
rec->u.mem.len = len;
- rec->u.mem.val = (gdb_byte *) xmalloc (len);
+ if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
+ rec->u.mem.u.ptr = (gdb_byte *) xmalloc (len);
return rec;
}
record_mem_release (struct record_entry *rec)
{
gdb_assert (rec->type == record_mem);
- xfree (rec->u.mem.val);
+ if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
+ xfree (rec->u.mem.u.ptr);
xfree (rec);
}
}
}
-/* Record the value of a register REGNUM to record_arch_list. */
+/* Return the value storage location of a record entry. */
+static inline gdb_byte *
+record_get_loc (struct record_entry *rec)
+{
+ switch (rec->type) {
+ case record_mem:
+ if (rec->u.mem.len > sizeof (rec->u.mem.u.buf))
+ return rec->u.mem.u.ptr;
+ else
+ return rec->u.mem.u.buf;
+ case record_reg:
+ if (rec->u.reg.len > sizeof (rec->u.reg.u.buf))
+ return rec->u.reg.u.ptr;
+ else
+ return rec->u.reg.u.buf;
+ case record_end:
+ default:
+ gdb_assert (0);
+ return NULL;
+ }
+}
+
+/* Record the value of a register NUM to record_arch_list. */
int
record_arch_list_add_reg (struct regcache *regcache, int regnum)
rec = record_reg_alloc (regcache, regnum);
- regcache_raw_read (regcache, regnum, rec->u.reg.val);
+ regcache_raw_read (regcache, regnum, record_get_loc (rec));
record_arch_list_add (rec);
rec = record_mem_alloc (addr, len);
- if (target_read_memory (addr, rec->u.mem.val, len))
+ if (target_read_memory (addr, record_get_loc (rec), len))
{
if (record_debug)
fprintf_unfiltered (gdb_stdlog,
record_list->u.reg.num);
regcache_cooked_read (regcache, record_list->u.reg.num, reg);
regcache_cooked_write (regcache, record_list->u.reg.num,
- record_list->u.reg.val);
- memcpy (record_list->u.reg.val, reg, MAX_REGISTER_SIZE);
+ record_get_loc (record_list));
+ memcpy (record_get_loc (record_list), reg,
+ record_list->u.reg.len);
}
else if (record_list->type == record_mem)
{
else
{
if (target_write_memory (record_list->u.mem.addr,
- record_list->u.mem.val,
+ record_get_loc (record_list),
record_list->u.mem.len))
{
if (execution_direction != EXEC_REVERSE)
}
else
{
- memcpy (record_list->u.mem.val, mem,
+ memcpy (record_get_loc (record_list), mem,
record_list->u.mem.len);
}
}