aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorElena Zannoni <ezannoni@kwikemart.cygnus.com>2001-12-19 23:54:27 +0000
committerElena Zannoni <ezannoni@kwikemart.cygnus.com>2001-12-19 23:54:27 +0000
commit16a0f3e75ec06dd9d4ff578c2ae5273c364f165c (patch)
tree76bf6c3dc271a1e5a6b541049b927b39124ac562 /gdb
parent47a70901841dedf5a3067a6798e29da42fb14fbe (diff)
downloadfsf-binutils-gdb-16a0f3e75ec06dd9d4ff578c2ae5273c364f165c.zip
fsf-binutils-gdb-16a0f3e75ec06dd9d4ff578c2ae5273c364f165c.tar.gz
fsf-binutils-gdb-16a0f3e75ec06dd9d4ff578c2ae5273c364f165c.tar.bz2
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().
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/arm-tdep.c11
-rw-r--r--gdb/corefile.c35
-rw-r--r--gdb/gdbcore.h1
4 files changed, 52 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 92daea9..c37f973 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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,
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 434b26f..d3e8b94 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -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
diff --git a/gdb/corefile.c b/gdb/corefile.c
index 4e096f0..facd2da 100644
--- a/gdb/corefile.c
+++ b/gdb/corefile.c
@@ -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)
{
diff --git a/gdb/gdbcore.h b/gdb/gdbcore.h
index 03ac799..8859455 100644
--- a/gdb/gdbcore.h
+++ b/gdb/gdbcore.h
@@ -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. */