diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/ada-lang.c | 15 | ||||
-rw-r--r-- | gdb/frame.c | 23 | ||||
-rw-r--r-- | gdb/frame.h | 23 | ||||
-rw-r--r-- | gdb/stack.c | 16 | ||||
-rw-r--r-- | gdb/tui/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/tui/tuiStack.c | 5 |
7 files changed, 70 insertions, 28 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0b9664a..434ec84 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -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 diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index e83037a..04d2183 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -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) diff --git a/gdb/frame.c b/gdb/frame.c index 44207f3..1918114 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -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 diff --git a/gdb/frame.h b/gdb/frame.h index 2a5e47d..202f9c8 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -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 diff --git a/gdb/stack.c b/gdb/stack.c index effa18c..999de6fd 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -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); diff --git a/gdb/tui/ChangeLog b/gdb/tui/ChangeLog index 3c72765..779360d 100644 --- a/gdb/tui/ChangeLog +++ b/gdb/tui/ChangeLog @@ -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 diff --git a/gdb/tui/tuiStack.c b/gdb/tui/tuiStack.c index 7f46d57..bbd30e6 100644 --- a/gdb/tui/tuiStack.c +++ b/gdb/tui/tuiStack.c @@ -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); |