Tue May 2 13:17:21 2000 Elena Zannoni (ezannoni@makita.cygnus.com)
* symtab.c (in_prologue): From Jim Blandy. Rewrite, more intelligently, making sure we use the information from the symbol tables fully.
This commit is contained in:
parent
9369728402
commit
54cf9c0344
@ -1,3 +1,9 @@
|
|||||||
|
2000-05-03 Elena Zannoni <ezannoni@makita.cygnus.com>
|
||||||
|
|
||||||
|
* symtab.c (in_prologue): From Jim Blandy. Rewrite, more
|
||||||
|
intelligently, making sure we use the information from the
|
||||||
|
symbol tables fully.
|
||||||
|
|
||||||
2000-05-02 H.J. Lu <hjl@gnu.org>
|
2000-05-02 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
* ia64-tdep.c (ia64_gdbarch_init): Reference to ELFOSABI_NONE
|
* ia64-tdep.c (ia64_gdbarch_init): Reference to ELFOSABI_NONE
|
||||||
|
83
gdb/symtab.c
83
gdb/symtab.c
@ -4402,43 +4402,64 @@ in_prologue (pc, func_start)
|
|||||||
struct symtab_and_line sal;
|
struct symtab_and_line sal;
|
||||||
CORE_ADDR func_addr, func_end;
|
CORE_ADDR func_addr, func_end;
|
||||||
|
|
||||||
if (!find_pc_partial_function (pc, NULL, &func_addr, &func_end))
|
/* We have several sources of information we can consult to figure
|
||||||
goto nosyms; /* Might be in prologue */
|
this out.
|
||||||
|
- Compilers usually emit line number info that marks the prologue
|
||||||
|
as its own "source line". So the ending address of that "line"
|
||||||
|
is the end of the prologue. If available, this is the most
|
||||||
|
reliable method.
|
||||||
|
- The minimal symbols and partial symbols, which can usually tell
|
||||||
|
us the starting and ending addresses of a function.
|
||||||
|
- If we know the function's start address, we can call the
|
||||||
|
architecture-defined SKIP_PROLOGUE function to analyze the
|
||||||
|
instruction stream and guess where the prologue ends.
|
||||||
|
- Our `func_start' argument; if non-zero, this is the caller's
|
||||||
|
best guess as to the function's entry point. At the time of
|
||||||
|
this writing, handle_inferior_event doesn't get this right, so
|
||||||
|
it should be our last resort. */
|
||||||
|
|
||||||
|
/* Consult the partial symbol table, to find which function
|
||||||
|
the PC is in. */
|
||||||
|
if (! find_pc_partial_function (pc, NULL, &func_addr, &func_end))
|
||||||
|
{
|
||||||
|
CORE_ADDR prologue_end;
|
||||||
|
|
||||||
|
/* We don't even have minsym information, so fall back to using
|
||||||
|
func_start, if given. */
|
||||||
|
if (! func_start)
|
||||||
|
return 1; /* We *might* be in a prologue. */
|
||||||
|
|
||||||
|
prologue_end = SKIP_PROLOGUE (func_start);
|
||||||
|
|
||||||
|
return func_start <= pc && pc < prologue_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we have line number information for the function, that's
|
||||||
|
usually pretty reliable. */
|
||||||
sal = find_pc_line (func_addr, 0);
|
sal = find_pc_line (func_addr, 0);
|
||||||
|
|
||||||
if (sal.line == 0)
|
/* Now sal describes the source line at the function's entry point,
|
||||||
goto nosyms;
|
which (by convention) is the prologue. The end of that "line",
|
||||||
|
sal.end, is the end of the prologue.
|
||||||
|
|
||||||
/* sal.end is the address of the first instruction past sal.line. */
|
Note that, for functions whose source code is all on a single
|
||||||
if (sal.end > func_addr
|
line, the line number information doesn't always end up this way.
|
||||||
&& sal.end <= func_end) /* Is prologue in function? */
|
So we must verify that our purported end-of-prologue address is
|
||||||
return pc < sal.end; /* Yes, is pc in prologue? */
|
*within* the function, not at its start or end. */
|
||||||
|
if (sal.line == 0
|
||||||
|
|| sal.end <= func_addr
|
||||||
|
|| func_end <= sal.end)
|
||||||
|
{
|
||||||
|
/* We don't have any good line number info, so use the minsym
|
||||||
|
information, together with the architecture-specific prologue
|
||||||
|
scanning code. */
|
||||||
|
CORE_ADDR prologue_end = SKIP_PROLOGUE (func_addr);
|
||||||
|
|
||||||
/* The line after the prologue seems to be outside the function. In this
|
return func_addr <= pc && pc < prologue_end;
|
||||||
case, tell the caller to find the prologue the hard way. */
|
}
|
||||||
|
|
||||||
return 1;
|
/* We have line number info, and it looks good. */
|
||||||
|
return func_addr <= pc && pc < sal.end;
|
||||||
/* Come here when symtabs don't contain line # info. In this case, it is
|
|
||||||
likely that the user has stepped into a library function w/o symbols, or
|
|
||||||
is doing a stepi/nexti through code without symbols. */
|
|
||||||
|
|
||||||
nosyms:
|
|
||||||
|
|
||||||
/* If func_start is zero (meaning unknown) then we don't know whether pc is
|
|
||||||
in the prologue or not. I.E. it might be. */
|
|
||||||
|
|
||||||
if (!func_start)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* We need to call the target-specific prologue skipping functions with the
|
|
||||||
function's start address because PC may be pointing at an instruction that
|
|
||||||
could be mistakenly considered part of the prologue. */
|
|
||||||
|
|
||||||
func_start = SKIP_PROLOGUE (func_start);
|
|
||||||
|
|
||||||
return pc < func_start;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user