mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-22 10:31:38 +00:00
gdb-3.4
This commit is contained in:
parent
4187119d59
commit
1c997a4ae8
124
gdb/ChangeLog
124
gdb/ChangeLog
@ -1,5 +1,129 @@
|
|||||||
|
Sun Nov 5 11:39:01 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* version.c: Change version to 3.4
|
||||||
|
|
||||||
|
* symtab.c (decode_line_1): Only skip past "struct" if it
|
||||||
|
is there.
|
||||||
|
|
||||||
|
* valops.c (value_ind), eval.c (evaluate_subexp, case UNOP_IND):
|
||||||
|
Have "*" <int-valued-exp> return an int, not a LONGEST.
|
||||||
|
|
||||||
|
* utils.c (fprintf_filtered): Pass arg{4,5,6} to sprintf.
|
||||||
|
|
||||||
|
* printcmd.c (x_command): Use variable itself rather
|
||||||
|
than treating it as a pointer only if it is a function.
|
||||||
|
(See comment "this makes x/i main work").
|
||||||
|
|
||||||
|
* coffread.c (symbol_file_command): Use error for
|
||||||
|
"%s does not have a symbol-table.\n".
|
||||||
|
|
||||||
|
Wed Nov 1 19:56:18 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* dbxread.c [BELIEVE_PCC_PROMOTION_TYPE]: New code.
|
||||||
|
m-sparc.h: Define BELIEVE_PCC_PROMOTION_TYPE.
|
||||||
|
|
||||||
|
Thu Oct 26 12:45:00 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* infrun.c: Include <sys/dir.h>.
|
||||||
|
|
||||||
|
* dbxread.c (read_dbx_symtab, case N_LSYM, case 'T'):
|
||||||
|
Check for enum types and put constants in psymtab.
|
||||||
|
|
||||||
|
Mon Oct 23 15:02:25 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* dbxread.c (define_symbol, read_dbx_symtab): Handle enum
|
||||||
|
constants (e.g. "b:c=e6,0").
|
||||||
|
|
||||||
|
Thu Oct 19 14:57:26 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* stack.c (frame_info): Use FRAME_ARGS_ADDRESS_CORRECT
|
||||||
|
m-vax.h (FRAME_ARGS_ADDRESS_CORRECT): New macro.
|
||||||
|
(FRAME_ARGS_ADDRESS): Restore old meaning.
|
||||||
|
|
||||||
|
* frame.h (Frame_unknown): New macro.
|
||||||
|
stack.c (frame_info): Check for Frame_unknown return from
|
||||||
|
FRAME_ARGS_ADDRESS.
|
||||||
|
m-vax.h (FRAME_ARGS_ADDRESS): Sometimes return Frame_unknown.
|
||||||
|
|
||||||
|
* utils.c (fatal_dump_core): Add "internal error" to message.
|
||||||
|
|
||||||
|
* infrun.c (IN_SIGTRAMP): New macro.
|
||||||
|
(wait_for_inferior): Use IN_SIGTRAMP.
|
||||||
|
m-vax.h (IN_SIGTRAMP): New macro.
|
||||||
|
|
||||||
|
Wed Oct 18 15:09:22 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* config.gdb, Makefile.dist: Shorten m-i386-sv32.h.
|
||||||
|
|
||||||
|
* coffread.c (symbol_file_command): Pass 0 to select_source_symtab.
|
||||||
|
|
||||||
|
Tue Oct 17 12:24:41 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* i386-dep.c (i386_frame_num_args): Take function from m-i386.h
|
||||||
|
file. Check for pfi null.
|
||||||
|
m-i386.h (FRAME_NUM_ARGS): Use i386_frame_num_args.
|
||||||
|
|
||||||
|
* infrun.c (wait_for_inferior): set stop_func_name to 0
|
||||||
|
before calling find_pc_partial_function.
|
||||||
|
|
||||||
|
Thu Oct 12 01:08:50 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* breakpoint.c (_initialize_breakpoint): Add "disa".
|
||||||
|
|
||||||
|
* Makefile.dist: Add GLOBAL_CFLAGS and pass to readline.
|
||||||
|
|
||||||
|
* config.gdb (various): "$machine =" -> "machine =".
|
||||||
|
|
||||||
|
Wed Oct 11 11:54:31 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* inflow.c (try_writing_regs): #if 0 out this function.
|
||||||
|
|
||||||
|
* main.c (main): Add "-help" option.
|
||||||
|
|
||||||
|
* dbxread.c (read_dbx_symtab): Merge code for N_FUN with
|
||||||
|
N_STSYM, etc.
|
||||||
|
|
||||||
|
Mon Oct 9 14:21:55 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* inflow.c (try_writing_regs_command): Don't write past end
|
||||||
|
of struct user.
|
||||||
|
|
||||||
|
* dbxread.c (read_struct_type): #if 0 out code which checks for
|
||||||
|
bitpos and bitsize 0.
|
||||||
|
|
||||||
|
* config.gdb: Accept sequent-i386 (not seq386).
|
||||||
|
(symmetry): Set depfile and paramfile.
|
||||||
|
|
||||||
|
* m-convex.h (IGNORE_SYMBOL): Check for N_MONPT if defined.
|
||||||
|
|
||||||
|
Thu Oct 5 10:14:26 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* default-dep.c (read_inferior_memory): Put #if 0'd out comment
|
||||||
|
within /* */.
|
||||||
|
|
||||||
|
Wed Oct 4 18:44:41 1989 Jim Kingdon (kingdon at apple-gunkies.ai.mit.edu)
|
||||||
|
|
||||||
|
* config.gdb: Change /dev/null to m-i386.h for various
|
||||||
|
386 machine "opcodefile" entries.
|
||||||
|
|
||||||
|
* config.gdb: Accept seq386 for sequent symmetry.
|
||||||
|
|
||||||
|
Mon Oct 2 09:59:50 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* hp300bsd-dep.c: Fix copyright notice.
|
||||||
|
|
||||||
|
Sun Oct 1 16:25:30 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* Makefile.dist (DEPFILES): Add isi-dep.c.
|
||||||
|
|
||||||
|
* default-dep.c (read_inferior_memory): Move #endif after else.
|
||||||
|
|
||||||
Sat Sep 30 12:50:16 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
Sat Sep 30 12:50:16 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* version.c: Change version number to 3.3.xxx.
|
||||||
|
|
||||||
|
* GDB 3.3 released.
|
||||||
|
|
||||||
* version.c: Change version number to 3.3.
|
* version.c: Change version number to 3.3.
|
||||||
|
|
||||||
* Makefile.dist (READLINE): Add vi_mode.c
|
* Makefile.dist (READLINE): Add vi_mode.c
|
||||||
|
@ -40,8 +40,9 @@ CC-LD=${CC}
|
|||||||
#define M_CFLAGS
|
#define M_CFLAGS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CFLAGS = -g -I. ${HAVE_VPRINTF_DEFINE} M_CFLAGS
|
/* CFLAGS for both GDB and readline. */
|
||||||
/* CFLAGS = -I. -g -pg ${HAVE_VPRINTF_DEFINE} */
|
GLOBAL_CFLAGS = -g M_CFLAGS
|
||||||
|
CFLAGS = -I. ${HAVE_VPRINTF_DEFINE} ${GLOBAL_CFLAGS}
|
||||||
/* None of the things in CFLAGS will do any harm, and on some systems
|
/* None of the things in CFLAGS will do any harm, and on some systems
|
||||||
(e.g. SunOS4) it is important to use the M_CFLAGS. */
|
(e.g. SunOS4) it is important to use the M_CFLAGS. */
|
||||||
LDFLAGS = $(CFLAGS)
|
LDFLAGS = $(CFLAGS)
|
||||||
@ -122,7 +123,7 @@ SFILES = blockframe.c breakpoint.c dbxread.c coffread.c command.c core.c \
|
|||||||
|
|
||||||
DEPFILES = umax-dep.c gould-dep.c default-dep.c sun3-dep.c \
|
DEPFILES = umax-dep.c gould-dep.c default-dep.c sun3-dep.c \
|
||||||
sparc-dep.c hp9k320-dep.c hp300bsd-dep.c news-dep.c i386-dep.c \
|
sparc-dep.c hp9k320-dep.c hp300bsd-dep.c news-dep.c i386-dep.c \
|
||||||
symmetry-dep.c convex-dep.c altos-dep.c
|
symmetry-dep.c convex-dep.c altos-dep.c isi-dep.c
|
||||||
|
|
||||||
PINSNS = gld-pinsn.c i386-pinsn.c sparc-pinsn.c vax-pinsn.c m68k-pinsn.c \
|
PINSNS = gld-pinsn.c i386-pinsn.c sparc-pinsn.c vax-pinsn.c m68k-pinsn.c \
|
||||||
ns32k-pinsn.c convex-pinsn.c
|
ns32k-pinsn.c convex-pinsn.c
|
||||||
@ -135,7 +136,7 @@ OPCODES = m68k-opcode.h pn-opcode.h sparc-opcode.h npl-opcode.h vax-opcode.h \
|
|||||||
ns32k-opcode.h convex-opcode.h
|
ns32k-opcode.h convex-opcode.h
|
||||||
|
|
||||||
MFILES = m-hp9k320.h m-hp300bsd.h m-i386.h m-i386gas.h \
|
MFILES = m-hp9k320.h m-hp300bsd.h m-i386.h m-i386gas.h \
|
||||||
m-i386-sysv3.2.h m-i386gas-sysv3.2.h m-isi.h m-merlin.h \
|
m-i386-sv32.h m-i386g-sv32.h m-isi.h m-merlin.h \
|
||||||
m-altos.h m-news.h m-newsos3.h m-npl.h m-pn.h \
|
m-altos.h m-news.h m-newsos3.h m-npl.h m-pn.h \
|
||||||
m-sparc.h m-sun2.h m-sun3.h m-sun2os4.h \
|
m-sparc.h m-sun2.h m-sun3.h m-sun2os4.h \
|
||||||
m-sun3os4.h m-sun4os4.h m-umax.h m-vax.h m-symmetry.h m-convex.h
|
m-sun3os4.h m-sun4os4.h m-umax.h m-vax.h m-symmetry.h m-convex.h
|
||||||
@ -286,7 +287,8 @@ expread.o : expread.tab.c defs.h param.h symtab.h frame.h expression.h
|
|||||||
mv expread.tab.o expread.o
|
mv expread.tab.o expread.o
|
||||||
|
|
||||||
readline/libreadline.a : force_update
|
readline/libreadline.a : force_update
|
||||||
cd readline ; ${MAKE} "SYSV=${SYSV_DEFINE}" "CC=${CC}" libreadline.a
|
cd readline ; ${MAKE} "SYSV=${SYSV_DEFINE}" \
|
||||||
|
"DEBUG_FLAGS=${GLOBAL_CFLAGS}" "CC=${CC}" libreadline.a
|
||||||
|
|
||||||
force_update :
|
force_update :
|
||||||
|
|
||||||
|
44
gdb/README
44
gdb/README
@ -19,14 +19,17 @@ emacs 18.55 or later.
|
|||||||
|
|
||||||
About languages other than C...
|
About languages other than C...
|
||||||
|
|
||||||
C++ support has been integrated into gdb. GDB should work with Pascal
|
C++ support has been integrated into gdb. GDB should work with
|
||||||
and FORTRAN programs, but I am not aware of anyone who is working on
|
FORTRAN programs (if you have problem, please send a bug report), but
|
||||||
getting it to use the syntax of any language other than C or C++.
|
I am not aware of anyone who is working on getting it to use the
|
||||||
|
syntax of any language other than C or C++. Pascal programs which use
|
||||||
|
sets, subranges, file variables, or nested functions will not
|
||||||
|
currently work.
|
||||||
|
|
||||||
About -gg format...
|
About -gg format...
|
||||||
|
|
||||||
Currently GDB version 3.x does *not* support GCC's -gg format. This
|
Currently GDB version 3.x does *not* support GCC's -gg format. This
|
||||||
is because it is (in theory) has fast enough startup on dbx debugging
|
is because it (in theory) has fast enough startup on dbx debugging
|
||||||
format object files that -gg format is unnecessary (and hence
|
format object files that -gg format is unnecessary (and hence
|
||||||
undesirable, since it wastes space and processing power in gcc). I
|
undesirable, since it wastes space and processing power in gcc). I
|
||||||
would like to hear people's opinions on the amount of time currently
|
would like to hear people's opinions on the amount of time currently
|
||||||
@ -97,30 +100,31 @@ operating system-dependent). If this is unavoidable, put a hook in
|
|||||||
the machine-independent file which calls a (possibly)
|
the machine-independent file which calls a (possibly)
|
||||||
machine-dependent macro (for example, the IGNORE_SYMBOL macro can be
|
machine-dependent macro (for example, the IGNORE_SYMBOL macro can be
|
||||||
used for any symbols which need to be ignored on a specific machine.
|
used for any symbols which need to be ignored on a specific machine.
|
||||||
Calling IGNORE_SYMBOL in dbxread.c is a lot cleaner than a maze of
|
Calling IGNORE_SYMBOL in dbxread.c is a lot cleaner than a maze of #if
|
||||||
#if defined's). The machine-independent code should do whatever "most"
|
defined's). The machine-independent code should do whatever "most"
|
||||||
machines want if the macro is not defined in param.h. Using #if defined
|
machines want if the macro is not defined in param.h. Using #if
|
||||||
can sometimes be OK (e.g. SET_STACK_LIMIT_HUGE) but should usually be
|
defined can sometimes be OK (e.g. SET_STACK_LIMIT_HUGE) but should be
|
||||||
conditionalized on a specific feature of an operating system (set in
|
conditionalized on a specific feature of an operating system (set in
|
||||||
param.h) rather than something like #if defined(vax) or #if defined(SYSV).
|
param.h) rather than something like #if defined(vax) or #if
|
||||||
|
defined(SYSV).
|
||||||
|
|
||||||
It is better to replace entire routines which may be system-specific,
|
It is better to replace entire routines which may be system-specific,
|
||||||
rather than put in a whole bunch of hooks which are probably not going
|
rather than put in a whole bunch of hooks which are probably not going
|
||||||
to be helpful for any purpose other than your changes. For example,
|
to be helpful for any purpose other than your changes. For example,
|
||||||
if you want to modify dbxread.c to deal with DBX debugging symbols
|
if you want to modify dbxread.c to deal with DBX debugging symbols
|
||||||
which are in COFF files rather than a.out files, do something
|
which are in COFF files rather than BSD a.out files, do something
|
||||||
along the lines of a macro GET_NEXT_SYMBOL, which could have
|
along the lines of a macro GET_NEXT_SYMBOL, which could have
|
||||||
different definitions for COFF and a.out, rather than trying to put
|
different definitions for COFF and a.out, rather than trying to put
|
||||||
the necessary changes throughout all the code in dbxread.c that
|
the necessary changes throughout all the code in dbxread.c that
|
||||||
currently assumes a.out format.
|
currently assumes BSD format.
|
||||||
|
|
||||||
Please avoid duplicating code. For example, if something needs to be
|
Please avoid duplicating code. For example, if something needs to be
|
||||||
changed in read_inferior_memory, it is very painful because there is a
|
changed in read_inferior_memory, it is very painful because there is a
|
||||||
copy in every dep.c file. The correct way to do this is to put the
|
copy in every dep.c file. The correct way to do this is to put (in
|
||||||
standard ptrace interfaces in a separate file ptrace.c, which is used
|
this case) the standard ptrace interfaces in a separate file ptrace.c,
|
||||||
by all systems which have ptrace. ptrace.c would deal with variations
|
which is used by all systems which have ptrace. ptrace.c would deal
|
||||||
between systems the same way any system-independent file would (hooks,
|
with variations between systems the same way any system-independent
|
||||||
#if defined, etc.).
|
file would (hooks, #if defined, etc.).
|
||||||
|
|
||||||
About debugging gdb with itself...
|
About debugging gdb with itself...
|
||||||
|
|
||||||
@ -128,11 +132,9 @@ You probably want to do a "make TAGS" after you configure your
|
|||||||
distribution; this will put the machine dependent routines for your
|
distribution; this will put the machine dependent routines for your
|
||||||
local machine where they will be accessed first by a M-period .
|
local machine where they will be accessed first by a M-period .
|
||||||
|
|
||||||
Also, you want to make sure that gdb is not compiled with shared
|
Also, make sure that you've compiled gdb with your local cc or taken
|
||||||
libraries on the Sun 4. And you want to make sure that you've
|
appropriate precautions regarding ansification of include files. See
|
||||||
compiled gdb with your local cc or taken appropriate precautions
|
the Makefile for more information.
|
||||||
regarding ansification of include files. See the Makefile for more
|
|
||||||
information.
|
|
||||||
|
|
||||||
The "info" command, when executed without a subcommand in a gdb being
|
The "info" command, when executed without a subcommand in a gdb being
|
||||||
debugged by gdb, will pop you back up to the top level gdb. See
|
debugged by gdb, will pop you back up to the top level gdb. See
|
||||||
|
@ -431,7 +431,15 @@ find_pc_function (pc)
|
|||||||
/* Finds the "function" (text symbol) that is smaller than PC
|
/* Finds the "function" (text symbol) that is smaller than PC
|
||||||
but greatest of all of the potential text symbols. Sets
|
but greatest of all of the potential text symbols. Sets
|
||||||
*NAME and/or *ADDRESS conditionally if that pointer is non-zero.
|
*NAME and/or *ADDRESS conditionally if that pointer is non-zero.
|
||||||
Returns 0 if it couldn't find anything, 1 if it did. */
|
Returns 0 if it couldn't find anything, 1 if it did.
|
||||||
|
|
||||||
|
Note that there are several possible responses:
|
||||||
|
* Set *NAME and *ADDRESS to nonzero values and return 0
|
||||||
|
* Set *NAME and *ADDRESS to zero and return 0
|
||||||
|
* Don't set *NAME and *ADDRESS and return 1
|
||||||
|
(I don't know whether it *should* work this way, but I'd rather
|
||||||
|
document it than risk breaking code
|
||||||
|
which depends on this behavior). */
|
||||||
|
|
||||||
int
|
int
|
||||||
find_pc_partial_function (pc, name, address)
|
find_pc_partial_function (pc, name, address)
|
||||||
|
@ -1297,6 +1297,7 @@ A disabled breakpoint is not forgotten, but has no effect until reenabled.\n\
|
|||||||
The \"display\" subcommand applies to auto-displays instead of breakpoints.",
|
The \"display\" subcommand applies to auto-displays instead of breakpoints.",
|
||||||
&disablelist, "disable ", 1, &cmdlist);
|
&disablelist, "disable ", 1, &cmdlist);
|
||||||
add_com_alias ("dis", "disable", class_breakpoint, 1);
|
add_com_alias ("dis", "disable", class_breakpoint, 1);
|
||||||
|
add_com_alias ("disa", "disable", class_breakpoint, 1);
|
||||||
|
|
||||||
add_abbrev_cmd ("breakpoints", class_breakpoint, disable_command,
|
add_abbrev_cmd ("breakpoints", class_breakpoint, disable_command,
|
||||||
"Disable some breakpoints or auto-display expressions.\n\
|
"Disable some breakpoints or auto-display expressions.\n\
|
||||||
|
@ -747,9 +747,7 @@ symbol_file_command (name)
|
|||||||
if (num_symbols == 0)
|
if (num_symbols == 0)
|
||||||
{
|
{
|
||||||
free_all_symtabs ();
|
free_all_symtabs ();
|
||||||
printf ("%s does not have a symbol-table.\n", name);
|
error ("%s does not have a symbol-table.\n", name);
|
||||||
fflush (stdout);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printf ("Reading symbol data from %s...", name);
|
printf ("Reading symbol data from %s...", name);
|
||||||
@ -814,7 +812,7 @@ symbol_file_command (name)
|
|||||||
|
|
||||||
/* Make a default for file to list. */
|
/* Make a default for file to list. */
|
||||||
|
|
||||||
select_source_symtab (symtab_list);
|
select_source_symtab (0);
|
||||||
|
|
||||||
symfile = savestring (name, strlen (name));
|
symfile = savestring (name, strlen (name));
|
||||||
|
|
||||||
|
@ -51,35 +51,40 @@ news)
|
|||||||
sun2)
|
sun2)
|
||||||
case $os in
|
case $os in
|
||||||
os4|sunos4)
|
os4|sunos4)
|
||||||
$machine=sun2os4
|
machine=sun2os4
|
||||||
$os=""
|
os=""
|
||||||
;;
|
;;
|
||||||
os2|sunos2)
|
os2|sunos2)
|
||||||
$machine=sun2os2
|
machine=sun2os2
|
||||||
$os=""
|
os=""
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
sun3)
|
sun3)
|
||||||
case $os in
|
case $os in
|
||||||
os4|sunos4)
|
os4|sunos4)
|
||||||
$machine=sun3os4
|
machine=sun3os4
|
||||||
$os=""
|
os=""
|
||||||
;;
|
;;
|
||||||
os3|sunos3)
|
os3|sunos3)
|
||||||
$machine=sun3os3
|
machine=sun3os3
|
||||||
$os=""
|
os=""
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
sparc|sun4)
|
sparc|sun4)
|
||||||
case $os in
|
case $os in
|
||||||
os4|sunos4)
|
os4|sunos4)
|
||||||
$machine=sun4os4
|
machine=sun4os4
|
||||||
$os=""
|
os=""
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
# GCC accepts sequent-i386 or symmetry, so be consistent.
|
||||||
|
sequent-i386)
|
||||||
|
machine=symmetry
|
||||||
|
os=""
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
paramfile=m-${machine}${os}.h
|
paramfile=m-${machine}${os}.h
|
||||||
@ -117,7 +122,10 @@ altosgas)
|
|||||||
;;
|
;;
|
||||||
vax)
|
vax)
|
||||||
echo
|
echo
|
||||||
echo "/bin/cc has been known to fail on readline.c on VAXen running BSD4.3"
|
# The following types of /bin/cc failures have been observed:
|
||||||
|
# 1. Something in readline.c which I have never seen
|
||||||
|
# 2. ``"values.c", line 816: compiler error: schain botch''
|
||||||
|
echo "/bin/cc has been known to fail on VAXen running BSD4.3"
|
||||||
echo "If this occurs, use gcc "
|
echo "If this occurs, use gcc "
|
||||||
echo " (but see comments in Makefile.dist about compiling with gcc)."
|
echo " (but see comments in Makefile.dist about compiling with gcc)."
|
||||||
echo
|
echo
|
||||||
@ -166,13 +174,17 @@ i386gas)
|
|||||||
# of this file about unneeded files.
|
# of this file about unneeded files.
|
||||||
opcodefile=m-i386.h
|
opcodefile=m-i386.h
|
||||||
;;
|
;;
|
||||||
i386-sysv3.2)
|
# These names are short and cryptic due to the @#$#!@#$@! System V
|
||||||
|
# 14 character file name limit.
|
||||||
|
i386-sv32)
|
||||||
makedefine="-DM_CLIBS=-lPW -DM_SYSV -DM_REGEX=regex.o"
|
makedefine="-DM_CLIBS=-lPW -DM_SYSV -DM_REGEX=regex.o"
|
||||||
pinsnfile=i386-pinsn.c
|
pinsnfile=i386-pinsn.c
|
||||||
depfile=i386-dep.c
|
depfile=i386-dep.c
|
||||||
opcodefile=/dev/null
|
# The following is a lie, but a necessary one. See comment at beginning
|
||||||
|
# of this file about unneeded files.
|
||||||
|
opcodefile=m-i386.h
|
||||||
;;
|
;;
|
||||||
i386gas-sysv3.2)
|
i386g-sv32)
|
||||||
makedefine="-DM_CLIBS=-lPW -DM_SYSV -DM_REGEX=regex.o"
|
makedefine="-DM_CLIBS=-lPW -DM_SYSV -DM_REGEX=regex.o"
|
||||||
echo
|
echo
|
||||||
echo "Use of the coff encapsulation features requires the GNU binary utilities"
|
echo "Use of the coff encapsulation features requires the GNU binary utilities"
|
||||||
@ -180,7 +192,9 @@ i386gas-sysv3.2)
|
|||||||
echo
|
echo
|
||||||
pinsnfile=i386-pinsn.c
|
pinsnfile=i386-pinsn.c
|
||||||
depfile=i386-dep.c
|
depfile=i386-dep.c
|
||||||
opcodefile=/dev/null
|
# The following is a lie, but a necessary one. See comment at beginning
|
||||||
|
# of this file about unneeded files.
|
||||||
|
opcodefile=m-i386.h
|
||||||
;;
|
;;
|
||||||
merlin)
|
merlin)
|
||||||
pinsnfile=ns32k-pinsn.c
|
pinsnfile=ns32k-pinsn.c
|
||||||
@ -256,9 +270,12 @@ sun4os4|sun4-os4)
|
|||||||
depfile=sparc-dep.c
|
depfile=sparc-dep.c
|
||||||
;;
|
;;
|
||||||
symmetry)
|
symmetry)
|
||||||
|
paramfile=m-symmetry.h
|
||||||
|
depfile=symmetry-dep.c
|
||||||
pinsnfile=i386-pinsn.c
|
pinsnfile=i386-pinsn.c
|
||||||
# Need *some* opcode file to keep make from trying to make opcode.h
|
# The following is a lie, but a necessary one. See comment at beginning
|
||||||
opcodefile=/dev/null
|
# of this file about unneeded files.
|
||||||
|
opcodefile=m-i386.h
|
||||||
;;
|
;;
|
||||||
umax)
|
umax)
|
||||||
pinsnfile=ns32k-pinsn.c
|
pinsnfile=ns32k-pinsn.c
|
||||||
|
@ -107,19 +107,19 @@ CORE_ADDR text_end;
|
|||||||
CORE_ADDR exec_data_start;
|
CORE_ADDR exec_data_start;
|
||||||
CORE_ADDR exec_data_end;
|
CORE_ADDR exec_data_end;
|
||||||
|
|
||||||
/* Address in executable file of start of text area data. */
|
/* Offset within executable file of start of text area data. */
|
||||||
|
|
||||||
int text_offset;
|
int text_offset;
|
||||||
|
|
||||||
/* Address in executable file of start of data area data. */
|
/* Offset within executable file of start of data area data. */
|
||||||
|
|
||||||
int exec_data_offset;
|
int exec_data_offset;
|
||||||
|
|
||||||
/* Address in core file of start of data area data. */
|
/* Offset within core file of start of data area data. */
|
||||||
|
|
||||||
int data_offset;
|
int data_offset;
|
||||||
|
|
||||||
/* Address in core file of start of stack area data. */
|
/* Offset within core file of start of stack area data. */
|
||||||
|
|
||||||
int stack_offset;
|
int stack_offset;
|
||||||
|
|
||||||
|
230
gdb/dbxread.c
230
gdb/dbxread.c
@ -1936,6 +1936,8 @@ read_dbx_symtab (desc, stringtab, stringtab_size, nlistlen, inclink,
|
|||||||
profile_types[i] = 0;
|
profile_types[i] = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
stringtab_global = stringtab;
|
||||||
|
|
||||||
pst = (struct partial_symtab *) 0;
|
pst = (struct partial_symtab *) 0;
|
||||||
|
|
||||||
includes_allocated = 30;
|
includes_allocated = 30;
|
||||||
@ -2270,9 +2272,7 @@ read_dbx_symtab (desc, stringtab, stringtab_size, nlistlen, inclink,
|
|||||||
|
|
||||||
p = (char *) index (namestring, ':');
|
p = (char *) index (namestring, ':');
|
||||||
|
|
||||||
/* Skip if there is no : or if the thing following the : is
|
/* Skip if there is no :. */
|
||||||
not a letter (which indicates declaration of a local
|
|
||||||
variable, which we aren't interested in). */
|
|
||||||
if (!p) continue;
|
if (!p) continue;
|
||||||
|
|
||||||
switch (p[1])
|
switch (p[1])
|
||||||
@ -2281,11 +2281,75 @@ read_dbx_symtab (desc, stringtab, stringtab_size, nlistlen, inclink,
|
|||||||
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
|
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
|
||||||
STRUCT_NAMESPACE, LOC_TYPEDEF,
|
STRUCT_NAMESPACE, LOC_TYPEDEF,
|
||||||
static_psymbols, bufp->n_value);
|
static_psymbols, bufp->n_value);
|
||||||
continue;
|
goto check_enum;
|
||||||
case 't':
|
case 't':
|
||||||
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
|
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
|
||||||
VAR_NAMESPACE, LOC_TYPEDEF,
|
VAR_NAMESPACE, LOC_TYPEDEF,
|
||||||
static_psymbols, bufp->n_value);
|
static_psymbols, bufp->n_value);
|
||||||
|
check_enum:
|
||||||
|
/* If this is an enumerated type, we need to
|
||||||
|
add all the enum constants to the partial symbol
|
||||||
|
table. This does not cover enums without names, e.g.
|
||||||
|
"enum {a, b} c;" in C, but fortunately those are
|
||||||
|
rare. There is no way for GDB to find those from the
|
||||||
|
enum type without spending too much time on it. Thus
|
||||||
|
to solve this problem, the compiler needs to put out separate
|
||||||
|
constant symbols ('c' N_LSYMS) for enum constants in
|
||||||
|
enums without names. */
|
||||||
|
|
||||||
|
/* We are looking for something of the form
|
||||||
|
<name> ":" ("t" | "T") [<number> "="] "e"
|
||||||
|
{<constant> ":" <value> ","} ";". */
|
||||||
|
|
||||||
|
/* Skip over the colon and the 't' or 'T'. */
|
||||||
|
p += 2;
|
||||||
|
/* This type may be given a number. Skip over it. */
|
||||||
|
while ((*p >= '0' && *p <= '9')
|
||||||
|
|| *p == '=')
|
||||||
|
p++;
|
||||||
|
|
||||||
|
if (*p++ == 'e')
|
||||||
|
{
|
||||||
|
/* We have found an enumerated type. */
|
||||||
|
/* According to comments in read_enum_type
|
||||||
|
a comma could end it instead of a semicolon.
|
||||||
|
I don't know where that happens.
|
||||||
|
Accept either. */
|
||||||
|
while (*p && *p != ';' && *p != ',')
|
||||||
|
{
|
||||||
|
char *q;
|
||||||
|
|
||||||
|
/* Check for and handle cretinous dbx symbol name
|
||||||
|
continuation! */
|
||||||
|
if (*p == '\\')
|
||||||
|
p = next_symbol_text ();
|
||||||
|
|
||||||
|
/* Point to the character after the name
|
||||||
|
of the enum constant. */
|
||||||
|
for (q = p; *q && *q != ':'; q++)
|
||||||
|
;
|
||||||
|
/* Note that the value doesn't matter for
|
||||||
|
enum constants in psymtabs, just in symtabs. */
|
||||||
|
ADD_PSYMBOL_TO_LIST (p, q - p,
|
||||||
|
VAR_NAMESPACE, LOC_CONST,
|
||||||
|
static_psymbols, 0);
|
||||||
|
/* Point past the name. */
|
||||||
|
p = q;
|
||||||
|
/* Skip over the value. */
|
||||||
|
while (*p && *p != ',')
|
||||||
|
p++;
|
||||||
|
/* Advance past the comma. */
|
||||||
|
if (*p)
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
case 'c':
|
||||||
|
/* Constant, e.g. from "const" in Pascal. */
|
||||||
|
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
|
||||||
|
VAR_NAMESPACE, LOC_CONST,
|
||||||
|
static_psymbols, bufp->n_value);
|
||||||
continue;
|
continue;
|
||||||
default:
|
default:
|
||||||
#ifdef PROFILE_TYPES
|
#ifdef PROFILE_TYPES
|
||||||
@ -2293,10 +2357,18 @@ read_dbx_symtab (desc, stringtab, stringtab_size, nlistlen, inclink,
|
|||||||
printf ("Funny...LSYM with a letter that isn't a type\n");
|
printf ("Funny...LSYM with a letter that isn't a type\n");
|
||||||
autovars++;
|
autovars++;
|
||||||
#endif
|
#endif
|
||||||
|
/* Skip if the thing following the : is
|
||||||
|
not a letter (which indicates declaration of a local
|
||||||
|
variable, which we aren't interested in). */
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
case N_FUN:
|
case N_FUN:
|
||||||
|
#if 0
|
||||||
|
/* This special-casing of N_FUN is just wrong; N_FUN
|
||||||
|
does not mean "function"; it means "text segment".
|
||||||
|
So N_FUN can go with 'V', etc. as well as 'f' or 'F'. */
|
||||||
|
|
||||||
SET_NAMESTRING();
|
SET_NAMESTRING();
|
||||||
|
|
||||||
p = (char *) index (namestring, ':');
|
p = (char *) index (namestring, ':');
|
||||||
@ -2314,7 +2386,7 @@ read_dbx_symtab (desc, stringtab, stringtab_size, nlistlen, inclink,
|
|||||||
static_psymbols, bufp->n_value);
|
static_psymbols, bufp->n_value);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
#endif /* 0 */
|
||||||
case N_GSYM: /* Global (extern) variable; can be
|
case N_GSYM: /* Global (extern) variable; can be
|
||||||
data or bss (sigh). */
|
data or bss (sigh). */
|
||||||
case N_STSYM: /* Data seg var -- static */
|
case N_STSYM: /* Data seg var -- static */
|
||||||
@ -2369,17 +2441,36 @@ read_dbx_symtab (desc, stringtab, stringtab_size, nlistlen, inclink,
|
|||||||
global_psymbols, bufp->n_value);
|
global_psymbols, bufp->n_value);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* I don't think the default case should happen. A breakpoint
|
case 'f':
|
||||||
here to check would probably be good. */
|
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
|
||||||
default:
|
VAR_NAMESPACE, LOC_BLOCK,
|
||||||
|
static_psymbols, bufp->n_value);
|
||||||
|
continue;
|
||||||
|
|
||||||
/* Two things show up here (hopefully); static symbols of
|
/* Two things show up here (hopefully); static symbols of
|
||||||
local scope (static used inside braces) or extensions
|
local scope (static used inside braces) or extensions
|
||||||
of structure symbols. We can ignore both. */
|
of structure symbols. We can ignore both. */
|
||||||
if (p[1] != 'V' && p[1] != '('
|
case 'V':
|
||||||
&& (p[1] < '0' || p[1] > '9'))
|
case '(':
|
||||||
fatal ("Internal error: Unexpected debugging symbol type '%c' at symnum %d.\n",
|
case '0':
|
||||||
p[1], symnum);
|
case '1':
|
||||||
|
case '2':
|
||||||
|
case '3':
|
||||||
|
case '4':
|
||||||
|
case '5':
|
||||||
|
case '6':
|
||||||
|
case '7':
|
||||||
|
case '8':
|
||||||
|
case '9':
|
||||||
|
/* Global functions are ignored here. I'm not
|
||||||
|
sure what psymtab they go into (or just the misc
|
||||||
|
function vector). */
|
||||||
|
case 'F':
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fatal ("Internal error: Unexpected debugging symbol type '%c' at symnum %d.\n",
|
||||||
|
p[1], symnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef N_BINCL
|
#ifdef N_BINCL
|
||||||
@ -3656,6 +3747,32 @@ add_file_command (arg_string)
|
|||||||
printf ("done.\n");
|
printf ("done.\n");
|
||||||
fflush (stdout);
|
fflush (stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read a number by which a type is referred to in dbx data,
|
||||||
|
or perhaps read a pair (FILENUM, TYPENUM) in parentheses.
|
||||||
|
Just a single number N is equivalent to (0,N).
|
||||||
|
Return the two numbers by storing them in the vector TYPENUMS.
|
||||||
|
TYPENUMS will then be used as an argument to dbx_lookup_type. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
read_type_number (pp, typenums)
|
||||||
|
register char **pp;
|
||||||
|
register int *typenums;
|
||||||
|
{
|
||||||
|
if (**pp == '(')
|
||||||
|
{
|
||||||
|
(*pp)++;
|
||||||
|
typenums[0] = read_number (pp, ',');
|
||||||
|
typenums[1] = read_number (pp, ')');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
typenums[0] = 0;
|
||||||
|
typenums[1] = read_number (pp, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static struct symbol *
|
static struct symbol *
|
||||||
define_symbol (value, string, desc)
|
define_symbol (value, string, desc)
|
||||||
@ -3696,7 +3813,10 @@ define_symbol (value, string, desc)
|
|||||||
|
|
||||||
/* c is a special case, not followed by a type-number.
|
/* c is a special case, not followed by a type-number.
|
||||||
SYMBOL:c=iVALUE for an integer constant symbol.
|
SYMBOL:c=iVALUE for an integer constant symbol.
|
||||||
SYMBOL:c=rVALUE for a floating constant symbol. */
|
SYMBOL:c=rVALUE for a floating constant symbol.
|
||||||
|
SYMBOL:c=eTYPE,INTVALUE for an enum constant symbol.
|
||||||
|
e.g. "b:c=e6,0" for "const b = blob1"
|
||||||
|
(where type 6 is defined by "blobs:t6=eblob1:0,blob2:1,;"). */
|
||||||
if (deftype == 'c')
|
if (deftype == 'c')
|
||||||
{
|
{
|
||||||
if (*p++ != '=')
|
if (*p++ != '=')
|
||||||
@ -3722,6 +3842,22 @@ define_symbol (value, string, desc)
|
|||||||
SYMBOL_CLASS (sym) = LOC_CONST;
|
SYMBOL_CLASS (sym) = LOC_CONST;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 'e':
|
||||||
|
/* SYMBOL:c=eTYPE,INTVALUE for an enum constant symbol.
|
||||||
|
e.g. "b:c=e6,0" for "const b = blob1"
|
||||||
|
(where type 6 is defined by "blobs:t6=eblob1:0,blob2:1,;"). */
|
||||||
|
{
|
||||||
|
int typenums[2];
|
||||||
|
|
||||||
|
read_type_number (&p, typenums);
|
||||||
|
if (*p++ != ',')
|
||||||
|
error ("Invalid symbol data: no comma in enum const symbol");
|
||||||
|
|
||||||
|
SYMBOL_TYPE (sym) = *dbx_lookup_type (typenums);
|
||||||
|
SYMBOL_VALUE (sym) = atoi (p);
|
||||||
|
SYMBOL_CLASS (sym) = LOC_CONST;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
error ("Invalid symbol data at symtab pos %d.", symnum);
|
error ("Invalid symbol data at symtab pos %d.", symnum);
|
||||||
}
|
}
|
||||||
@ -3796,9 +3932,40 @@ define_symbol (value, string, desc)
|
|||||||
SYMBOL_VALUE (sym) = value;
|
SYMBOL_VALUE (sym) = value;
|
||||||
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
|
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
|
||||||
add_symbol_to_list (sym, &local_symbols);
|
add_symbol_to_list (sym, &local_symbols);
|
||||||
|
|
||||||
/* If it's compiled, if it says `short', believe it. */
|
/* If it's compiled, if it says `short', believe it. */
|
||||||
if (processing_gcc_compilation || BELIEVE_PCC_PROMOTION)
|
if (processing_gcc_compilation || BELIEVE_PCC_PROMOTION)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#if defined(BELIEVE_PCC_PROMOTION_TYPE)
|
||||||
|
/* This macro is defined on machines (e.g. sparc) where
|
||||||
|
we should believe the type of a PCC 'short' argument,
|
||||||
|
but shouldn't believe the address (the address is
|
||||||
|
the address of the corresponding int). Note that
|
||||||
|
this is only different from the BELIEVE_PCC_PROMOTION
|
||||||
|
case on big-endian machines.
|
||||||
|
|
||||||
|
My guess is that this correction, as opposed to changing
|
||||||
|
the parameter to an 'int' (as done below, for PCC
|
||||||
|
on most machines), is the right thing to do
|
||||||
|
on all machines, but I don't want to risk breaking
|
||||||
|
something that already works. On most PCC machines,
|
||||||
|
the sparc problem doesn't come up because the calling
|
||||||
|
function has to zero the top bytes (not knowing whether
|
||||||
|
the called function wants an int or a short), so there
|
||||||
|
is no practical difference between an int and a short
|
||||||
|
(except perhaps what happens when the GDB user types
|
||||||
|
"print short_arg = 0x10000;"). */
|
||||||
|
if (SYMBOL_TYPE (sym) == builtin_type_char
|
||||||
|
|| SYMBOL_TYPE (sym) == builtin_type_unsigned_char)
|
||||||
|
SYMBOL_VALUE (sym) += 3;
|
||||||
|
if (SYMBOL_TYPE (sym) == builtin_type_short
|
||||||
|
|| SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
|
||||||
|
SYMBOL_VALUE (sym) += 2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
#else /* no BELIEVE_PCC_PROMOTION_TYPE. */
|
||||||
|
|
||||||
/* If PCC says a parameter is a short or a char,
|
/* If PCC says a parameter is a short or a char,
|
||||||
it is really an int. */
|
it is really an int. */
|
||||||
if (SYMBOL_TYPE (sym) == builtin_type_char
|
if (SYMBOL_TYPE (sym) == builtin_type_char
|
||||||
@ -3809,6 +3976,8 @@ define_symbol (value, string, desc)
|
|||||||
SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
|
SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
#endif /* no BELIEVE_PCC_PROMOTION_TYPE. */
|
||||||
|
|
||||||
case 'P':
|
case 'P':
|
||||||
SYMBOL_CLASS (sym) = LOC_REGPARM;
|
SYMBOL_CLASS (sym) = LOC_REGPARM;
|
||||||
SYMBOL_VALUE (sym) = STAB_REG_TO_REGNUM (value);
|
SYMBOL_VALUE (sym) = STAB_REG_TO_REGNUM (value);
|
||||||
@ -3960,30 +4129,6 @@ cleanup_undefined_types ()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Read a number by which a type is referred to in dbx data,
|
|
||||||
or perhaps read a pair (FILENUM, TYPENUM) in parentheses.
|
|
||||||
Just a single number N is equivalent to (0,N).
|
|
||||||
Return the two numbers by storing them in the vector TYPENUMS.
|
|
||||||
TYPENUMS will then be used as an argument to dbx_lookup_type. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
read_type_number (pp, typenums)
|
|
||||||
register char **pp;
|
|
||||||
register int *typenums;
|
|
||||||
{
|
|
||||||
if (**pp == '(')
|
|
||||||
{
|
|
||||||
(*pp)++;
|
|
||||||
typenums[0] = read_number (pp, ',');
|
|
||||||
typenums[1] = read_number (pp, ')');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
typenums[0] = 0;
|
|
||||||
typenums[1] = read_number (pp, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read a dbx type reference or definition;
|
/* Read a dbx type reference or definition;
|
||||||
return the type that is meant.
|
return the type that is meant.
|
||||||
This can be just a number, in which case it references
|
This can be just a number, in which case it references
|
||||||
@ -4508,6 +4653,16 @@ read_struct_type (pp, type)
|
|||||||
list->field.bitpos = read_number (pp, ',');
|
list->field.bitpos = read_number (pp, ',');
|
||||||
list->field.bitsize = read_number (pp, ';');
|
list->field.bitsize = read_number (pp, ';');
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* This is wrong because this is identical to the symbols
|
||||||
|
produced for GCC 0-size arrays. For example:
|
||||||
|
typedef union {
|
||||||
|
int num;
|
||||||
|
char str[0];
|
||||||
|
} foo;
|
||||||
|
The code which dumped core in such circumstances should be
|
||||||
|
fixed not to dump core. */
|
||||||
|
|
||||||
/* g++ -g0 can put out bitpos & bitsize zero for a static
|
/* g++ -g0 can put out bitpos & bitsize zero for a static
|
||||||
field. This does not give us any way of getting its
|
field. This does not give us any way of getting its
|
||||||
class, so we can't know its name. But we can just
|
class, so we can't know its name. But we can just
|
||||||
@ -4536,6 +4691,7 @@ Therefore GDB will not know about your class variables.\n\
|
|||||||
list = list->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
#endif /* 0 */
|
||||||
{
|
{
|
||||||
/* Detect an unpacked field and mark it as such.
|
/* Detect an unpacked field and mark it as such.
|
||||||
dbx gives a bit size for all fields.
|
dbx gives a bit size for all fields.
|
||||||
|
@ -189,16 +189,16 @@ read_inferior_memory (memaddr, myaddr, len)
|
|||||||
{
|
{
|
||||||
errno = 0;
|
errno = 0;
|
||||||
#if 0
|
#if 0
|
||||||
This is now done by read_memory, because when this function did it,
|
/* This is now done by read_memory, because when this function did it,
|
||||||
reading a byte or short int hardware port read whole longs, causing
|
reading a byte or short int hardware port read whole longs, causing
|
||||||
serious side effects
|
serious side effects
|
||||||
such as bus errors and unexpected hardware operation. This would
|
such as bus errors and unexpected hardware operation. This would
|
||||||
also be a problem with ptrace if the inferior process could read
|
also be a problem with ptrace if the inferior process could read
|
||||||
or write hardware registers, but that's not usually the case.
|
or write hardware registers, but that's not usually the case. */
|
||||||
if (remote_debugging)
|
if (remote_debugging)
|
||||||
buffer[i] = remote_fetch_word (addr);
|
buffer[i] = remote_fetch_word (addr);
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
buffer[i] = ptrace (1, inferior_pid, addr, 0);
|
buffer[i] = ptrace (1, inferior_pid, addr, 0);
|
||||||
if (errno)
|
if (errno)
|
||||||
return errno;
|
return errno;
|
||||||
@ -413,6 +413,11 @@ core_file_command (filename, from_tty)
|
|||||||
perror_with_name ("Not a core file: reading upage");
|
perror_with_name ("Not a core file: reading upage");
|
||||||
if (val != sizeof u)
|
if (val != sizeof u)
|
||||||
error ("Not a core file: could only read %d bytes", val);
|
error ("Not a core file: could only read %d bytes", val);
|
||||||
|
|
||||||
|
/* We are depending on exec_file_command having been called
|
||||||
|
previously to set exec_data_start. Since the executable
|
||||||
|
and the core file share the same text segment, the address
|
||||||
|
of the data segment will be the same in both. */
|
||||||
data_start = exec_data_start;
|
data_start = exec_data_start;
|
||||||
|
|
||||||
data_end = data_start + NBPG * u.u_dsize;
|
data_end = data_start + NBPG * u.u_dsize;
|
||||||
|
@ -739,7 +739,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
|
|||||||
lval_memory);
|
lval_memory);
|
||||||
else if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_INT)
|
else if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_INT)
|
||||||
/* GDB allows dereferencing an int. */
|
/* GDB allows dereferencing an int. */
|
||||||
return value_zero (BUILTIN_TYPE_LONGEST, lval_memory);
|
return value_zero (builtin_type_int, lval_memory);
|
||||||
else
|
else
|
||||||
error ("Attempt to take contents of a non-pointer value.");
|
error ("Attempt to take contents of a non-pointer value.");
|
||||||
}
|
}
|
||||||
|
@ -111,3 +111,5 @@ extern struct symbol *get_pc_function ();
|
|||||||
/* In stack.c */
|
/* In stack.c */
|
||||||
extern FRAME find_relative_frame ();
|
extern FRAME find_relative_frame ();
|
||||||
|
|
||||||
|
/* Generic pointer value indicating "I don't know." */
|
||||||
|
#define Frame_unknown (CORE_ADDR)-1
|
||||||
|
@ -40,9 +40,9 @@ original English.
|
|||||||
@sp 1
|
@sp 1
|
||||||
@center The GNU Source-Level Debugger
|
@center The GNU Source-Level Debugger
|
||||||
@sp 4
|
@sp 4
|
||||||
@center Third Edition, GDB version 3.2
|
@center Third Edition, GDB version 3.4
|
||||||
@sp 1
|
@sp 1
|
||||||
@center April 1989
|
@center October 1989
|
||||||
@sp 5
|
@sp 5
|
||||||
@center Richard M. Stallman
|
@center Richard M. Stallman
|
||||||
@page
|
@page
|
||||||
@ -669,6 +669,9 @@ correct, but there's no sense in pushing your luck.
|
|||||||
GDB no longer supports the debugging information produced by giving the
|
GDB no longer supports the debugging information produced by giving the
|
||||||
GNU C compiler the @samp{-gg} option, so do not use this option.
|
GNU C compiler the @samp{-gg} option, so do not use this option.
|
||||||
|
|
||||||
|
@ignore
|
||||||
|
@comment As far as I know, there are no cases in which GDB will
|
||||||
|
@comment produce strange output in this case. (but no promises).
|
||||||
If your program includes archives made with the @code{ar} program, and
|
If your program includes archives made with the @code{ar} program, and
|
||||||
if the object files used as input to @code{ar} were compiled without the
|
if the object files used as input to @code{ar} were compiled without the
|
||||||
@samp{-g} option and have names longer than 15 characters, GDB will get
|
@samp{-g} option and have names longer than 15 characters, GDB will get
|
||||||
@ -680,6 +683,7 @@ names longer than 15 characters.
|
|||||||
To avoid this problem, compile the archive members with the @samp{-g}
|
To avoid this problem, compile the archive members with the @samp{-g}
|
||||||
option or use shorter file names. Alternatively, use a version of GNU
|
option or use shorter file names. Alternatively, use a version of GNU
|
||||||
@code{ar} dated more recently than August 1989.
|
@code{ar} dated more recently than August 1989.
|
||||||
|
@end ignore
|
||||||
|
|
||||||
@node Running, Stopping, Compilation, Top
|
@node Running, Stopping, Compilation, Top
|
||||||
@chapter Running Your Program Under GDB
|
@chapter Running Your Program Under GDB
|
||||||
@ -3341,13 +3345,19 @@ to correspond properly to the code.
|
|||||||
@node Remote, Commands, Emacs, Top
|
@node Remote, Commands, Emacs, Top
|
||||||
@chapter Remote Kernel Debugging
|
@chapter Remote Kernel Debugging
|
||||||
|
|
||||||
GDB has a special facility for debugging a remote machine via a serial
|
If you are trying to debug a program running on a machine that can't run
|
||||||
connection. This can be used for kernel debugging.
|
GDB in the usual way, it is often useful to use remote debugging. For
|
||||||
|
example, you might be debugging an operating system kernel, or debugging
|
||||||
|
a small system which does not have a general purpose operating system
|
||||||
|
powerful enough to run a full-featured debugger. Currently GDB supports
|
||||||
|
remote debugging over a serial connection.
|
||||||
|
|
||||||
The program to be debugged on the remote machine needs to contain a
|
The program to be debugged on the remote machine needs to contain a
|
||||||
debugging device driver which talks to GDB over the serial line using the
|
debugging device driver which talks to GDB over the serial line using the
|
||||||
protocol described below. The same version of GDB that is used ordinarily
|
protocol described below. The same version of GDB that is used ordinarily
|
||||||
can be used for this.
|
can be used for this. Several sample remote debugging drivers are
|
||||||
|
distributed with GDB; see the @file{README} file in the GDB distribution for
|
||||||
|
more information.
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Remote Commands:: Commands used to start and finish remote debugging.
|
* Remote Commands:: Commands used to start and finish remote debugging.
|
||||||
|
@ -1,6 +1,21 @@
|
|||||||
In other words, go ahead and share GDB, but don't try to stop
|
/* Machine-dependent code for a Hewlett-Packard 9000/300, running bsd.
|
||||||
anyone else from sharing it farther. Help stamp out software hoarding!
|
Copyright (C) 1986, 1987, 1989 Free Software Foundation, Inc.
|
||||||
*/
|
|
||||||
|
This file is part of GDB.
|
||||||
|
|
||||||
|
GDB is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 1, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
GDB is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
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 "defs.h"
|
#include "defs.h"
|
||||||
#include "param.h"
|
#include "param.h"
|
||||||
|
@ -767,6 +767,65 @@ i386_get_frame_setup (pc)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return number of args passed to a frame.
|
||||||
|
Can return -1, meaning no way to tell. */
|
||||||
|
|
||||||
|
/* on the 386, the instruction following the call could be:
|
||||||
|
* popl %ecx - one arg
|
||||||
|
* addl $imm, %esp - imm/4 args; imm may be 8 or 32 bits
|
||||||
|
* anything else - zero args
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
i386_frame_num_args (fi)
|
||||||
|
struct frame_info fi;
|
||||||
|
{
|
||||||
|
int retpc;
|
||||||
|
unsigned char op;
|
||||||
|
struct frame_info *pfi;
|
||||||
|
|
||||||
|
pfi = get_prev_frame_info ((fi));
|
||||||
|
if (pfi == 0)
|
||||||
|
{
|
||||||
|
/* Note: this can happen if we are looking at the frame for
|
||||||
|
main, because FRAME_CHAIN_VALID won't let us go into
|
||||||
|
start. If we have debugging symbols, that's not really
|
||||||
|
a big deal; it just means it will only show as many arguments
|
||||||
|
to main as are declared. */
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retpc = pfi->pc;
|
||||||
|
op = read_memory_integer (retpc, 1);
|
||||||
|
if (op == 0x59)
|
||||||
|
/* pop %ecx */
|
||||||
|
return 1;
|
||||||
|
else if (op == 0x83)
|
||||||
|
{
|
||||||
|
op = read_memory_integer (retpc+1, 1);
|
||||||
|
if (op == 0xc4)
|
||||||
|
/* addl $<signed imm 8 bits>, %esp */
|
||||||
|
return (read_memory_integer (retpc+2,1)&0xff)/4;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (op == 0x81)
|
||||||
|
{ /* add with 32 bit immediate */
|
||||||
|
op = read_memory_integer (retpc+1, 1);
|
||||||
|
if (op == 0xc4)
|
||||||
|
/* addl $<imm 32>, %esp */
|
||||||
|
return read_memory_integer (retpc+2, 4) / 4;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* parse the first few instructions of the function to see
|
* parse the first few instructions of the function to see
|
||||||
* what registers were stored.
|
* what registers were stored.
|
||||||
|
15
gdb/inflow.c
15
gdb/inflow.c
@ -470,6 +470,11 @@ inferior_died ()
|
|||||||
set_current_frame (0);
|
set_current_frame (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* This function is just for testing, and on some systems (Sony NewsOS
|
||||||
|
3.2) <sys/user.h> also includes <sys/time.h> which leads to errors
|
||||||
|
(since on this system at least sys/time.h is not protected against
|
||||||
|
multiple inclusion). */
|
||||||
static void
|
static void
|
||||||
try_writing_regs_command ()
|
try_writing_regs_command ()
|
||||||
{
|
{
|
||||||
@ -480,7 +485,12 @@ try_writing_regs_command ()
|
|||||||
if (inferior_pid == 0)
|
if (inferior_pid == 0)
|
||||||
error ("There is no inferior process now.");
|
error ("There is no inferior process now.");
|
||||||
|
|
||||||
for (i = 0; ; i += 2)
|
/* A Sun 3/50 or 3/60 (at least) running SunOS 4.0.3 will have a
|
||||||
|
kernel panic if we try to write past the end of the user area.
|
||||||
|
Presumably Sun will fix this bug (it has been reported), but it
|
||||||
|
is tacky to crash the system, so at least on SunOS4 we need to
|
||||||
|
stop writing when we hit the end of the user area. */
|
||||||
|
for (i = 0; i < sizeof (struct user); i += 2)
|
||||||
{
|
{
|
||||||
QUIT;
|
QUIT;
|
||||||
errno = 0;
|
errno = 0;
|
||||||
@ -495,6 +505,7 @@ try_writing_regs_command ()
|
|||||||
printf (" Failed at 0x%x.\n", i);
|
printf (" Failed at 0x%x.\n", i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
_initialize_inflow ()
|
_initialize_inflow ()
|
||||||
@ -502,9 +513,11 @@ _initialize_inflow ()
|
|||||||
add_com ("term-status", class_obscure, term_status_command,
|
add_com ("term-status", class_obscure, term_status_command,
|
||||||
"Print info on inferior's saved terminal status.");
|
"Print info on inferior's saved terminal status.");
|
||||||
|
|
||||||
|
#if 0
|
||||||
add_com ("try-writing-regs", class_obscure, try_writing_regs_command,
|
add_com ("try-writing-regs", class_obscure, try_writing_regs_command,
|
||||||
"Try writing all locations in inferior's system block.\n\
|
"Try writing all locations in inferior's system block.\n\
|
||||||
Report which ones can be written.");
|
Report which ones can be written.");
|
||||||
|
#endif
|
||||||
|
|
||||||
add_com ("kill", class_run, kill_command,
|
add_com ("kill", class_run, kill_command,
|
||||||
"Kill execution of program being debugged.");
|
"Kill execution of program being debugged.");
|
||||||
|
34
gdb/infrun.c
34
gdb/infrun.c
@ -139,9 +139,34 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
#include <sys/ptrace.h>
|
#include <sys/ptrace.h>
|
||||||
#endif /* UMAX_PTRACE */
|
#endif /* UMAX_PTRACE */
|
||||||
|
|
||||||
|
/* Required by <sys/user.h>. */
|
||||||
|
#include <sys/types.h>
|
||||||
|
/* Required by <sys/user.h>, at least on system V. */
|
||||||
|
#include <sys/dir.h>
|
||||||
|
/* Needed by IN_SIGTRAMP on some machines (e.g. vax). */
|
||||||
|
#include <sys/param.h>
|
||||||
|
/* Needed by IN_SIGTRAMP on some machines (e.g. vax). */
|
||||||
|
#include <sys/user.h>
|
||||||
|
|
||||||
extern char *sys_siglist[];
|
extern char *sys_siglist[];
|
||||||
extern int errno;
|
extern int errno;
|
||||||
|
|
||||||
|
/* Sigtramp is a routine that the kernel calls (which then calls the
|
||||||
|
signal handler). On most machines it is a library routine that
|
||||||
|
is linked into the executable.
|
||||||
|
|
||||||
|
This macro, given a program counter value and the name of the
|
||||||
|
function in which that PC resides (which can be null if the
|
||||||
|
name is not known), returns nonzero if the PC and name show
|
||||||
|
that we are in sigtramp.
|
||||||
|
|
||||||
|
On most machines just see if the name is sigtramp (and if we have
|
||||||
|
no name, assume we are not in sigtramp). */
|
||||||
|
#if !defined (IN_SIGTRAMP)
|
||||||
|
#define IN_SIGTRAMP(pc, name) \
|
||||||
|
name && !strcmp ("_sigtramp", name)
|
||||||
|
#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];
|
||||||
@ -534,8 +559,9 @@ wait_for_inferior ()
|
|||||||
stop_frame_address = FRAME_FP (get_current_frame ());
|
stop_frame_address = FRAME_FP (get_current_frame ());
|
||||||
stop_sp = read_register (SP_REGNUM);
|
stop_sp = read_register (SP_REGNUM);
|
||||||
stop_func_start = 0;
|
stop_func_start = 0;
|
||||||
/* Don't care about return value; stop_func_start will be 0
|
stop_func_name = 0;
|
||||||
if it doesn't work. */
|
/* Don't care about return value; stop_func_start and stop_func_name
|
||||||
|
will both be 0 if it doesn't work. */
|
||||||
(void) find_pc_partial_function (stop_pc, &stop_func_name,
|
(void) find_pc_partial_function (stop_pc, &stop_func_name,
|
||||||
&stop_func_start);
|
&stop_func_start);
|
||||||
stop_func_start += FUNCTION_START_OFFSET;
|
stop_func_start += FUNCTION_START_OFFSET;
|
||||||
@ -813,8 +839,8 @@ wait_for_inferior ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Did we just take a signal? */
|
/* Did we just take a signal? */
|
||||||
if (stop_func_name && !strcmp ("_sigtramp", stop_func_name)
|
if (IN_SIGTRAMP (stop_pc, stop_func_name)
|
||||||
&& (!prev_func_name || strcmp ("_sigtramp", prev_func_name)))
|
&& !IN_SIGTRAMP (prev_pc, prev_func_name))
|
||||||
{
|
{
|
||||||
/* We've just taken a signal; go until we are back to
|
/* We've just taken a signal; go until we are back to
|
||||||
the point where we took it and one more. */
|
the point where we took it and one more. */
|
||||||
|
624
gdb/isi-dep.c
Normal file
624
gdb/isi-dep.c
Normal file
@ -0,0 +1,624 @@
|
|||||||
|
/* Low level interface to ptrace, for GDB when running under Unix.
|
||||||
|
Copyright (C) 1988 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
GDB is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY. No author or distributor accepts responsibility to anyone
|
||||||
|
for the consequences of using it or for whether it serves any
|
||||||
|
particular purpose or works at all, unless he says so in writing.
|
||||||
|
Refer to the GDB General Public License for full details.
|
||||||
|
|
||||||
|
Everyone is granted permission to copy, modify and redistribute GDB,
|
||||||
|
but only under the conditions described in the GDB General Public
|
||||||
|
License. A copy of this license is supposed to have been given to you
|
||||||
|
along with GDB so you can know your rights and responsibilities. It
|
||||||
|
should be in a file named COPYING. Among other things, the copyright
|
||||||
|
notice and this notice must be preserved on all copies.
|
||||||
|
|
||||||
|
In other words, go ahead and share GDB, but don't try to stop
|
||||||
|
anyone else from sharing it farther. Help stamp out software hoarding!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "defs.h"
|
||||||
|
#include "param.h"
|
||||||
|
#include "frame.h"
|
||||||
|
#include "inferior.h"
|
||||||
|
|
||||||
|
#ifdef USG
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/dir.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/user.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#ifdef COFF_ENCAPSULATE
|
||||||
|
#include "a.out.encap.h"
|
||||||
|
#else
|
||||||
|
#include <a.out.h>
|
||||||
|
#endif
|
||||||
|
#ifndef N_SET_MAGIC
|
||||||
|
#define N_SET_MAGIC(exec, val) ((exec).a_magic = (val))
|
||||||
|
#endif
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <sys/ptrace.h>
|
||||||
|
#ifdef ATTACH_DETACH
|
||||||
|
static int oldParent;
|
||||||
|
extern int attach_flag;
|
||||||
|
#endif /* ATTACH_DETACH */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mapping of register numbers to their position in the stack
|
||||||
|
*/
|
||||||
|
#include <machine/reg.h>
|
||||||
|
int rloc[] = {
|
||||||
|
R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, R13, FP, SP, PS, PC
|
||||||
|
};
|
||||||
|
|
||||||
|
extern int errno;
|
||||||
|
|
||||||
|
/* This function simply calls ptrace with the given arguments.
|
||||||
|
It exists so that all calls to ptrace are isolated in this
|
||||||
|
machine-dependent file. */
|
||||||
|
int
|
||||||
|
call_ptrace (request, pid, arg3, arg4)
|
||||||
|
int request, pid, arg3, arg4;
|
||||||
|
{
|
||||||
|
return ptrace (request, pid, arg3, arg4);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ATTACH_DETACH
|
||||||
|
/* Start debugging the process whose number is PID. */
|
||||||
|
|
||||||
|
attach (pid)
|
||||||
|
int pid;
|
||||||
|
{
|
||||||
|
errno = 0;
|
||||||
|
oldParent = ptrace (PT_ATTACH, pid, 0, 0);
|
||||||
|
if (errno)
|
||||||
|
perror_with_name ("ptrace");
|
||||||
|
attach_flag = 1;
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Stop debugging the process whose number is PID
|
||||||
|
and continue it with signal number SIGNAL.
|
||||||
|
SIGNAL = 0 means just continue it. */
|
||||||
|
|
||||||
|
void
|
||||||
|
detach (signal)
|
||||||
|
int signal;
|
||||||
|
{
|
||||||
|
errno = 0;
|
||||||
|
ptrace (PT_DETACH, inferior_pid, signal, oldParent);
|
||||||
|
if (errno)
|
||||||
|
perror_with_name ("ptrace");
|
||||||
|
attach_flag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ATTACH_DETACH */
|
||||||
|
|
||||||
|
kill_inferior ()
|
||||||
|
{
|
||||||
|
if (remote_debugging)
|
||||||
|
return;
|
||||||
|
if (inferior_pid == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef ATTACH_DETACH
|
||||||
|
if (attach_flag) {
|
||||||
|
/*
|
||||||
|
* Need to detach so the old parent gets notified of the death.
|
||||||
|
*/
|
||||||
|
detach(SIGKILL);
|
||||||
|
} else {
|
||||||
|
#endif /* ATTACH_DETACH */
|
||||||
|
ptrace (PT_KILL, inferior_pid, 0, 0);
|
||||||
|
wait (0);
|
||||||
|
#ifdef ATTACH_DETACH
|
||||||
|
}
|
||||||
|
#endif /* ATTACH_DETACH */
|
||||||
|
inferior_died ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is used when GDB is exiting. It gives less chance of error.*/
|
||||||
|
|
||||||
|
kill_inferior_fast ()
|
||||||
|
{
|
||||||
|
if (remote_debugging)
|
||||||
|
return;
|
||||||
|
if (inferior_pid == 0)
|
||||||
|
return;
|
||||||
|
#ifdef ATTACH_DETACH
|
||||||
|
if (attach_flag) {
|
||||||
|
detach(SIGKILL);
|
||||||
|
} else {
|
||||||
|
#endif /* ATTACH_DETACH */
|
||||||
|
ptrace (PT_KILL, inferior_pid, 0, 0);
|
||||||
|
wait (0);
|
||||||
|
#ifdef ATTACH_DETACH
|
||||||
|
}
|
||||||
|
#endif /* ATTACH_DETACH */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Resume execution of the inferior process.
|
||||||
|
If STEP is nonzero, single-step it.
|
||||||
|
If SIGNAL is nonzero, give it that signal. */
|
||||||
|
|
||||||
|
void
|
||||||
|
resume (step, signal)
|
||||||
|
int step;
|
||||||
|
int signal;
|
||||||
|
{
|
||||||
|
errno = 0;
|
||||||
|
if (remote_debugging)
|
||||||
|
remote_resume (step, signal);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ptrace (step ? PT_STEP : PT_CONTINUE, inferior_pid, 1, signal);
|
||||||
|
if (errno)
|
||||||
|
perror_with_name ("ptrace");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
fetch_inferior_registers ()
|
||||||
|
{
|
||||||
|
register int regno;
|
||||||
|
register unsigned int regaddr;
|
||||||
|
char buf[MAX_REGISTER_RAW_SIZE];
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
struct user u;
|
||||||
|
unsigned int offset = (char *) &u.u_ar0 - (char *) &u;
|
||||||
|
offset = ptrace (3, inferior_pid, offset, 0) - KERNEL_U_ADDR;
|
||||||
|
|
||||||
|
for (regno = 0; regno < NUM_REGS; regno++)
|
||||||
|
{
|
||||||
|
regaddr = register_addr (regno, offset);
|
||||||
|
for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (int))
|
||||||
|
{
|
||||||
|
*(int *) &buf[i] = ptrace (3, inferior_pid, regaddr, 0);
|
||||||
|
regaddr += sizeof (int);
|
||||||
|
}
|
||||||
|
supply_register (regno, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store our register values back into the inferior.
|
||||||
|
If REGNO is -1, do this for all registers.
|
||||||
|
Otherwise, REGNO specifies which register (so we can save time). */
|
||||||
|
|
||||||
|
store_inferior_registers (regno)
|
||||||
|
int regno;
|
||||||
|
{
|
||||||
|
register unsigned int regaddr;
|
||||||
|
char buf[80];
|
||||||
|
|
||||||
|
struct user u;
|
||||||
|
unsigned int offset = (char *) &u.u_ar0 - (char *) &u;
|
||||||
|
offset = ptrace (3, inferior_pid, offset, 0) - KERNEL_U_ADDR;
|
||||||
|
|
||||||
|
if (regno >= 0)
|
||||||
|
{
|
||||||
|
regaddr = register_addr (regno, offset);
|
||||||
|
errno = 0;
|
||||||
|
ptrace (6, inferior_pid, regaddr, read_register (regno));
|
||||||
|
if (errno != 0)
|
||||||
|
{
|
||||||
|
sprintf (buf, "writing register number %d", regno);
|
||||||
|
perror_with_name (buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else for (regno = 0; regno < NUM_REGS; regno++)
|
||||||
|
{
|
||||||
|
regaddr = register_addr (regno, offset);
|
||||||
|
errno = 0;
|
||||||
|
ptrace (6, inferior_pid, regaddr, read_register (regno));
|
||||||
|
if (errno != 0)
|
||||||
|
{
|
||||||
|
sprintf (buf, "writing register number %d", regno);
|
||||||
|
perror_with_name (buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy LEN bytes from inferior's memory starting at MEMADDR
|
||||||
|
to debugger memory starting at MYADDR.
|
||||||
|
On failure (cannot read from inferior, usually because address is out
|
||||||
|
of bounds) returns the value of errno. */
|
||||||
|
|
||||||
|
int
|
||||||
|
read_inferior_memory (memaddr, myaddr, len)
|
||||||
|
CORE_ADDR memaddr;
|
||||||
|
char *myaddr;
|
||||||
|
int len;
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
/* Round starting address down to longword boundary. */
|
||||||
|
register CORE_ADDR addr = memaddr & - sizeof (int);
|
||||||
|
/* Round ending address up; get number of longwords that makes. */
|
||||||
|
register int count
|
||||||
|
= (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
|
||||||
|
/* Allocate buffer of that many longwords. */
|
||||||
|
register int *buffer = (int *) alloca (count * sizeof (int));
|
||||||
|
extern int errno;
|
||||||
|
|
||||||
|
/* Read all the longwords */
|
||||||
|
for (i = 0; i < count; i++, addr += sizeof (int))
|
||||||
|
{
|
||||||
|
errno = 0;
|
||||||
|
if (remote_debugging)
|
||||||
|
buffer[i] = remote_fetch_word (addr);
|
||||||
|
else
|
||||||
|
buffer[i] = ptrace (1, inferior_pid, addr, 0);
|
||||||
|
if (errno)
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy appropriate bytes out of the buffer. */
|
||||||
|
bcopy ((char *) buffer + (memaddr & (sizeof (int) - 1)), myaddr, len);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy LEN bytes of data from debugger memory at MYADDR
|
||||||
|
to inferior's memory at MEMADDR.
|
||||||
|
On failure (cannot write the inferior)
|
||||||
|
returns the value of errno. */
|
||||||
|
|
||||||
|
int
|
||||||
|
write_inferior_memory (memaddr, myaddr, len)
|
||||||
|
CORE_ADDR memaddr;
|
||||||
|
char *myaddr;
|
||||||
|
int len;
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
/* Round starting address down to longword boundary. */
|
||||||
|
register CORE_ADDR addr = memaddr & - sizeof (int);
|
||||||
|
/* Round ending address up; get number of longwords that makes. */
|
||||||
|
register int count
|
||||||
|
= (((memaddr + len) - addr) + sizeof (int) - 1) / sizeof (int);
|
||||||
|
/* Allocate buffer of that many longwords. */
|
||||||
|
register int *buffer = (int *) alloca (count * sizeof (int));
|
||||||
|
extern int errno;
|
||||||
|
|
||||||
|
/* Fill start and end extra bytes of buffer with existing memory data. */
|
||||||
|
|
||||||
|
if (remote_debugging)
|
||||||
|
buffer[0] = remote_fetch_word (addr);
|
||||||
|
else
|
||||||
|
buffer[0] = ptrace (1, inferior_pid, addr, 0);
|
||||||
|
|
||||||
|
if (count > 1)
|
||||||
|
{
|
||||||
|
if (remote_debugging)
|
||||||
|
buffer[count - 1]
|
||||||
|
= remote_fetch_word (addr + (count - 1) * sizeof (int));
|
||||||
|
else
|
||||||
|
buffer[count - 1]
|
||||||
|
= ptrace (1, inferior_pid,
|
||||||
|
addr + (count - 1) * sizeof (int), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy data to be written over corresponding part of buffer */
|
||||||
|
|
||||||
|
bcopy (myaddr, (char *) buffer + (memaddr & (sizeof (int) - 1)), len);
|
||||||
|
|
||||||
|
/* Write the entire buffer. */
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++, addr += sizeof (int))
|
||||||
|
{
|
||||||
|
errno = 0;
|
||||||
|
if (remote_debugging)
|
||||||
|
remote_store_word (addr, buffer[i]);
|
||||||
|
else
|
||||||
|
ptrace (4, inferior_pid, addr, buffer[i]);
|
||||||
|
if (errno)
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Work with core dump and executable files, for GDB.
|
||||||
|
This code would be in core.c if it weren't machine-dependent. */
|
||||||
|
|
||||||
|
/* Recognize COFF format systems because a.out.h defines AOUTHDR. */
|
||||||
|
#ifdef AOUTHDR
|
||||||
|
#define COFF_FORMAT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef N_TXTADDR
|
||||||
|
#define N_TXTADDR(hdr) 0
|
||||||
|
#endif /* no N_TXTADDR */
|
||||||
|
|
||||||
|
#ifndef N_DATADDR
|
||||||
|
#define N_DATADDR(hdr) hdr.a_text
|
||||||
|
#endif /* no N_DATADDR */
|
||||||
|
|
||||||
|
/* Make COFF and non-COFF names for things a little more compatible
|
||||||
|
to reduce conditionals later. */
|
||||||
|
|
||||||
|
#ifdef COFF_FORMAT
|
||||||
|
#define a_magic magic
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef COFF_FORMAT
|
||||||
|
#define AOUTHDR struct exec
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern char *sys_siglist[];
|
||||||
|
|
||||||
|
|
||||||
|
/* Hook for `exec_file_command' command to call. */
|
||||||
|
|
||||||
|
extern void (*exec_file_display_hook) ();
|
||||||
|
|
||||||
|
/* File names of core file and executable file. */
|
||||||
|
|
||||||
|
extern char *corefile;
|
||||||
|
extern char *execfile;
|
||||||
|
|
||||||
|
/* Descriptors on which core file and executable file are open.
|
||||||
|
Note that the execchan is closed when an inferior is created
|
||||||
|
and reopened if the inferior dies or is killed. */
|
||||||
|
|
||||||
|
extern int corechan;
|
||||||
|
extern int execchan;
|
||||||
|
|
||||||
|
/* Last modification time of executable file.
|
||||||
|
Also used in source.c to compare against mtime of a source file. */
|
||||||
|
|
||||||
|
extern int exec_mtime;
|
||||||
|
|
||||||
|
/* Virtual addresses of bounds of the two areas of memory in the core file. */
|
||||||
|
|
||||||
|
extern CORE_ADDR data_start;
|
||||||
|
extern CORE_ADDR data_end;
|
||||||
|
extern CORE_ADDR stack_start;
|
||||||
|
extern CORE_ADDR stack_end;
|
||||||
|
|
||||||
|
/* Virtual addresses of bounds of two areas of memory in the exec file.
|
||||||
|
Note that the data area in the exec file is used only when there is no core file. */
|
||||||
|
|
||||||
|
extern CORE_ADDR text_start;
|
||||||
|
extern CORE_ADDR text_end;
|
||||||
|
|
||||||
|
extern CORE_ADDR exec_data_start;
|
||||||
|
extern CORE_ADDR exec_data_end;
|
||||||
|
|
||||||
|
/* Address in executable file of start of text area data. */
|
||||||
|
|
||||||
|
extern int text_offset;
|
||||||
|
|
||||||
|
/* Address in executable file of start of data area data. */
|
||||||
|
|
||||||
|
extern int exec_data_offset;
|
||||||
|
|
||||||
|
/* Address in core file of start of data area data. */
|
||||||
|
|
||||||
|
extern int data_offset;
|
||||||
|
|
||||||
|
/* Address in core file of start of stack area data. */
|
||||||
|
|
||||||
|
extern int stack_offset;
|
||||||
|
|
||||||
|
#ifdef COFF_FORMAT
|
||||||
|
/* various coff data structures */
|
||||||
|
|
||||||
|
extern FILHDR file_hdr;
|
||||||
|
extern SCNHDR text_hdr;
|
||||||
|
extern SCNHDR data_hdr;
|
||||||
|
|
||||||
|
#endif /* not COFF_FORMAT */
|
||||||
|
|
||||||
|
/* a.out header saved in core file. */
|
||||||
|
|
||||||
|
extern AOUTHDR core_aouthdr;
|
||||||
|
|
||||||
|
/* a.out header of exec file. */
|
||||||
|
|
||||||
|
extern AOUTHDR exec_aouthdr;
|
||||||
|
|
||||||
|
extern void validate_files ();
|
||||||
|
|
||||||
|
core_file_command (filename, from_tty)
|
||||||
|
char *filename;
|
||||||
|
int from_tty;
|
||||||
|
{
|
||||||
|
int val;
|
||||||
|
extern char registers[];
|
||||||
|
|
||||||
|
/* Discard all vestiges of any previous core file
|
||||||
|
and mark data and stack spaces as empty. */
|
||||||
|
|
||||||
|
if (corefile)
|
||||||
|
free (corefile);
|
||||||
|
corefile = 0;
|
||||||
|
|
||||||
|
if (corechan >= 0)
|
||||||
|
close (corechan);
|
||||||
|
corechan = -1;
|
||||||
|
|
||||||
|
data_start = 0;
|
||||||
|
data_end = 0;
|
||||||
|
stack_start = STACK_END_ADDR;
|
||||||
|
stack_end = STACK_END_ADDR;
|
||||||
|
|
||||||
|
/* Now, if a new core file was specified, open it and digest it. */
|
||||||
|
|
||||||
|
if (filename)
|
||||||
|
{
|
||||||
|
filename = tilde_expand (filename);
|
||||||
|
make_cleanup (free, filename);
|
||||||
|
|
||||||
|
if (have_inferior_p ())
|
||||||
|
error ("To look at a core file, you must kill the inferior with \"kill\".");
|
||||||
|
corechan = open (filename, O_RDONLY, 0);
|
||||||
|
if (corechan < 0)
|
||||||
|
perror_with_name (filename);
|
||||||
|
/* 4.2-style (and perhaps also sysV-style) core dump file. */
|
||||||
|
{
|
||||||
|
struct user u;
|
||||||
|
|
||||||
|
int reg_offset;
|
||||||
|
|
||||||
|
val = myread (corechan, &u, sizeof u);
|
||||||
|
if (val < 0)
|
||||||
|
perror_with_name (filename);
|
||||||
|
data_start = exec_data_start;
|
||||||
|
|
||||||
|
data_end = data_start + NBPG * u.u_dsize;
|
||||||
|
stack_start = stack_end - NBPG * u.u_ssize;
|
||||||
|
data_offset = NBPG * UPAGES;
|
||||||
|
stack_offset = NBPG * (UPAGES + u.u_dsize);
|
||||||
|
reg_offset = (int) u.u_ar0 - KERNEL_U_ADDR;
|
||||||
|
|
||||||
|
/* I don't know where to find this info.
|
||||||
|
So, for now, mark it as not available. */
|
||||||
|
N_SET_MAGIC (core_aouthdr, 0);
|
||||||
|
|
||||||
|
/* Read the register values out of the core file and store
|
||||||
|
them where `read_register' will find them. */
|
||||||
|
|
||||||
|
{
|
||||||
|
register int regno;
|
||||||
|
|
||||||
|
for (regno = 0; regno < NUM_REGS; regno++)
|
||||||
|
{
|
||||||
|
char buf[MAX_REGISTER_RAW_SIZE];
|
||||||
|
|
||||||
|
val = lseek (corechan, register_addr (regno, reg_offset), 0);
|
||||||
|
if (val < 0)
|
||||||
|
perror_with_name (filename);
|
||||||
|
|
||||||
|
val = myread (corechan, buf, sizeof buf);
|
||||||
|
if (val < 0)
|
||||||
|
perror_with_name (filename);
|
||||||
|
supply_register (regno, buf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (filename[0] == '/')
|
||||||
|
corefile = savestring (filename, strlen (filename));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
corefile = concat (current_directory, "/", filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
set_current_frame ( create_new_frame (read_register (FP_REGNUM),
|
||||||
|
read_pc ()));
|
||||||
|
select_frame (get_current_frame (), 0);
|
||||||
|
validate_files ();
|
||||||
|
}
|
||||||
|
else if (from_tty)
|
||||||
|
printf ("No core file now.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
exec_file_command (filename, from_tty)
|
||||||
|
char *filename;
|
||||||
|
int from_tty;
|
||||||
|
{
|
||||||
|
int val;
|
||||||
|
|
||||||
|
/* Eliminate all traces of old exec file.
|
||||||
|
Mark text segment as empty. */
|
||||||
|
|
||||||
|
if (execfile)
|
||||||
|
free (execfile);
|
||||||
|
execfile = 0;
|
||||||
|
data_start = 0;
|
||||||
|
data_end -= exec_data_start;
|
||||||
|
text_start = 0;
|
||||||
|
text_end = 0;
|
||||||
|
exec_data_start = 0;
|
||||||
|
exec_data_end = 0;
|
||||||
|
if (execchan >= 0)
|
||||||
|
close (execchan);
|
||||||
|
execchan = -1;
|
||||||
|
|
||||||
|
/* Now open and digest the file the user requested, if any. */
|
||||||
|
|
||||||
|
if (filename)
|
||||||
|
{
|
||||||
|
filename = tilde_expand (filename);
|
||||||
|
make_cleanup (free, filename);
|
||||||
|
|
||||||
|
execchan = openp (getenv ("PATH"), 1, filename, O_RDONLY, 0,
|
||||||
|
&execfile);
|
||||||
|
if (execchan < 0)
|
||||||
|
perror_with_name (filename);
|
||||||
|
|
||||||
|
#ifdef COFF_FORMAT
|
||||||
|
{
|
||||||
|
int aout_hdrsize;
|
||||||
|
int num_sections;
|
||||||
|
|
||||||
|
if (read_file_hdr (execchan, &file_hdr) < 0)
|
||||||
|
error ("\"%s\": not in executable format.", execfile);
|
||||||
|
|
||||||
|
aout_hdrsize = file_hdr.f_opthdr;
|
||||||
|
num_sections = file_hdr.f_nscns;
|
||||||
|
|
||||||
|
if (read_aout_hdr (execchan, &exec_aouthdr, aout_hdrsize) < 0)
|
||||||
|
error ("\"%s\": can't read optional aouthdr", execfile);
|
||||||
|
|
||||||
|
if (read_section_hdr (execchan, _TEXT, &text_hdr, num_sections) < 0)
|
||||||
|
error ("\"%s\": can't read text section header", execfile);
|
||||||
|
|
||||||
|
if (read_section_hdr (execchan, _DATA, &data_hdr, num_sections) < 0)
|
||||||
|
error ("\"%s\": can't read data section header", execfile);
|
||||||
|
|
||||||
|
text_start = exec_aouthdr.text_start;
|
||||||
|
text_end = text_start + exec_aouthdr.tsize;
|
||||||
|
text_offset = text_hdr.s_scnptr;
|
||||||
|
exec_data_start = exec_aouthdr.data_start;
|
||||||
|
exec_data_end = exec_data_start + exec_aouthdr.dsize;
|
||||||
|
exec_data_offset = data_hdr.s_scnptr;
|
||||||
|
data_start = exec_data_start;
|
||||||
|
data_end += exec_data_start;
|
||||||
|
exec_mtime = file_hdr.f_timdat;
|
||||||
|
}
|
||||||
|
#else /* not COFF_FORMAT */
|
||||||
|
{
|
||||||
|
struct stat st_exec;
|
||||||
|
|
||||||
|
#ifdef HEADER_SEEK_FD
|
||||||
|
HEADER_SEEK_FD (execchan);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
val = myread (execchan, &exec_aouthdr, sizeof (AOUTHDR));
|
||||||
|
|
||||||
|
if (val < 0)
|
||||||
|
perror_with_name (filename);
|
||||||
|
|
||||||
|
text_start = N_TXTADDR (exec_aouthdr);
|
||||||
|
exec_data_start = N_DATADDR (exec_aouthdr);
|
||||||
|
|
||||||
|
text_offset = N_TXTOFF (exec_aouthdr);
|
||||||
|
exec_data_offset = N_TXTOFF (exec_aouthdr) + exec_aouthdr.a_text;
|
||||||
|
|
||||||
|
text_end = text_start + exec_aouthdr.a_text;
|
||||||
|
exec_data_end = exec_data_start + exec_aouthdr.a_data;
|
||||||
|
data_start = exec_data_start;
|
||||||
|
data_end += exec_data_start;
|
||||||
|
|
||||||
|
fstat (execchan, &st_exec);
|
||||||
|
exec_mtime = st_exec.st_mtime;
|
||||||
|
}
|
||||||
|
#endif /* not COFF_FORMAT */
|
||||||
|
|
||||||
|
validate_files ();
|
||||||
|
}
|
||||||
|
else if (from_tty)
|
||||||
|
printf ("No exec file now.\n");
|
||||||
|
|
||||||
|
/* Tell display code (if any) about the changed file name. */
|
||||||
|
if (exec_file_display_hook)
|
||||||
|
(*exec_file_display_hook) (filename);
|
||||||
|
}
|
@ -57,8 +57,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
|
|
||||||
/* Symbol types to ignore. */
|
/* Symbol types to ignore. */
|
||||||
|
|
||||||
|
#if defined (N_MONPT)
|
||||||
#define IGNORE_SYMBOL(TYPE) \
|
#define IGNORE_SYMBOL(TYPE) \
|
||||||
(((TYPE) & ~N_EXT) == N_TBSS || ((TYPE) & ~N_EXT) == N_TDATA)
|
(((TYPE) & ~N_EXT) == N_TBSS \
|
||||||
|
|| ((TYPE) & ~N_EXT) == N_TDATA \
|
||||||
|
|| ((TYPE) & ~N_EXT) == N_MONPT)
|
||||||
|
#else /* no N_MONPT */
|
||||||
|
#define IGNORE_SYMBOL(TYPE) \
|
||||||
|
(((TYPE) & ~N_EXT) == N_TBSS \
|
||||||
|
|| ((TYPE) & ~N_EXT) == N_TDATA)
|
||||||
|
#endif /* no N_MONPT */
|
||||||
|
|
||||||
/* Use SIGCONT rather than SIGTSTP because convex Unix occasionally
|
/* Use SIGCONT rather than SIGTSTP because convex Unix occasionally
|
||||||
turkeys SIGTSTP. I think. */
|
turkeys SIGTSTP. I think. */
|
||||||
@ -119,7 +127,7 @@ extern unsigned text_end;
|
|||||||
#define SAVED_PC_AFTER_CALL(frame) \
|
#define SAVED_PC_AFTER_CALL(frame) \
|
||||||
read_memory_integer (read_register (SP_REGNUM), 4)
|
read_memory_integer (read_register (SP_REGNUM), 4)
|
||||||
|
|
||||||
/* Address of end of stack space.
|
/* Address of end of stack space.
|
||||||
This is ((USRSTACK + 0xfff) & -0x1000)) from <convex/vmparam.h> but
|
This is ((USRSTACK + 0xfff) & -0x1000)) from <convex/vmparam.h> but
|
||||||
that expression depends on the kernel version; instead, fetch a
|
that expression depends on the kernel version; instead, fetch a
|
||||||
page-zero pointer and get it from that. This will be invalid if
|
page-zero pointer and get it from that. This will be invalid if
|
||||||
@ -149,7 +157,7 @@ extern unsigned text_end;
|
|||||||
#define BREAKPOINT {0x7d,0x50}
|
#define BREAKPOINT {0x7d,0x50}
|
||||||
|
|
||||||
/* Amount PC must be decremented by after a breakpoint.
|
/* Amount PC must be decremented by after a breakpoint.
|
||||||
This is often the number of bytes in BREAKPOINT but not always.
|
This is often the number of bytes in BREAKPOINT but not always.
|
||||||
(The break PC needs to be decremented by 2, but we do it when the
|
(The break PC needs to be decremented by 2, but we do it when the
|
||||||
break frame is recognized and popped. That way gdb can tell breaks
|
break frame is recognized and popped. That way gdb can tell breaks
|
||||||
from trace traps with certainty.) */
|
from trace traps with certainty.) */
|
||||||
@ -228,7 +236,7 @@ extern unsigned text_end;
|
|||||||
#define REGISTER_BYTES (4*10 + 8*8)
|
#define REGISTER_BYTES (4*10 + 8*8)
|
||||||
|
|
||||||
/* Index within `registers' of the first byte of the space for
|
/* Index within `registers' of the first byte of the space for
|
||||||
register N.
|
register N.
|
||||||
NB: must match structure of struct syscall_context for correct operation */
|
NB: must match structure of struct syscall_context for correct operation */
|
||||||
|
|
||||||
#define REGISTER_BYTE(N) ((N) < s7_REGNUM ? 4*(N) : \
|
#define REGISTER_BYTE(N) ((N) < s7_REGNUM ? 4*(N) : \
|
||||||
@ -370,7 +378,7 @@ extern struct value *value_of_trapped_internalvar ();
|
|||||||
|
|
||||||
/* A macro that tells us whether the function invocation represented
|
/* A macro that tells us whether the function invocation represented
|
||||||
by FI does not have a frame on the stack associated with it. If it
|
by FI does not have a frame on the stack associated with it. If it
|
||||||
does not, FRAMELESS is set to 1, else 0.
|
does not, FRAMELESS is set to 1, else 0.
|
||||||
On convex, check at the return address for `callq' -- if so, frameless,
|
On convex, check at the return address for `callq' -- if so, frameless,
|
||||||
otherwise, not. */
|
otherwise, not. */
|
||||||
|
|
||||||
|
29
gdb/m-i386.h
29
gdb/m-i386.h
@ -287,34 +287,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
/* Return number of args passed to a frame.
|
/* Return number of args passed to a frame.
|
||||||
Can return -1, meaning no way to tell. */
|
Can return -1, meaning no way to tell. */
|
||||||
|
|
||||||
/* on the 386, the instruction following the call could be:
|
#define FRAME_NUM_ARGS(numargs, fi) (numargs) = i386_frame_num_args(fi)
|
||||||
* popl %ecx - one arg
|
|
||||||
* addl $imm, %esp - imm/4 args; imm may be 8 or 32 bits
|
|
||||||
* anything else - zero args
|
|
||||||
*/
|
|
||||||
#define FRAME_NUM_ARGS(numargs, fi) { \
|
|
||||||
int retpc; \
|
|
||||||
unsigned char op; \
|
|
||||||
struct frame_info *pfi; \
|
|
||||||
pfi = get_prev_frame_info ((fi)); \
|
|
||||||
retpc = pfi->pc; \
|
|
||||||
numargs = 0; \
|
|
||||||
op = read_memory_integer (retpc, 1); \
|
|
||||||
if (op == 0x59) \
|
|
||||||
/* pop %ecx */ \
|
|
||||||
(numargs) = 1; \
|
|
||||||
else if (op == 0x83) { \
|
|
||||||
op = read_memory_integer (retpc+1, 1); \
|
|
||||||
if (op == 0xc4) \
|
|
||||||
/* addl $<signed imm 8 bits>, %esp */ \
|
|
||||||
(numargs) = (read_memory_integer (retpc+2,1)&0xff)/4;\
|
|
||||||
} else if (op == 0x81) { /* add with 32 bit immediate */\
|
|
||||||
op = read_memory_integer (retpc+1, 1); \
|
|
||||||
if (op == 0xc4) \
|
|
||||||
/* addl $<imm 32>, %esp */ \
|
|
||||||
(numargs) = read_memory_integer (retpc+2, 4) / 4;\
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return number of bytes at start of arglist that are not really args. */
|
/* Return number of bytes at start of arglist that are not really args. */
|
||||||
|
|
||||||
|
@ -52,6 +52,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||||||
argument is in the upper half of the word reserved on the stack,
|
argument is in the upper half of the word reserved on the stack,
|
||||||
but puts it in the lower half. */
|
but puts it in the lower half. */
|
||||||
/* #define BELIEVE_PCC_PROMOTION 1 */
|
/* #define BELIEVE_PCC_PROMOTION 1 */
|
||||||
|
/* OK, I've added code to dbxread.c to deal with this case. */
|
||||||
|
#define BELIEVE_PCC_PROMOTION_TYPE
|
||||||
|
|
||||||
/* Offset from address of function to start of its code.
|
/* Offset from address of function to start of its code.
|
||||||
Zero on most machines. */
|
Zero on most machines. */
|
||||||
|
34
gdb/m-vax.h
34
gdb/m-vax.h
@ -101,6 +101,18 @@ fix to bug-gdb@prep.ai.mit.edu. */
|
|||||||
|
|
||||||
#define KERNEL_U_ADDR (0x80000000 - (UPAGES * NBPG))
|
#define KERNEL_U_ADDR (0x80000000 - (UPAGES * NBPG))
|
||||||
|
|
||||||
|
/* Same as offsetof macro from stddef.h (which 4.3BSD doesn't have). */
|
||||||
|
#define my_offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER)
|
||||||
|
|
||||||
|
/* On the VAX, sigtramp is in the u area. Note that this definition
|
||||||
|
includes both the subroutine at u_pcb.pcb_sigc[3], and the
|
||||||
|
routine at u_pcb.pcb_sigc[0] (which does a calls to u_pcb.pcb_sigc[3]).
|
||||||
|
I think this is what we want. */
|
||||||
|
#define IN_SIGTRAMP(pc, name) \
|
||||||
|
((pc) >= KERNEL_U_ADDR + my_offsetof (struct user, u_pcb.pcb_sigc[0]) \
|
||||||
|
&& (pc) < KERNEL_U_ADDR + my_offsetof (struct user, u_pcb.pcb_sigc[5]) \
|
||||||
|
)
|
||||||
|
|
||||||
/* Address of end of stack space. */
|
/* Address of end of stack space. */
|
||||||
|
|
||||||
#define STACK_END_ADDR (0x80000000 - (UPAGES * NBPG))
|
#define STACK_END_ADDR (0x80000000 - (UPAGES * NBPG))
|
||||||
@ -285,13 +297,27 @@ fix to bug-gdb@prep.ai.mit.edu. */
|
|||||||
|
|
||||||
#define FRAME_SAVED_PC(FRAME) (read_memory_integer ((FRAME)->frame + 16, 4))
|
#define FRAME_SAVED_PC(FRAME) (read_memory_integer ((FRAME)->frame + 16, 4))
|
||||||
|
|
||||||
/* Cannot find the AP register value directly from the FP value.
|
/* Cannot find the AP register value directly from the FP value. Must
|
||||||
Must find it saved in the frame called by this one, or in the AP register
|
find it saved in the frame called by this one, or in the AP
|
||||||
for the innermost frame. */
|
register for the innermost frame. However, there is no way to tell
|
||||||
|
the difference between the innermost frame and a frame for which we
|
||||||
|
just don't know the frame that it called (e.g. "info frame
|
||||||
|
0x7ffec789"). For the sake of argument suppose that the stack is
|
||||||
|
somewhat trashed (which is one reason that "info frame" exists).
|
||||||
|
So return Frame_unknown (indicating we don't know the address of
|
||||||
|
the arglist) if we don't know what frame this frame calls. */
|
||||||
|
#define FRAME_ARGS_ADDRESS_CORRECT(fi) \
|
||||||
|
(((fi)->next_frame \
|
||||||
|
? read_memory_integer ((fi)->next_frame + 8, 4) \
|
||||||
|
: /* read_register (AP_REGNUM) */ Frame_unknown))
|
||||||
|
|
||||||
|
/* In most of GDB, getting the args address is too important to
|
||||||
|
just say "I don't know". This is sometimes wrong, but c'est
|
||||||
|
la vie. */
|
||||||
#define FRAME_ARGS_ADDRESS(fi) \
|
#define FRAME_ARGS_ADDRESS(fi) \
|
||||||
(((fi)->next_frame \
|
(((fi)->next_frame \
|
||||||
? read_memory_integer ((fi)->next_frame + 8, 4) \
|
? read_memory_integer ((fi)->next_frame + 8, 4) \
|
||||||
: read_register (AP_REGNUM)))
|
: read_register (AP_REGNUM) /* Frame_unknown */))
|
||||||
|
|
||||||
#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
|
#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
|
||||||
|
|
||||||
|
@ -773,6 +773,10 @@ print_base (regno, disp, stream)
|
|||||||
fprintf_filtered (stream, "%d(%s)", disp, reg_names[regno]);
|
fprintf_filtered (stream, "%d(%s)", disp, reg_names[regno]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Nonzero if the host system has a 68881 (or compatible)
|
||||||
|
floating-point unit. This does *not* indicate whether the target
|
||||||
|
system has a co-processor, just whether the host system does.
|
||||||
|
There might be a difference in the case of remote debugging. */
|
||||||
static int have_fpu = 1;
|
static int have_fpu = 1;
|
||||||
|
|
||||||
/* This is not part of insn printing, but it is machine-specific,
|
/* This is not part of insn printing, but it is machine-specific,
|
||||||
|
30
gdb/main.c
30
gdb/main.c
@ -347,6 +347,36 @@ main (argc, argv, envp)
|
|||||||
/* -t /def/ttyp1: use /dev/ttyp1 for inferior I/O. */
|
/* -t /def/ttyp1: use /dev/ttyp1 for inferior I/O. */
|
||||||
else if (!strcmp (arg, "-t") || !strcmp (arg, "-tty"))
|
else if (!strcmp (arg, "-t") || !strcmp (arg, "-tty"))
|
||||||
tty_command (argv[i], 0);
|
tty_command (argv[i], 0);
|
||||||
|
|
||||||
|
/* -help: print a summary of command line switches. */
|
||||||
|
else if (!strcmp (arg, "-help"))
|
||||||
|
{
|
||||||
|
fputs ("\
|
||||||
|
This is GDB, the GNU debugger. Use the command\n\
|
||||||
|
gdb [options] [executable [core-file]]\n\
|
||||||
|
to enter the debugger.\n\
|
||||||
|
\n\
|
||||||
|
Options available are:\n\
|
||||||
|
-help Print this message.\n\
|
||||||
|
-quiet Do not print version number on startup.\n\
|
||||||
|
-fullname Output information used by emacs-GDB interface.\n\
|
||||||
|
-batch Exit after processing options.\n\
|
||||||
|
-nx Do not read .gdbinit file.\n\
|
||||||
|
-tty TTY Use TTY for input/output by the program being debugged.\n\
|
||||||
|
-cd DIR Change current directory to DIR.\n\
|
||||||
|
-directory DIR Search for source files in DIR.\n\
|
||||||
|
-command FILE Execute GDB commands from FILE.\n\
|
||||||
|
-symbols SYMFILE Read symbols from SYMFILE.\n\
|
||||||
|
-exec EXECFILE Use EXECFILE as the executable.\n\
|
||||||
|
-se FILE Use FILE as symbol file and executable file.\n\
|
||||||
|
-core COREFILE Analyze the core dump COREFILE.\n\
|
||||||
|
\n\
|
||||||
|
For more information, type \"help\" from within GDB, or consult the\n\
|
||||||
|
GDB manual (available as on-line info or a printed manual).\n", stderr);
|
||||||
|
/* Exiting after printing this message seems like
|
||||||
|
the most useful thing to do. */
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
error ("Unknown command-line switch: \"%s\"\n", arg);
|
error ("Unknown command-line switch: \"%s\"\n", arg);
|
||||||
}
|
}
|
||||||
|
@ -708,8 +708,10 @@ x_command (exp, from_tty)
|
|||||||
*exp = 0;
|
*exp = 0;
|
||||||
old_chain = make_cleanup (free_current_contents, &expr);
|
old_chain = make_cleanup (free_current_contents, &expr);
|
||||||
val = evaluate_expression (expr);
|
val = evaluate_expression (expr);
|
||||||
if (last_format == 'i'
|
/* In rvalue contexts, such as this, functions are coerced into
|
||||||
&& TYPE_CODE (VALUE_TYPE (val)) != TYPE_CODE_PTR
|
pointers to functions. This makes "x/i main" work. */
|
||||||
|
if (/* last_format == 'i'
|
||||||
|
&& */ TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_FUNC
|
||||||
&& VALUE_LVAL (val) == lval_memory)
|
&& VALUE_LVAL (val) == lval_memory)
|
||||||
next_address = VALUE_ADDRESS (val);
|
next_address = VALUE_ADDRESS (val);
|
||||||
else
|
else
|
||||||
|
@ -1,3 +1,18 @@
|
|||||||
|
Thu Oct 19 17:18:40 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* Move vi_doing_insert from vi_mode.c to readline.c
|
||||||
|
|
||||||
|
* readline.c: Move compare_strings before its use.
|
||||||
|
Remove definitions.
|
||||||
|
|
||||||
|
* readline.c: Move defining_kbd_macro above rl_dispatch.
|
||||||
|
(rl_dispatch): Remove "extern int defining_kbd_macro".
|
||||||
|
|
||||||
|
Mon Oct 16 11:56:03 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
|
* readline.c (rl_set_signals): Remove unnecessary "static int
|
||||||
|
rl_signal_handler()".
|
||||||
|
|
||||||
Sat Sep 30 14:51:56 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
Sat Sep 30 14:51:56 1989 Jim Kingdon (kingdon at hobbes.ai.mit.edu)
|
||||||
|
|
||||||
* readline.c (rl_initialize): Change parsing_conditionalized_out
|
* readline.c (rl_initialize): Change parsing_conditionalized_out
|
||||||
|
@ -65,7 +65,7 @@ all: libreadline.a
|
|||||||
libreadline.a: readline.o history.o funmap.o keymaps.o
|
libreadline.a: readline.o history.o funmap.o keymaps.o
|
||||||
$(RM) -f libreadline.a
|
$(RM) -f libreadline.a
|
||||||
$(AR) clq libreadline.a readline.o history.o funmap.o keymaps.o
|
$(AR) clq libreadline.a readline.o history.o funmap.o keymaps.o
|
||||||
if [ -f $(RANLIB) ]; then $(RANLIB) libreadline.a; fi
|
# if [ -f $(RANLIB) ]; then $(RANLIB) libreadline.a; fi
|
||||||
|
|
||||||
readline.o: readline.h chardefs.h keymaps.h history.h readline.c vi_mode.c
|
readline.o: readline.h chardefs.h keymaps.h history.h readline.c vi_mode.c
|
||||||
$(CC) -c $(CFLAGS) $(CPPFLAGS) $(READLINE_DEFINES) \
|
$(CC) -c $(CFLAGS) $(CPPFLAGS) $(READLINE_DEFINES) \
|
||||||
@ -111,4 +111,4 @@ clean:
|
|||||||
$(DESTDIR)/libreadline.a: libreadline.a
|
$(DESTDIR)/libreadline.a: libreadline.a
|
||||||
-mv $(DESTDIR)/libreadline.a $(DESTDIR)/libreadline.old
|
-mv $(DESTDIR)/libreadline.a $(DESTDIR)/libreadline.old
|
||||||
cp libreadline.a $(DESTDIR)/libreadline.a
|
cp libreadline.a $(DESTDIR)/libreadline.a
|
||||||
$(RANLIB) -t $(DESTDIR)/libreadline.a
|
# $(RANLIB) -t $(DESTDIR)/libreadline.a
|
||||||
|
@ -34,6 +34,11 @@ static char *xmalloc (), *xrealloc ();
|
|||||||
|
|
||||||
FUNMAP **funmap = (FUNMAP **)NULL;
|
FUNMAP **funmap = (FUNMAP **)NULL;
|
||||||
static int funmap_size = 0;
|
static int funmap_size = 0;
|
||||||
|
|
||||||
|
static int just_testing_ar_tmp = 0;
|
||||||
|
static int just_testing_ar_tmp_2 = 5;
|
||||||
|
int foo_testing_ar;
|
||||||
|
|
||||||
static int funmap_entry = 0;
|
static int funmap_entry = 0;
|
||||||
|
|
||||||
static FUNMAP default_funmap[] = {
|
static FUNMAP default_funmap[] = {
|
||||||
|
@ -139,6 +139,14 @@ static SigHandler *old_sigwinch = (SigHandler *)NULL;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Stupid comparison routine for qsort () ing strings. */
|
||||||
|
static int
|
||||||
|
compare_strings (s1, s2)
|
||||||
|
char **s1, **s2;
|
||||||
|
{
|
||||||
|
return (strcmp (*s1, *s2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
@ -390,6 +398,40 @@ readline_internal ()
|
|||||||
return (savestring (the_line));
|
return (savestring (the_line));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Variables for keyboard macros. */
|
||||||
|
|
||||||
|
/* The currently executing macro string. If this is non-zero,
|
||||||
|
then it is a malloc ()'ed string where input is coming from. */
|
||||||
|
static char *executing_macro = (char *)NULL;
|
||||||
|
|
||||||
|
/* The offset in the above string to the next character to be read. */
|
||||||
|
static int executing_macro_index = 0;
|
||||||
|
|
||||||
|
/* Non-zero means to save keys that we dispatch on in a kbd macro. */
|
||||||
|
static int defining_kbd_macro = 0;
|
||||||
|
|
||||||
|
/* The current macro string being built. Characters get stuffed
|
||||||
|
in here by add_macro_char (). */
|
||||||
|
static char *current_macro = (char *)NULL;
|
||||||
|
|
||||||
|
/* The size of the buffer allocated to current_macro. */
|
||||||
|
static int current_macro_size = 0;
|
||||||
|
|
||||||
|
/* The index at which characters are being added to current_macro. */
|
||||||
|
static int current_macro_index = 0;
|
||||||
|
|
||||||
|
/* A structure used to save nested macro strings.
|
||||||
|
It is a linked list of string/index for each saved macro. */
|
||||||
|
struct saved_macro {
|
||||||
|
struct saved_macro *next;
|
||||||
|
char *string;
|
||||||
|
int index;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* The list of saved macros. */
|
||||||
|
struct saved_macro *macro_list = (struct saved_macro *)NULL;
|
||||||
|
|
||||||
|
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
@ -472,9 +514,8 @@ rl_signal_handler (sig, code, scp)
|
|||||||
|
|
||||||
rl_set_signals ()
|
rl_set_signals ()
|
||||||
{
|
{
|
||||||
static int rl_signal_handler ();
|
|
||||||
|
|
||||||
old_int = (SigHandler *)signal (SIGINT, rl_signal_handler);
|
old_int = (SigHandler *)signal (SIGINT, rl_signal_handler);
|
||||||
|
|
||||||
if (old_int == (SigHandler *)SIG_IGN)
|
if (old_int == (SigHandler *)SIG_IGN)
|
||||||
signal (SIGINT, SIG_IGN);
|
signal (SIGINT, SIG_IGN);
|
||||||
|
|
||||||
@ -685,10 +726,12 @@ rl_dispatch (key, map)
|
|||||||
register int key;
|
register int key;
|
||||||
Keymap map;
|
Keymap map;
|
||||||
{
|
{
|
||||||
static int defining_kbd_macro;
|
|
||||||
|
|
||||||
if (defining_kbd_macro)
|
if (defining_kbd_macro)
|
||||||
add_macro_char (key);
|
{
|
||||||
|
static add_macro_char ();
|
||||||
|
|
||||||
|
add_macro_char (key);
|
||||||
|
}
|
||||||
|
|
||||||
if (key > 127 && key < 256)
|
if (key > 127 && key < 256)
|
||||||
{
|
{
|
||||||
@ -769,43 +812,14 @@ rl_dispatch (key, map)
|
|||||||
/* */
|
/* */
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
|
|
||||||
/* The currently executing macro string. If this is non-zero,
|
|
||||||
then it is a malloc ()'ed string where input is coming from. */
|
|
||||||
static char *executing_macro = (char *)NULL;
|
|
||||||
|
|
||||||
/* The offset in the above string to the next character to be read. */
|
|
||||||
static int executing_macro_index = 0;
|
|
||||||
|
|
||||||
/* Non-zero means to save keys that we dispatch on in a kbd macro. */
|
|
||||||
static int defining_kbd_macro = 0;
|
|
||||||
|
|
||||||
/* The current macro string being built. Characters get stuffed
|
|
||||||
in here by add_macro_char (). */
|
|
||||||
static char *current_macro = (char *)NULL;
|
|
||||||
|
|
||||||
/* The size of the buffer allocated to current_macro. */
|
|
||||||
static int current_macro_size = 0;
|
|
||||||
|
|
||||||
/* The index at which characters are being added to current_macro. */
|
|
||||||
static int current_macro_index = 0;
|
|
||||||
|
|
||||||
/* A structure used to save nested macro strings.
|
|
||||||
It is a linked list of string/index for each saved macro. */
|
|
||||||
struct saved_macro {
|
|
||||||
struct saved_macro *next;
|
|
||||||
char *string;
|
|
||||||
int index;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The list of saved macros. */
|
|
||||||
struct saved_macro *macro_list = (struct saved_macro *)NULL;
|
|
||||||
|
|
||||||
/* Set up to read subsequent input from STRING.
|
/* Set up to read subsequent input from STRING.
|
||||||
STRING is free ()'ed when we are done with it. */
|
STRING is free ()'ed when we are done with it. */
|
||||||
static
|
static
|
||||||
with_macro_input (string)
|
with_macro_input (string)
|
||||||
char *string;
|
char *string;
|
||||||
{
|
{
|
||||||
|
static push_executing_macro ();
|
||||||
|
|
||||||
push_executing_macro ();
|
push_executing_macro ();
|
||||||
executing_macro = string;
|
executing_macro = string;
|
||||||
executing_macro_index = 0;
|
executing_macro_index = 0;
|
||||||
@ -821,6 +835,8 @@ next_macro_key ()
|
|||||||
|
|
||||||
if (!executing_macro[executing_macro_index])
|
if (!executing_macro[executing_macro_index])
|
||||||
{
|
{
|
||||||
|
static pop_executing_macro ();
|
||||||
|
|
||||||
pop_executing_macro ();
|
pop_executing_macro ();
|
||||||
return (next_macro_key ());
|
return (next_macro_key ());
|
||||||
}
|
}
|
||||||
@ -933,6 +949,10 @@ rl_call_last_kbd_macro (count, ignore)
|
|||||||
with_macro_input (savestring (current_macro));
|
with_macro_input (savestring (current_macro));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Non-zero means do not parse any lines other than comments and
|
||||||
|
parser directives. */
|
||||||
|
static unsigned char parsing_conditionalized_out = 0;
|
||||||
|
|
||||||
/* **************************************************************** */
|
/* **************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
@ -980,7 +1000,6 @@ rl_initialize ()
|
|||||||
|
|
||||||
/* Parsing of key-bindings begins in an enabled state. */
|
/* Parsing of key-bindings begins in an enabled state. */
|
||||||
{
|
{
|
||||||
static unsigned char parsing_conditionalized_out;
|
|
||||||
parsing_conditionalized_out = 0;
|
parsing_conditionalized_out = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2571,6 +2590,11 @@ rl_tab_insert (count)
|
|||||||
rl_insert (count, '\t');
|
rl_insert (count, '\t');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef VI_MODE
|
||||||
|
/* Non-zero means enter insertion mode. */
|
||||||
|
static vi_doing_insert = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* What to do when a NEWLINE is pressed. We accept the whole line.
|
/* What to do when a NEWLINE is pressed. We accept the whole line.
|
||||||
KEY is the key that invoked this command. I guess it could have
|
KEY is the key that invoked this command. I guess it could have
|
||||||
meaning in the future. */
|
meaning in the future. */
|
||||||
@ -2582,7 +2606,6 @@ rl_newline (count, key)
|
|||||||
|
|
||||||
#ifdef VI_MODE
|
#ifdef VI_MODE
|
||||||
{
|
{
|
||||||
static int vi_doing_insert;
|
|
||||||
if (vi_doing_insert)
|
if (vi_doing_insert)
|
||||||
{
|
{
|
||||||
rl_end_undo_group ();
|
rl_end_undo_group ();
|
||||||
@ -3097,7 +3120,7 @@ rl_complete_internal (what_to_do)
|
|||||||
if (rl_ignore_completion_duplicates)
|
if (rl_ignore_completion_duplicates)
|
||||||
{
|
{
|
||||||
char *lowest_common;
|
char *lowest_common;
|
||||||
int compare_strings (), j, newlen = 0;
|
int j, newlen = 0;
|
||||||
|
|
||||||
/* Sort the items. */
|
/* Sort the items. */
|
||||||
/* It is safe to sort this array, because the lowest common
|
/* It is safe to sort this array, because the lowest common
|
||||||
@ -3308,7 +3331,6 @@ rl_complete_internal (what_to_do)
|
|||||||
/* Sort the items if they are not already sorted. */
|
/* Sort the items if they are not already sorted. */
|
||||||
if (!rl_ignore_completion_duplicates)
|
if (!rl_ignore_completion_duplicates)
|
||||||
{
|
{
|
||||||
int compare_strings ();
|
|
||||||
qsort (matches, len, sizeof (char *), compare_strings);
|
qsort (matches, len, sizeof (char *), compare_strings);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3362,14 +3384,6 @@ rl_complete_internal (what_to_do)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Stupid comparison routine for qsort () ing strings. */
|
|
||||||
static int
|
|
||||||
compare_strings (s1, s2)
|
|
||||||
char **s1, **s2;
|
|
||||||
{
|
|
||||||
return (strcmp (*s1, *s2));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* A completion function for usernames.
|
/* A completion function for usernames.
|
||||||
TEXT contains a partial username preceded by a random
|
TEXT contains a partial username preceded by a random
|
||||||
character (usually `~'). */
|
character (usually `~'). */
|
||||||
@ -4910,6 +4924,7 @@ rl_named_function (string)
|
|||||||
char *string;
|
char *string;
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
|
static int stricmp ();
|
||||||
|
|
||||||
for (i = 0; funmap[i]; i++)
|
for (i = 0; funmap[i]; i++)
|
||||||
if (stricmp (funmap[i]->name, string) == 0)
|
if (stricmp (funmap[i]->name, string) == 0)
|
||||||
@ -5006,10 +5021,6 @@ function_exit:
|
|||||||
/* Calling programs set this to have their argv[0]. */
|
/* Calling programs set this to have their argv[0]. */
|
||||||
char *rl_readline_name = "other";
|
char *rl_readline_name = "other";
|
||||||
|
|
||||||
/* Non-zero means do not parse any lines other than comments and
|
|
||||||
parser directives. */
|
|
||||||
static unsigned char parsing_conditionalized_out = 0;
|
|
||||||
|
|
||||||
/* Stack of previous values of parsing_conditionalized_out. */
|
/* Stack of previous values of parsing_conditionalized_out. */
|
||||||
static unsigned char *if_stack = (unsigned char *)NULL;
|
static unsigned char *if_stack = (unsigned char *)NULL;
|
||||||
static int if_stack_depth = 0;
|
static int if_stack_depth = 0;
|
||||||
@ -5020,6 +5031,7 @@ parser_if (args)
|
|||||||
char *args;
|
char *args;
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
|
static int stricmp ();
|
||||||
|
|
||||||
/* Push parser state. */
|
/* Push parser state. */
|
||||||
if (if_stack_depth + 1 >= if_stack_size)
|
if (if_stack_depth + 1 >= if_stack_size)
|
||||||
@ -5090,6 +5102,7 @@ handle_parser_directive (statement)
|
|||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
char *directive, *args;
|
char *directive, *args;
|
||||||
|
static int stricmp ();
|
||||||
|
|
||||||
/* Isolate the actual directive. */
|
/* Isolate the actual directive. */
|
||||||
|
|
||||||
@ -5128,7 +5141,7 @@ rl_parse_and_bind (string)
|
|||||||
{
|
{
|
||||||
extern char *possible_control_prefixes[], *possible_meta_prefixes[];
|
extern char *possible_control_prefixes[], *possible_meta_prefixes[];
|
||||||
char *rindex (), *funname, *kname;
|
char *rindex (), *funname, *kname;
|
||||||
static int substring_member_of_array ();
|
static int substring_member_of_array (), stricmp ();
|
||||||
register int c;
|
register int c;
|
||||||
int key, i;
|
int key, i;
|
||||||
|
|
||||||
@ -5280,7 +5293,7 @@ rl_parse_and_bind (string)
|
|||||||
rl_variable_bind (name, value)
|
rl_variable_bind (name, value)
|
||||||
char *name, *value;
|
char *name, *value;
|
||||||
{
|
{
|
||||||
static int strnicmp ();
|
static int strnicmp (), stricmp ();
|
||||||
|
|
||||||
if (stricmp (name, "editing-mode") == 0)
|
if (stricmp (name, "editing-mode") == 0)
|
||||||
{
|
{
|
||||||
@ -5335,6 +5348,7 @@ glean_key_from_name (name)
|
|||||||
char *name;
|
char *name;
|
||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
|
static int stricmp ();
|
||||||
|
|
||||||
for (i = 0; name_key_alist[i].name; i++)
|
for (i = 0; name_key_alist[i].name; i++)
|
||||||
if (stricmp (name, name_key_alist[i].name) == 0)
|
if (stricmp (name, name_key_alist[i].name) == 0)
|
||||||
|
@ -13,9 +13,6 @@
|
|||||||
static char *vi_last_search = (char *)NULL;
|
static char *vi_last_search = (char *)NULL;
|
||||||
static int vi_histpos;
|
static int vi_histpos;
|
||||||
|
|
||||||
/* Non-zero means enter insertion mode. */
|
|
||||||
static vi_doing_insert = 0;
|
|
||||||
|
|
||||||
/* *** UNCLEAN *** */
|
/* *** UNCLEAN *** */
|
||||||
/* Command keys which do movement for xxx_to commands. */
|
/* Command keys which do movement for xxx_to commands. */
|
||||||
static char *vi_motion = " hl^$0ftFt;,%wbeWBE|";
|
static char *vi_motion = " hl^$0ftFt;,%wbeWBE|";
|
||||||
|
48
gdb/stack.c
48
gdb/stack.c
@ -301,6 +301,16 @@ parse_frame_specification (frame_exp)
|
|||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FRAME_ARGS_ADDRESS_CORRECT is just like FRAME_ARGS_ADDRESS except
|
||||||
|
that if it is unsure about the answer, it returns Frame_unknown
|
||||||
|
instead of guessing (this happens on the VAX, for example).
|
||||||
|
|
||||||
|
On most machines, we never have to guess about the args address,
|
||||||
|
so FRAME_ARGS_ADDRESS{,_CORRECT} are the same. */
|
||||||
|
#if !defined (FRAME_ARGS_ADDRESS_CORRECT)
|
||||||
|
#define FRAME_ARGS_ADDRESS_CORRECT FRAME_ARGS_ADDRESS
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Print verbosely the selected frame or the frame at address ADDR.
|
/* Print verbosely the selected frame or the frame at address ADDR.
|
||||||
This means absolutely all information in the frame is printed. */
|
This means absolutely all information in the frame is printed. */
|
||||||
|
|
||||||
@ -316,7 +326,6 @@ frame_info (addr_exp)
|
|||||||
FRAME calling_frame;
|
FRAME calling_frame;
|
||||||
int i, count;
|
int i, count;
|
||||||
char *funname = 0;
|
char *funname = 0;
|
||||||
int numargs;
|
|
||||||
|
|
||||||
if (!(have_inferior_p () || have_core_file_p ()))
|
if (!(have_inferior_p () || have_core_file_p ()))
|
||||||
error ("No inferior or core file.");
|
error ("No inferior or core file.");
|
||||||
@ -359,20 +368,31 @@ frame_info (addr_exp)
|
|||||||
printf (" caller of frame at 0x%x", fi->next_frame);
|
printf (" caller of frame at 0x%x", fi->next_frame);
|
||||||
if (fi->next_frame || calling_frame)
|
if (fi->next_frame || calling_frame)
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
printf (" Arglist at 0x%x,", FRAME_ARGS_ADDRESS (fi));
|
|
||||||
FRAME_NUM_ARGS (i, fi);
|
|
||||||
if (i < 0)
|
|
||||||
printf (" args: ");
|
|
||||||
else if (i == 0)
|
|
||||||
printf (" no args.");
|
|
||||||
else if (i == 1)
|
|
||||||
printf (" 1 arg: ");
|
|
||||||
else
|
|
||||||
printf (" %d args: ", i);
|
|
||||||
|
|
||||||
FRAME_NUM_ARGS (numargs, fi);
|
{
|
||||||
print_frame_args (func, fi, numargs, stdout);
|
/* Address of the argument list for this frame, or Frame_unknown. */
|
||||||
printf ("\n");
|
CORE_ADDR arg_list = FRAME_ARGS_ADDRESS_CORRECT (fi);
|
||||||
|
/* Number of args for this frame, or -1 if unknown. */
|
||||||
|
int numargs;
|
||||||
|
|
||||||
|
if (arg_list != Frame_unknown)
|
||||||
|
{
|
||||||
|
printf (" Arglist at 0x%x,", arg_list);
|
||||||
|
|
||||||
|
FRAME_NUM_ARGS (numargs, fi);
|
||||||
|
if (numargs < 0)
|
||||||
|
printf (" args: ");
|
||||||
|
else if (numargs == 0)
|
||||||
|
printf (" no args.");
|
||||||
|
else if (numargs == 1)
|
||||||
|
printf (" 1 arg: ");
|
||||||
|
else
|
||||||
|
printf (" %d args: ", numargs);
|
||||||
|
print_frame_args (func, fi, numargs, stdout);
|
||||||
|
printf ("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* The sp is special; what's returned isn't the save address, but
|
/* The sp is special; what's returned isn't the save address, but
|
||||||
actually the value of the previous frame's sp. */
|
actually the value of the previous frame's sp. */
|
||||||
printf (" Previous frame's sp is 0x%x\n", fsr.regs[SP_REGNUM]);
|
printf (" Previous frame's sp is 0x%x\n", fsr.regs[SP_REGNUM]);
|
||||||
|
@ -1567,7 +1567,13 @@ decode_line_1 (argptr, funfirstline, default_symtab, default_line)
|
|||||||
that depends on knowing the name of D. */
|
that depends on knowing the name of D. */
|
||||||
if (class_name)
|
if (class_name)
|
||||||
{
|
{
|
||||||
while (*class_name++ != ' ');
|
/* We just want the class name. In the context
|
||||||
|
of C++, stripping off "struct " is always
|
||||||
|
sensible. */
|
||||||
|
if (strncmp("struct ", class_name, 7) == 0)
|
||||||
|
class_name += 7;
|
||||||
|
if (strncmp("union ", class_name, 6) == 0)
|
||||||
|
class_name += 6;
|
||||||
|
|
||||||
sym_class = lookup_symbol (class_name, 0, STRUCT_NAMESPACE, 0);
|
sym_class = lookup_symbol (class_name, 0, STRUCT_NAMESPACE, 0);
|
||||||
for (method_counter = TYPE_NFN_FIELDS (SYMBOL_TYPE (sym_class)) - 1;
|
for (method_counter = TYPE_NFN_FIELDS (SYMBOL_TYPE (sym_class)) - 1;
|
||||||
|
@ -287,7 +287,9 @@ fatal_dump_core (string, arg)
|
|||||||
char *string;
|
char *string;
|
||||||
int arg;
|
int arg;
|
||||||
{
|
{
|
||||||
fprintf (stderr, "gdb: ");
|
/* "internal error" is always correct, since GDB should never dump
|
||||||
|
core, no matter what the input. */
|
||||||
|
fprintf (stderr, "gdb internal error: ");
|
||||||
fprintf (stderr, string, arg);
|
fprintf (stderr, string, arg);
|
||||||
fprintf (stderr, "\n");
|
fprintf (stderr, "\n");
|
||||||
signal (SIGQUIT, SIG_DFL);
|
signal (SIGQUIT, SIG_DFL);
|
||||||
@ -698,7 +700,7 @@ fprintf_filtered (stream, format, arg1, arg2, arg3, arg4, arg5, arg6)
|
|||||||
|
|
||||||
/* This won't blow up if the restrictions described above are
|
/* This won't blow up if the restrictions described above are
|
||||||
followed. */
|
followed. */
|
||||||
(void) sprintf (linebuffer, format, arg1, arg2, arg3);
|
(void) sprintf (linebuffer, format, arg1, arg2, arg3, arg4, arg5, arg6);
|
||||||
|
|
||||||
fputs_filtered (linebuffer, stream);
|
fputs_filtered (linebuffer, stream);
|
||||||
}
|
}
|
||||||
|
@ -392,9 +392,12 @@ value_ind (arg1)
|
|||||||
if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_MEMBER)
|
if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_MEMBER)
|
||||||
error ("not implemented: member types in value_ind");
|
error ("not implemented: member types in value_ind");
|
||||||
|
|
||||||
/* Allow * on an integer so we can cast it to whatever we want. */
|
/* Allow * on an integer so we can cast it to whatever we want.
|
||||||
|
This returns an int, which seems like the most C-like thing
|
||||||
|
to do. "long long" variables are rare enough that
|
||||||
|
BUILTIN_TYPE_LONGEST would seem to be a mistake. */
|
||||||
if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_INT)
|
if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_INT)
|
||||||
return value_at (BUILTIN_TYPE_LONGEST,
|
return value_at (builtin_type_int,
|
||||||
(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 (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)),
|
return value_at (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)),
|
||||||
|
@ -17,4 +17,4 @@ 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. */
|
||||||
|
|
||||||
char *version = "3.3";
|
char *version = "3.4";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user