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>
* 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)
{
int regno, sp_offset, fp_offset;
LONGEST return_value;
CORE_ADDR prologue_start, prologue_end, current_pc;
/* Check if this function is already in the cache of frame information. */
@ -791,9 +792,13 @@ arm_scan_prologue (struct frame_info *fi)
{
/* Get address of the stmfd in the prologue of the callee; the saved
PC is the address of the stmfd + 8. */
prologue_start = ADDR_BITS_REMOVE (read_memory_integer (fi->frame, 4))
- 8;
prologue_end = prologue_start + 64; /* See above. */
if (!safe_read_memory_integer (fi->frame, 4, &return_value))
return;
else
{
prologue_start = ADDR_BITS_REMOVE (return_value) - 8;
prologue_end = prologue_start + 64; /* See above. */
}
}
/* Now search the prologue looking for instructions that set up the

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. */
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
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. */
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
number of bytes. */