* configure.in: Check for unistd.h.

* configure: Regenerated.

* command.c, cp-valprint.c, fork-child.c, i386-tdep.c,
i386b-nat.c, inflow.c, main.c, maint.c, objfiles.c, solib.c,
source.c, stack.c, symfile.c, top.c, utils.c: Include strings.h
and/or unistd.h to bring prototypes into scope.
This commit is contained in:
J.T. Conklin 1995-07-31 22:46:03 +00:00
parent f641906be5
commit 1a49497348
18 changed files with 564 additions and 319 deletions

View file

@ -1,5 +1,6 @@
/* Print and select stack frames for GDB, the GNU debugger.
Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994
Free Software Foundation, Inc.
This file is part of GDB.
@ -17,6 +18,7 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <string.h>
#include "defs.h"
#include "value.h"
#include "symtab.h"
@ -30,61 +32,47 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "breakpoint.h"
#include "demangle.h"
#include "inferior.h"
#include "annotate.h"
static void
return_command PARAMS ((char *, int));
static void return_command PARAMS ((char *, int));
static void
down_command PARAMS ((char *, int));
static void down_command PARAMS ((char *, int));
static void
down_silently_command PARAMS ((char *, int));
static void down_silently_command PARAMS ((char *, int));
static void
up_command PARAMS ((char *, int));
static void up_command PARAMS ((char *, int));
static void
up_silently_command PARAMS ((char *, int));
static void up_silently_command PARAMS ((char *, int));
static void
frame_command PARAMS ((char *, int));
static void frame_command PARAMS ((char *, int));
static void
select_frame_command PARAMS ((char *, int));
static void select_frame_command PARAMS ((char *, int));
static void
args_info PARAMS ((char *, int));
static void args_info PARAMS ((char *, int));
static void
print_frame_arg_vars PARAMS ((FRAME, GDB_FILE *));
static void print_frame_arg_vars PARAMS ((struct frame_info *, GDB_FILE *));
static void
catch_info PARAMS ((char *, int));
static void catch_info PARAMS ((char *, int));
static void
locals_info PARAMS ((char *, int));
static void locals_info PARAMS ((char *, int));
static void
print_frame_label_vars PARAMS ((FRAME, int, GDB_FILE *));
static void print_frame_label_vars PARAMS ((struct frame_info *, int,
GDB_FILE *));
static void
print_frame_local_vars PARAMS ((FRAME, GDB_FILE *));
static void print_frame_local_vars PARAMS ((struct frame_info *, GDB_FILE *));
static int
print_block_frame_labels PARAMS ((struct block *, int *, GDB_FILE *));
static int print_block_frame_labels PARAMS ((struct block *, int *,
GDB_FILE *));
static int
print_block_frame_locals PARAMS ((struct block *, FRAME, GDB_FILE *));
static int print_block_frame_locals PARAMS ((struct block *,
struct frame_info *,
GDB_FILE *));
static void
backtrace_command PARAMS ((char *, int));
static void backtrace_command PARAMS ((char *, int));
static FRAME
parse_frame_specification PARAMS ((char *));
static void
frame_info PARAMS ((char *, int));
static struct frame_info *parse_frame_specification PARAMS ((char *));
static void frame_info PARAMS ((char *, int));
extern int addressprint; /* Print addresses, or stay symbolic only? */
extern int info_verbose; /* Verbosity of symbol reading msgs */
@ -93,7 +81,7 @@ extern int lines_to_list; /* # of lines "list" command shows by default */
/* The "selected" stack frame is used by default for local and arg access.
May be zero, for no selected frame. */
FRAME selected_frame;
struct frame_info *selected_frame;
/* Level of the selected frame:
0 for innermost, 1 for its caller, ...
@ -125,11 +113,12 @@ print_stack_frame_stub (args)
char *args;
{
struct print_stack_frame_args *p = (struct print_stack_frame_args *)args;
print_frame_info (p->fi, p->level, p->source, p->args);
return 0;
}
/* Print a stack frame briefly. FRAME should be the frame id
/* Print a stack frame briefly. FRAME_INFI should be the frame info
and LEVEL should be its level in the stack (or -1 for level not defined).
This prints the level, the function executing, the arguments,
and the file name and line number.
@ -140,14 +129,14 @@ print_stack_frame_stub (args)
If SOURCE is -1, print ONLY the source line. */
void
print_stack_frame (frame, level, source)
FRAME frame;
print_stack_frame (fi, level, source)
struct frame_info *fi;
int level;
int source;
{
struct print_stack_frame_args args;
args.fi = get_frame_info (frame);
args.fi = fi;
args.level = level;
args.source = source;
args.args = 1;
@ -163,17 +152,22 @@ struct print_args_args {
static int print_args_stub PARAMS ((char *));
/* Pass the args the way catch_errors wants them. */
static int
print_args_stub (args)
char *args;
{
int numargs;
struct print_args_args *p = (struct print_args_args *)args;
FRAME_NUM_ARGS (numargs, (p->fi));
print_frame_args (p->func, p->fi, numargs, gdb_stdout);
return 0;
}
/* LEVEL is the level of the frame, or -1 if it is the innermost frame
but we don't want to print the level. */
void
print_frame_info (fi, level, source, args)
struct frame_info *fi;
@ -185,10 +179,11 @@ print_frame_info (fi, level, source, args)
struct symbol *func;
register char *funname = 0;
enum language funlang = language_unknown;
#if 0
char buf[MAX_REGISTER_RAW_SIZE];
CORE_ADDR sp;
#if 0
/* On the 68k, this spends too much time in m68k_find_saved_regs. */
/* Get the value of SP_REGNUM relative to the frame. */
@ -205,20 +200,28 @@ print_frame_info (fi, level, source, args)
if (frame_in_dummy (fi))
#endif
{
annotate_frame_begin (level == -1 ? 0 : level, fi->pc);
/* Do this regardless of SOURCE because we don't have any source
to list for this frame. */
if (level >= 0)
printf_filtered ("#%-2d ", level);
annotate_function_call ();
printf_filtered ("<function called from gdb>\n");
annotate_frame_end ();
return;
}
if (fi->signal_handler_caller)
{
annotate_frame_begin (level == -1 ? 0 : level, fi->pc);
/* Do this regardless of SOURCE because we don't have any source
to list for this frame. */
if (level >= 0)
printf_filtered ("#%-2d ", level);
annotate_signal_handler_caller ();
printf_filtered ("<signal handler called>\n");
annotate_frame_end ();
return;
}
@ -290,17 +293,23 @@ print_frame_info (fi, level, source, args)
if (source >= 0 || !sal.symtab)
{
annotate_frame_begin (level == -1 ? 0 : level, fi->pc);
if (level >= 0)
printf_filtered ("#%-2d ", level);
if (addressprint)
if (fi->pc != sal.pc || !sal.symtab)
{
annotate_frame_address ();
print_address_numeric (fi->pc, 1, gdb_stdout);
annotate_frame_address_end ();
printf_filtered (" in ");
}
annotate_frame_function_name ();
fprintf_symbol_filtered (gdb_stdout, funname ? funname : "??", funlang,
DMGL_ANSI);
wrap_here (" ");
annotate_frame_args ();
fputs_filtered (" (", gdb_stdout);
if (args)
{
@ -312,18 +321,28 @@ print_frame_info (fi, level, source, args)
printf_filtered (")");
if (sal.symtab && sal.symtab->filename)
{
annotate_frame_source_begin ();
wrap_here (" ");
printf_filtered (" at %s:%d", sal.symtab->filename, sal.line);
printf_filtered (" at ");
annotate_frame_source_file ();
printf_filtered ("%s", sal.symtab->filename);
annotate_frame_source_file_end ();
printf_filtered (":");
annotate_frame_source_line ();
printf_filtered ("%d", sal.line);
annotate_frame_source_end ();
}
#ifdef PC_LOAD_SEGMENT
/* If we couldn't print out function name but if can figure out what
load segment this pc value is from, at least print out some info
about its load segment. */
if (!funname) {
wrap_here (" ");
printf_filtered (" from %s", PC_LOAD_SEGMENT (fi->pc));
}
if (!funname)
{
annotate_frame_where ();
wrap_here (" ");
printf_filtered (" from %s", PC_LOAD_SEGMENT (fi->pc));
}
#endif
printf_filtered ("\n");
}
@ -342,22 +361,26 @@ print_frame_info (fi, level, source, args)
print_address_numeric (fi->pc, 1, gdb_stdout);
printf_filtered ("\t");
}
print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
if (print_frame_info_listing_hook)
print_frame_info_listing_hook (sal.symtab, sal.line, sal.line + 1, 0);
else
print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
}
current_source_line = max (sal.line - lines_to_list/2, 1);
}
if (source != 0)
set_default_breakpoint (1, fi->pc, sal.symtab, sal.line);
annotate_frame_end ();
gdb_flush (gdb_stdout);
}
/*
* Read a frame specification in whatever the appropriate format is.
* Call error() if the specification is in any way invalid (i.e.
* this function never returns NULL).
*/
static FRAME
/* Read a frame specification in whatever the appropriate format is.
Call error() if the specification is in any way invalid (i.e.
this function never returns NULL). */
static struct frame_info *
parse_frame_specification (frame_exp)
char *frame_exp;
{
@ -403,8 +426,9 @@ parse_frame_specification (frame_exp)
case 1:
{
int level = args[0];
FRAME fid = find_relative_frame (get_current_frame (), &level);
FRAME tfid;
struct frame_info *fid =
find_relative_frame (get_current_frame (), &level);
struct frame_info *tfid;
if (level == 0)
/* find_relative_frame was successful */
@ -430,13 +454,13 @@ parse_frame_specification (frame_exp)
(s)he gets. Still, give the highest one that matches. */
for (fid = get_current_frame ();
fid && FRAME_FP (fid) != args[0];
fid && fid->frame != args[0];
fid = get_prev_frame (fid))
;
if (fid)
while ((tfid = get_prev_frame (fid)) &&
(FRAME_FP (tfid) == args[0]))
(tfid->frame == args[0]))
fid = tfid;
/* We couldn't identify the frame as an existing frame, but
@ -476,30 +500,28 @@ frame_info (addr_exp, from_tty)
char *addr_exp;
int from_tty;
{
FRAME frame;
struct frame_info *fi;
struct frame_saved_regs fsr;
struct symtab_and_line sal;
struct symbol *func;
struct symtab *s;
FRAME calling_frame;
int i, count;
struct frame_info *calling_frame_info;
int i, count, numregs;
char *funname = 0;
enum language funlang = language_unknown;
if (!target_has_stack)
error ("No stack.");
frame = parse_frame_specification (addr_exp);
if (!frame)
fi = parse_frame_specification (addr_exp);
if (fi == NULL)
error ("Invalid frame specified.");
fi = get_frame_info (frame);
sal = find_pc_line (fi->pc,
fi->next != NULL
&& !fi->next->signal_handler_caller
&& !frame_in_dummy (fi->next));
func = get_frame_function (frame);
func = get_frame_function (fi);
s = find_pc_symtab(fi->pc);
if (func)
{
@ -515,22 +537,21 @@ frame_info (addr_exp, from_tty)
funlang = SYMBOL_LANGUAGE (msymbol);
}
}
calling_frame = get_prev_frame (frame);
calling_frame_info = get_prev_frame (fi);
if (!addr_exp && selected_frame_level >= 0)
{
printf_filtered ("Stack level %d, frame at ", selected_frame_level);
print_address_numeric (FRAME_FP(frame), 1, gdb_stdout);
print_address_numeric (fi->frame, 1, gdb_stdout);
printf_filtered (":\n");
}
else
{
printf_filtered ("Stack frame at ");
print_address_numeric (FRAME_FP(frame), 1, gdb_stdout);
print_address_numeric (fi->frame, 1, gdb_stdout);
printf_filtered (":\n");
}
printf_filtered (" %s = ",
reg_names[PC_REGNUM]);
printf_filtered (" %s = ", reg_names[PC_REGNUM]);
print_address_numeric (fi->pc, 1, gdb_stdout);
wrap_here (" ");
@ -546,7 +567,7 @@ frame_info (addr_exp, from_tty)
puts_filtered ("; ");
wrap_here (" ");
printf_filtered ("saved %s ", reg_names[PC_REGNUM]);
print_address_numeric (FRAME_SAVED_PC (frame), 1, gdb_stdout);
print_address_numeric (FRAME_SAVED_PC (fi), 1, gdb_stdout);
printf_filtered ("\n");
{
@ -558,12 +579,12 @@ frame_info (addr_exp, from_tty)
printf_filtered (" (FRAMELESS),");
}
if (calling_frame)
if (calling_frame_info)
{
printf_filtered (" called by frame at ");
print_address_numeric (FRAME_FP (calling_frame), 1, gdb_stdout);
print_address_numeric (calling_frame_info->frame, 1, gdb_stdout);
}
if (fi->next && calling_frame)
if (fi->next && calling_frame_info)
puts_filtered (",");
wrap_here (" ");
if (fi->next)
@ -571,7 +592,7 @@ frame_info (addr_exp, from_tty)
printf_filtered (" caller of frame at ");
print_address_numeric (fi->next->frame, 1, gdb_stdout);
}
if (fi->next || calling_frame)
if (fi->next || calling_frame_info)
puts_filtered ("\n");
if (s)
printf_filtered (" source language %s.\n", language_str (s->language));
@ -629,7 +650,8 @@ frame_info (addr_exp, from_tty)
print_address_numeric (fsr.regs[SP_REGNUM], 1, gdb_stdout);
printf_filtered ("\n");
count = 0;
for (i = 0; i < NUM_REGS; i++)
numregs = ARCH_NUM_REGS;
for (i = 0; i < numregs; i++)
if (fsr.regs[i] && i != SP_REGNUM)
{
if (count == 0)
@ -644,6 +666,10 @@ frame_info (addr_exp, from_tty)
if (count)
puts_filtered ("\n");
#else /* Have FRAME_FIND_SAVED_REGS. */
/* We could get some information about saved registers by calling
get_saved_register on each register. Which info goes with which frame
is necessarily lost, however, and I suspect that the users don't care
whether they get the info. */
puts_filtered ("\n");
#endif /* Have FRAME_FIND_SAVED_REGS. */
}
@ -688,9 +714,8 @@ backtrace_command (count_exp, from_tty)
{
struct frame_info *fi;
register int count;
register FRAME frame;
register int i;
register FRAME trailing;
register struct frame_info *trailing;
register int trailing_level;
if (!target_has_stack)
@ -707,7 +732,7 @@ backtrace_command (count_exp, from_tty)
count = parse_and_eval_address (count_exp);
if (count < 0)
{
FRAME current;
struct frame_info *current;
count = -count;
@ -744,24 +769,22 @@ backtrace_command (count_exp, from_tty)
if people have strong opinions against reading symbols for
backtrace this may have to be an option. */
i = count;
for (frame = trailing;
frame != NULL && i--;
frame = get_prev_frame (frame))
for (fi = trailing;
fi != NULL && i--;
fi = get_prev_frame (fi))
{
QUIT;
fi = get_frame_info (frame);
ps = find_pc_psymtab (fi->pc);
if (ps)
PSYMTAB_TO_SYMTAB (ps); /* Force syms to come in */
}
}
for (i = 0, frame = trailing;
frame && count--;
i++, frame = get_prev_frame (frame))
for (i = 0, fi = trailing;
fi && count--;
i++, fi = get_prev_frame (fi))
{
QUIT;
fi = get_frame_info (frame);
/* Don't use print_stack_frame; if an error() occurs it probably
means further attempts to backtrace would fail (on the other
@ -771,7 +794,7 @@ backtrace_command (count_exp, from_tty)
}
/* If we've stopped before the end, mention that. */
if (frame && from_tty)
if (fi && from_tty)
printf_filtered ("(More stack frames follow...)\n");
}
@ -779,9 +802,9 @@ backtrace_command (count_exp, from_tty)
Return 1 if any variables were printed; 0 otherwise. */
static int
print_block_frame_locals (b, frame, stream)
print_block_frame_locals (b, fi, stream)
struct block *b;
register FRAME frame;
register struct frame_info *fi;
register GDB_FILE *stream;
{
int nsyms;
@ -803,7 +826,7 @@ print_block_frame_locals (b, frame, stream)
values_printed = 1;
fputs_filtered (SYMBOL_SOURCE_NAME (sym), stream);
fputs_filtered (" = ", stream);
print_variable_value (sym, frame, stream);
print_variable_value (sym, fi, stream);
fprintf_filtered (stream, "\n");
break;
@ -866,11 +889,11 @@ print_block_frame_labels (b, have_default, stream)
on the function running in FRAME. */
static void
print_frame_local_vars (frame, stream)
register FRAME frame;
print_frame_local_vars (fi, stream)
register struct frame_info *fi;
register GDB_FILE *stream;
{
register struct block *block = get_frame_block (frame);
register struct block *block = get_frame_block (fi);
register int values_printed = 0;
if (block == 0)
@ -881,7 +904,7 @@ print_frame_local_vars (frame, stream)
while (block != 0)
{
if (print_block_frame_locals (block, frame, stream))
if (print_block_frame_locals (block, fi, stream))
values_printed = 1;
/* After handling the function's top-level block, stop.
Don't continue to its superblock, the block of
@ -900,17 +923,16 @@ print_frame_local_vars (frame, stream)
/* Same, but print labels. */
static void
print_frame_label_vars (frame, this_level_only, stream)
register FRAME frame;
print_frame_label_vars (fi, this_level_only, stream)
register struct frame_info *fi;
int this_level_only;
register GDB_FILE *stream;
{
register struct blockvector *bl;
register struct block *block = get_frame_block (frame);
register struct block *block = get_frame_block (fi);
register int values_printed = 0;
int index, have_default = 0;
char *blocks_printed;
struct frame_info *fi = get_frame_info (frame);
CORE_ADDR pc = fi->pc;
if (block == 0)
@ -992,11 +1014,11 @@ catch_info (ignore, from_tty)
}
static void
print_frame_arg_vars (frame, stream)
register FRAME frame;
print_frame_arg_vars (fi, stream)
register struct frame_info *fi;
register GDB_FILE *stream;
{
struct symbol *func = get_frame_function (frame);
struct symbol *func = get_frame_function (fi);
register struct block *b;
int nsyms;
register int i;
@ -1040,7 +1062,7 @@ print_frame_arg_vars (frame, stream)
sym2 = lookup_symbol (SYMBOL_NAME (sym),
b, VAR_NAMESPACE, (int *)NULL, (struct symtab **)NULL);
print_variable_value (sym2, frame, stream);
print_variable_value (sym2, fi, stream);
fprintf_filtered (stream, "\n");
break;
@ -1066,24 +1088,24 @@ args_info (ignore, from_tty)
print_frame_arg_vars (selected_frame, gdb_stdout);
}
/* Select frame FRAME, and note that its stack level is LEVEL.
/* Select frame FI, and note that its stack level is LEVEL.
LEVEL may be -1 if an actual level number is not known. */
void
select_frame (frame, level)
FRAME frame;
select_frame (fi, level)
struct frame_info *fi;
int level;
{
register struct symtab *s;
selected_frame = frame;
selected_frame = fi;
selected_frame_level = level;
/* Ensure that symbols for this frame are read in. Also, determine the
source language of this frame, and switch to it if desired. */
if (frame)
if (fi)
{
s = find_pc_symtab (get_frame_info (frame)->pc);
s = find_pc_symtab (fi->pc);
if (s
&& s->language != current_language->la_language
&& s->language != language_unknown
@ -1098,10 +1120,10 @@ select_frame (frame, level)
void
record_selected_frame (frameaddrp, levelp)
FRAME_ADDR *frameaddrp;
CORE_ADDR *frameaddrp;
int *levelp;
{
*frameaddrp = selected_frame ? FRAME_FP (selected_frame) : 0;
*frameaddrp = selected_frame ? selected_frame->frame : 0;
*levelp = selected_frame_level;
}
@ -1128,13 +1150,13 @@ get_selected_block ()
but the final value of *LEVEL_OFFSET_PTR is nonzero and indicates
how much farther the original request asked to go. */
FRAME
struct frame_info *
find_relative_frame (frame, level_offset_ptr)
register FRAME frame;
register int* level_offset_ptr;
register struct frame_info *frame;
register int *level_offset_ptr;
{
register FRAME prev;
register FRAME frame1;
register struct frame_info *prev;
register struct frame_info *frame1;
/* Going up is simple: just do get_prev_frame enough times
or until initial frame is reached. */
@ -1172,7 +1194,7 @@ select_frame_command (level_exp, from_tty)
char *level_exp;
int from_tty;
{
register FRAME frame, frame1;
register struct frame_info *frame, *frame1;
unsigned int level = 0;
if (!target_has_stack)
@ -1218,7 +1240,7 @@ up_silently_command (count_exp, from_tty)
char *count_exp;
int from_tty;
{
register FRAME frame;
register struct frame_info *fi;
int count = 1, count1;
if (count_exp)
count = parse_and_eval_address (count_exp);
@ -1227,10 +1249,10 @@ up_silently_command (count_exp, from_tty)
if (target_has_stack == 0 || selected_frame == 0)
error ("No stack.");
frame = find_relative_frame (selected_frame, &count1);
fi = find_relative_frame (selected_frame, &count1);
if (count1 != 0 && count_exp == 0)
error ("Initial frame selected; you cannot go up.");
select_frame (frame, selected_frame_level + count - count1);
select_frame (fi, selected_frame_level + count - count1);
}
static void
@ -1251,7 +1273,7 @@ down_silently_command (count_exp, from_tty)
char *count_exp;
int from_tty;
{
register FRAME frame;
register struct frame_info *frame;
int count = -1, count1;
if (count_exp)
count = - parse_and_eval_address (count_exp);
@ -1291,23 +1313,32 @@ return_command (retval_exp, from_tty)
int from_tty;
{
struct symbol *thisfun;
FRAME_ADDR selected_frame_addr;
CORE_ADDR selected_frame_addr;
CORE_ADDR selected_frame_pc;
FRAME frame;
struct frame_info *frame;
value_ptr return_value = NULL;
if (selected_frame == NULL)
error ("No selected frame.");
thisfun = get_frame_function (selected_frame);
selected_frame_addr = FRAME_FP (selected_frame);
selected_frame_pc = (get_frame_info (selected_frame))->pc;
selected_frame_pc = selected_frame->pc;
/* Compute the return value (if any -- possibly getting errors here). */
if (retval_exp)
{
struct type *return_type = NULL;
return_value = parse_and_eval (retval_exp);
/* Cast return value to the return type of the function. */
if (thisfun != NULL)
return_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (thisfun));
if (return_type == NULL)
return_type = builtin_type_int;
return_value = value_cast (return_type, 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))
@ -1336,8 +1367,8 @@ return_command (retval_exp, from_tty)
a POP_FRAME. The pc comparison makes this work even if the
selected frame shares its fp with another frame. */
while ( selected_frame_addr != FRAME_FP (frame = get_current_frame())
|| selected_frame_pc != (get_frame_info (frame))->pc )
while (selected_frame_addr != (frame = get_current_frame())->frame
|| selected_frame_pc != frame->pc)
POP_FRAME;
/* Then pop that frame. */
@ -1356,27 +1387,26 @@ return_command (retval_exp, from_tty)
frame_command ("0", 1);
}
/* Gets the language of the current frame. */
/* Gets the language of the current frame. */
enum language
get_frame_language()
{
register struct symtab *s;
FRAME fr;
enum language flang; /* The language of the current frame */
register struct symtab *s;
enum language flang; /* The language of the current frame */
fr = get_frame_info(selected_frame);
if(fr)
{
s = find_pc_symtab(fr->pc);
if(s)
flang = s->language;
if (selected_frame)
{
s = find_pc_symtab(selected_frame->pc);
if (s)
flang = s->language;
else
flang = language_unknown;
}
else
flang = language_unknown;
flang = language_unknown;
}
else
flang = language_unknown;
return flang;
return flang;
}
void