gdb/
authorPedro Alves <palves@redhat.com>
Fri, 18 Mar 2011 18:45:30 +0000 (18:45 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 18 Mar 2011 18:45:30 +0000 (18:45 +0000)
* frame.h (frame_unwind_caller_pc_if_available): Declare.
* frame.c (frame_unwind_caller_pc_if_available): New.
* stack.c (frame_info): Handle unavailable PC.

gdb/frame.c
gdb/frame.h
gdb/stack.c
gdb/testsuite/ChangeLog

index 20d8404e9842de1a03ab5f794caa981156655d29..a817e4d6eb8b75d240f3a34b41592b65e5e7dd2e 100644 (file)
@@ -710,6 +710,13 @@ frame_unwind_caller_pc (struct frame_info *this_frame)
   return frame_unwind_pc (skip_inlined_frames (this_frame));
 }
 
+int
+frame_unwind_caller_pc_if_available (struct frame_info *this_frame,
+                                    CORE_ADDR *pc)
+{
+  return frame_unwind_pc_if_available (skip_inlined_frames (this_frame), pc);
+}
+
 int
 get_frame_func_if_available (struct frame_info *this_frame, CORE_ADDR *pc)
 {
index 25f20a944f7500ca36b396d02406037cc1818786..7bc11480afdafee6f5a13141a577cc36a9273a23 100644 (file)
@@ -562,6 +562,14 @@ extern void put_frame_register_bytes (struct frame_info *frame, int regnum,
 
 extern CORE_ADDR frame_unwind_caller_pc (struct frame_info *frame);
 
+/* Same as frame_unwind_caller_pc, but returns a boolean indication of
+   whether the caller PC is determinable (when the PC is unavailable,
+   it will not be), instead of possibly throwing an error trying to
+   read unavailable memory or registers.  */
+
+extern int frame_unwind_caller_pc_if_available (struct frame_info *this_frame,
+                                               CORE_ADDR *pc);
+
 /* Discard the specified frame.  Restoring the registers to the state
    of the caller.  */
 extern void frame_pop (struct frame_info *frame);
index de204182e7bf59abbb6e240c02525a3a7ea589fc..dba77d4bf303046ec56b7b1fa90634be31f5bfc4 100644 (file)
@@ -1031,6 +1031,9 @@ frame_info (char *addr_exp, int from_tty)
   int selected_frame_p;
   struct gdbarch *gdbarch;
   struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
+  CORE_ADDR frame_pc;
+  int frame_pc_p;
+  CORE_ADDR caller_pc;
 
   fi = parse_frame_specification_1 (addr_exp, "No stack.", &selected_frame_p);
   gdbarch = get_frame_arch (fi);
@@ -1049,11 +1052,10 @@ frame_info (char *addr_exp, int from_tty)
        get_frame_pc().  */
     pc_regname = "pc";
 
+  frame_pc_p = get_frame_pc_if_available (fi, &frame_pc);
   find_frame_sal (fi, &sal);
   func = get_frame_function (fi);
-  /* FIXME: cagney/2002-11-28: Why bother?  Won't sal.symtab contain
-     the same value?  */
-  s = find_pc_symtab (get_frame_pc (fi));
+  s = sal.symtab;
   if (func)
     {
       funname = SYMBOL_PRINT_NAME (func);
@@ -1074,11 +1076,11 @@ frame_info (char *addr_exp, int from_tty)
            }
        }
     }
-  else
+  else if (frame_pc_p)
     {
       struct minimal_symbol *msymbol;
 
-      msymbol = lookup_minimal_symbol_by_pc (get_frame_pc (fi));
+      msymbol = lookup_minimal_symbol_by_pc (frame_pc);
       if (msymbol != NULL)
        {
          funname = SYMBOL_PRINT_NAME (msymbol);
@@ -1099,7 +1101,10 @@ frame_info (char *addr_exp, int from_tty)
   fputs_filtered (paddress (gdbarch, get_frame_base (fi)), gdb_stdout);
   printf_filtered (":\n");
   printf_filtered (" %s = ", pc_regname);
-  fputs_filtered (paddress (gdbarch, get_frame_pc (fi)), gdb_stdout);
+  if (frame_pc_p)
+    fputs_filtered (paddress (gdbarch, get_frame_pc (fi)), gdb_stdout);
+  else
+    fputs_filtered ("<unavailable>", gdb_stdout);
 
   wrap_here ("   ");
   if (funname)
@@ -1114,7 +1119,10 @@ frame_info (char *addr_exp, int from_tty)
   puts_filtered ("; ");
   wrap_here ("    ");
   printf_filtered ("saved %s ", pc_regname);
-  fputs_filtered (paddress (gdbarch, frame_unwind_caller_pc (fi)), gdb_stdout);
+  if (frame_unwind_caller_pc_if_available (fi, &caller_pc))
+    fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);
+  else
+    fputs_filtered ("<unavailable>", gdb_stdout);
   printf_filtered ("\n");
 
   if (calling_frame_info == NULL)
index e3b1a8a2930efe00dc45e47366134775f96c8e24..96e2a9a9566e10609f59f90ddf1702a2693afe28 100644 (file)
@@ -1,3 +1,9 @@
+2011-03-18  Pedro Alves  <pedro@codesourcery.com>
+
+       * frame.h (frame_unwind_caller_pc_if_available): Declare.
+       * frame.c (frame_unwind_caller_pc_if_available): New.
+       * stack.c (frame_info): Handle unavailable PC.
+
 2011-03-18  Pedro Alves  <pedro@codesourcery.com>
 
        * frame.c (frame_unwind_pc): Rename to ...
This page took 0.035202 seconds and 4 git commands to generate.