mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
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. Index: tui/ChangeLog 2002-11-28 Andrew Cagney <ac131313@redhat.com> * tuiStack.c (tuiShowFrameInfo): Use find_frame_sal instead of find_pc_line.
This commit is contained in:
parent
d92419e5e9
commit
1058bca748
@ -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
|
||||
|
@ -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)
|
||||
|
23
gdb/frame.c
23
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
|
||||
|
23
gdb/frame.h
23
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
|
||||
|
16
gdb/stack.c
16
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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user