* infcmd.c (jump_command): Use cleanups to avoid memory leaks.

* stack.c (return_command):  Use cleanups to avoid memory leaks.
This commit is contained in:
Fred Fish 1992-06-20 23:30:33 +00:00
parent e95bfbf19c
commit b4fde6fa65
3 changed files with 156 additions and 44 deletions

View file

@ -1,3 +1,8 @@
Sat Jun 20 16:28:39 1992 Fred Fish (fnf@cygnus.com)
* infcmd.c (jump_command): Use cleanups to avoid memory leaks.
* stack.c (return_command): Use cleanups to avoid memory leaks.
Fri Jun 19 19:06:41 1992 John Gilmore (gnu at cygnus.com) Fri Jun 19 19:06:41 1992 John Gilmore (gnu at cygnus.com)
* remote-adapt.c, remote-eb.c, remote-mm.c: Lint. Fix * remote-adapt.c, remote-eb.c, remote-mm.c: Lint. Fix

View file

@ -413,6 +413,10 @@ jump_command (arg, from_tty)
register CORE_ADDR addr; register CORE_ADDR addr;
struct symtabs_and_lines sals; struct symtabs_and_lines sals;
struct symtab_and_line sal; struct symtab_and_line sal;
struct symbol *fn;
struct symbol *sfn;
char *fname;
struct cleanup *back_to;
ERROR_NO_INFERIOR; ERROR_NO_INFERIOR;
@ -433,13 +437,19 @@ jump_command (arg, from_tty)
resolve_sal_pc (&sal); /* May error out */ resolve_sal_pc (&sal); /* May error out */
/* See if we are trying to jump to another function. */
fn = get_frame_function (get_current_frame ());
sfn = find_pc_function (sal.pc);
if (fn != NULL && sfn != fn)
{
fname = strdup_demangled (SYMBOL_NAME (fn));
back_to = make_cleanup (free, fname);
if (!query ("Line %d is not in `%s'. Jump anyway? ", sal.line, fname))
{ {
struct symbol *fn = get_frame_function (get_current_frame ());
struct symbol *sfn = find_pc_function (sal.pc);
if (fn != 0 && sfn != fn
&& ! query ("Line %d is not in `%s'. Jump anyway? ",
sal.line, SYMBOL_NAME (fn)))
error ("Not confirmed."); error ("Not confirmed.");
/* NOTREACHED */
}
do_cleanups (back_to);
} }
addr = ADDR_BITS_SET (sal.pc); addr = ADDR_BITS_SET (sal.pc);
@ -1203,7 +1213,7 @@ then the same breakpoint won't break until the Nth time it is reached.");
"Start debugged program. You may specify arguments to give it.\n\ "Start debugged program. You may specify arguments to give it.\n\
Args may include \"*\", or \"[...]\"; they are expanded using \"sh\".\n\ Args may include \"*\", or \"[...]\"; they are expanded using \"sh\".\n\
Input and output redirection with \">\", \"<\", or \">>\" are also allowed.\n\n\ Input and output redirection with \">\", \"<\", or \">>\" are also allowed.\n\n\
With no arguments, uses arguments last specified (with \"run\" or \"set args\".\n\ With no arguments, uses arguments last specified (with \"run\" or \"set args\").\n\
To cancel previous arguments and run with no arguments,\n\ To cancel previous arguments and run with no arguments,\n\
use \"set args\" without arguments."); use \"set args\" without arguments.");
add_com_alias ("r", "run", class_run, 1); add_com_alias ("r", "run", class_run, 1);

View file

@ -17,25 +17,79 @@ You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include "defs.h" #include "defs.h"
#include "param.h" #include "value.h"
#include "language.h"
#include "symtab.h" #include "symtab.h"
#include "gdbtypes.h"
#include "expression.h"
#include "language.h"
#include "frame.h" #include "frame.h"
#include "gdbcmd.h" #include "gdbcmd.h"
#include "value.h"
#include "gdbcore.h" #include "gdbcore.h"
#include "target.h" #include "target.h"
#include "breakpoint.h" #include "breakpoint.h"
#include "demangle.h"
static void
return_command PARAMS ((char *, int));
static void
down_command PARAMS ((char *, int));
static void
down_silently_command PARAMS ((char *, int));
static void
up_command PARAMS ((char *, int));
static void
up_silently_command PARAMS ((char *, int));
static void
frame_command PARAMS ((char *, int));
static void
select_frame_command PARAMS ((char *, int));
static void
args_info PARAMS ((char *, int));
static void
print_frame_arg_vars PARAMS ((FRAME, FILE *));
static void
catch_info PARAMS ((char *, int));
static void
locals_info PARAMS ((char *, int));
static void
print_frame_label_vars PARAMS ((FRAME, int, FILE *));
static void
print_frame_local_vars PARAMS ((FRAME, FILE *));
static int
print_block_frame_labels PARAMS ((struct block *, int *, FILE *));
static int
print_block_frame_locals PARAMS ((struct block *, FRAME, FILE *));
static void
backtrace_command PARAMS ((char *, int));
static FRAME
parse_frame_specification PARAMS ((char *));
static void
frame_info PARAMS ((char *, int));
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 int lines_to_list; /* # of lines "list" command shows by default */ extern int lines_to_list; /* # of lines "list" command shows by default */
extern char *reg_names[]; /* Names of registers */
/* Thie "selected" stack frame is used by default for local and arg access. /* The "selected" stack frame is used by default for local and arg access.
May be zero, for no selected frame. */ May be zero, for no selected frame. */
FRAME selected_frame; FRAME selected_frame;
@ -51,7 +105,6 @@ int selected_frame_level;
int frame_file_full_name = 0; int frame_file_full_name = 0;
void print_frame_info ();
/* Print a stack frame briefly. FRAME should be the frame id /* Print a stack frame briefly. FRAME should be the frame id
and LEVEL should be its level in the stack (or -1 for level not defined). and LEVEL should be its level in the stack (or -1 for level not defined).
@ -106,13 +159,17 @@ print_frame_info (fi, level, source, args)
if (addressprint) if (addressprint)
printf_filtered ("%s in ", local_hex_string(fi->pc)); printf_filtered ("%s in ", local_hex_string(fi->pc));
fputs_demangled (fname, stdout, -1); fputs_demangled (fname, stdout, 0);
fputs_filtered (" (...)\n", stdout); fputs_filtered (" (...)\n", stdout);
return; return;
} }
#endif #endif
#ifdef CORE_NEEDS_RELOCATION
CORE_NEEDS_RELOCATION(fi->pc);
#endif
sal = find_pc_line (fi->pc, fi->next_frame); sal = find_pc_line (fi->pc, fi->next_frame);
func = find_pc_function (fi->pc); func = find_pc_function (fi->pc);
if (func) if (func)
@ -125,14 +182,15 @@ print_frame_info (fi, level, source, args)
ends has been truncated by ar because it is longer than 15 ends has been truncated by ar because it is longer than 15
characters). characters).
So look in the misc_function_vector as well, and if it comes So look in the minimal symbol tables as well, and if it comes
up with a larger address for the function use that instead. up with a larger address for the function use that instead.
I don't think this can ever cause any problems; I don't think this can ever cause any problems; there shouldn't
there shouldn't be any be any minimal symbols in the middle of a function.
misc_function_vector symbols in the middle of a function. */ FIXME: (Not necessarily true. What about text labels) */
int misc_index = find_pc_misc_function (fi->pc);
if (misc_index >= 0 struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
&& (misc_function_vector[misc_index].address if (msymbol != NULL
&& (msymbol -> address
> BLOCK_START (SYMBOL_BLOCK_VALUE (func)))) > BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
{ {
/* In this case we have no way of knowing the source file /* In this case we have no way of knowing the source file
@ -141,16 +199,16 @@ print_frame_info (fi, level, source, args)
/* We also don't know anything about the function besides /* We also don't know anything about the function besides
its address and name. */ its address and name. */
func = 0; func = 0;
funname = misc_function_vector[misc_index].name; funname = msymbol -> name;
} }
else else
funname = SYMBOL_NAME (func); funname = SYMBOL_NAME (func);
} }
else else
{ {
register int misc_index = find_pc_misc_function (fi->pc); register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
if (misc_index >= 0) if (msymbol != NULL)
funname = misc_function_vector[misc_index].name; funname = msymbol -> name;
} }
if (source >= 0 || !sal.symtab) if (source >= 0 || !sal.symtab)
@ -160,7 +218,7 @@ print_frame_info (fi, level, source, args)
if (addressprint) if (addressprint)
if (fi->pc != sal.pc || !sal.symtab) if (fi->pc != sal.pc || !sal.symtab)
printf_filtered ("%s in ", local_hex_string(fi->pc)); printf_filtered ("%s in ", local_hex_string(fi->pc));
fputs_demangled (funname ? funname : "??", stdout, -1); fputs_demangled (funname ? funname : "??", stdout, 0);
wrap_here (" "); wrap_here (" ");
fputs_filtered (" (", stdout); fputs_filtered (" (", stdout);
if (args) if (args)
@ -174,6 +232,16 @@ print_frame_info (fi, level, source, args)
wrap_here (" "); wrap_here (" ");
printf_filtered (" at %s:%d", sal.symtab->filename, sal.line); printf_filtered (" at %s:%d", sal.symtab->filename, sal.line);
} }
#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));
}
#endif
printf_filtered ("\n"); printf_filtered ("\n");
} }
@ -197,8 +265,6 @@ print_frame_info (fi, level, source, args)
fflush (stdout); fflush (stdout);
} }
void flush_cached_frames ();
#ifdef FRAME_SPECIFICATION_DYADIC #ifdef FRAME_SPECIFICATION_DYADIC
extern FRAME setup_arbitrary_frame (); extern FRAME setup_arbitrary_frame ();
#endif #endif
@ -312,8 +378,9 @@ parse_frame_specification (frame_exp)
This means absolutely all information in the frame is printed. */ This means absolutely all information in the frame is printed. */
static void static void
frame_info (addr_exp) frame_info (addr_exp, from_tty)
char *addr_exp; char *addr_exp;
int from_tty;
{ {
FRAME frame; FRAME frame;
struct frame_info *fi; struct frame_info *fi;
@ -340,9 +407,9 @@ frame_info (addr_exp)
funname = SYMBOL_NAME (func); funname = SYMBOL_NAME (func);
else else
{ {
register int misc_index = find_pc_misc_function (fi->pc); register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
if (misc_index >= 0) if (msymbol != NULL)
funname = misc_function_vector[misc_index].name; funname = msymbol -> name;
} }
calling_frame = get_prev_frame (frame); calling_frame = get_prev_frame (frame);
@ -362,7 +429,7 @@ frame_info (addr_exp)
if (funname) if (funname)
{ {
printf_filtered (" in "); printf_filtered (" in ");
fputs_demangled (funname, stdout, 1); fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS);
} }
wrap_here (" "); wrap_here (" ");
if (sal.symtab) if (sal.symtab)
@ -371,6 +438,16 @@ frame_info (addr_exp)
wrap_here (" "); wrap_here (" ");
printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM], printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM],
local_hex_string(FRAME_SAVED_PC (frame))); local_hex_string(FRAME_SAVED_PC (frame)));
{
int frameless = 0;
#ifdef FRAMELESS_FUNCTION_INVOCATION
FRAMELESS_FUNCTION_INVOCATION (fi, frameless);
#endif
if (frameless)
printf_filtered (" (FRAMELESS),");
}
if (calling_frame) if (calling_frame)
printf_filtered (" called by frame at %s", printf_filtered (" called by frame at %s",
local_hex_string(FRAME_FP (calling_frame))); local_hex_string(FRAME_FP (calling_frame)));
@ -409,6 +486,15 @@ frame_info (addr_exp)
puts_filtered ("\n"); puts_filtered ("\n");
} }
} }
{
/* Address of the local variables for this frame, or 0. */
CORE_ADDR arg_list = FRAME_LOCALS_ADDRESS (fi);
if (arg_list == 0)
printf_filtered (" Locals at unknown address,");
else
printf_filtered (" Locals at %s,", local_hex_string(arg_list));
}
#if defined (FRAME_FIND_SAVED_REGS) #if defined (FRAME_FIND_SAVED_REGS)
get_frame_saved_regs (fi, &fsr); get_frame_saved_regs (fi, &fsr);
@ -618,7 +704,7 @@ print_block_frame_labels (b, have_default, stream)
struct symtab_and_line sal; struct symtab_and_line sal;
sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0); sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
values_printed = 1; values_printed = 1;
fputs_demangled (SYMBOL_NAME (sym), stream, 1); fputs_demangled (SYMBOL_NAME (sym), stream, DMGL_ANSI | DMGL_PARAMS);
if (addressprint) if (addressprint)
fprintf_filtered (stream, " %s", fprintf_filtered (stream, " %s",
local_hex_string(SYMBOL_VALUE_ADDRESS (sym))); local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
@ -677,7 +763,6 @@ print_frame_label_vars (frame, this_level_only, stream)
int this_level_only; int this_level_only;
register FILE *stream; register FILE *stream;
{ {
extern struct blockvector *blockvector_for_pc ();
register struct blockvector *bl; register struct blockvector *bl;
register struct block *block = get_frame_block (frame); register struct block *block = get_frame_block (frame);
register int values_printed = 0; register int values_printed = 0;
@ -755,7 +840,9 @@ locals_info (args, from_tty)
} }
static void static void
catch_info () catch_info (ignore, from_tty)
char *ignore;
int from_tty;
{ {
if (!selected_frame) if (!selected_frame)
error ("No frame selected."); error ("No frame selected.");
@ -812,7 +899,9 @@ print_frame_arg_vars (frame, stream)
} }
static void static void
args_info () args_info (ignore, from_tty)
char *ignore;
int from_tty;
{ {
if (!selected_frame) if (!selected_frame)
error ("No frame selected."); error ("No frame selected.");
@ -854,7 +943,7 @@ record_selected_frame (frameaddrp, levelp)
FRAME_ADDR *frameaddrp; FRAME_ADDR *frameaddrp;
int *levelp; int *levelp;
{ {
*frameaddrp = selected_frame ? FRAME_FP (selected_frame) : NULL; *frameaddrp = selected_frame ? FRAME_FP (selected_frame) : 0;
*levelp = selected_frame_level; *levelp = selected_frame_level;
} }
@ -1038,6 +1127,8 @@ return_command (retval_exp, from_tty)
FRAME_ADDR selected_frame_addr; FRAME_ADDR selected_frame_addr;
CORE_ADDR selected_frame_pc; CORE_ADDR selected_frame_pc;
FRAME frame; FRAME frame;
char *funcname;
struct cleanup *back_to;
if (selected_frame == NULL) if (selected_frame == NULL)
error ("No selected frame."); error ("No selected frame.");
@ -1051,8 +1142,14 @@ return_command (retval_exp, from_tty)
{ {
if (thisfun != 0) if (thisfun != 0)
{ {
if (!query ("Make %s return now? ", SYMBOL_NAME (thisfun))) funcname = strdup_demangled (SYMBOL_NAME (thisfun));
back_to = make_cleanup (free, funcname);
if (!query ("Make %s return now? ", funcname))
{
error ("Not confirmed."); error ("Not confirmed.");
/* NOTREACHED */
}
do_cleanups (back_to);
} }
else else
if (!query ("Make selected stack frame return now? ")) if (!query ("Make selected stack frame return now? "))