* Move comments on bypassing call dummy breakpoint from stack.c
to breakpoint.h.
This commit is contained in:
parent
d699eb2124
commit
78cab901b0
@ -1,3 +1,8 @@
|
||||
Fri Oct 15 14:30:30 1993 Jim Kingdon (kingdon@lioth.cygnus.com)
|
||||
|
||||
* Move comments on bypassing call dummy breakpoint from stack.c
|
||||
to breakpoint.h.
|
||||
|
||||
Fri Oct 15 11:52:56 1993 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
|
||||
|
||||
* symtab.c (lookup_partial_symtab): If filename is not found and
|
||||
|
@ -50,6 +50,12 @@ enum bptype {
|
||||
bp_step_resume,
|
||||
|
||||
/* The breakpoint at the end of a call dummy. */
|
||||
/* FIXME: What if the function we are calling longjmp()s out of the
|
||||
call, or the user gets out with the "return" command? We currently
|
||||
have no way of cleaning up the breakpoint in these (obscure) situations.
|
||||
(Probably can solve this by noticing longjmp, "return", etc., it's
|
||||
similar to noticing when a watchpoint on a local variable goes out
|
||||
of scope (with hardware support for watchpoints)). */
|
||||
bp_call_dummy
|
||||
};
|
||||
|
||||
|
54
gdb/stack.c
54
gdb/stack.c
@ -170,18 +170,8 @@ print_frame_info (fi, level, source, args)
|
||||
|
||||
/* This is not a perfect test, because if a function alloca's some
|
||||
memory, puts some code there, and then jumps into it, then the test
|
||||
will succeed even though there is no call dummy. A better
|
||||
solution would be to keep track of where the call dummies are.
|
||||
Probably the best way to do that is by setting a breakpoint.c
|
||||
breakpoint at the end of the call dummy (wanted anyway, to clean
|
||||
up wait_for_inferior). Then we know that the sizeof (CALL_DUMMY)
|
||||
(or some such) bytes before that breakpoint are a call dummy.
|
||||
Only problem I see with this approach is figuring out to get rid
|
||||
of the breakpoint whenever the call dummy vanishes (e.g.
|
||||
return_command, or longjmp out of the called function), which we
|
||||
probably can solve (it's very similar to figuring out when a
|
||||
watchpoint on a local variable goes out of scope if it is being
|
||||
watched via something like a 386 debug register). */
|
||||
will succeed even though there is no call dummy. Probably best is
|
||||
to check for a bp_call_dummy breakpoint. */
|
||||
if (PC_IN_CALL_DUMMY (fi->pc, sp, fi->frame))
|
||||
{
|
||||
/* Do this regardless of SOURCE because we don't have any source
|
||||
@ -266,7 +256,7 @@ print_frame_info (fi, level, source, args)
|
||||
printf_filtered ("#%-2d ", level);
|
||||
if (addressprint)
|
||||
if (fi->pc != sal.pc || !sal.symtab)
|
||||
printf_filtered ("%s in ", local_hex_string(fi->pc));
|
||||
printf_filtered ("%s in ", local_hex_string((unsigned long) fi->pc));
|
||||
fprintf_symbol_filtered (stdout, funname ? funname : "??", funlang,
|
||||
DMGL_NO_OPTS);
|
||||
wrap_here (" ");
|
||||
@ -307,7 +297,7 @@ print_frame_info (fi, level, source, args)
|
||||
if (!done)
|
||||
{
|
||||
if (addressprint && mid_statement)
|
||||
printf_filtered ("%s\t", local_hex_string(fi->pc));
|
||||
printf_filtered ("%s\t", local_hex_string((unsigned long) fi->pc));
|
||||
print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
|
||||
}
|
||||
current_source_line = max (sal.line - lines_to_list/2, 1);
|
||||
@ -329,7 +319,7 @@ parse_frame_specification (frame_exp)
|
||||
{
|
||||
int numargs = 0;
|
||||
#define MAXARGS 4
|
||||
int args[MAXARGS];
|
||||
CORE_ADDR args[MAXARGS];
|
||||
|
||||
if (frame_exp)
|
||||
{
|
||||
@ -470,14 +460,14 @@ frame_info (addr_exp, from_tty)
|
||||
if (!addr_exp && selected_frame_level >= 0) {
|
||||
printf_filtered ("Stack level %d, frame at %s:\n",
|
||||
selected_frame_level,
|
||||
local_hex_string(FRAME_FP(frame)));
|
||||
local_hex_string((unsigned long) FRAME_FP(frame)));
|
||||
} else {
|
||||
printf_filtered ("Stack frame at %s:\n",
|
||||
local_hex_string(FRAME_FP(frame)));
|
||||
local_hex_string((unsigned long) FRAME_FP(frame)));
|
||||
}
|
||||
printf_filtered (" %s = %s",
|
||||
reg_names[PC_REGNUM],
|
||||
local_hex_string(fi->pc));
|
||||
local_hex_string((unsigned long) fi->pc));
|
||||
|
||||
wrap_here (" ");
|
||||
if (funname)
|
||||
@ -492,7 +482,7 @@ frame_info (addr_exp, from_tty)
|
||||
puts_filtered ("; ");
|
||||
wrap_here (" ");
|
||||
printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM],
|
||||
local_hex_string(FRAME_SAVED_PC (frame)));
|
||||
local_hex_string((unsigned long) FRAME_SAVED_PC (frame)));
|
||||
|
||||
{
|
||||
int frameless = 0;
|
||||
@ -505,13 +495,13 @@ frame_info (addr_exp, from_tty)
|
||||
|
||||
if (calling_frame)
|
||||
printf_filtered (" called by frame at %s",
|
||||
local_hex_string(FRAME_FP (calling_frame)));
|
||||
local_hex_string((unsigned long) FRAME_FP (calling_frame)));
|
||||
if (fi->next && calling_frame)
|
||||
puts_filtered (",");
|
||||
wrap_here (" ");
|
||||
if (fi->next)
|
||||
printf_filtered (" caller of frame at %s",
|
||||
local_hex_string (fi->next->frame));
|
||||
local_hex_string ((unsigned long) fi->next->frame));
|
||||
if (fi->next || calling_frame)
|
||||
puts_filtered ("\n");
|
||||
if (s)
|
||||
@ -531,7 +521,8 @@ frame_info (addr_exp, from_tty)
|
||||
printf_filtered (" Arglist at unknown address.\n");
|
||||
else
|
||||
{
|
||||
printf_filtered (" Arglist at %s,", local_hex_string(arg_list));
|
||||
printf_filtered (" Arglist at %s,",
|
||||
local_hex_string((unsigned long) arg_list));
|
||||
|
||||
FRAME_NUM_ARGS (numargs, fi);
|
||||
if (numargs < 0)
|
||||
@ -553,7 +544,8 @@ frame_info (addr_exp, from_tty)
|
||||
if (arg_list == 0)
|
||||
printf_filtered (" Locals at unknown address,");
|
||||
else
|
||||
printf_filtered (" Locals at %s,", local_hex_string(arg_list));
|
||||
printf_filtered (" Locals at %s,",
|
||||
local_hex_string((unsigned long) arg_list));
|
||||
}
|
||||
|
||||
#if defined (FRAME_FIND_SAVED_REGS)
|
||||
@ -561,7 +553,7 @@ frame_info (addr_exp, from_tty)
|
||||
/* The sp is special; what's returned isn't the save address, but
|
||||
actually the value of the previous frame's sp. */
|
||||
printf_filtered (" Previous frame's sp is %s\n",
|
||||
local_hex_string(fsr.regs[SP_REGNUM]));
|
||||
local_hex_string((unsigned long) fsr.regs[SP_REGNUM]));
|
||||
count = 0;
|
||||
for (i = 0; i < NUM_REGS; i++)
|
||||
if (fsr.regs[i] && i != SP_REGNUM)
|
||||
@ -572,7 +564,7 @@ frame_info (addr_exp, from_tty)
|
||||
puts_filtered (",");
|
||||
wrap_here (" ");
|
||||
printf_filtered (" %s at %s", reg_names[i],
|
||||
local_hex_string(fsr.regs[i]));
|
||||
local_hex_string((unsigned long) fsr.regs[i]));
|
||||
count++;
|
||||
}
|
||||
if (count)
|
||||
@ -767,7 +759,7 @@ print_block_frame_labels (b, have_default, stream)
|
||||
fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
|
||||
if (addressprint)
|
||||
fprintf_filtered (stream, " %s",
|
||||
local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
|
||||
local_hex_string((unsigned long) SYMBOL_VALUE_ADDRESS (sym)));
|
||||
fprintf_filtered (stream, " in file %s, line %d\n",
|
||||
sal.symtab->filename, sal.line);
|
||||
}
|
||||
@ -1211,14 +1203,16 @@ return_command (retval_exp, from_tty)
|
||||
selected_frame_addr = FRAME_FP (selected_frame);
|
||||
selected_frame_pc = (get_frame_info (selected_frame))->pc;
|
||||
|
||||
/* Compute the return value (if any -- possibly getting errors here).
|
||||
Call VALUE_CONTENTS to make sure we have fully evaluated it, since
|
||||
it might live in the stack frame we're about to pop. */
|
||||
/* Compute the return value (if any -- possibly getting errors here). */
|
||||
|
||||
if (retval_exp)
|
||||
{
|
||||
return_value = parse_and_eval (retval_exp);
|
||||
VALUE_CONTENTS (return_value);
|
||||
|
||||
/* Make sure we have fully evaluated it, since
|
||||
it might live in the stack frame we're about to pop. */
|
||||
if (VALUE_LAZY (return_value))
|
||||
value_fetch_lazy (return_value);
|
||||
}
|
||||
|
||||
/* If interactive, require confirmation. */
|
||||
|
Loading…
Reference in New Issue
Block a user