Roll in Tiemann changes for gcc -ansi. Fix assorted bugs. See ChangeLog.
This commit is contained in:
parent
924bbb3815
commit
d11c44f1ee
12 changed files with 147 additions and 63 deletions
|
@ -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
|
||||
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include "defs.h"
|
||||
#include "param.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_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;
|
||||
else
|
||||
cache_pc_function_high = cache_pc_function_low + 1;
|
||||
|
|
|
@ -94,7 +94,7 @@ extern char *cplus_demangle ();
|
|||
as long as we're including defs.h. */
|
||||
extern void *xmalloc (int);
|
||||
extern void *xrealloc (char *, int);
|
||||
extern void free (char *);
|
||||
extern void free (void *);
|
||||
#else
|
||||
extern char *xmalloc ();
|
||||
extern char *xrealloc ();
|
||||
|
|
|
@ -121,7 +121,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#include "command.h"
|
||||
#include "target.h"
|
||||
#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"
|
||||
|
||||
struct dbx_symfile_info {
|
||||
|
@ -4986,6 +4986,7 @@ read_huge_number (pp, end, valu, bits)
|
|||
char overflow = 0;
|
||||
int nbits = 0;
|
||||
int c;
|
||||
long upper_limit;
|
||||
|
||||
if (*p == '-')
|
||||
{
|
||||
|
@ -5001,9 +5002,10 @@ read_huge_number (pp, end, valu, bits)
|
|||
p++;
|
||||
}
|
||||
|
||||
upper_limit = LONG_MAX / radix;
|
||||
while ((c = *p++) >= '0' && c <= ('0' + radix))
|
||||
{
|
||||
if (n <= LONG_MAX / radix)
|
||||
if (n <= upper_limit)
|
||||
{
|
||||
n *= radix;
|
||||
n += c - '0'; /* FIXME this overflows anyway */
|
||||
|
|
28
gdb/defs.h
28
gdb/defs.h
|
@ -36,15 +36,25 @@ typedef unsigned int CORE_ADDR;
|
|||
* If non-ansi, non-gcc, then eliminate "const" entirely, making those
|
||||
* objects be read-write rather than read-only.
|
||||
*/
|
||||
#ifndef const
|
||||
#ifndef __STDC__
|
||||
# ifdef __GNUC__
|
||||
# define const __const__
|
||||
# define volatile __volatile__
|
||||
# else
|
||||
# define const /*nothing*/
|
||||
# endif /* GNUC */
|
||||
#endif /* STDC */
|
||||
#endif /* const */
|
||||
|
||||
#ifndef volatile
|
||||
#ifndef __STDC__
|
||||
# ifdef __GNUC__
|
||||
# define volatile __volatile__
|
||||
# else
|
||||
# define volatile /*nothing*/
|
||||
# endif /* GNUC */
|
||||
#endif /* STDC */
|
||||
#endif /* volatile */
|
||||
|
||||
extern char *savestring ();
|
||||
extern char *strsave ();
|
||||
|
@ -61,14 +71,16 @@ extern char *reg_names[];
|
|||
extern volatile void error(), fatal();
|
||||
|
||||
/* Various possibilities for alloca. */
|
||||
#ifdef __GNUC__
|
||||
# define alloca __builtin_alloca
|
||||
#else
|
||||
# ifdef sparc
|
||||
# include <alloca.h>
|
||||
# endif
|
||||
extern char *alloca ();
|
||||
#ifndef alloca
|
||||
# ifdef __GNUC__
|
||||
# define alloca __builtin_alloca
|
||||
# else
|
||||
# ifdef sparc
|
||||
# include <alloca.h>
|
||||
# endif
|
||||
extern char *alloca ();
|
||||
# endif
|
||||
#endif
|
||||
|
||||
extern int errno; /* System call error return status */
|
||||
|
||||
|
|
|
@ -106,19 +106,16 @@ child_resume (step, signal)
|
|||
int signal;
|
||||
{
|
||||
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
|
||||
a new PC value to the child.) */
|
||||
|
||||
if (step)
|
||||
{
|
||||
#if defined (NO_SINGLE_STEP)
|
||||
single_step (signal);
|
||||
#else /* Have single step. */
|
||||
ptrace (PT_STEP, inferior_pid, (int *)1, signal);
|
||||
#endif /* Have single step. */
|
||||
}
|
||||
ptrace (PT_STEP, inferior_pid, (int *)1, signal);
|
||||
else
|
||||
ptrace (PT_CONTINUE, inferior_pid, (int *)1, signal);
|
||||
|
||||
if (errno)
|
||||
perror_with_name ("ptrace");
|
||||
}
|
||||
|
@ -245,7 +242,6 @@ fetch_inferior_registers (regno)
|
|||
fetch_register (regno);
|
||||
else
|
||||
fetch_register (regno);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Registers we shouldn't try to store. */
|
||||
|
|
42
gdb/infrun.c
42
gdb/infrun.c
|
@ -172,6 +172,12 @@ extern char *inferior_thisrun_terminal;
|
|||
name && !strcmp ("_sigtramp", name)
|
||||
#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. */
|
||||
|
||||
static char signal_stop[NSIG];
|
||||
|
@ -283,6 +289,14 @@ resume (step, sig)
|
|||
{
|
||||
struct cleanup *old_cleanups = make_cleanup (resume_cleanups, 0);
|
||||
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);
|
||||
discard_cleanups (old_cleanups);
|
||||
}
|
||||
|
@ -717,6 +731,9 @@ wait_for_inferior ()
|
|||
int stop_step_resume_break;
|
||||
struct symtab_and_line sal;
|
||||
int remove_breakpoints_on_following_step = 0;
|
||||
#ifdef TDESC
|
||||
extern dc_handle_t tdesc_handle;
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
/* This no longer works now that read_register is lazy;
|
||||
|
@ -741,6 +758,9 @@ wait_for_inferior ()
|
|||
if (WIFEXITED (w))
|
||||
{
|
||||
target_terminal_ours (); /* Must do this before mourn anyway */
|
||||
#ifdef TDESC
|
||||
safe_to_init_tdesc_context = 0;
|
||||
#endif
|
||||
if (WEXITSTATUS (w))
|
||||
printf ("\nProgram exited with code 0%o.\n",
|
||||
(unsigned int)WEXITSTATUS (w));
|
||||
|
@ -761,6 +781,9 @@ wait_for_inferior ()
|
|||
stop_signal = WTERMSIG (w);
|
||||
target_terminal_ours (); /* Must do this before mourn anyway */
|
||||
target_kill ((char *)0, 0); /* kill mourns as well */
|
||||
#ifdef TDESC
|
||||
safe_to_init_tdesc_context = 0;
|
||||
#endif
|
||||
#ifdef PRINT_RANDOM_SIGNAL
|
||||
printf ("\nProgram terminated: ");
|
||||
PRINT_RANDOM_SIGNAL (stop_signal);
|
||||
|
@ -785,6 +808,14 @@ wait_for_inferior ()
|
|||
#endif /* NO_SINGLE_STEP */
|
||||
|
||||
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),
|
||||
read_pc ()));
|
||||
|
||||
|
@ -1225,6 +1256,14 @@ wait_for_inferior ()
|
|||
to one-proceed past a breakpoint. */
|
||||
/* If we've just finished a special step resume and we don't
|
||||
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 &&
|
||||
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
|
||||
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)
|
||||
{
|
||||
CORE_ADDR pc_contents = read_register (PC_REGNUM);
|
||||
|
|
|
@ -993,27 +993,30 @@ ptype_command (typename, from_tty)
|
|||
whatis_exp (typename, 1);
|
||||
return;
|
||||
}
|
||||
printf_filtered ("No type named %s, but there is a ",
|
||||
typename);
|
||||
printf_filtered ("No type named %s, ", typename);
|
||||
wrap_here ("");
|
||||
printf_filtered ("but there is ");
|
||||
switch (TYPE_CODE (SYMBOL_TYPE (sym)))
|
||||
{
|
||||
case TYPE_CODE_STRUCT:
|
||||
printf_filtered ("struct");
|
||||
printf_filtered ("a struct");
|
||||
break;
|
||||
|
||||
case TYPE_CODE_UNION:
|
||||
printf_filtered ("union");
|
||||
printf_filtered ("a union");
|
||||
break;
|
||||
|
||||
case TYPE_CODE_ENUM:
|
||||
printf_filtered ("enum");
|
||||
printf_filtered ("an enum");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf_filtered ("(Internal error in gdb)");
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -1531,11 +1534,13 @@ print_frame_args (func, fi, num, stream)
|
|||
|
||||
/* Avoid value_print because it will deref ref parameters. We just
|
||||
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));
|
||||
if (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
|
||||
fputs_filtered ("???", stream);
|
||||
first = 0;
|
||||
|
|
|
@ -29,19 +29,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#include "target.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/file.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/core.h>
|
||||
|
||||
#include "gdbcore.h"
|
||||
|
||||
/* From infrun.c */
|
||||
|
@ -69,9 +58,16 @@ static binsn_quantum break_mem[3];
|
|||
|
||||
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
|
||||
single_step (signal)
|
||||
int signal;
|
||||
single_step ()
|
||||
{
|
||||
branch_type br, isannulled();
|
||||
CORE_ADDR pc;
|
||||
|
@ -107,8 +103,7 @@ single_step (signal)
|
|||
target_insert_breakpoint (target, break_mem[2]);
|
||||
}
|
||||
|
||||
/* Let it go */
|
||||
ptrace (7, inferior_pid, 1, signal);
|
||||
/* We are ready to let it go */
|
||||
one_stepped = 1;
|
||||
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.
|
||||
*/
|
||||
|
@ -138,11 +155,14 @@ frame_saved_pc (frame)
|
|||
|
||||
/* If it's at the bottom, the return value's stored in i7/rp */
|
||||
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
|
||||
/* Wouldn't this always work? This would allow this routine to
|
||||
be completely a macro. */
|
||||
prev_pc = GET_RWINDOW_REG (frame->bottom, rw_in[7]);
|
||||
/* Wouldn't this always work? */
|
||||
read_memory ((CORE_ADDR)&((struct rwindow *)(frame->bottom))->rw_in[7],
|
||||
&prev_pc,
|
||||
sizeof (CORE_ADDR));
|
||||
|
||||
return PC_ADJUST (prev_pc);
|
||||
}
|
||||
|
|
|
@ -40,7 +40,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
|
||||
extern int info_verbose;
|
||||
|
||||
extern int close ();
|
||||
extern void qsort ();
|
||||
extern char *getenv ();
|
||||
|
||||
|
@ -865,6 +864,10 @@ free_named_symtabs (name)
|
|||
struct blockvector *bv;
|
||||
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. */
|
||||
|
||||
again2:
|
||||
|
|
|
@ -37,8 +37,6 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
extern int close ();
|
||||
extern void qsort ();
|
||||
extern char *getenv ();
|
||||
|
||||
extern char *cplus_demangle ();
|
||||
|
@ -2234,7 +2232,6 @@ decode_line_2 (sym_arr, nelts, funfirstline)
|
|||
int nelts;
|
||||
int funfirstline;
|
||||
{
|
||||
char *getenv();
|
||||
struct symtabs_and_lines values, return_values;
|
||||
register CORE_ADDR pc;
|
||||
char *args, *arg1, *command_line_input ();
|
||||
|
@ -2466,7 +2463,7 @@ list_symbols (regexp, class, bpt)
|
|||
int found_in_file = 0;
|
||||
|
||||
if (regexp)
|
||||
if (0 != (val = (char *) re_comp (regexp)))
|
||||
if (0 != (val = re_comp (regexp)))
|
||||
error ("Invalid regexp (%s): %s", val, regexp);
|
||||
|
||||
/* Search through the partial_symtab_list *first* for all symbols
|
||||
|
|
|
@ -58,7 +58,8 @@ extern char *realloc();
|
|||
/* Can't #define it since printcmd.c needs it */
|
||||
void
|
||||
vprintf (format, ap)
|
||||
char *format; void *ap;
|
||||
char *format;
|
||||
va_alist ap;
|
||||
{
|
||||
vfprintf (stdout, format, ap);
|
||||
}
|
||||
|
@ -380,6 +381,7 @@ void
|
|||
quit ()
|
||||
{
|
||||
target_terminal_ours ();
|
||||
wrap_here ((char *)0); /* Force out any pending output */
|
||||
#ifdef HAVE_TERMIO
|
||||
ioctl (fileno (stdout), TCFLSH, 1);
|
||||
#else /* not HAVE_TERMIO */
|
||||
|
@ -873,7 +875,7 @@ fputs_filtered (linebuffer, stream)
|
|||
if (*lineptr == '\n')
|
||||
{
|
||||
chars_printed = 0;
|
||||
wrap_here (""); /* Spit out chars, cancel further wraps */
|
||||
wrap_here ((char *)0); /* Spit out chars, cancel further wraps */
|
||||
lines_printed++;
|
||||
putc ('\n', stream);
|
||||
lineptr++;
|
||||
|
|
20
gdb/valops.c
20
gdb/valops.c
|
@ -92,6 +92,10 @@ value_cast (type, 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
|
||||
{
|
||||
error ("Invalid cast.");
|
||||
|
@ -495,7 +499,7 @@ value_ind (arg1)
|
|||
(CORE_ADDR) value_as_long (arg1));
|
||||
else if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_PTR)
|
||||
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.");
|
||||
return 0; /* For lint -- never reached */
|
||||
}
|
||||
|
@ -620,7 +624,7 @@ find_function_addr (function, retval_type)
|
|||
}
|
||||
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
|
||||
|| TYPE_CODE (TYPE_TARGET_TYPE (ftype)) == TYPE_CODE_METHOD)
|
||||
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.
|
||||
Their values are characters since their addresses are char */
|
||||
if (TYPE_LENGTH (ftype) == 1)
|
||||
funaddr = value_as_long (value_addr (function));
|
||||
funaddr = value_as_pointer (value_addr (function));
|
||||
else
|
||||
/* 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;
|
||||
}
|
||||
|
@ -950,7 +954,7 @@ value_string (ptr, len)
|
|||
val = target_call_function (val, 1, &blocklen);
|
||||
if (value_zerop (val))
|
||||
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);
|
||||
return val;
|
||||
}
|
||||
|
@ -1002,7 +1006,8 @@ search_struct_field (name, arg1, offset, type, looking_for_baseclass)
|
|||
if (BASETYPE_VIA_VIRTUAL (type, i))
|
||||
{
|
||||
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)
|
||||
error ("virtual baseclass botch");
|
||||
if (found_baseclass)
|
||||
|
@ -1074,7 +1079,8 @@ search_struct_method (name, arg1, args, offset, static_memfuncp, type)
|
|||
if (BASETYPE_VIA_VIRTUAL (type, i))
|
||||
{
|
||||
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)
|
||||
error ("virtual baseclass botch");
|
||||
v = search_struct_method (name, v2, args, 0,
|
||||
|
|
Loading…
Reference in a new issue