2001-12-19 Elena Zannoni <ezannoni@redhat.com>

* corefile.c (do_captured_read_memory_integer,
        safe_read_memory_integer): New functions.
        * gdbcore.h (safe_read_memory_integer): Export.
        * arm-tdep.c (arm_scan_prologue): Use safe_read_memory_integer,
        to read the frame value, to capture calls to error().
This commit is contained in:
Elena Zannoni
2001-12-19 23:54:27 +00:00
parent 47a7090184
commit 16a0f3e75e
4 changed files with 52 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2001-12-19 Elena Zannoni <ezannoni@redhat.com>
* corefile.c (do_captured_read_memory_integer,
safe_read_memory_integer): New functions.
* gdbcore.h (safe_read_memory_integer): Export.
* arm-tdep.c (arm_scan_prologue): Use safe_read_memory_integer,
to read the frame value, to capture calls to error().
2001-12-19 Jim Blandy <jimb@redhat.com> 2001-12-19 Jim Blandy <jimb@redhat.com>
* s390-tdep.c (s390_register_name): S390_LAST_REGNUM is, in fact, * s390-tdep.c (s390_register_name): S390_LAST_REGNUM is, in fact,

View File

@ -727,6 +727,7 @@ static void
arm_scan_prologue (struct frame_info *fi) arm_scan_prologue (struct frame_info *fi)
{ {
int regno, sp_offset, fp_offset; int regno, sp_offset, fp_offset;
LONGEST return_value;
CORE_ADDR prologue_start, prologue_end, current_pc; CORE_ADDR prologue_start, prologue_end, current_pc;
/* Check if this function is already in the cache of frame information. */ /* Check if this function is already in the cache of frame information. */
@ -791,10 +792,14 @@ arm_scan_prologue (struct frame_info *fi)
{ {
/* Get address of the stmfd in the prologue of the callee; the saved /* Get address of the stmfd in the prologue of the callee; the saved
PC is the address of the stmfd + 8. */ PC is the address of the stmfd + 8. */
prologue_start = ADDR_BITS_REMOVE (read_memory_integer (fi->frame, 4)) if (!safe_read_memory_integer (fi->frame, 4, &return_value))
- 8; return;
else
{
prologue_start = ADDR_BITS_REMOVE (return_value) - 8;
prologue_end = prologue_start + 64; /* See above. */ prologue_end = prologue_start + 64; /* See above. */
} }
}
/* Now search the prologue looking for instructions that set up the /* Now search the prologue looking for instructions that set up the
frame pointer, adjust the stack pointer, and save registers. frame pointer, adjust the stack pointer, and save registers.

View File

@ -262,6 +262,41 @@ dis_asm_print_address (bfd_vma addr, struct disassemble_info *info)
/* Read an integer from debugged memory, given address and number of bytes. */ /* Read an integer from debugged memory, given address and number of bytes. */
struct captured_read_memory_integer_arguments
{
CORE_ADDR memaddr;
int len;
LONGEST result;
};
static int
do_captured_read_memory_integer (void *data)
{
struct captured_read_memory_integer_arguments *args = (struct captured_read_memory_integer_arguments*) data;
CORE_ADDR memaddr = args->memaddr;
int len = args->len;
args->result = read_memory_integer (memaddr, len);
return 0;
}
int
safe_read_memory_integer (CORE_ADDR memaddr, int len, LONGEST *return_value)
{
int status;
struct captured_read_memory_integer_arguments args;
args.memaddr = memaddr;
args.len = len;
status = catch_errors (do_captured_read_memory_integer, &args,
"", RETURN_MASK_ALL);
if (!status)
*return_value = args.result;
return status;
}
LONGEST LONGEST
read_memory_integer (CORE_ADDR memaddr, int len) read_memory_integer (CORE_ADDR memaddr, int len)
{ {

View File

@ -55,6 +55,7 @@ extern void read_memory (CORE_ADDR memaddr, char *myaddr, int len);
bytes. */ bytes. */
extern LONGEST read_memory_integer (CORE_ADDR memaddr, int len); extern LONGEST read_memory_integer (CORE_ADDR memaddr, int len);
extern int safe_read_memory_integer (CORE_ADDR memaddr, int len, LONGEST *return_value);
/* Read an unsigned integer from debugged memory, given address and /* Read an unsigned integer from debugged memory, given address and
number of bytes. */ number of bytes. */