#include "inferior.h"
#include "target.h"
#include "gdbarch.h"
+#include "gdbcmd.h"
/*
* DATA STRUCTURE
return register_valid[regnum];
}
+/* REGISTER_CHANGED
+
+ invalidate a single register REGNUM in the cache */
+void
+register_changed (int regnum)
+{
+ register_valid[regnum] = 0;
+}
+
/* FIND_SAVED_REGISTER ()
Return the address in which frame FRAME's value of register REGNUM
Update it from the target. */
if (regno < NUM_REGS)
target_fetch_registers (regno);
- else if (regno < NUM_PSEUDO_REGS)
- ARCH_FETCH_PSEUDO_REGISTERS (regno);
+ else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
+ FETCH_PSEUDO_REGISTER (regno);
if (!register_valid[regno])
- error ("read_register_bytes: Couldn't update register %d.", regno);
+ {
+ /* Sometimes pseudoregs are never marked valid, so that they
+ will be fetched every time (it can be complicated to know
+ if a pseudoreg is valid, while "fetching" them can be cheap).
+ */
+ if (regno < NUM_REGS)
+ error ("read_register_bytes: Couldn't update register %d.", regno);
+ }
}
if (myaddr != NULL)
if (regno < NUM_REGS)
target_fetch_registers (regno);
else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
- ARCH_FETCH_PSEUDO_REGISTERS (regno);
+ FETCH_PSEUDO_REGISTER (regno);
}
memcpy (myaddr, ®isters[REGISTER_BYTE (regno)],
REGISTER_RAW_SIZE (regno));
if (regno < NUM_REGS)
target_store_registers (regno);
else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
- ARCH_STORE_PSEUDO_REGISTERS (regno);
+ STORE_PSEUDO_REGISTER (regno);
}
/* Copy INLEN bytes of consecutive data from memory at MYADDR
if (regno < NUM_REGS)
target_store_registers (regno);
else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
- ARCH_STORE_PSEUDO_REGISTERS (regno);
+ STORE_PSEUDO_REGISTER (regno);
}
}
}
{
if (regno < NUM_REGS)
target_fetch_registers (regno);
- else if (regno < NUM_PSEUDO_REGS)
- ARCH_FETCH_PSEUDO_REGISTERS (regno);
+ else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
+ FETCH_PSEUDO_REGISTER (regno);
}
return (extract_unsigned_integer (®isters[REGISTER_BYTE (regno)],
if (regno < NUM_REGS)
target_store_registers (regno);
else if (regno < NUM_REGS + NUM_PSEUDO_REGS)
- ARCH_STORE_PSEUDO_REGISTERS (regno);
+ STORE_PSEUDO_REGISTER (regno);
}
void
Ditto for write_pc.
1999-06-08: The following were re-written so that it assumes the
- existance of a TARGET_READ_PC et.al. macro. A default generic
+ existence of a TARGET_READ_PC et.al. macro. A default generic
version of that macro is made available where needed.
Since the ``TARGET_READ_PC'' et.al. macro is going to be controlled
eliminate the intermediate read_pc_pid(). The client would call
TARGET_READ_PC directly. (cagney). */
-#ifndef TARGET_READ_PC
-#define TARGET_READ_PC generic_target_read_pc
-#endif
-
CORE_ADDR
generic_target_read_pc (int pid)
{
return read_pc_pid (inferior_pid);
}
-#ifndef TARGET_WRITE_PC
-#define TARGET_WRITE_PC generic_target_write_pc
-#endif
-
void
generic_target_write_pc (CORE_ADDR pc, int pid)
{
/* Cope with strage ways of getting to the stack and frame pointers */
-#ifndef TARGET_READ_SP
-#define TARGET_READ_SP generic_target_read_sp
-#endif
-
CORE_ADDR
generic_target_read_sp (void)
{
return TARGET_READ_SP ();
}
-#ifndef TARGET_WRITE_SP
-#define TARGET_WRITE_SP generic_target_write_sp
-#endif
-
void
generic_target_write_sp (CORE_ADDR val)
{
TARGET_WRITE_SP (val);
}
-#ifndef TARGET_READ_FP
-#define TARGET_READ_FP generic_target_read_fp
-#endif
-
CORE_ADDR
generic_target_read_fp (void)
{
return TARGET_READ_FP ();
}
-#ifndef TARGET_WRITE_FP
-#define TARGET_WRITE_FP generic_target_write_fp
-#endif
-
void
generic_target_write_fp (CORE_ADDR val)
{
TARGET_WRITE_FP (val);
}
+/* ARGSUSED */
+static void
+reg_flush_command (char *command, int from_tty)
+{
+ /* Force-flush the register cache. */
+ registers_changed ();
+ if (from_tty)
+ printf_filtered ("Register cache flushed.\n");
+}
+
+
static void
build_regcache (void)
{
register_gdbarch_swap (®isters, sizeof (registers), NULL);
register_gdbarch_swap (®ister_valid, sizeof (register_valid), NULL);
register_gdbarch_swap (NULL, 0, build_regcache);
+
+ add_com ("flushregs", class_maintenance, reg_flush_command,
+ "Force gdb to flush its register cache (maintainer command)");
}