stack: check frame_unwind_caller_id
authorMarkus Metzger <markus.t.metzger@intel.com>
Thu, 11 Feb 2016 10:07:09 +0000 (11:07 +0100)
committerMarkus Metzger <markus.t.metzger@intel.com>
Fri, 12 Feb 2016 08:46:31 +0000 (09:46 +0100)
Callers of frame_unwind_caller_* functions are supposed to check
frame_unwind_caller_id.

Add such a check to frame_info and treat an invalid caller ID as if the caller
PC were not available.

gdb/
* stack.c (frame_info): Check frame_unwind_caller_id.

gdb/ChangeLog
gdb/stack.c

index d21bb3f53de449bcf105a6437cc6dd3f33dadc68..ef8818097fb10ad8102b1032a8c7709912deae18 100644 (file)
@@ -1,3 +1,7 @@
+2016-02-12  Markus Metzger  <markus.t.metzger@intel.com>
+
+       * stack.c (frame_info): Check frame_unwind_caller_id.
+
 2016-02-12  Markus Metzger  <markus.t.metzger@intel.com>
 
        * frame.h (skip_tailcall_frames): New.
index 89879f38adbf66db738fed1d34caa04eb8c626fb..6e3acc7e40288996c8087609818c1df5c743be67 100644 (file)
@@ -1509,27 +1509,32 @@ frame_info (char *addr_exp, int from_tty)
   wrap_here ("    ");
   printf_filtered ("saved %s = ", pc_regname);
 
-  TRY
-    {
-      caller_pc = frame_unwind_caller_pc (fi);
-      caller_pc_p = 1;
-    }
-  CATCH (ex, RETURN_MASK_ERROR)
+  if (!frame_id_p (frame_unwind_caller_id (fi)))
+    val_print_unavailable (gdb_stdout);
+  else
     {
-      switch (ex.error)
+      TRY
        {
-       case NOT_AVAILABLE_ERROR:
-         val_print_unavailable (gdb_stdout);
-         break;
-       case OPTIMIZED_OUT_ERROR:
-         val_print_not_saved (gdb_stdout);
-         break;
-       default:
-         fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
-         break;
+         caller_pc = frame_unwind_caller_pc (fi);
+         caller_pc_p = 1;
        }
+      CATCH (ex, RETURN_MASK_ERROR)
+       {
+         switch (ex.error)
+           {
+           case NOT_AVAILABLE_ERROR:
+             val_print_unavailable (gdb_stdout);
+             break;
+           case OPTIMIZED_OUT_ERROR:
+             val_print_not_saved (gdb_stdout);
+             break;
+           default:
+             fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
+             break;
+           }
+       }
+      END_CATCH
     }
-  END_CATCH
 
   if (caller_pc_p)
     fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);