2002-11-28 Andrew Cagney <ac131313@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 29 Nov 2002 01:52:02 +0000 (01:52 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 29 Nov 2002 01:52:02 +0000 (01:52 +0000)
* frame.c (pc_notcurrent): New function.
(find_frame_sal): New function.
* frame.h (find_frame_sal): Declare.
(struct symtab_and_line): Add opaque declaration.
* stack.c (print_frame_info_base): Use find_pc_line instead of
find_frame_sal.
(frame_info): Ditto.
* ada-lang.c (find_printable_frame): Ditto.

Index: tui/ChangeLog
2002-11-28  Andrew Cagney  <ac131313@redhat.com>

* tuiStack.c (tuiShowFrameInfo): Use find_frame_sal instead of
find_pc_line.

gdb/ChangeLog
gdb/ada-lang.c
gdb/frame.c
gdb/frame.h
gdb/stack.c
gdb/tui/ChangeLog
gdb/tui/tuiStack.c

index 0b9664a..434ec84 100644 (file)
@@ -1,3 +1,14 @@
+2002-11-28  Andrew Cagney  <ac131313@redhat.com>
+
+       * frame.c (pc_notcurrent): New function.
+       (find_frame_sal): New function.
+       * frame.h (find_frame_sal): Declare.
+       (struct symtab_and_line): Add opaque declaration.
+       * stack.c (print_frame_info_base): Use find_pc_line instead of
+       find_frame_sal.
+       (frame_info): Ditto.
+       * ada-lang.c (find_printable_frame): Ditto.
+
 2002-11-28  J. Brobecker  <brobecker@gnat.com>
 
        * configure.in: Check that the pthdebug library is recent enough
index e83037a..04d2183 100644 (file)
@@ -5032,20 +5032,7 @@ find_printable_frame (struct frame_info *fi, int level)
 
   for (; fi != NULL; level += 1, fi = get_prev_frame (fi))
     {
-      /* If fi is not the innermost frame, that normally means that
-         fi->pc points at the return instruction (which is *after* the
-         call instruction), and we want to get the line containing the
-         call (because the call is where the user thinks the program
-         is).  However, if the next frame is either a SIGTRAMP_FRAME
-         or a DUMMY_FRAME, then the next frame will contain a saved
-         interrupt PC and such a PC indicates the current (rather than
-         next) instruction/line, consequently, for such cases, want to
-         get the line containing fi->pc.  */
-      sal =
-       find_pc_line (fi->pc,
-                     fi->next != NULL
-                     && !(get_frame_type (fi->next) == SIGTRAMP_FRAME)
-                     && !(get_frame_type (fi->next) == DUMMY_FRAME));
+      find_frame_sal (fi, &sal);
       if (sal.symtab && !is_ada_runtime_file (sal.symtab->filename))
        {
 #if defined(__alpha__) && defined(__osf__) && !defined(VXWORKS_TARGET)
index 44207f3..1918114 100644 (file)
@@ -1021,6 +1021,29 @@ get_frame_pc (struct frame_info *frame)
   return frame->pc;
 }
 
+static int
+pc_notcurrent (struct frame_info *frame)
+{
+  /* If FRAME is not the innermost frame, that normally means that
+     FRAME->pc points at the return instruction (which is *after* the
+     call instruction), and we want to get the line containing the
+     call (because the call is where the user thinks the program is).
+     However, if the next frame is either a SIGTRAMP_FRAME or a
+     DUMMY_FRAME, then the next frame will contain a saved interrupt
+     PC and such a PC indicates the current (rather than next)
+     instruction/line, consequently, for such cases, want to get the
+     line containing fi->pc.  */
+  struct frame_info *next = get_next_frame (frame);
+  int notcurrent = (next != NULL && get_frame_type (next) == NORMAL_FRAME);
+  return notcurrent;
+}
+
+void
+find_frame_sal (struct frame_info *frame, struct symtab_and_line *sal)
+{
+  (*sal) = find_pc_line (frame->pc, pc_notcurrent (frame));
+}
+
 /* Per "frame.h", return the ``address'' of the frame.  Code should
    really be using get_frame_id().  */
 CORE_ADDR
index 2a5e47d..202f9c8 100644 (file)
@@ -23,6 +23,8 @@
 #if !defined (FRAME_H)
 #define FRAME_H 1
 
+struct symtab_and_line;
+
 /* The frame object.  */
 
 struct frame_info;
@@ -99,6 +101,27 @@ extern struct frame_info *frame_find_by_id (struct frame_id id);
    this frame.  */
 extern CORE_ADDR get_frame_pc (struct frame_info *);
 
+/* Closely related to the resume address, various symbol table
+   attributes that are determined by the PC.  Note that for a normal
+   frame, the PC refers to the resume address after the return, and
+   not the call instruction.  In such a case, the address is adjusted
+   so that it (approximatly) identifies the call site (and not return
+   site).
+
+   NOTE: cagney/2002-11-28: The frame cache could be used to cache the
+   computed value.  Working on the assumption that the bottle-neck is
+   in the single step code, and that code causes the frame cache to be
+   constantly flushed, caching things in a frame is probably of little
+   benefit.  As they say `show us the numbers'.
+
+   NOTE: cagney/2002-11-28: Plenty more where this one came from:
+   find_frame_block(), find_frame_partial_function(),
+   find_frame_symtab(), find_frame_function().  Each will need to be
+   carefully considered to determine if the real intent was for it to
+   apply to the PC or the adjusted PC.  */
+extern void find_frame_sal (struct frame_info *frame,
+                           struct symtab_and_line *sal);
+
 /* Return the frame address from FI.  Except in the machine-dependent
    *FRAME* macros, a frame address has no defined meaning other than
    as a magic cookie which identifies a frame over calls to the
index effa18c..999de6f 100644 (file)
@@ -356,11 +356,7 @@ print_frame_info_base (struct frame_info *fi, int level, int source, int args)
      frame is a SIGTRAMP_FRAME or a DUMMY_FRAME, then the next frame
      was not entered as the result of a call, and we want to get the
      line containing fi->pc.  */
-  sal =
-    find_pc_line (fi->pc,
-                 fi->next != NULL
-                 && !(get_frame_type (fi->next) == SIGTRAMP_FRAME)
-                 && !(get_frame_type (fi->next) == DUMMY_FRAME));
+  find_frame_sal (fi, &sal);
 
   location_print = (source == LOCATION 
                    || source == LOC_AND_ADDRESS
@@ -757,11 +753,10 @@ frame_info (char *addr_exp, int from_tty)
   if (fi == NULL)
     error ("Invalid frame specified.");
 
-  sal = find_pc_line (fi->pc,
-                     fi->next != NULL
-                     && !(get_frame_type (fi->next) == SIGTRAMP_FRAME)
-                     && !(get_frame_type (fi->next) == DUMMY_FRAME));
+  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 (fi->pc);
   if (func)
     {
@@ -858,7 +853,8 @@ frame_info (char *addr_exp, int from_tty)
   if (fi->next || calling_frame_info)
     puts_filtered ("\n");
   if (s)
-    printf_filtered (" source language %s.\n", language_str (s->language));
+    printf_filtered (" source language %s.\n",
+                    language_str (s->language));
 
 #ifdef PRINT_EXTRA_FRAME_INFO
   PRINT_EXTRA_FRAME_INFO (fi);
index 3c72765..779360d 100644 (file)
@@ -1,3 +1,8 @@
+2002-11-28  Andrew Cagney  <ac131313@redhat.com>
+
+       * tuiStack.c (tuiShowFrameInfo): Use find_frame_sal instead of
+       find_pc_line.
+
 2002-11-23  Andrew Cagney  <ac131313@redhat.com>
 
        * tuiStack.c (tuiShowFrameInfo): Use get_frame_type instead of
index 7f46d57..bbd30e6 100644 (file)
@@ -349,10 +349,7 @@ tuiShowFrameInfo (struct frame_info *fi)
       int sourceAlreadyDisplayed;
       struct symtab_and_line sal;
 
-      sal = find_pc_line (fi->pc,
-                          (fi->next != (struct frame_info *) NULL
-                          && !(get_frame_type (fi->next) == SIGTRAMP_FRAME)
-                          && !(get_frame_type (fi->next) == DUMMY_FRAME)));
+      find_frame_sap (fi, &sal);
 
       sourceAlreadyDisplayed = sal.symtab != 0
         && tuiSourceIsDisplayed (sal.symtab->filename);