* Move comments on bypassing call dummy breakpoint from stack.c

to breakpoint.h.
This commit is contained in:
Jim Kingdon 1993-10-15 19:37:29 +00:00
parent d699eb2124
commit 78cab901b0
3 changed files with 35 additions and 30 deletions

View File

@ -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

View File

@ -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
};

View File

@ -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. */