Roll in Tiemann changes for gcc -ansi. Fix assorted bugs. See ChangeLog.

This commit is contained in:
John Gilmore 1991-05-30 08:52:52 +00:00
parent 924bbb3815
commit d11c44f1ee
12 changed files with 147 additions and 63 deletions

View file

@ -18,6 +18,7 @@ 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 GDB; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include "defs.h" #include "defs.h"
#include "param.h" #include "param.h"
#include "symtab.h" #include "symtab.h"
@ -575,7 +576,7 @@ find_pc_partial_function (pc, name, address)
cache_pc_function_low = pc - FUNCTION_START_OFFSET; cache_pc_function_low = pc - FUNCTION_START_OFFSET;
} }
cache_pc_function_name = misc_function_vector[miscfunc].name; cache_pc_function_name = misc_function_vector[miscfunc].name;
if (miscfunc < misc_function_count && 1 /* FIXME mf_text again? */ ) if (miscfunc < misc_function_count /* && FIXME mf_text again? */ )
cache_pc_function_high = misc_function_vector[miscfunc+1].address; cache_pc_function_high = misc_function_vector[miscfunc+1].address;
else else
cache_pc_function_high = cache_pc_function_low + 1; cache_pc_function_high = cache_pc_function_low + 1;

View file

@ -94,7 +94,7 @@ extern char *cplus_demangle ();
as long as we're including defs.h. */ as long as we're including defs.h. */
extern void *xmalloc (int); extern void *xmalloc (int);
extern void *xrealloc (char *, int); extern void *xrealloc (char *, int);
extern void free (char *); extern void free (void *);
#else #else
extern char *xmalloc (); extern char *xmalloc ();
extern char *xrealloc (); extern char *xrealloc ();

View file

@ -121,7 +121,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "command.h" #include "command.h"
#include "target.h" #include "target.h"
#include "gdbcore.h" /* for bfd stuff */ #include "gdbcore.h" /* for bfd stuff */
#include "liba.out.h" /* FIXME Secret internal BFD stuff for a.out */ #include "libaout.h" /* FIXME Secret internal BFD stuff for a.out */
#include "symfile.h" #include "symfile.h"
struct dbx_symfile_info { struct dbx_symfile_info {
@ -4986,6 +4986,7 @@ read_huge_number (pp, end, valu, bits)
char overflow = 0; char overflow = 0;
int nbits = 0; int nbits = 0;
int c; int c;
long upper_limit;
if (*p == '-') if (*p == '-')
{ {
@ -5001,9 +5002,10 @@ read_huge_number (pp, end, valu, bits)
p++; p++;
} }
upper_limit = LONG_MAX / radix;
while ((c = *p++) >= '0' && c <= ('0' + radix)) while ((c = *p++) >= '0' && c <= ('0' + radix))
{ {
if (n <= LONG_MAX / radix) if (n <= upper_limit)
{ {
n *= radix; n *= radix;
n += c - '0'; /* FIXME this overflows anyway */ n += c - '0'; /* FIXME this overflows anyway */

View file

@ -36,15 +36,25 @@ typedef unsigned int CORE_ADDR;
* If non-ansi, non-gcc, then eliminate "const" entirely, making those * If non-ansi, non-gcc, then eliminate "const" entirely, making those
* objects be read-write rather than read-only. * objects be read-write rather than read-only.
*/ */
#ifndef const
#ifndef __STDC__ #ifndef __STDC__
# ifdef __GNUC__ # ifdef __GNUC__
# define const __const__ # define const __const__
# define volatile __volatile__
# else # else
# define const /*nothing*/ # define const /*nothing*/
# endif /* GNUC */
#endif /* STDC */
#endif /* const */
#ifndef volatile
#ifndef __STDC__
# ifdef __GNUC__
# define volatile __volatile__
# else
# define volatile /*nothing*/ # define volatile /*nothing*/
# endif /* GNUC */ # endif /* GNUC */
#endif /* STDC */ #endif /* STDC */
#endif /* volatile */
extern char *savestring (); extern char *savestring ();
extern char *strsave (); extern char *strsave ();
@ -61,6 +71,7 @@ extern char *reg_names[];
extern volatile void error(), fatal(); extern volatile void error(), fatal();
/* Various possibilities for alloca. */ /* Various possibilities for alloca. */
#ifndef alloca
# ifdef __GNUC__ # ifdef __GNUC__
# define alloca __builtin_alloca # define alloca __builtin_alloca
# else # else
@ -69,6 +80,7 @@ extern volatile void error(), fatal();
# endif # endif
extern char *alloca (); extern char *alloca ();
# endif # endif
#endif
extern int errno; /* System call error return status */ extern int errno; /* System call error return status */

View file

@ -106,19 +106,16 @@ child_resume (step, signal)
int signal; int signal;
{ {
errno = 0; errno = 0;
/* An address of (int *)1 tells it to continue from where it was.
/* An address of (int *)1 tells ptrace to continue from where it was.
(If GDB wanted it to start some other way, we have already written (If GDB wanted it to start some other way, we have already written
a new PC value to the child.) */ a new PC value to the child.) */
if (step) if (step)
{
#if defined (NO_SINGLE_STEP)
single_step (signal);
#else /* Have single step. */
ptrace (PT_STEP, inferior_pid, (int *)1, signal); ptrace (PT_STEP, inferior_pid, (int *)1, signal);
#endif /* Have single step. */
}
else else
ptrace (PT_CONTINUE, inferior_pid, (int *)1, signal); ptrace (PT_CONTINUE, inferior_pid, (int *)1, signal);
if (errno) if (errno)
perror_with_name ("ptrace"); perror_with_name ("ptrace");
} }
@ -245,7 +242,6 @@ fetch_inferior_registers (regno)
fetch_register (regno); fetch_register (regno);
else else
fetch_register (regno); fetch_register (regno);
return 0;
} }
/* Registers we shouldn't try to store. */ /* Registers we shouldn't try to store. */

View file

@ -172,6 +172,12 @@ extern char *inferior_thisrun_terminal;
name && !strcmp ("_sigtramp", name) name && !strcmp ("_sigtramp", name)
#endif #endif
#ifdef TDESC
#include "tdesc.h"
int safe_to_init_tdesc_context = 0;
extern dc_dcontext_t current_context;
#endif
/* Tables of how to react to signals; the user sets them. */ /* Tables of how to react to signals; the user sets them. */
static char signal_stop[NSIG]; static char signal_stop[NSIG];
@ -283,6 +289,14 @@ resume (step, sig)
{ {
struct cleanup *old_cleanups = make_cleanup (resume_cleanups, 0); struct cleanup *old_cleanups = make_cleanup (resume_cleanups, 0);
QUIT; QUIT;
#ifdef NO_SINGLE_STEP
if (step) {
single_step(); /* Do it the hard way, w/temp breakpoints */
step = 0; /* ...and don't ask hardware to do it. */
}
#endif
target_resume (step, sig); target_resume (step, sig);
discard_cleanups (old_cleanups); discard_cleanups (old_cleanups);
} }
@ -717,6 +731,9 @@ wait_for_inferior ()
int stop_step_resume_break; int stop_step_resume_break;
struct symtab_and_line sal; struct symtab_and_line sal;
int remove_breakpoints_on_following_step = 0; int remove_breakpoints_on_following_step = 0;
#ifdef TDESC
extern dc_handle_t tdesc_handle;
#endif
#if 0 #if 0
/* This no longer works now that read_register is lazy; /* This no longer works now that read_register is lazy;
@ -741,6 +758,9 @@ wait_for_inferior ()
if (WIFEXITED (w)) if (WIFEXITED (w))
{ {
target_terminal_ours (); /* Must do this before mourn anyway */ target_terminal_ours (); /* Must do this before mourn anyway */
#ifdef TDESC
safe_to_init_tdesc_context = 0;
#endif
if (WEXITSTATUS (w)) if (WEXITSTATUS (w))
printf ("\nProgram exited with code 0%o.\n", printf ("\nProgram exited with code 0%o.\n",
(unsigned int)WEXITSTATUS (w)); (unsigned int)WEXITSTATUS (w));
@ -761,6 +781,9 @@ wait_for_inferior ()
stop_signal = WTERMSIG (w); stop_signal = WTERMSIG (w);
target_terminal_ours (); /* Must do this before mourn anyway */ target_terminal_ours (); /* Must do this before mourn anyway */
target_kill ((char *)0, 0); /* kill mourns as well */ target_kill ((char *)0, 0); /* kill mourns as well */
#ifdef TDESC
safe_to_init_tdesc_context = 0;
#endif
#ifdef PRINT_RANDOM_SIGNAL #ifdef PRINT_RANDOM_SIGNAL
printf ("\nProgram terminated: "); printf ("\nProgram terminated: ");
PRINT_RANDOM_SIGNAL (stop_signal); PRINT_RANDOM_SIGNAL (stop_signal);
@ -785,6 +808,14 @@ wait_for_inferior ()
#endif /* NO_SINGLE_STEP */ #endif /* NO_SINGLE_STEP */
stop_pc = read_pc (); stop_pc = read_pc ();
#ifdef TDESC
if (safe_to_init_tdesc_context)
{
current_context = init_dcontext();
set_current_frame ( create_new_frame (get_frame_base (read_pc()),read_pc()));
}
else
#endif /* TDESC */
set_current_frame ( create_new_frame (read_register (FP_REGNUM), set_current_frame ( create_new_frame (read_register (FP_REGNUM),
read_pc ())); read_pc ()));
@ -1225,6 +1256,14 @@ wait_for_inferior ()
to one-proceed past a breakpoint. */ to one-proceed past a breakpoint. */
/* If we've just finished a special step resume and we don't /* If we've just finished a special step resume and we don't
want to hit a breakpoint, pull em out. */ want to hit a breakpoint, pull em out. */
#ifdef TDESC
if (!tdesc_handle)
{
init_tdesc();
safe_to_init_tdesc_context = 1;
}
#endif
if (!step_resume_break_address && if (!step_resume_break_address &&
remove_breakpoints_on_following_step) remove_breakpoints_on_following_step)
{ {
@ -1252,7 +1291,8 @@ wait_for_inferior ()
that we shouldn't rewrite the regs when we were stopped by a that we shouldn't rewrite the regs when we were stopped by a
random signal from the inferior process. */ random signal from the inferior process. */
if (!stop_breakpoint && (stop_signal != SIGCLD) if (!bpstat_explains_signal (stop_bpstat)
&& (stop_signal != SIGCLD)
&& !stopped_by_random_signal) && !stopped_by_random_signal)
{ {
CORE_ADDR pc_contents = read_register (PC_REGNUM); CORE_ADDR pc_contents = read_register (PC_REGNUM);

View file

@ -993,27 +993,30 @@ ptype_command (typename, from_tty)
whatis_exp (typename, 1); whatis_exp (typename, 1);
return; return;
} }
printf_filtered ("No type named %s, but there is a ", printf_filtered ("No type named %s, ", typename);
typename); wrap_here ("");
printf_filtered ("but there is ");
switch (TYPE_CODE (SYMBOL_TYPE (sym))) switch (TYPE_CODE (SYMBOL_TYPE (sym)))
{ {
case TYPE_CODE_STRUCT: case TYPE_CODE_STRUCT:
printf_filtered ("struct"); printf_filtered ("a struct");
break; break;
case TYPE_CODE_UNION: case TYPE_CODE_UNION:
printf_filtered ("union"); printf_filtered ("a union");
break; break;
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
printf_filtered ("enum"); printf_filtered ("an enum");
break; break;
default: default:
printf_filtered ("(Internal error in gdb)"); printf_filtered ("(Internal error in gdb)");
break; break;
} }
printf_filtered (" %s. Type \"help ptype\".\n", typename); printf_filtered (" %s. ", typename);
wrap_here ("");
printf_filtered ("(Type \"help ptype\".)\n");
type = SYMBOL_TYPE (sym); type = SYMBOL_TYPE (sym);
} }
} }
@ -1531,11 +1534,13 @@ print_frame_args (func, fi, num, stream)
/* Avoid value_print because it will deref ref parameters. We just /* Avoid value_print because it will deref ref parameters. We just
want to print their addresses. Print ??? for args whose address want to print their addresses. Print ??? for args whose address
we do not know. */ we do not know. We pass 2 as "recurse" to val_print because our
standard indentation here is 4 spaces, and val_print indents
2 for each recurse. */
val = read_var_value (sym, FRAME_INFO_ID (fi)); val = read_var_value (sym, FRAME_INFO_ID (fi));
if (val) if (val)
val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), VALUE_ADDRESS (val), val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), VALUE_ADDRESS (val),
stream, 0, 0, 0, Val_no_prettyprint); stream, 0, 0, 2, Val_no_prettyprint);
else else
fputs_filtered ("???", stream); fputs_filtered ("???", stream);
first = 0; first = 0;

View file

@ -29,19 +29,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "target.h" #include "target.h"
#include "ieee-float.h" #include "ieee-float.h"
#include <sys/param.h>
#include <sys/dir.h>
#include <sys/user.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <sys/ptrace.h> #include <sys/ptrace.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/core.h>
#include "gdbcore.h" #include "gdbcore.h"
/* From infrun.c */ /* From infrun.c */
@ -69,9 +58,16 @@ static binsn_quantum break_mem[3];
int one_stepped; int one_stepped;
/* single_step() is called just before we want to resume the inferior,
if we want to single-step it but there is no hardware or kernel single-step
support (as on all SPARCs). We find all the possible targets of the
coming instruction and breakpoint them.
single_step is also called just after the inferior stops. If we had
set up a simulated single-step, we undo our damage. */
void void
single_step (signal) single_step ()
int signal;
{ {
branch_type br, isannulled(); branch_type br, isannulled();
CORE_ADDR pc; CORE_ADDR pc;
@ -107,8 +103,7 @@ single_step (signal)
target_insert_breakpoint (target, break_mem[2]); target_insert_breakpoint (target, break_mem[2]);
} }
/* Let it go */ /* We are ready to let it go */
ptrace (7, inferior_pid, 1, signal);
one_stepped = 1; one_stepped = 1;
return; return;
} }
@ -127,6 +122,28 @@ single_step (signal)
} }
} }
CORE_ADDR
sparc_frame_chain (thisframe)
FRAME thisframe;
{
CORE_ADDR retval;
read_memory ((CORE_ADDR)&(((struct rwindow *)(thisframe->frame))->rw_in[6]),
&retval,
sizeof (CORE_ADDR));
return retval;
}
CORE_ADDR
sparc_extract_struct_value_address (regbuf)
char regbuf[REGISTER_BYTES];
{
CORE_ADDR retval;
read_memory (((int *)(regbuf))[SP_REGNUM]+(16*4),
&retval,
sizeof (CORE_ADDR));
return retval;
}
/* /*
* Find the pc saved in frame FRAME. * Find the pc saved in frame FRAME.
*/ */
@ -138,11 +155,14 @@ frame_saved_pc (frame)
/* If it's at the bottom, the return value's stored in i7/rp */ /* If it's at the bottom, the return value's stored in i7/rp */
if (get_current_frame () == frame) if (get_current_frame () == frame)
prev_pc = GET_RWINDOW_REG (read_register (SP_REGNUM), rw_in[7]); read_memory ((CORE_ADDR)&((struct rwindow *)
(read_register (SP_REGNUM)))->rw_in[7],
&prev_pc, sizeof (CORE_ADDR));
else else
/* Wouldn't this always work? This would allow this routine to /* Wouldn't this always work? */
be completely a macro. */ read_memory ((CORE_ADDR)&((struct rwindow *)(frame->bottom))->rw_in[7],
prev_pc = GET_RWINDOW_REG (frame->bottom, rw_in[7]); &prev_pc,
sizeof (CORE_ADDR));
return PC_ADJUST (prev_pc); return PC_ADJUST (prev_pc);
} }

View file

@ -40,7 +40,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
extern int info_verbose; extern int info_verbose;
extern int close ();
extern void qsort (); extern void qsort ();
extern char *getenv (); extern char *getenv ();
@ -865,6 +864,10 @@ free_named_symtabs (name)
struct blockvector *bv; struct blockvector *bv;
int blewit = 0; int blewit = 0;
/* Some symbol formats have trouble providing file names... */
if (name == 0 || *name == '\0')
return 0;
/* Look for a psymtab with the specified name. */ /* Look for a psymtab with the specified name. */
again2: again2:

View file

@ -37,8 +37,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
extern int close ();
extern void qsort ();
extern char *getenv (); extern char *getenv ();
extern char *cplus_demangle (); extern char *cplus_demangle ();
@ -2234,7 +2232,6 @@ decode_line_2 (sym_arr, nelts, funfirstline)
int nelts; int nelts;
int funfirstline; int funfirstline;
{ {
char *getenv();
struct symtabs_and_lines values, return_values; struct symtabs_and_lines values, return_values;
register CORE_ADDR pc; register CORE_ADDR pc;
char *args, *arg1, *command_line_input (); char *args, *arg1, *command_line_input ();
@ -2466,7 +2463,7 @@ list_symbols (regexp, class, bpt)
int found_in_file = 0; int found_in_file = 0;
if (regexp) if (regexp)
if (0 != (val = (char *) re_comp (regexp))) if (0 != (val = re_comp (regexp)))
error ("Invalid regexp (%s): %s", val, regexp); error ("Invalid regexp (%s): %s", val, regexp);
/* Search through the partial_symtab_list *first* for all symbols /* Search through the partial_symtab_list *first* for all symbols

View file

@ -58,7 +58,8 @@ extern char *realloc();
/* Can't #define it since printcmd.c needs it */ /* Can't #define it since printcmd.c needs it */
void void
vprintf (format, ap) vprintf (format, ap)
char *format; void *ap; char *format;
va_alist ap;
{ {
vfprintf (stdout, format, ap); vfprintf (stdout, format, ap);
} }
@ -380,6 +381,7 @@ void
quit () quit ()
{ {
target_terminal_ours (); target_terminal_ours ();
wrap_here ((char *)0); /* Force out any pending output */
#ifdef HAVE_TERMIO #ifdef HAVE_TERMIO
ioctl (fileno (stdout), TCFLSH, 1); ioctl (fileno (stdout), TCFLSH, 1);
#else /* not HAVE_TERMIO */ #else /* not HAVE_TERMIO */
@ -873,7 +875,7 @@ fputs_filtered (linebuffer, stream)
if (*lineptr == '\n') if (*lineptr == '\n')
{ {
chars_printed = 0; chars_printed = 0;
wrap_here (""); /* Spit out chars, cancel further wraps */ wrap_here ((char *)0); /* Spit out chars, cancel further wraps */
lines_printed++; lines_printed++;
putc ('\n', stream); putc ('\n', stream);
lineptr++; lineptr++;

View file

@ -92,6 +92,10 @@ value_cast (type, arg2)
{ {
return value_at_lazy (type, VALUE_ADDRESS (arg2) + VALUE_OFFSET (arg2)); return value_at_lazy (type, VALUE_ADDRESS (arg2) + VALUE_OFFSET (arg2));
} }
else if (code1 == TYPE_CODE_VOID)
{
return value_zero (builtin_type_void, not_lval);
}
else else
{ {
error ("Invalid cast."); error ("Invalid cast.");
@ -495,7 +499,7 @@ value_ind (arg1)
(CORE_ADDR) value_as_long (arg1)); (CORE_ADDR) value_as_long (arg1));
else if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_PTR) else if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_PTR)
return value_at_lazy (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)), return value_at_lazy (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)),
(CORE_ADDR) value_as_long (arg1)); value_as_pointer (arg1));
error ("Attempt to take contents of a non-pointer value."); error ("Attempt to take contents of a non-pointer value.");
return 0; /* For lint -- never reached */ return 0; /* For lint -- never reached */
} }
@ -620,7 +624,7 @@ find_function_addr (function, retval_type)
} }
else if (code == TYPE_CODE_PTR) else if (code == TYPE_CODE_PTR)
{ {
funaddr = value_as_long (function); funaddr = value_as_pointer (function);
if (TYPE_CODE (TYPE_TARGET_TYPE (ftype)) == TYPE_CODE_FUNC if (TYPE_CODE (TYPE_TARGET_TYPE (ftype)) == TYPE_CODE_FUNC
|| TYPE_CODE (TYPE_TARGET_TYPE (ftype)) == TYPE_CODE_METHOD) || TYPE_CODE (TYPE_TARGET_TYPE (ftype)) == TYPE_CODE_METHOD)
value_type = TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (ftype)); value_type = TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (ftype));
@ -632,10 +636,10 @@ find_function_addr (function, retval_type)
/* Handle the case of functions lacking debugging info. /* Handle the case of functions lacking debugging info.
Their values are characters since their addresses are char */ Their values are characters since their addresses are char */
if (TYPE_LENGTH (ftype) == 1) if (TYPE_LENGTH (ftype) == 1)
funaddr = value_as_long (value_addr (function)); funaddr = value_as_pointer (value_addr (function));
else else
/* Handle integer used as address of a function. */ /* Handle integer used as address of a function. */
funaddr = value_as_long (function); funaddr = (CORE_ADDR) value_as_long (function);
value_type = builtin_type_int; value_type = builtin_type_int;
} }
@ -950,7 +954,7 @@ value_string (ptr, len)
val = target_call_function (val, 1, &blocklen); val = target_call_function (val, 1, &blocklen);
if (value_zerop (val)) if (value_zerop (val))
error ("No memory available for string constant."); error ("No memory available for string constant.");
write_memory ((CORE_ADDR) value_as_long (val), copy, len + 1); write_memory (value_as_pointer (val), copy, len + 1);
VALUE_TYPE (val) = lookup_pointer_type (builtin_type_char); VALUE_TYPE (val) = lookup_pointer_type (builtin_type_char);
return val; return val;
} }
@ -1002,7 +1006,8 @@ search_struct_field (name, arg1, offset, type, looking_for_baseclass)
if (BASETYPE_VIA_VIRTUAL (type, i)) if (BASETYPE_VIA_VIRTUAL (type, i))
{ {
value v2; value v2;
baseclass_addr (type, i, VALUE_CONTENTS (arg1) + offset, &v2); baseclass_addr (type, i, VALUE_CONTENTS (arg1) + offset,
&v2, (int *)NULL);
if (v2 == 0) if (v2 == 0)
error ("virtual baseclass botch"); error ("virtual baseclass botch");
if (found_baseclass) if (found_baseclass)
@ -1074,7 +1079,8 @@ search_struct_method (name, arg1, args, offset, static_memfuncp, type)
if (BASETYPE_VIA_VIRTUAL (type, i)) if (BASETYPE_VIA_VIRTUAL (type, i))
{ {
value v2; value v2;
baseclass_addr (type, i, VALUE_CONTENTS (arg1) + offset, &v2); baseclass_addr (type, i, VALUE_CONTENTS (arg1) + offset,
&v2, (int *)NULL);
if (v2 == 0) if (v2 == 0)
error ("virtual baseclass botch"); error ("virtual baseclass botch");
v = search_struct_method (name, v2, args, 0, v = search_struct_method (name, v2, args, 0,