{
struct minimal_symbol *msymbol;
+ /* FIXME: This should be using containing_function_bounds or a
+ cleaned-up version thereof, to deal with things like the
+ end of the text segment. */
+
msymbol = lookup_minimal_symbol_by_pc (stop_pc);
target_terminal_ours ();
printf_filtered ("Current function has no line number information.\n");
fflush (stdout);
- /* No info or after _etext ("Can't happen") */
if (msymbol == NULL || SYMBOL_NAME (msymbol + 1) == NULL)
- error ("No data available on pc function.");
+ {
+ /* If sigtramp is in the u area, check for it. */
+#if defined SIGTRAMP_START
+ if (IN_SIGTRAMP (stop_pc, (char *)NULL))
+ {
+ step_range_start = SIGTRAMP_START;
+ step_range_end = SIGTRAMP_END;
+ }
+ else
+#endif
+ error ("Cannot find bounds of current function.");
+ }
+ else
+ {
+ step_range_start = SYMBOL_VALUE_ADDRESS (msymbol);
+ step_range_end = SYMBOL_VALUE_ADDRESS (msymbol + 1);
+ }
printf_filtered ("Single stepping until function exit.\n");
fflush (stdout);
-
- step_range_start = SYMBOL_VALUE_ADDRESS (msymbol);
- step_range_end = SYMBOL_VALUE_ADDRESS (msymbol + 1);
}
}
else
path_info ((char *)NULL, from_tty);
}
\f
+/* XXX - This routine is getting awfully cluttered with #if's. It's probably
+ time to turn this into target_read_pc. Ditto for write_pc. */
+
CORE_ADDR
read_pc ()
{
-#if GDB_TARGET_IS_HPPA
+#ifdef GDB_TARGET_IS_HPPA
int flags = read_register(FLAGS_REGNUM);
if (flags & 2)
- return read_register(31) & ~0x3;
-#endif
-
+ return read_register(31) & ~0x3; /* User PC is here when in sys call */
+ return read_register (PC_REGNUM) & ~0x3;
+#else
+#ifdef GDB_TARGET_IS_H8500
+ return (read_register (SEG_C_REGNUM) << 16) | read_register (PC_REGNUM);
+#else
return ADDR_BITS_REMOVE ((CORE_ADDR) read_register (PC_REGNUM));
+#endif
+#endif
}
void
{
write_register (PC_REGNUM, (long) val);
#ifdef NPC_REGNUM
- write_register (NPC_REGNUM, (long) val+4);
+ write_register (NPC_REGNUM, (long) val + 4);
+#ifdef NNPC_REGNUM
+ write_register (NNPC_REGNUM, (long) val + 8);
+#endif
+#endif
+#ifdef GDB_TARGET_IS_H8500
+ write_register (SEG_C_REGNUM, val >> 16);
#endif
pc_changed = 0;
}
if (query ("A program is being debugged already. Kill it? "))
target_kill ();
else
- error ("Inferior not killed.");
+ error ("Not killed.");
}
target_attach (args, from_tty);