* core.c (core_file_command): Print frame at coredump with

its level number, by calling print_stack_frame.
* frame.h:  Add selected_frame_level, print_stack_frame.
* frame.h, stack.c:  Remove print_sel_frame, print_selected_frame.
* convex-tdep.c, convex-xdep.c, infcmd.c, inflow.c, infrun.c:
Change print_sel_frame and print_selected_frame callers to
print_stack_frame.

* dbxread.c (read_ofile_symtab):  Avoid empty else clause.
* symfile.c (free_named_symtabs):  Ditto.
* main.c (main):  wrap_here needs an arg.
* solib.c (find_solib):  Avoid memory access if _DYNAMIC is zero.
(solib_add):  Avoid noise.
(solib_create_inferior_hook):  Lint.
(sharedlibrary_command):  Move dont_repeat to here.
* utils.c (error):  Call wrap_here to force buffered output.

Small patches from Peter Schauer:

* coffread.c (start_symtab):  Free any existing line_vector before
malloc-ing new one.
(read_coff_symtab):  Ditto for type_vector.

* source.c (lines_to_list):  New variable, replacing function.
(all uses):  Use as variable.
(_initialize_source):  Add 'set listsize' and 'show listsize'.
* utils.c (lines_to_list):  Remove function.
* stack.c (print_frame_info):  Use as variable.
* defs.h (lines_to_list):  Remove declaration.
This commit is contained in:
John Gilmore 1991-09-11 01:49:50 +00:00
parent b1815762f9
commit cadbb07a69
7 changed files with 87 additions and 52 deletions

View file

@ -1,3 +1,35 @@
Tue Sep 10 09:19:29 1991 John Gilmore (gnu at cygint.cygnus.com)
* core.c (core_file_command): Print frame at coredump with
its level number, by calling print_stack_frame.
* frame.h: Add selected_frame_level, print_stack_frame.
* frame.h, stack.c: Remove print_sel_frame, print_selected_frame.
* convex-tdep.c, convex-xdep.c, infcmd.c, inflow.c, infrun.c:
Change print_sel_frame and print_selected_frame callers to
print_stack_frame.
* dbxread.c (read_ofile_symtab): Avoid empty else clause.
* symfile.c (free_named_symtabs): Ditto.
* main.c (main): wrap_here needs an arg.
* solib.c (find_solib): Avoid memory access if _DYNAMIC is zero.
(solib_add): Avoid noise.
(solib_create_inferior_hook): Lint.
(sharedlibrary_command): Move dont_repeat to here.
* utils.c (error): Call wrap_here to force buffered output.
Small patches from Peter Schauer:
* coffread.c (start_symtab): Free any existing line_vector before
malloc-ing new one.
(read_coff_symtab): Ditto for type_vector.
* source.c (lines_to_list): New variable, replacing function.
(all uses): Use as variable.
(_initialize_source): Add 'set listsize' and 'show listsize'.
* utils.c (lines_to_list): Remove function.
* stack.c (print_frame_info): Use as variable.
* defs.h (lines_to_list): Remove declaration.
Mon Sep 9 13:45:57 1991 John Gilmore (gnu at cygint.cygnus.com) Mon Sep 9 13:45:57 1991 John Gilmore (gnu at cygint.cygnus.com)
* breakpoint.c (insert_breakpoints): Restore warning about * breakpoint.c (insert_breakpoints): Restore warning about

View file

@ -439,8 +439,10 @@ start_symtab ()
#endif #endif
#endif #endif
/* Initialize the source file information for this file. */ /* Initialize the source file line number information for this file. */
if (line_vector) /* Unlikely, but maybe possible? */
free (line_vector);
line_vector_index = 0; line_vector_index = 0;
line_vector_length = 1000; line_vector_length = 1000;
prev_line_number = -2; /* Force first line number to be explicit */ prev_line_number = -2; /* Force first line number to be explicit */
@ -831,6 +833,8 @@ read_coff_symtab (desc, nsyms)
last_source_file = 0; last_source_file = 0;
bzero (opaque_type_chain, sizeof opaque_type_chain); bzero (opaque_type_chain, sizeof opaque_type_chain);
if (type_vector) /* Get rid of previous one */
free (type_vector);
type_vector_length = 160; type_vector_length = 160;
type_vector = (struct typevector *) type_vector = (struct typevector *)
xmalloc (sizeof (struct typevector) xmalloc (sizeof (struct typevector)
@ -1697,7 +1701,7 @@ decode_type (cs, c_type, aux)
/* Reference to existing type */ /* Reference to existing type */
if (cs->c_nsyms > 1 && aux->x_sym.x_tagndx.l != 0) if (cs->c_nsyms > 1 && aux->x_sym.x_tagndx.l != 0)
{ {
type = coff_alloc_type (aux->x_sym.x_tagndx); type = coff_alloc_type (aux->x_sym.x_tagndx.l);
return type; return type;
} }

View file

@ -723,7 +723,7 @@ set_thread_command (arg)
set_current_frame (create_new_frame (read_register (FP_REGNUM), set_current_frame (create_new_frame (read_register (FP_REGNUM),
read_pc ())); read_pc ()));
select_frame (get_current_frame (), 0); select_frame (get_current_frame (), 0);
print_sel_frame (1); print_stack_frame (selected_frame, selected_frame_level, -1);
} }
/* Here on CONT command; gdb's dispatch address is changed to come here. /* Here on CONT command; gdb's dispatch address is changed to come here.

View file

@ -976,7 +976,7 @@ core_file_command (filename, from_tty)
select_frame (get_current_frame (), 0); select_frame (get_current_frame (), 0);
validate_files (); validate_files ();
print_sel_frame (1); print_stack_frame (selected_frame, selected_frame_level, -1);
} }
else if (from_tty) else if (from_tty)
printf_filtered ("No core file now.\n"); printf_filtered ("No core file now.\n");

View file

@ -170,11 +170,12 @@ core_open (filename, from_tty)
#ifdef SOLIB_ADD #ifdef SOLIB_ADD
(void) catch_errors (solib_add_stub, (char *)from_tty, (char *)0); (void) catch_errors (solib_add_stub, (char *)from_tty, (char *)0);
#endif #endif
/* Now, set up the frame cache, and print the top of stack */ /* Now, set up the frame cache, and print the top of stack */
set_current_frame ( create_new_frame (read_register (FP_REGNUM), set_current_frame (create_new_frame (read_register (FP_REGNUM),
read_pc ())); read_pc ()));
select_frame (get_current_frame (), 0); select_frame (get_current_frame (), 0);
print_sel_frame (0); /* Print the top frame and source line */ print_stack_frame (selected_frame, selected_frame_level, 1);
} else { } else {
printf ( printf (
"Warning: you won't be able to access this core file until you terminate\n\ "Warning: you won't be able to access this core file until you terminate\n\

View file

@ -381,7 +381,7 @@ kill_command (arg, from_tty)
if (selected_frame == NULL) if (selected_frame == NULL)
fputs_filtered ("No selected stack frame.\n", stdout); fputs_filtered ("No selected stack frame.\n", stdout);
else else
print_sel_frame (0); print_stack_frame (selected_frame, selected_frame_level, 1);
} }
} }
@ -478,7 +478,7 @@ Report which ones can be written.");
inferior_pid = 0; inferior_pid = 0;
ioctl (0, TIOCGETP, &sg_ours); ioctl (0, TIOCGETP, &sg_ours);
fcntl (0, F_GETFL, tflags_ours); tflags_ours = fcntl (0, F_GETFL, 0);
#if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN) #if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN)
ioctl (0, TIOCGETC, &tc_ours); ioctl (0, TIOCGETC, &tc_ours);

View file

@ -3,19 +3,19 @@
This file is part of GDB. This file is part of GDB.
GDB is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option) the Free Software Foundation; either version 2 of the License, or
any later version. (at your option) any later version.
GDB is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with GDB; see the file COPYING. If not, write to along with this program; if not, write to the Free Software
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h> #include <stdio.h>
@ -31,6 +31,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
extern int addressprint; /* Print addresses, or stay symbolic only? */ extern int addressprint; /* Print addresses, or stay symbolic only? */
extern int info_verbose; /* Verbosity of symbol reading msgs */ extern int info_verbose; /* Verbosity of symbol reading msgs */
extern unsigned lines_to_list; /* # of lines "list" command shows by default */
extern char *reg_names[]; /* Names of registers */ extern char *reg_names[]; /* Names of registers */
/* Thie "selected" stack frame is used by default for local and arg access. /* Thie "selected" stack frame is used by default for local and arg access.
@ -61,7 +62,7 @@ void print_frame_info ();
If SOURCE is 1, print the source line as well. If SOURCE is 1, print the source line as well.
If SOURCE is -1, print ONLY the source line. */ If SOURCE is -1, print ONLY the source line. */
static void void
print_stack_frame (frame, level, source) print_stack_frame (frame, level, source)
FRAME frame; FRAME frame;
int level; int level;
@ -187,7 +188,7 @@ print_frame_info (fi, level, source, args)
printf_filtered ("0x%x\t", fi->pc); printf_filtered ("0x%x\t", fi->pc);
print_source_lines (sal.symtab, sal.line, sal.line + 1, 0); print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
} }
current_source_line = max (sal.line - lines_to_list () / 2, 1); current_source_line = max (sal.line - lines_to_list/2, 1);
} }
if (source != 0) if (source != 0)
set_default_breakpoint (1, fi->pc, sal.symtab, sal.line); set_default_breakpoint (1, fi->pc, sal.symtab, sal.line);
@ -195,24 +196,6 @@ print_frame_info (fi, level, source, args)
fflush (stdout); fflush (stdout);
} }
/* Call here to print info on selected frame, after a trap. */
void
print_sel_frame (just_source)
int just_source;
{
print_stack_frame (selected_frame, -1, just_source ? -1 : 1);
}
/* Print info on the selected frame, including level number
but not source. */
void
print_selected_frame ()
{
print_stack_frame (selected_frame, selected_frame_level, 0);
}
void flush_cached_frames (); void flush_cached_frames ();
#ifdef FRAME_SPECIFICATION_DYADIC #ifdef FRAME_SPECIFICATION_DYADIC
@ -592,13 +575,11 @@ print_block_frame_locals (b, frame, stream)
return values_printed; return values_printed;
} }
/* Same, but print labels. /* Same, but print labels. */
FIXME, this does not even reference FRAME... --gnu */
static int static int
print_block_frame_labels (b, frame, have_default, stream) print_block_frame_labels (b, have_default, stream)
struct block *b; struct block *b;
register FRAME frame;
int *have_default; int *have_default;
register FILE *stream; register FILE *stream;
{ {
@ -728,7 +709,7 @@ print_frame_label_vars (frame, this_level_only, stream)
{ {
if (blocks_printed[index] == 0) if (blocks_printed[index] == 0)
{ {
if (print_block_frame_labels (BLOCKVECTOR_BLOCK (bl, index), frame, &have_default, stream)) if (print_block_frame_labels (BLOCKVECTOR_BLOCK (bl, index), &have_default, stream))
values_printed = 1; values_printed = 1;
blocks_printed[index] = 1; blocks_printed[index] = 1;
} }
@ -762,18 +743,16 @@ locals_info (args, from_tty)
char *args; char *args;
int from_tty; int from_tty;
{ {
if (!target_has_stack) if (!selected_frame)
error ("No stack."); error ("No frame selected.");
print_frame_local_vars (selected_frame, stdout); print_frame_local_vars (selected_frame, stdout);
} }
static void static void
catch_info () catch_info ()
{ {
if (!target_has_stack) if (!selected_frame)
error ("No stack."); error ("No frame selected.");
print_frame_label_vars (selected_frame, 0, stdout); print_frame_label_vars (selected_frame, 0, stdout);
} }
@ -834,8 +813,8 @@ print_frame_arg_vars (frame, stream)
static void static void
args_info () args_info ()
{ {
if (!target_has_stack) if (!selected_frame)
error ("No stack."); error ("No frame selected.");
print_frame_arg_vars (selected_frame, stdout); print_frame_arg_vars (selected_frame, stdout);
} }
@ -913,6 +892,11 @@ find_relative_frame (frame, level_offset_ptr)
The following algorithm is linear. */ The following algorithm is linear. */
if (*level_offset_ptr < 0) if (*level_offset_ptr < 0)
{ {
#if 0
/* This is ancient and unnecessary? -- gnu@cygnus.com
It also loops forever if frame #0 is not current_frame (e.g. when we have
used the "frame" command after the stack was invalid). */
/* First put frame1 at innermost frame /* First put frame1 at innermost frame
and frame2 N levels up from there. */ and frame2 N levels up from there. */
frame1 = get_current_frame (); frame1 = get_current_frame ();
@ -931,6 +915,15 @@ find_relative_frame (frame, level_offset_ptr)
frame2 = get_prev_frame (frame2); frame2 = get_prev_frame (frame2);
} }
return frame1; return frame1;
#else
while (*level_offset_ptr < 0) {
frame1 = get_next_frame (frame);
if (!frame1)
break;
frame = frame1;
(*level_offset_ptr)++;
}
#endif
} }
return frame; return frame;
} }
@ -954,10 +947,15 @@ frame_command (level_exp, from_tty)
frame = parse_frame_specification (level_exp); frame = parse_frame_specification (level_exp);
for (frame1 = get_prev_frame (0); /* Try to figure out what level this frame is. But if there is
frame1 && frame1 != frame; no current stack, don't error out -- let the user set one. */
frame1 = get_prev_frame (frame1)) frame1 = 0;
level++; if (get_current_frame()) {
for (frame1 = get_prev_frame (0);
frame1 && frame1 != frame;
frame1 = get_prev_frame (frame1))
level++;
}
if (!frame1) if (!frame1)
level = 0; level = 0;