import gdb-1999-11-08 snapshot
This commit is contained in:
parent
98007ce7b0
commit
11cf874164
57 changed files with 1736 additions and 543 deletions
228
gdb/ChangeLog
228
gdb/ChangeLog
|
@ -1,3 +1,231 @@
|
||||||
|
1999-11-08 Mark Salter <msalter@cygnus.com>
|
||||||
|
|
||||||
|
* utils.c (floatformat_to_doublest): Fix conversion of denormals.
|
||||||
|
|
||||||
|
Mon Nov 8 20:14:13 1999 Andrew Cagney <cagney@amy.cygnus.com>
|
||||||
|
|
||||||
|
* remote.c (get_memory_read_packet_size): For moment limit read
|
||||||
|
size to PBUFSIZ.
|
||||||
|
(putpkt_binary): Remove check on packet size. Allocate ``cnt +
|
||||||
|
6'' characters for output buffer.
|
||||||
|
(get_memory_packet_size): When packet size is ``fixed'' and the
|
||||||
|
size is zero, return MAX_REMOTE_PACKET_SIZE. Check that packets
|
||||||
|
are at least MIN_REMOTE_PACKET_SIZE.
|
||||||
|
(set_memory_packet_size): Print usage when ``args'' is NULL.
|
||||||
|
|
||||||
|
Mon Nov 8 18:18:07 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* defs.h, utils.c (gdb_file_deallocate): Delete.
|
||||||
|
* corefile.c (memory_error): Use make_cleanup_gdb_file_delete.
|
||||||
|
|
||||||
|
* defs.h, utils.c (gdb_file_init_astring): Delete.
|
||||||
|
|
||||||
|
* defs.h, utils.c (tui_file_get_strbuf): Rename
|
||||||
|
gdb_file_get_strbuf.
|
||||||
|
(tui_file_adjust_strbuf): Rename gdb_file_adjust_strbuf.
|
||||||
|
* utils.c (error_stream, error_last_message): Update.
|
||||||
|
|
||||||
|
Mon Nov 8 16:28:00 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* defs.h, utils.c (gdb_fclose): Delete.
|
||||||
|
* defs.h (make_cleanup_gdb_file): Declare.
|
||||||
|
* utils.c (make_cleanup_gdb_file_delete, do_gdb_file_delete): New
|
||||||
|
functions.
|
||||||
|
|
||||||
|
* symmisc.c (maintenance_print_symbols,
|
||||||
|
maintenance_print_psymbols, maintenance_print_msymbols): Use
|
||||||
|
make_cleanup_gdb_file_delete.
|
||||||
|
* serial.c (do_serial_close): Use gdb_file_delete.
|
||||||
|
|
||||||
|
Mon Nov 8 14:16:32 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* defs.h (gdb_file_write_ftype, set_gdb_file_write,
|
||||||
|
gdb_file_write): Declare.
|
||||||
|
|
||||||
|
* utils.c (struct gdb_file): Add to_write member.
|
||||||
|
(gdb_file_write, set_gdb_file_write): New functions.
|
||||||
|
(gdb_file_new): Initialize the write method.
|
||||||
|
(null_file_write): New function.
|
||||||
|
(null_file_fputs, null_file_write): ``write'' calls ``fputs'' and
|
||||||
|
``fputs'' calls ``write'' when the other is implemented.
|
||||||
|
(stdio_file_new): Initialize write method.
|
||||||
|
(stdio_file_write): New function.
|
||||||
|
|
||||||
|
* utils.c (putchar_unfiltered, fputc_unfiltered): Use
|
||||||
|
gdb_file_write.
|
||||||
|
|
||||||
|
Thu Nov 4 11:59:24 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* remote.c (get_memory_packet_size, set_memory_packet_size,
|
||||||
|
build_memory_packet_size): New functions. Set / compute / update
|
||||||
|
the size of a memory read / write packet.
|
||||||
|
(set_memory_read_packet_size, set_memory_write_packet_size): New
|
||||||
|
functions. Verify changes to the memory read / write packet size.
|
||||||
|
(prefered_memory_write_packet_size,
|
||||||
|
current_memory_write_packet_size, prefered_memory_read_packet_size,
|
||||||
|
current_memory_read_packet_size): New variables.
|
||||||
|
(get_memory_read_packet_size, get_memory_write_packet_size): New
|
||||||
|
functions. Determine the current memory read/write packet size. A
|
||||||
|
function is needed as ``current_register_packet_size'', a variable
|
||||||
|
is used in the calculation.
|
||||||
|
(register_remote_packet_sizes, build_remote_packet_sizes):
|
||||||
|
Initialize packet sizes according the current architecture.
|
||||||
|
(remote_fetch_registers, remote_write_bytes, remote_read_bytes,
|
||||||
|
build_remote_gdbarch_data): Update.
|
||||||
|
(_initialize_remote): Add the commands ``set remote
|
||||||
|
memory-read-packet-size'' and ``set remote
|
||||||
|
memory-write-packet-size''. Deprecate ``set remotepacketsize''.
|
||||||
|
|
||||||
|
Sun Nov 7 18:09:54 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* target.h, target.c (target_load): Replace macro with a function.
|
||||||
|
|
||||||
|
* config/i960/tm-nindy960.h (ADDITIONAL_OPTION_HANDLER): Rewrite
|
||||||
|
replacing SET_TOP_LEVEL with catch_command_errors.
|
||||||
|
(nindy_open): Add extern declaration.
|
||||||
|
|
||||||
|
* top.h (top_level_val, SET_TOP_LEVEL): Delete.
|
||||||
|
* defs.h (catch_command_errors_ftype, catch_command_errors): Add
|
||||||
|
declarations.
|
||||||
|
* top.c (struct captured_command_args): Declare.
|
||||||
|
(do_captured_command, catch_command_errors): New functions. Call
|
||||||
|
the command function via catch_errors.
|
||||||
|
(catch_errors): Add more comments.
|
||||||
|
|
||||||
|
* main.c (struct captured_main_args): Define.
|
||||||
|
(captured_main): New. Rewrite main. Replace SET_TOP_LEVEL with
|
||||||
|
calls to catch_command_errors. Delete calls to do_cleanups which
|
||||||
|
are now handled by catch_errors. Call the command loop via
|
||||||
|
captured_command_loop and catch_errors.
|
||||||
|
(main): Move code body to captured_main. Call captured_main via
|
||||||
|
catch_errors.
|
||||||
|
(captured_command_loop): New function. Wrap call to command_loop.
|
||||||
|
|
||||||
|
1999-11-05 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* procfs.c (unconditionally_kill_inferior) (init_procinfo)
|
||||||
|
(create_procinfo) (procfs_exit_handler) (proc_set_exec_trap)
|
||||||
|
(do_attach) (do_detach) (procfs_wait) (set_proc_siginfo)
|
||||||
|
(procfs_resume) (info_proc_mappings)
|
||||||
|
(modify_run_on_last_close_flag) (procfs_lwp_creation_handler)
|
||||||
|
(procfs_thread_alive): Remove unused variables, conditionalize
|
||||||
|
vars declarations to eliminate compiler warnings.
|
||||||
|
|
||||||
|
Fri Nov 5 16:32:04 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* inferior.h (CALL_DUMMY_ADDRESS, CALL_DUMMY_START_OFFSET,
|
||||||
|
CALL_DUMMY_BREAKPOINT_OFFSET, CALL_DUMMY_LENGTH,
|
||||||
|
CALL_DUMMY_STACK_ADJUST, CALL_DUMMY_WORDS,
|
||||||
|
SIZEOF_CALL_DUMMY_WORDS, PUSH_DUMMY_FRAME, FIX_CALL_DUMMY,
|
||||||
|
STORE_STRUCT_RETURN), d10v-tdep.c (print_insn), d30v-tdep.c
|
||||||
|
(print_insn), target.h (SOFTWARE_SINGLE_STEP): Call internal_error
|
||||||
|
instead of abort.
|
||||||
|
|
||||||
|
* utils.c (stdio_file_delete, stdio_file_flush, stdio_file_fputs,
|
||||||
|
stdio_file_isatty, tui_file_delete, tui_file_isatty,
|
||||||
|
tui_file_rewind, tui_file_put, gdb_file_init_astring,
|
||||||
|
gdb_file_get_strbuf, gdb_file_adjust_strbuf): Call internal_error
|
||||||
|
instead of error.
|
||||||
|
|
||||||
|
1999-11-04 Kevin Buettner <kevinb@cygnus.com>
|
||||||
|
|
||||||
|
* remote.c (build_remote_gdbarch_data): Set remote_address_size...
|
||||||
|
(_initialize_remote) ...but don't set it here. Also, tie
|
||||||
|
remote_address_size to the target architecture via call to
|
||||||
|
register_gdbarch_swap().
|
||||||
|
|
||||||
|
1999-11-04 Jeff Holcomb <jeffh@cygnus.com>
|
||||||
|
|
||||||
|
* remote-rdp.c (send_rdp): Fix typo.
|
||||||
|
|
||||||
|
1999-11-04 Michael Snyder <msnyder@cleaver.cygnus.com>
|
||||||
|
|
||||||
|
* breakpoint.c (commands_command): remove unprotected ref to
|
||||||
|
args pointer (which may be null).
|
||||||
|
|
||||||
|
1999-11-04 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* infcmd.c (print_return_value): New function. Print return value
|
||||||
|
from finish command.
|
||||||
|
(finish_command_continuation): Call print_return_value().
|
||||||
|
(finish_command): Ditto.
|
||||||
|
|
||||||
|
1999-11-04 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* infrun.c (handle_inferior_event): Add calls to print_stop_reason()
|
||||||
|
for end of stepping range cases.
|
||||||
|
|
||||||
|
Thu Nov 4 17:46:36 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* event-loop.c (gdb_do_one_event): Delete SET_TOP_LEVEL call.
|
||||||
|
Move error code to start_event_loop.
|
||||||
|
(start_event_loop): Call gdb_do_one_event via catch_errors.
|
||||||
|
Handle caught errors.
|
||||||
|
|
||||||
|
Thu Nov 4 17:36:27 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* breakpoint.c (get_number): Delete static declaration.
|
||||||
|
|
||||||
|
1999-11-03 Michael Snyder <msnyder@cleaver.cygnus.com>
|
||||||
|
|
||||||
|
* breakpoint.c (map_breakpoint_numbers): use a match count
|
||||||
|
instead of a goto.
|
||||||
|
|
||||||
|
1999-11-03 Nick Clifton <nickc@cygnus.com>
|
||||||
|
|
||||||
|
* config/mcore/tm-mcore.h (TARGET_BYTE_ORDER_DEFAULT): Change to
|
||||||
|
little endian.
|
||||||
|
|
||||||
|
1999-11-02 Michael Snyder <msnyder@cleaver.cygnus.com>
|
||||||
|
|
||||||
|
* target.h (target_new_objfile) replace macro with function pointer
|
||||||
|
hook. Any module needing notification of new objfiles may claim
|
||||||
|
this hook. Multiple notification clients must cooperate by saving
|
||||||
|
the previous pointer (if any) and calling it.
|
||||||
|
* sol-thread.c (_initialize_sol_thread): point new_objfile hook at
|
||||||
|
sol_thread_new_objfile. Save old pointer if any.
|
||||||
|
(sol_thread_new_objfile): call old owner of event hook if any.
|
||||||
|
* hpux-thread.c (_initialize_hpux_thread, hpux_thread_new_objfile):
|
||||||
|
ditto.
|
||||||
|
* linux-thread.c (_initialize_linux_thread, linux_thread_new_objfile):
|
||||||
|
ditto.
|
||||||
|
symfile.c (symbol_file_add, clear_symtab_users) call the new
|
||||||
|
function pointer hook, instead of the macro.
|
||||||
|
* config/sparc/nm-sun4sol2.h: remove define of target_new_objfile.
|
||||||
|
* config/pa/nm-hppah.h: ditto.
|
||||||
|
* config/i386/nm-i386sol2.h: ditto.
|
||||||
|
* config/i386/nm-linux.h: ditto.
|
||||||
|
|
||||||
|
1999-11-02 Tom Tromey <tromey@cygnus.com>
|
||||||
|
|
||||||
|
* NEWS: Mention breakpoint ranges.
|
||||||
|
|
||||||
|
1999-11-02 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
|
* rdi-share/devsw.c (openLogFile): Change a call to setlinebuf()
|
||||||
|
to an equivalent call to setvbuf() to prevent an unresolved
|
||||||
|
reference when building on cygwin.
|
||||||
|
|
||||||
|
1999-11-02 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* infrun.c (inferior_stop_reason): New enum, explicitly name the
|
||||||
|
resons for which the inferior stops.
|
||||||
|
(handle_inferior_event): Case TARGET_WAITKIND_EXITED: replace
|
||||||
|
printf's with call to print_stop_reason(). Case
|
||||||
|
TARGET_WAITKIND_SIGNALLED: Same. When stopped by random signal:
|
||||||
|
Same.
|
||||||
|
(print_stop_reason): New static function. Print relevant messages
|
||||||
|
when stopping.
|
||||||
|
|
||||||
|
1999-11-02 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
|
* rdi-share/Makefile.in: Rename dependency from bytesex.o to
|
||||||
|
angel_bytesex.o.
|
||||||
|
|
||||||
|
1999-11-02 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
|
* kod.c: Remove prototype for show_kod() which is no longer used.
|
||||||
|
|
||||||
1999-11-01 Michael Snyder <msnyder@cygnus.com>
|
1999-11-01 Michael Snyder <msnyder@cygnus.com>
|
||||||
Tom Tromey <tromey@cygnus.com>
|
Tom Tromey <tromey@cygnus.com>
|
||||||
|
|
||||||
|
|
|
@ -229,7 +229,7 @@ CDEPS = $(XM_CDEPS) $(TM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE) \
|
||||||
ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
||||||
ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
||||||
|
|
||||||
VERSION = 19991101
|
VERSION = 19991108
|
||||||
DIST=gdb
|
DIST=gdb
|
||||||
|
|
||||||
LINT=/usr/5bin/lint
|
LINT=/usr/5bin/lint
|
||||||
|
|
6
gdb/NEWS
6
gdb/NEWS
|
@ -48,6 +48,12 @@ The command ``set remotebinarydownload'' command has been replaced by
|
||||||
``set remote X-packet''. Other commands in ``set remote'' family
|
``set remote X-packet''. Other commands in ``set remote'' family
|
||||||
include ``set remote P-packet''.
|
include ``set remote P-packet''.
|
||||||
|
|
||||||
|
* Breakpoint commands accept ranges.
|
||||||
|
|
||||||
|
The breakpoint commands ``enable'', ``disable'', and ``delete'' now
|
||||||
|
accept a range of breakpoints, e.g. ``5-7''. The tracepoint command
|
||||||
|
``tracepoint passcount'' also accepts a range of tracepoints.
|
||||||
|
|
||||||
*** Changes in GDB-4.18:
|
*** Changes in GDB-4.18:
|
||||||
|
|
||||||
* New native configurations
|
* New native configurations
|
||||||
|
|
|
@ -471,6 +471,7 @@ get_number_trailer (pp, trailer)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Like get_number_trailer, but don't allow a trailer. */
|
/* Like get_number_trailer, but don't allow a trailer. */
|
||||||
int
|
int
|
||||||
get_number (pp)
|
get_number (pp)
|
||||||
|
@ -632,8 +633,6 @@ commands_command (arg, from_tty)
|
||||||
|
|
||||||
p = arg;
|
p = arg;
|
||||||
bnum = get_number (&p);
|
bnum = get_number (&p);
|
||||||
if (bnum == 0)
|
|
||||||
error ("bad breakpoint number: '%s'", arg);
|
|
||||||
|
|
||||||
if (p && *p)
|
if (p && *p)
|
||||||
error ("Unexpected extra arguments following breakpoint number.");
|
error ("Unexpected extra arguments following breakpoint number.");
|
||||||
|
@ -2070,9 +2069,9 @@ print_it_typical (bs)
|
||||||
/* Fall through, we don't deal with these types of breakpoints
|
/* Fall through, we don't deal with these types of breakpoints
|
||||||
here. */
|
here. */
|
||||||
|
|
||||||
|
case bp_finish:
|
||||||
case bp_none:
|
case bp_none:
|
||||||
case bp_until:
|
case bp_until:
|
||||||
case bp_finish:
|
|
||||||
case bp_longjmp:
|
case bp_longjmp:
|
||||||
case bp_longjmp_resume:
|
case bp_longjmp_resume:
|
||||||
case bp_step_resume:
|
case bp_step_resume:
|
||||||
|
@ -2116,7 +2115,6 @@ print_bp_stop_message (bpstat bs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Print a message indicating what happened. This is called from
|
/* Print a message indicating what happened. This is called from
|
||||||
normal_stop(). The input to this routine is the head of the bpstat
|
normal_stop(). The input to this routine is the head of the bpstat
|
||||||
list - a list of the eventpoints that caused this stop. This
|
list - a list of the eventpoints that caused this stop. This
|
||||||
|
@ -6610,12 +6608,14 @@ map_breakpoint_numbers (args, function)
|
||||||
char *p1;
|
char *p1;
|
||||||
register int num;
|
register int num;
|
||||||
register struct breakpoint *b, *tmp;
|
register struct breakpoint *b, *tmp;
|
||||||
|
int match;
|
||||||
|
|
||||||
if (p == 0)
|
if (p == 0)
|
||||||
error_no_arg ("one or more breakpoint numbers");
|
error_no_arg ("one or more breakpoint numbers");
|
||||||
|
|
||||||
while (*p)
|
while (*p)
|
||||||
{
|
{
|
||||||
|
match = 0;
|
||||||
p1 = p;
|
p1 = p;
|
||||||
|
|
||||||
num = get_number_or_range (&p1);
|
num = get_number_or_range (&p1);
|
||||||
|
@ -6629,13 +6629,14 @@ map_breakpoint_numbers (args, function)
|
||||||
if (b->number == num)
|
if (b->number == num)
|
||||||
{
|
{
|
||||||
struct breakpoint *related_breakpoint = b->related_breakpoint;
|
struct breakpoint *related_breakpoint = b->related_breakpoint;
|
||||||
|
match = 1;
|
||||||
function (b);
|
function (b);
|
||||||
if (related_breakpoint)
|
if (related_breakpoint)
|
||||||
function (related_breakpoint);
|
function (related_breakpoint);
|
||||||
goto win;
|
break;
|
||||||
}
|
}
|
||||||
printf_unfiltered ("No breakpoint number %d.\n", num);
|
if (match == 0)
|
||||||
win:
|
printf_unfiltered ("No breakpoint number %d.\n", num);
|
||||||
}
|
}
|
||||||
p = p1;
|
p = p1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,12 +20,3 @@
|
||||||
|
|
||||||
#include "nm-sysv4.h"
|
#include "nm-sysv4.h"
|
||||||
|
|
||||||
#ifdef HAVE_THREAD_DB_LIB
|
|
||||||
|
|
||||||
struct objfile;
|
|
||||||
|
|
||||||
#define target_new_objfile(OBJFILE) sol_thread_new_objfile (OBJFILE)
|
|
||||||
|
|
||||||
void sol_thread_new_objfile PARAMS ((struct objfile * objfile));
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -76,14 +76,6 @@ i386_remove_watchpoint PARAMS ((int pid, CORE_ADDR addr, int len));
|
||||||
|
|
||||||
/* Support for the glibc linuxthreads package. */
|
/* Support for the glibc linuxthreads package. */
|
||||||
|
|
||||||
#ifdef __STDC__
|
|
||||||
struct objfile;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void
|
|
||||||
linuxthreads_new_objfile PARAMS ((struct objfile *objfile));
|
|
||||||
#define target_new_objfile(OBJFILE) linuxthreads_new_objfile (OBJFILE)
|
|
||||||
|
|
||||||
extern char *
|
extern char *
|
||||||
linuxthreads_pid_to_str PARAMS ((int pid));
|
linuxthreads_pid_to_str PARAMS ((int pid));
|
||||||
#define target_pid_to_str(PID) linuxthreads_pid_to_str (PID)
|
#define target_pid_to_str(PID) linuxthreads_pid_to_str (PID)
|
||||||
|
|
|
@ -60,13 +60,18 @@ extern char *nindy_ttyname; /* Name of serial port to talk to nindy */
|
||||||
/* If specified on the command line, open tty for talking to nindy,
|
/* If specified on the command line, open tty for talking to nindy,
|
||||||
and download the executable file if one was specified. */
|
and download the executable file if one was specified. */
|
||||||
|
|
||||||
#define ADDITIONAL_OPTION_HANDLER \
|
extern void nindy_open (char *name, int from_tty);
|
||||||
if (!SET_TOP_LEVEL () && nindy_ttyname) { \
|
#define ADDITIONAL_OPTION_HANDLER \
|
||||||
nindy_open (nindy_ttyname, !batch); \
|
if (nindy_ttyname != NULL) \
|
||||||
if (!SET_TOP_LEVEL () && execarg) { \
|
{ \
|
||||||
target_load (execarg, !batch); \
|
if (catch_command_errors (nindy_open, nindy_ttyname, \
|
||||||
} \
|
!batch, RETURN_MASK_ALL)) \
|
||||||
}
|
{ \
|
||||||
|
if (execarg != NULL) \
|
||||||
|
catch_command_errors (target_load, execarg, !batch, \
|
||||||
|
RETURN_MASK_ALL); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
/* If configured for i960 target, we take control before main loop
|
/* If configured for i960 target, we take control before main loop
|
||||||
and demand that we configure for a nindy target. */
|
and demand that we configure for a nindy target. */
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
/* The mcore is big endian */
|
/* The mcore is little endian (by default) */
|
||||||
#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
|
#define TARGET_BYTE_ORDER_DEFAULT LITTLE_ENDIAN
|
||||||
|
|
||||||
/* All registers are 32 bits */
|
/* All registers are 32 bits */
|
||||||
#define REGISTER_SIZE 4
|
#define REGISTER_SIZE 4
|
||||||
|
|
|
@ -279,11 +279,6 @@ extern int hppa_resume_execd_vforking_child_to_get_parent_vfork PARAMS ((void));
|
||||||
|
|
||||||
#ifdef HAVE_HPUX_THREAD_SUPPORT
|
#ifdef HAVE_HPUX_THREAD_SUPPORT
|
||||||
|
|
||||||
struct objfile;
|
|
||||||
|
|
||||||
void hpux_thread_new_objfile PARAMS ((struct objfile * objfile));
|
|
||||||
#define target_new_objfile(OBJFILE) hpux_thread_new_objfile (OBJFILE)
|
|
||||||
|
|
||||||
extern char *hpux_pid_to_str PARAMS ((int pid));
|
extern char *hpux_pid_to_str PARAMS ((int pid));
|
||||||
#define target_pid_to_str(PID) hpux_pid_to_str (PID)
|
#define target_pid_to_str(PID) hpux_pid_to_str (PID)
|
||||||
|
|
||||||
|
|
|
@ -30,12 +30,3 @@
|
||||||
|
|
||||||
#define PRSVADDR_BROKEN
|
#define PRSVADDR_BROKEN
|
||||||
|
|
||||||
#ifdef HAVE_THREAD_DB_LIB
|
|
||||||
|
|
||||||
struct objfile;
|
|
||||||
|
|
||||||
#define target_new_objfile(OBJFILE) sol_thread_new_objfile (OBJFILE)
|
|
||||||
|
|
||||||
void sol_thread_new_objfile PARAMS ((struct objfile * objfile));
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -237,7 +237,7 @@ memory_error (status, memaddr)
|
||||||
CORE_ADDR memaddr;
|
CORE_ADDR memaddr;
|
||||||
{
|
{
|
||||||
GDB_FILE *tmp_stream = tui_sfileopen (130);
|
GDB_FILE *tmp_stream = tui_sfileopen (130);
|
||||||
make_cleanup ((make_cleanup_func) gdb_file_deallocate, &tmp_stream);
|
make_cleanup_gdb_file_delete (tmp_stream);
|
||||||
|
|
||||||
error_begin ();
|
error_begin ();
|
||||||
|
|
||||||
|
|
|
@ -1312,7 +1312,7 @@ print_insn (memaddr, stream)
|
||||||
{
|
{
|
||||||
/* If there's no disassembler, something is very wrong. */
|
/* If there's no disassembler, something is very wrong. */
|
||||||
if (tm_print_insn == NULL)
|
if (tm_print_insn == NULL)
|
||||||
abort ();
|
internal_error ("print_insn: no disassembler");
|
||||||
|
|
||||||
if (TARGET_BYTE_ORDER == BIG_ENDIAN)
|
if (TARGET_BYTE_ORDER == BIG_ENDIAN)
|
||||||
tm_print_insn_info.endian = BFD_ENDIAN_BIG;
|
tm_print_insn_info.endian = BFD_ENDIAN_BIG;
|
||||||
|
|
|
@ -1187,7 +1187,7 @@ print_insn (memaddr, stream)
|
||||||
{
|
{
|
||||||
/* If there's no disassembler, something is very wrong. */
|
/* If there's no disassembler, something is very wrong. */
|
||||||
if (tm_print_insn == NULL)
|
if (tm_print_insn == NULL)
|
||||||
abort ();
|
internal_error ("print_insn: no disassembler");
|
||||||
|
|
||||||
if (TARGET_BYTE_ORDER == BIG_ENDIAN)
|
if (TARGET_BYTE_ORDER == BIG_ENDIAN)
|
||||||
tm_print_insn_info.endian = BFD_ENDIAN_BIG;
|
tm_print_insn_info.endian = BFD_ENDIAN_BIG;
|
||||||
|
|
30
gdb/defs.h
30
gdb/defs.h
|
@ -299,6 +299,9 @@ extern struct cleanup *make_cleanup (make_cleanup_func, void *);
|
||||||
|
|
||||||
extern struct cleanup *make_cleanup_freeargv (char **);
|
extern struct cleanup *make_cleanup_freeargv (char **);
|
||||||
|
|
||||||
|
struct gdb_file;
|
||||||
|
extern struct cleanup *make_cleanup_gdb_file_delete (struct gdb_file *);
|
||||||
|
|
||||||
extern struct cleanup *make_final_cleanup (make_cleanup_func, void *);
|
extern struct cleanup *make_final_cleanup (make_cleanup_func, void *);
|
||||||
|
|
||||||
extern struct cleanup *make_my_cleanup (struct cleanup **,
|
extern struct cleanup *make_my_cleanup (struct cleanup **,
|
||||||
|
@ -392,6 +395,11 @@ extern struct gdb_file *gdb_file_new (void);
|
||||||
typedef void (gdb_file_flush_ftype) (struct gdb_file * stream);
|
typedef void (gdb_file_flush_ftype) (struct gdb_file * stream);
|
||||||
extern void set_gdb_file_flush (struct gdb_file *stream, gdb_file_flush_ftype * flush);
|
extern void set_gdb_file_flush (struct gdb_file *stream, gdb_file_flush_ftype * flush);
|
||||||
|
|
||||||
|
/* NOTE: Both fputs and write methods are available. Default
|
||||||
|
implementations that mapping one onto the other are included. */
|
||||||
|
typedef void (gdb_file_write_ftype) (struct gdb_file * stream, const char *buf, long length_buf);
|
||||||
|
extern void set_gdb_file_write (struct gdb_file *stream, gdb_file_write_ftype *fputs);
|
||||||
|
|
||||||
typedef void (gdb_file_fputs_ftype) (const char *, struct gdb_file * stream);
|
typedef void (gdb_file_fputs_ftype) (const char *, struct gdb_file * stream);
|
||||||
extern void set_gdb_file_fputs (struct gdb_file *stream, gdb_file_fputs_ftype * fputs);
|
extern void set_gdb_file_fputs (struct gdb_file *stream, gdb_file_fputs_ftype * fputs);
|
||||||
|
|
||||||
|
@ -428,6 +436,8 @@ extern void gdb_file_rewind (struct gdb_file *stream);
|
||||||
|
|
||||||
extern int gdb_file_isatty (GDB_FILE *);
|
extern int gdb_file_isatty (GDB_FILE *);
|
||||||
|
|
||||||
|
extern void gdb_file_write (struct gdb_file *file, const char *buf, long length_buf);
|
||||||
|
|
||||||
/* NOTE: copies left to right */
|
/* NOTE: copies left to right */
|
||||||
extern void gdb_file_put (struct gdb_file *src, struct gdb_file *dest);
|
extern void gdb_file_put (struct gdb_file *src, struct gdb_file *dest);
|
||||||
|
|
||||||
|
@ -471,13 +481,10 @@ extern void printf_unfiltered (const char *, ...) ATTR_FORMAT (printf, 1, 2);
|
||||||
|
|
||||||
/* #if defined (TUI) */
|
/* #if defined (TUI) */
|
||||||
/* DEPRECATED: Only the TUI should use these methods. */
|
/* DEPRECATED: Only the TUI should use these methods. */
|
||||||
extern GDB_FILE *gdb_file_init_astring (int);
|
|
||||||
extern struct gdb_file *tui_fileopen (FILE *);
|
extern struct gdb_file *tui_fileopen (FILE *);
|
||||||
extern struct gdb_file *tui_sfileopen (int);
|
extern struct gdb_file *tui_sfileopen (int);
|
||||||
extern void gdb_fclose (GDB_FILE **);
|
extern char *tui_file_get_strbuf (struct gdb_file *);
|
||||||
extern void gdb_file_deallocate (GDB_FILE **);
|
extern void tui_file_adjust_strbuf (int, struct gdb_file *);
|
||||||
extern char *gdb_file_get_strbuf (GDB_FILE *);
|
|
||||||
extern void gdb_file_adjust_strbuf (int, GDB_FILE *);
|
|
||||||
/* #endif */
|
/* #endif */
|
||||||
|
|
||||||
extern void print_spaces (int, GDB_FILE *);
|
extern void print_spaces (int, GDB_FILE *);
|
||||||
|
@ -847,9 +854,22 @@ typedef int return_mask;
|
||||||
|
|
||||||
extern NORETURN void return_to_top_level (enum return_reason) ATTR_NORETURN;
|
extern NORETURN void return_to_top_level (enum return_reason) ATTR_NORETURN;
|
||||||
|
|
||||||
|
/* If CATCH_ERRORS_FTYPE throws an error, catch_errors() returns zero
|
||||||
|
otherwize the result from CATCH_ERRORS_FTYPE is returned. It is
|
||||||
|
probably useful for CATCH_ERRORS_FTYPE to always return a non-zero
|
||||||
|
value. It's unfortunate that, catch_errors() does not return an
|
||||||
|
indication of the exact exception that it caught - quit_flag might
|
||||||
|
help. */
|
||||||
|
|
||||||
typedef int (catch_errors_ftype) (PTR);
|
typedef int (catch_errors_ftype) (PTR);
|
||||||
extern int catch_errors (catch_errors_ftype *, PTR, char *, return_mask);
|
extern int catch_errors (catch_errors_ftype *, PTR, char *, return_mask);
|
||||||
|
|
||||||
|
/* Template to catch_errors() that wraps calls to command
|
||||||
|
functions. */
|
||||||
|
|
||||||
|
typedef void (catch_command_errors_ftype) (char *, int);
|
||||||
|
extern int catch_command_errors (catch_command_errors_ftype *func, char *command, int from_tty, return_mask);
|
||||||
|
|
||||||
extern void warning_begin (void);
|
extern void warning_begin (void);
|
||||||
|
|
||||||
extern void warning (const char *, ...) ATTR_FORMAT (printf, 1, 2);
|
extern void warning (const char *, ...) ATTR_FORMAT (printf, 1, 2);
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
1999-11-05 Stan Shebs <shebs@andros.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.texinfo: Clarify regular expressions used in rbreak.
|
||||||
|
|
||||||
1999-10-15 Kevin Buettner <kevinb@cygnus.com>
|
1999-10-15 Kevin Buettner <kevinb@cygnus.com>
|
||||||
|
|
||||||
* gdbint.texinfo (MEMORY_INSERT_BREAKPOINT,
|
* gdbint.texinfo (MEMORY_INSERT_BREAKPOINT,
|
||||||
|
|
|
@ -2229,14 +2229,19 @@ See also @ref{Conditions, ,Break conditions}.
|
||||||
@kindex rbreak
|
@kindex rbreak
|
||||||
@cindex regular expression
|
@cindex regular expression
|
||||||
@item rbreak @var{regex}
|
@item rbreak @var{regex}
|
||||||
@c FIXME what kind of regexp?
|
|
||||||
Set breakpoints on all functions matching the regular expression
|
Set breakpoints on all functions matching the regular expression
|
||||||
@var{regex}. This command
|
@var{regex}. This command sets an unconditional breakpoint on all
|
||||||
sets an unconditional breakpoint on all matches, printing a list of all
|
matches, printing a list of all breakpoints it set. Once these
|
||||||
breakpoints it set. Once these breakpoints are set, they are treated
|
breakpoints are set, they are treated just like the breakpoints set with
|
||||||
just like the breakpoints set with the @code{break} command. You can
|
the @code{break} command. You can delete them, disable them, or make
|
||||||
delete them, disable them, or make them conditional the same way as any
|
them conditional the same way as any other breakpoint.
|
||||||
other breakpoint.
|
|
||||||
|
The syntax of the regular expression is the standard one used with tools
|
||||||
|
like @file{grep}. Note that this is different from the syntax used by
|
||||||
|
shells, so for instance @code{foo*} matches all functions that include
|
||||||
|
an @code{fo} followed by zero or more @code{o}s. There is an implicit
|
||||||
|
@code{.*} leading and trailing the regular expression you supply, so to
|
||||||
|
match only functions that begin with @code{foo}, use @code{^foo}.
|
||||||
|
|
||||||
When debugging C++ programs, @code{rbreak} is useful for setting
|
When debugging C++ programs, @code{rbreak} is useful for setting
|
||||||
breakpoints on overloaded functions that are not members of any special
|
breakpoints on overloaded functions that are not members of any special
|
||||||
|
|
|
@ -375,7 +375,7 @@ elf_symtab_read (objfile, dynamic)
|
||||||
if (sym->section == &bfd_abs_section)
|
if (sym->section == &bfd_abs_section)
|
||||||
{
|
{
|
||||||
/* This is a hack to get the minimal symbol type
|
/* This is a hack to get the minimal symbol type
|
||||||
right for Irix 5, which has absolute adresses
|
right for Irix 5, which has absolute addresses
|
||||||
with special section indices for dynamic symbols. */
|
with special section indices for dynamic symbols. */
|
||||||
unsigned short shndx =
|
unsigned short shndx =
|
||||||
((elf_symbol_type *) sym)->internal_elf_sym.st_shndx;
|
((elf_symbol_type *) sym)->internal_elf_sym.st_shndx;
|
||||||
|
|
112
gdb/event-loop.c
112
gdb/event-loop.c
|
@ -256,7 +256,7 @@ static void create_file_handler (int fd, int mask, handler_func * proc, gdb_clie
|
||||||
static void invoke_async_signal_handler (void);
|
static void invoke_async_signal_handler (void);
|
||||||
static void handle_file_event (int event_file_desc);
|
static void handle_file_event (int event_file_desc);
|
||||||
static int gdb_wait_for_event (void);
|
static int gdb_wait_for_event (void);
|
||||||
static int gdb_do_one_event (void);
|
static int gdb_do_one_event (void *data);
|
||||||
static int check_async_ready (void);
|
static int check_async_ready (void);
|
||||||
static void async_queue_event (gdb_event * event_ptr, queue_position position);
|
static void async_queue_event (gdb_event * event_ptr, queue_position position);
|
||||||
static gdb_event *create_file_event (int fd);
|
static gdb_event *create_file_event (int fd);
|
||||||
|
@ -388,52 +388,61 @@ process_event (void)
|
||||||
|
|
||||||
/* Process one high level event. If nothing is ready at this time,
|
/* Process one high level event. If nothing is ready at this time,
|
||||||
wait for something to happen (via gdb_wait_for_event), then process
|
wait for something to happen (via gdb_wait_for_event), then process
|
||||||
it. Returns 1 if something was done otherwise returns 0 (this can
|
it. Returns >0 if something was done otherwise returns <0 (this
|
||||||
happen if there are no event sources to wait for). */
|
can happen if there are no event sources to wait for). If an error
|
||||||
static int
|
occures catch_errors() which calls this function returns zero. */
|
||||||
gdb_do_one_event (void)
|
|
||||||
{
|
|
||||||
int result = 0;
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
gdb_do_one_event (void *data)
|
||||||
|
{
|
||||||
|
/* Any events already waiting in the queue? */
|
||||||
|
if (process_event ())
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Are any timers that are ready? If so, put an event on the queue. */
|
||||||
|
poll_timers ();
|
||||||
|
|
||||||
|
/* Wait for a new event. If gdb_wait_for_event returns -1,
|
||||||
|
we should get out because this means that there are no
|
||||||
|
event sources left. This will make the event loop stop,
|
||||||
|
and the application exit. */
|
||||||
|
|
||||||
|
if (gdb_wait_for_event () < 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle any new events occurred while waiting. */
|
||||||
|
if (process_event ())
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If gdb_wait_for_event has returned 1, it means that one
|
||||||
|
event has been handled. We break out of the loop. */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Start up the event loop. This is the entry point to the event loop
|
||||||
|
from the command loop. */
|
||||||
|
|
||||||
|
void
|
||||||
|
start_event_loop (void)
|
||||||
|
{
|
||||||
|
/* Loop until there is nothing to do. This is the entry point to the
|
||||||
|
event loop engine. gdb_do_one_event, called via catch_errors()
|
||||||
|
will process one event for each invocation. It blocks waits for
|
||||||
|
an event and then processes it. >0 when an event is processed, 0
|
||||||
|
when catch_errors() caught an error and <0 when there are no
|
||||||
|
longer any event sources registered. */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (!SET_TOP_LEVEL ())
|
int result = catch_errors (gdb_do_one_event, 0, "", RETURN_MASK_ALL);
|
||||||
{
|
if (result < 0)
|
||||||
/* Any events already waiting in the queue? */
|
break;
|
||||||
if (process_event ())
|
if (result == 0)
|
||||||
{
|
|
||||||
result = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Are any timers that are ready? If so, put an event on the queue. */
|
|
||||||
poll_timers ();
|
|
||||||
|
|
||||||
/* Wait for a new event. If gdb_wait_for_event returns -1,
|
|
||||||
we should get out because this means that there are no
|
|
||||||
event sources left. This will make the event loop stop,
|
|
||||||
and the application exit. */
|
|
||||||
|
|
||||||
result = gdb_wait_for_event ();
|
|
||||||
if (result < 0)
|
|
||||||
{
|
|
||||||
result = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Handle any new events occurred while waiting. */
|
|
||||||
if (process_event ())
|
|
||||||
{
|
|
||||||
result = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If gdb_wait_for_event has returned 1, it means that one
|
|
||||||
event has been handled. We break out of the loop. */
|
|
||||||
if (result)
|
|
||||||
break;
|
|
||||||
} /* end of if !set_top_level */
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* FIXME: this should really be a call to a hook that is
|
/* FIXME: this should really be a call to a hook that is
|
||||||
interface specific, because interfaces can display the
|
interface specific, because interfaces can display the
|
||||||
|
@ -443,21 +452,6 @@ gdb_do_one_event (void)
|
||||||
whether display the prompt or not. */
|
whether display the prompt or not. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Start up the event loop. This is the entry point to the event loop
|
|
||||||
from the command loop. */
|
|
||||||
void
|
|
||||||
start_event_loop (void)
|
|
||||||
{
|
|
||||||
/* Loop until there is something to do. This is the entry point to
|
|
||||||
the event loop engine. gdb_do_one_event will process one event
|
|
||||||
for each invocation. It always returns 1, unless there are no
|
|
||||||
more event sources registered. In this case it returns 0. */
|
|
||||||
while (gdb_do_one_event () != 0)
|
|
||||||
;
|
|
||||||
|
|
||||||
/* We are done with the event loop. There are no more event sources
|
/* We are done with the event loop. There are no more event sources
|
||||||
to listen to. So we exit GDB. */
|
to listen to. So we exit GDB. */
|
||||||
|
|
|
@ -492,7 +492,7 @@ static int u_offsets[] =
|
||||||
-1, /* Not available: ITC */
|
-1, /* Not available: ITC */
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
PT_AR_PFS,
|
PT_CR_IFS, /* was PT_AR_PFS, but it seemed bogus */
|
||||||
PT_AR_LC,
|
PT_AR_LC,
|
||||||
-1, /* Not available: EC, the Epilog Count register */
|
-1, /* Not available: EC, the Epilog Count register */
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
|
|
@ -520,6 +520,13 @@ hpux_thread_create_inferior (exec_file, allargs, env)
|
||||||
those variables don't show up until the library gets mapped and the symbol
|
those variables don't show up until the library gets mapped and the symbol
|
||||||
table is read in. */
|
table is read in. */
|
||||||
|
|
||||||
|
/* This new_objfile event is now managed by a chained function pointer.
|
||||||
|
* It is the callee's responsability to call the next client on the chain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Saved pointer to previous owner of the new_objfile event. */
|
||||||
|
static void (*target_new_objfile_chain) PARAMS ((struct objfile *));
|
||||||
|
|
||||||
void
|
void
|
||||||
hpux_thread_new_objfile (objfile)
|
hpux_thread_new_objfile (objfile)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
|
@ -529,25 +536,28 @@ hpux_thread_new_objfile (objfile)
|
||||||
if (!objfile)
|
if (!objfile)
|
||||||
{
|
{
|
||||||
hpux_thread_active = 0;
|
hpux_thread_active = 0;
|
||||||
|
goto quit;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ms = lookup_minimal_symbol ("cma__g_known_threads", NULL, objfile);
|
ms = lookup_minimal_symbol ("cma__g_known_threads", NULL, objfile);
|
||||||
|
|
||||||
if (!ms)
|
if (!ms)
|
||||||
return;
|
goto quit;
|
||||||
|
|
||||||
P_cma__g_known_threads = SYMBOL_VALUE_ADDRESS (ms);
|
P_cma__g_known_threads = SYMBOL_VALUE_ADDRESS (ms);
|
||||||
|
|
||||||
ms = lookup_minimal_symbol ("cma__g_current_thread", NULL, objfile);
|
ms = lookup_minimal_symbol ("cma__g_current_thread", NULL, objfile);
|
||||||
|
|
||||||
if (!ms)
|
if (!ms)
|
||||||
return;
|
goto quit;
|
||||||
|
|
||||||
P_cma__g_current_thread = SYMBOL_VALUE_ADDRESS (ms);
|
P_cma__g_current_thread = SYMBOL_VALUE_ADDRESS (ms);
|
||||||
|
|
||||||
hpux_thread_active = 1;
|
hpux_thread_active = 1;
|
||||||
|
quit:
|
||||||
|
/* Call predecessor on chain, if any. */
|
||||||
|
if (target_new_objfile_chain)
|
||||||
|
target_new_objfile_chain (objfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clean up after the inferior dies. */
|
/* Clean up after the inferior dies. */
|
||||||
|
@ -638,4 +648,7 @@ _initialize_hpux_thread ()
|
||||||
add_target (&hpux_thread_ops);
|
add_target (&hpux_thread_ops);
|
||||||
|
|
||||||
child_suppress_run = 1;
|
child_suppress_run = 1;
|
||||||
|
/* Hook into new_objfile notification. */
|
||||||
|
target_new_objfile_chain = target_new_objfile_hook;
|
||||||
|
target_new_objfile_hook = hpux_thread_new_objfile;
|
||||||
}
|
}
|
||||||
|
|
|
@ -325,6 +325,13 @@ store_fpregs ()
|
||||||
/* Transfering floating-point and SSE registers to and from GDB. */
|
/* Transfering floating-point and SSE registers to and from GDB. */
|
||||||
|
|
||||||
|
|
||||||
|
/* PTRACE_GETXFPREGS is a Cygnus invention, since we wrote our own
|
||||||
|
Linux kernel patch for SSE support. That patch may or may not
|
||||||
|
actually make it into the official distribution. If you find that
|
||||||
|
years have gone by since this code was added, and Linux isn't using
|
||||||
|
PTRACE_GETXFPREGS, that means that our patch didn't make it, and
|
||||||
|
you can delete this code. */
|
||||||
|
|
||||||
#ifdef HAVE_PTRACE_GETXFPREGS
|
#ifdef HAVE_PTRACE_GETXFPREGS
|
||||||
static void
|
static void
|
||||||
supply_xfpregset (struct user_xfpregs_struct *xfpregs)
|
supply_xfpregset (struct user_xfpregs_struct *xfpregs)
|
||||||
|
|
96
gdb/infcmd.c
96
gdb/infcmd.c
|
@ -49,6 +49,8 @@ void registers_info PARAMS ((char *, int));
|
||||||
|
|
||||||
void continue_command PARAMS ((char *, int));
|
void continue_command PARAMS ((char *, int));
|
||||||
|
|
||||||
|
static void print_return_value (int struct_return, struct type *value_type);
|
||||||
|
|
||||||
static void finish_command_continuation PARAMS ((struct continuation_arg *));
|
static void finish_command_continuation PARAMS ((struct continuation_arg *));
|
||||||
|
|
||||||
static void until_next_command PARAMS ((int));
|
static void until_next_command PARAMS ((int));
|
||||||
|
@ -869,6 +871,37 @@ until_command (arg, from_tty)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Print the result of a function at the end of a 'finish' command. */
|
||||||
|
static void
|
||||||
|
print_return_value (int structure_return, struct type *value_type)
|
||||||
|
{
|
||||||
|
register value_ptr value;
|
||||||
|
|
||||||
|
if (!structure_return)
|
||||||
|
{
|
||||||
|
value = value_being_returned (value_type, stop_registers, structure_return);
|
||||||
|
printf_filtered ("Value returned is $%d = ", record_latest_value (value));
|
||||||
|
value_print (value, gdb_stdout, 0, Val_no_prettyprint);
|
||||||
|
printf_filtered ("\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We cannot determine the contents of the structure because
|
||||||
|
it is on the stack, and we don't know where, since we did not
|
||||||
|
initiate the call, as opposed to the call_function_by_hand case */
|
||||||
|
#ifdef VALUE_RETURNED_FROM_STACK
|
||||||
|
value = 0;
|
||||||
|
printf_filtered ("Value returned has type: %s.", TYPE_NAME (value_type));
|
||||||
|
printf_filtered (" Cannot determine contents\n");
|
||||||
|
#else
|
||||||
|
value = value_being_returned (value_type, stop_registers, structure_return);
|
||||||
|
printf_filtered ("Value returned is $%d = ", record_latest_value (value));
|
||||||
|
value_print (value, gdb_stdout, 0, Val_no_prettyprint);
|
||||||
|
printf_filtered ("\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Stuff that needs to be done by the finish command after the target
|
/* Stuff that needs to be done by the finish command after the target
|
||||||
has stopped. In asynchronous mode, we wait for the target to stop in
|
has stopped. In asynchronous mode, we wait for the target to stop in
|
||||||
the call to poll or select in the event loop, so it is impossible to
|
the call to poll or select in the event loop, so it is impossible to
|
||||||
|
@ -891,7 +924,6 @@ finish_command_continuation (arg)
|
||||||
&& function != 0)
|
&& function != 0)
|
||||||
{
|
{
|
||||||
struct type *value_type;
|
struct type *value_type;
|
||||||
register value_ptr val;
|
|
||||||
CORE_ADDR funcaddr;
|
CORE_ADDR funcaddr;
|
||||||
int struct_return;
|
int struct_return;
|
||||||
|
|
||||||
|
@ -908,38 +940,11 @@ finish_command_continuation (arg)
|
||||||
funcaddr = BLOCK_START (SYMBOL_BLOCK_VALUE (function));
|
funcaddr = BLOCK_START (SYMBOL_BLOCK_VALUE (function));
|
||||||
|
|
||||||
struct_return = using_struct_return (value_of_variable (function, NULL),
|
struct_return = using_struct_return (value_of_variable (function, NULL),
|
||||||
|
|
||||||
funcaddr,
|
funcaddr,
|
||||||
check_typedef (value_type),
|
check_typedef (value_type),
|
||||||
BLOCK_GCC_COMPILED (SYMBOL_BLOCK_VALUE (function)));
|
BLOCK_GCC_COMPILED (SYMBOL_BLOCK_VALUE (function)));
|
||||||
|
|
||||||
if (!struct_return)
|
print_return_value (struct_return, value_type);
|
||||||
{
|
|
||||||
val = value_being_returned (value_type, stop_registers, struct_return);
|
|
||||||
printf_filtered ("Value returned is $%d = ", record_latest_value (val));
|
|
||||||
value_print (val, gdb_stdout, 0, Val_no_prettyprint);
|
|
||||||
printf_filtered ("\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We cannot determine the contents of the structure because
|
|
||||||
it is on the stack, and we don't know where, since we did not
|
|
||||||
initiate the call, as opposed to the call_function_by_hand case */
|
|
||||||
#ifdef VALUE_RETURNED_FROM_STACK
|
|
||||||
val = 0;
|
|
||||||
printf_filtered ("Value returned has type: %s.",
|
|
||||||
TYPE_NAME (value_type));
|
|
||||||
printf_filtered (" Cannot determine contents\n");
|
|
||||||
#else
|
|
||||||
val = value_being_returned (value_type, stop_registers,
|
|
||||||
struct_return);
|
|
||||||
printf_filtered ("Value returned is $%d = ",
|
|
||||||
record_latest_value (val));
|
|
||||||
value_print (val, gdb_stdout, 0, Val_no_prettyprint);
|
|
||||||
printf_filtered ("\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
do_exec_cleanups (ALL_CLEANUPS);
|
do_exec_cleanups (ALL_CLEANUPS);
|
||||||
}
|
}
|
||||||
|
@ -1044,7 +1049,6 @@ finish_command (arg, from_tty)
|
||||||
&& function != 0)
|
&& function != 0)
|
||||||
{
|
{
|
||||||
struct type *value_type;
|
struct type *value_type;
|
||||||
register value_ptr val;
|
|
||||||
CORE_ADDR funcaddr;
|
CORE_ADDR funcaddr;
|
||||||
int struct_return;
|
int struct_return;
|
||||||
|
|
||||||
|
@ -1064,35 +1068,7 @@ finish_command (arg, from_tty)
|
||||||
check_typedef (value_type),
|
check_typedef (value_type),
|
||||||
BLOCK_GCC_COMPILED (SYMBOL_BLOCK_VALUE (function)));
|
BLOCK_GCC_COMPILED (SYMBOL_BLOCK_VALUE (function)));
|
||||||
|
|
||||||
if (!struct_return)
|
print_return_value (struct_return, value_type);
|
||||||
{
|
|
||||||
val =
|
|
||||||
value_being_returned (value_type, stop_registers, struct_return);
|
|
||||||
printf_filtered ("Value returned is $%d = ",
|
|
||||||
record_latest_value (val));
|
|
||||||
value_print (val, gdb_stdout, 0, Val_no_prettyprint);
|
|
||||||
printf_filtered ("\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* We cannot determine the contents of the structure
|
|
||||||
because it is on the stack, and we don't know
|
|
||||||
where, since we did not initiate the call, as
|
|
||||||
opposed to the call_function_by_hand case */
|
|
||||||
#ifdef VALUE_RETURNED_FROM_STACK
|
|
||||||
val = 0;
|
|
||||||
printf_filtered ("Value returned has type: %s.",
|
|
||||||
TYPE_NAME (value_type));
|
|
||||||
printf_filtered (" Cannot determine contents\n");
|
|
||||||
#else
|
|
||||||
val = value_being_returned (value_type, stop_registers,
|
|
||||||
struct_return);
|
|
||||||
printf_filtered ("Value returned is $%d = ",
|
|
||||||
record_latest_value (val));
|
|
||||||
value_print (val, gdb_stdout, 0, Val_no_prettyprint);
|
|
||||||
printf_filtered ("\n");
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
do_cleanups (old_chain);
|
do_cleanups (old_chain);
|
||||||
}
|
}
|
||||||
|
|
|
@ -395,20 +395,20 @@ extern int attach_flag;
|
||||||
#endif /* No CALL_DUMMY_LOCATION. */
|
#endif /* No CALL_DUMMY_LOCATION. */
|
||||||
|
|
||||||
#if !defined (CALL_DUMMY_ADDRESS)
|
#if !defined (CALL_DUMMY_ADDRESS)
|
||||||
#define CALL_DUMMY_ADDRESS() (abort (), 0) /* anything to abort GDB */
|
#define CALL_DUMMY_ADDRESS() (internal_error ("CALL_DUMMY_ADDRESS"), 0)
|
||||||
#endif
|
#endif
|
||||||
#if !defined (CALL_DUMMY_START_OFFSET)
|
#if !defined (CALL_DUMMY_START_OFFSET)
|
||||||
#define CALL_DUMMY_START_OFFSET (abort (), 0) /* anything to abort GDB */
|
#define CALL_DUMMY_START_OFFSET (internal_error ("CALL_DUMMY_START_OFFSET"), 0)
|
||||||
#endif
|
#endif
|
||||||
#if !defined (CALL_DUMMY_BREAKPOINT_OFFSET)
|
#if !defined (CALL_DUMMY_BREAKPOINT_OFFSET)
|
||||||
#define CALL_DUMMY_BREAKPOINT_OFFSET_P (0)
|
#define CALL_DUMMY_BREAKPOINT_OFFSET_P (0)
|
||||||
#define CALL_DUMMY_BREAKPOINT_OFFSET (abort (), 0) /* anything to abort GDB */
|
#define CALL_DUMMY_BREAKPOINT_OFFSET (internal_error ("CALL_DUMMY_BREAKPOINT_OFFSET"), 0)
|
||||||
#endif
|
#endif
|
||||||
#if !defined CALL_DUMMY_BREAKPOINT_OFFSET_P
|
#if !defined CALL_DUMMY_BREAKPOINT_OFFSET_P
|
||||||
#define CALL_DUMMY_BREAKPOINT_OFFSET_P (1)
|
#define CALL_DUMMY_BREAKPOINT_OFFSET_P (1)
|
||||||
#endif
|
#endif
|
||||||
#if !defined (CALL_DUMMY_LENGTH)
|
#if !defined (CALL_DUMMY_LENGTH)
|
||||||
#define CALL_DUMMY_LENGTH (abort (), 0) /* anything to abort GDB */
|
#define CALL_DUMMY_LENGTH (internal_error ("CALL_DUMMY_LENGTH"), 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (CALL_DUMMY_STACK_ADJUST)
|
#if defined (CALL_DUMMY_STACK_ADJUST)
|
||||||
|
@ -417,7 +417,7 @@ extern int attach_flag;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if !defined (CALL_DUMMY_STACK_ADJUST)
|
#if !defined (CALL_DUMMY_STACK_ADJUST)
|
||||||
#define CALL_DUMMY_STACK_ADJUST (abort (), 0)
|
#define CALL_DUMMY_STACK_ADJUST (internal_error ("CALL_DUMMY_STACK_ADJUST"), 0)
|
||||||
#endif
|
#endif
|
||||||
#if !defined (CALL_DUMMY_STACK_ADJUST_P)
|
#if !defined (CALL_DUMMY_STACK_ADJUST_P)
|
||||||
#define CALL_DUMMY_STACK_ADJUST_P (0)
|
#define CALL_DUMMY_STACK_ADJUST_P (0)
|
||||||
|
@ -436,7 +436,7 @@ extern int attach_flag;
|
||||||
extern LONGEST call_dummy_words[];
|
extern LONGEST call_dummy_words[];
|
||||||
#define CALL_DUMMY_WORDS (call_dummy_words)
|
#define CALL_DUMMY_WORDS (call_dummy_words)
|
||||||
#else
|
#else
|
||||||
#define CALL_DUMMY_WORDS (abort (), (void*) 0) /* anything to abort GDB */
|
#define CALL_DUMMY_WORDS (internal_error ("CALL_DUMMY_WORDS"), (void*) 0)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -445,20 +445,20 @@ extern LONGEST call_dummy_words[];
|
||||||
extern int sizeof_call_dummy_words;
|
extern int sizeof_call_dummy_words;
|
||||||
#define SIZEOF_CALL_DUMMY_WORDS (sizeof_call_dummy_words)
|
#define SIZEOF_CALL_DUMMY_WORDS (sizeof_call_dummy_words)
|
||||||
#else
|
#else
|
||||||
#define SIZEOF_CALL_DUMMY_WORDS (abort (), 0) /* anything to abort GDB */
|
#define SIZEOF_CALL_DUMMY_WORDS (internal_error ("SIZEOF_CALL_DUMMY_WORDS"), 0)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined PUSH_DUMMY_FRAME
|
#if !defined PUSH_DUMMY_FRAME
|
||||||
#define PUSH_DUMMY_FRAME (abort ())
|
#define PUSH_DUMMY_FRAME (internal_error ("PUSH_DUMMY_FRAME"), 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined FIX_CALL_DUMMY
|
#if !defined FIX_CALL_DUMMY
|
||||||
#define FIX_CALL_DUMMY(a1,a2,a3,a4,a5,a6,a7) (abort ())
|
#define FIX_CALL_DUMMY(a1,a2,a3,a4,a5,a6,a7) (internal_error ("FIX_CALL_DUMMY"), 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined STORE_STRUCT_RETURN
|
#if !defined STORE_STRUCT_RETURN
|
||||||
#define STORE_STRUCT_RETURN(a1,a2) (abort ())
|
#define STORE_STRUCT_RETURN(a1,a2) (internal_error ("STORE_STRUCT_RETURN"), 0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
126
gdb/infrun.c
126
gdb/infrun.c
|
@ -1160,6 +1160,24 @@ enum infwait_states
|
||||||
infwait_nonstep_watch_state
|
infwait_nonstep_watch_state
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Why did the inferior stop? Used to print the appropriate messages
|
||||||
|
to the interface from within handle_inferior_event(). */
|
||||||
|
enum inferior_stop_reason
|
||||||
|
{
|
||||||
|
/* We don't know why. */
|
||||||
|
STOP_UNKNOWN,
|
||||||
|
/* Step, next, nexti, stepi finished. */
|
||||||
|
END_STEPPING_RANGE,
|
||||||
|
/* Found breakpoint. */
|
||||||
|
BREAKPOINT_HIT,
|
||||||
|
/* Inferior terminated by signal. */
|
||||||
|
SIGNAL_EXITED,
|
||||||
|
/* Inferior exited. */
|
||||||
|
EXITED,
|
||||||
|
/* Inferior received signal, and user asked to be notified. */
|
||||||
|
SIGNAL_RECEIVED
|
||||||
|
};
|
||||||
|
|
||||||
/* This structure contains what used to be local variables in
|
/* This structure contains what used to be local variables in
|
||||||
wait_for_inferior. Probably many of them can return to being
|
wait_for_inferior. Probably many of them can return to being
|
||||||
locals in handle_inferior_event. */
|
locals in handle_inferior_event. */
|
||||||
|
@ -1202,6 +1220,7 @@ static void step_over_function (struct execution_control_state *ecs);
|
||||||
static void stop_stepping (struct execution_control_state *ecs);
|
static void stop_stepping (struct execution_control_state *ecs);
|
||||||
static void prepare_to_wait (struct execution_control_state *ecs);
|
static void prepare_to_wait (struct execution_control_state *ecs);
|
||||||
static void keep_going (struct execution_control_state *ecs);
|
static void keep_going (struct execution_control_state *ecs);
|
||||||
|
static void print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info);
|
||||||
|
|
||||||
/* Wait for control to return from inferior to debugger.
|
/* Wait for control to return from inferior to debugger.
|
||||||
If inferior gets a signal, we may decide to start it up again
|
If inferior gets a signal, we may decide to start it up again
|
||||||
|
@ -1499,12 +1518,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
|
|
||||||
case TARGET_WAITKIND_EXITED:
|
case TARGET_WAITKIND_EXITED:
|
||||||
target_terminal_ours (); /* Must do this before mourn anyway */
|
target_terminal_ours (); /* Must do this before mourn anyway */
|
||||||
annotate_exited (ecs->ws.value.integer);
|
print_stop_reason (EXITED, ecs->ws.value.integer);
|
||||||
if (ecs->ws.value.integer)
|
|
||||||
printf_filtered ("\nProgram exited with code 0%o.\n",
|
|
||||||
(unsigned int) ecs->ws.value.integer);
|
|
||||||
else
|
|
||||||
printf_filtered ("\nProgram exited normally.\n");
|
|
||||||
|
|
||||||
/* Record the exit code in the convenience variable $_exitcode, so
|
/* Record the exit code in the convenience variable $_exitcode, so
|
||||||
that the user can inspect this again later. */
|
that the user can inspect this again later. */
|
||||||
|
@ -1522,7 +1536,6 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
stop_print_frame = 0;
|
stop_print_frame = 0;
|
||||||
stop_signal = ecs->ws.value.sig;
|
stop_signal = ecs->ws.value.sig;
|
||||||
target_terminal_ours (); /* Must do this before mourn anyway */
|
target_terminal_ours (); /* Must do this before mourn anyway */
|
||||||
annotate_signalled ();
|
|
||||||
|
|
||||||
/* This looks pretty bogus to me. Doesn't TARGET_WAITKIND_SIGNALLED
|
/* This looks pretty bogus to me. Doesn't TARGET_WAITKIND_SIGNALLED
|
||||||
mean it is already dead? This has been here since GDB 2.8, so
|
mean it is already dead? This has been here since GDB 2.8, so
|
||||||
|
@ -1531,18 +1544,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
rather than trying to change it here --kingdon, 5 Dec 1994. */
|
rather than trying to change it here --kingdon, 5 Dec 1994. */
|
||||||
target_kill (); /* kill mourns as well */
|
target_kill (); /* kill mourns as well */
|
||||||
|
|
||||||
printf_filtered ("\nProgram terminated with signal ");
|
print_stop_reason (SIGNAL_EXITED, stop_signal);
|
||||||
annotate_signal_name ();
|
|
||||||
printf_filtered ("%s", target_signal_to_name (stop_signal));
|
|
||||||
annotate_signal_name_end ();
|
|
||||||
printf_filtered (", ");
|
|
||||||
annotate_signal_string ();
|
|
||||||
printf_filtered ("%s", target_signal_to_string (stop_signal));
|
|
||||||
annotate_signal_string_end ();
|
|
||||||
printf_filtered (".\n");
|
|
||||||
|
|
||||||
printf_filtered ("The program no longer exists.\n");
|
|
||||||
gdb_flush (gdb_stdout);
|
|
||||||
singlestep_breakpoints_inserted_p = 0; /*SOFTWARE_SINGLE_STEP_P */
|
singlestep_breakpoints_inserted_p = 0; /*SOFTWARE_SINGLE_STEP_P */
|
||||||
stop_stepping (ecs);
|
stop_stepping (ecs);
|
||||||
return;
|
return;
|
||||||
|
@ -2182,17 +2184,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
{
|
{
|
||||||
printed = 1;
|
printed = 1;
|
||||||
target_terminal_ours_for_output ();
|
target_terminal_ours_for_output ();
|
||||||
annotate_signal ();
|
print_stop_reason (SIGNAL_RECEIVED, stop_signal);
|
||||||
printf_filtered ("\nProgram received signal ");
|
|
||||||
annotate_signal_name ();
|
|
||||||
printf_filtered ("%s", target_signal_to_name (stop_signal));
|
|
||||||
annotate_signal_name_end ();
|
|
||||||
printf_filtered (", ");
|
|
||||||
annotate_signal_string ();
|
|
||||||
printf_filtered ("%s", target_signal_to_string (stop_signal));
|
|
||||||
annotate_signal_string_end ();
|
|
||||||
printf_filtered (".\n");
|
|
||||||
gdb_flush (gdb_stdout);
|
|
||||||
}
|
}
|
||||||
if (signal_stop[stop_signal])
|
if (signal_stop[stop_signal])
|
||||||
{
|
{
|
||||||
|
@ -2704,6 +2696,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
supposed to be stepping at the assembly language level
|
supposed to be stepping at the assembly language level
|
||||||
("stepi"). Just stop. */
|
("stepi"). Just stop. */
|
||||||
stop_step = 1;
|
stop_step = 1;
|
||||||
|
print_stop_reason (END_STEPPING_RANGE, 0);
|
||||||
stop_stepping (ecs);
|
stop_stepping (ecs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2775,6 +2768,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
/* It is stepi or nexti. We always want to stop stepping after
|
/* It is stepi or nexti. We always want to stop stepping after
|
||||||
one instruction. */
|
one instruction. */
|
||||||
stop_step = 1;
|
stop_step = 1;
|
||||||
|
print_stop_reason (END_STEPPING_RANGE, 0);
|
||||||
stop_stepping (ecs);
|
stop_stepping (ecs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2820,6 +2814,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
when we do "s" in a function with no line numbers,
|
when we do "s" in a function with no line numbers,
|
||||||
or can this happen as a result of a return or longjmp?). */
|
or can this happen as a result of a return or longjmp?). */
|
||||||
stop_step = 1;
|
stop_step = 1;
|
||||||
|
print_stop_reason (END_STEPPING_RANGE, 0);
|
||||||
stop_stepping (ecs);
|
stop_stepping (ecs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2832,6 +2827,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
That is said to make things like for (;;) statements work
|
That is said to make things like for (;;) statements work
|
||||||
better. */
|
better. */
|
||||||
stop_step = 1;
|
stop_step = 1;
|
||||||
|
print_stop_reason (END_STEPPING_RANGE, 0);
|
||||||
stop_stepping (ecs);
|
stop_stepping (ecs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2851,6 +2847,7 @@ handle_inferior_event (struct execution_control_state *ecs)
|
||||||
in which after skipping the prologue we better stop even though
|
in which after skipping the prologue we better stop even though
|
||||||
we will be in mid-line. */
|
we will be in mid-line. */
|
||||||
stop_step = 1;
|
stop_step = 1;
|
||||||
|
print_stop_reason (END_STEPPING_RANGE, 0);
|
||||||
stop_stepping (ecs);
|
stop_stepping (ecs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2957,6 +2954,7 @@ step_into_function (struct execution_control_state *ecs)
|
||||||
{
|
{
|
||||||
/* We are already there: stop now. */
|
/* We are already there: stop now. */
|
||||||
stop_step = 1;
|
stop_step = 1;
|
||||||
|
print_stop_reason (END_STEPPING_RANGE, 0);
|
||||||
stop_stepping (ecs);
|
stop_stepping (ecs);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3192,6 +3190,74 @@ prepare_to_wait (struct execution_control_state *ecs)
|
||||||
soon. */
|
soon. */
|
||||||
ecs->wait_some_more = 1;
|
ecs->wait_some_more = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Print why the inferior has stopped. We always print something when
|
||||||
|
the inferior exits, or receives a signal. The rest of the cases are
|
||||||
|
dealt with later on in normal_stop() and print_it_typical(). Ideally
|
||||||
|
there should be a call to this function from handle_inferior_event()
|
||||||
|
each time stop_stepping() is called.*/
|
||||||
|
static void
|
||||||
|
print_stop_reason (enum inferior_stop_reason stop_reason, int stop_info)
|
||||||
|
{
|
||||||
|
switch (stop_reason)
|
||||||
|
{
|
||||||
|
case STOP_UNKNOWN:
|
||||||
|
/* We don't deal with these cases from handle_inferior_event()
|
||||||
|
yet. */
|
||||||
|
break;
|
||||||
|
case END_STEPPING_RANGE:
|
||||||
|
/* We are done with a step/next/si/ni command. */
|
||||||
|
/* For now print nothing. */
|
||||||
|
break;
|
||||||
|
case BREAKPOINT_HIT:
|
||||||
|
/* We found a breakpoint. */
|
||||||
|
/* For now print nothing. */
|
||||||
|
break;
|
||||||
|
case SIGNAL_EXITED:
|
||||||
|
/* The inferior was terminated by a signal. */
|
||||||
|
annotate_signalled ();
|
||||||
|
printf_filtered ("\nProgram terminated with signal ");
|
||||||
|
annotate_signal_name ();
|
||||||
|
printf_filtered ("%s", target_signal_to_name (stop_info));
|
||||||
|
annotate_signal_name_end ();
|
||||||
|
printf_filtered (", ");
|
||||||
|
annotate_signal_string ();
|
||||||
|
printf_filtered ("%s", target_signal_to_string (stop_info));
|
||||||
|
annotate_signal_string_end ();
|
||||||
|
printf_filtered (".\n");
|
||||||
|
|
||||||
|
printf_filtered ("The program no longer exists.\n");
|
||||||
|
gdb_flush (gdb_stdout);
|
||||||
|
break;
|
||||||
|
case EXITED:
|
||||||
|
/* The inferior program is finished. */
|
||||||
|
annotate_exited (stop_info);
|
||||||
|
if (stop_info)
|
||||||
|
printf_filtered ("\nProgram exited with code 0%o.\n",
|
||||||
|
(unsigned int) stop_info);
|
||||||
|
else
|
||||||
|
printf_filtered ("\nProgram exited normally.\n");
|
||||||
|
break;
|
||||||
|
case SIGNAL_RECEIVED:
|
||||||
|
/* Signal received. The signal table tells us to print about
|
||||||
|
it. */
|
||||||
|
annotate_signal ();
|
||||||
|
printf_filtered ("\nProgram received signal ");
|
||||||
|
annotate_signal_name ();
|
||||||
|
printf_filtered ("%s", target_signal_to_name (stop_info));
|
||||||
|
annotate_signal_name_end ();
|
||||||
|
printf_filtered (", ");
|
||||||
|
annotate_signal_string ();
|
||||||
|
printf_filtered ("%s", target_signal_to_string (stop_info));
|
||||||
|
annotate_signal_string_end ();
|
||||||
|
printf_filtered (".\n");
|
||||||
|
gdb_flush (gdb_stdout);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
internal_error ("print_stop_reason: unrecognized enum value");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Here to return control to GDB when the inferior stops for real.
|
/* Here to return control to GDB when the inferior stops for real.
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
void _initialize_kod (void);
|
void _initialize_kod (void);
|
||||||
|
|
||||||
/* Prototypes for local functions. */
|
/* Prototypes for local functions. */
|
||||||
static void show_kod (char *, int);
|
|
||||||
static void info_kod_command (char *, int);
|
static void info_kod_command (char *, int);
|
||||||
static void load_kod_library (char *);
|
static void load_kod_library (char *);
|
||||||
|
|
||||||
|
|
|
@ -831,11 +831,19 @@ update_stop_threads (test_pid)
|
||||||
do_cleanups (old_chain);
|
do_cleanups (old_chain);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This routine is called whenever a new symbol table is read in, or when all
|
/* This routine is called whenever a new symbol table is read in, or
|
||||||
symbol tables are removed. libpthread can only be initialized when it
|
when all symbol tables are removed. linux-thread event handling
|
||||||
finds the right variables in libpthread.so. Since it's a shared library,
|
can only be initialized when we find the right variables in
|
||||||
those variables don't show up until the library gets mapped and the symbol
|
libpthread.so. Since it's a shared library, those variables don't
|
||||||
table is read in. */
|
show up until the library gets mapped and the symbol table is read
|
||||||
|
in. */
|
||||||
|
|
||||||
|
/* This new_objfile event is now managed by a chained function pointer.
|
||||||
|
* It is the callee's responsability to call the next client on the chain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Saved pointer to previous owner of the new_objfile event. */
|
||||||
|
static void (*target_new_objfile_chain) PARAMS ((struct objfile *));
|
||||||
|
|
||||||
void
|
void
|
||||||
linuxthreads_new_objfile (objfile)
|
linuxthreads_new_objfile (objfile)
|
||||||
|
@ -853,17 +861,17 @@ linuxthreads_new_objfile (objfile)
|
||||||
/* Indicate that we don't know anything's address any more. */
|
/* Indicate that we don't know anything's address any more. */
|
||||||
linuxthreads_max = 0;
|
linuxthreads_max = 0;
|
||||||
|
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we've already found our variables in another objfile, don't
|
/* If we've already found our variables in another objfile, don't
|
||||||
bother looking for them again. */
|
bother looking for them again. */
|
||||||
if (linuxthreads_max)
|
if (linuxthreads_max)
|
||||||
return;
|
goto quit;
|
||||||
|
|
||||||
if (! lookup_minimal_symbol ("__pthread_initial_thread", NULL, objfile))
|
if (! lookup_minimal_symbol ("__pthread_initial_thread", NULL, objfile))
|
||||||
/* This object file isn't the pthreads library. */
|
/* This object file isn't the pthreads library. */
|
||||||
return;
|
goto quit;
|
||||||
|
|
||||||
if ((ms = lookup_minimal_symbol ("__pthread_threads_debug",
|
if ((ms = lookup_minimal_symbol ("__pthread_threads_debug",
|
||||||
NULL, objfile)) == NULL)
|
NULL, objfile)) == NULL)
|
||||||
|
@ -874,7 +882,7 @@ This program seems to use POSIX threads, but the thread library used\n\
|
||||||
does not support debugging. This may make using GDB difficult. Don't\n\
|
does not support debugging. This may make using GDB difficult. Don't\n\
|
||||||
set breakpoints or single-step through code that might be executed by\n\
|
set breakpoints or single-step through code that might be executed by\n\
|
||||||
any thread other than the main thread.");
|
any thread other than the main thread.");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
linuxthreads_debug = SYMBOL_VALUE_ADDRESS (ms);
|
linuxthreads_debug = SYMBOL_VALUE_ADDRESS (ms);
|
||||||
|
|
||||||
|
@ -888,7 +896,7 @@ any thread other than the main thread.");
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Unable to find linuxthreads symbol \"%s\"\n",
|
"Unable to find linuxthreads symbol \"%s\"\n",
|
||||||
"__pthread_sizeof_handle");
|
"__pthread_sizeof_handle");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ms = lookup_minimal_symbol ("__pthread_offsetof_descr",
|
if ((ms = lookup_minimal_symbol ("__pthread_offsetof_descr",
|
||||||
|
@ -900,7 +908,7 @@ any thread other than the main thread.");
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Unable to find linuxthreads symbol \"%s\"\n",
|
"Unable to find linuxthreads symbol \"%s\"\n",
|
||||||
"__pthread_offsetof_descr");
|
"__pthread_offsetof_descr");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ms = lookup_minimal_symbol ("__pthread_offsetof_pid",
|
if ((ms = lookup_minimal_symbol ("__pthread_offsetof_pid",
|
||||||
|
@ -912,11 +920,11 @@ any thread other than the main thread.");
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Unable to find linuxthreads symbol \"%s\"\n",
|
"Unable to find linuxthreads symbol \"%s\"\n",
|
||||||
"__pthread_offsetof_pid");
|
"__pthread_offsetof_pid");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! find_all_signal_vars (objfile))
|
if (! find_all_signal_vars (objfile))
|
||||||
return;
|
goto quit;
|
||||||
|
|
||||||
/* Read adresses of internal structures to access */
|
/* Read adresses of internal structures to access */
|
||||||
if ((ms = lookup_minimal_symbol ("__pthread_handles",
|
if ((ms = lookup_minimal_symbol ("__pthread_handles",
|
||||||
|
@ -925,7 +933,7 @@ any thread other than the main thread.");
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Unable to find linuxthreads symbol \"%s\"\n",
|
"Unable to find linuxthreads symbol \"%s\"\n",
|
||||||
"__pthread_handles");
|
"__pthread_handles");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
linuxthreads_handles = SYMBOL_VALUE_ADDRESS (ms);
|
linuxthreads_handles = SYMBOL_VALUE_ADDRESS (ms);
|
||||||
|
|
||||||
|
@ -935,7 +943,7 @@ any thread other than the main thread.");
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Unable to find linuxthreads symbol \"%s\"\n",
|
"Unable to find linuxthreads symbol \"%s\"\n",
|
||||||
"__pthread_handles_num");
|
"__pthread_handles_num");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
linuxthreads_num = SYMBOL_VALUE_ADDRESS (ms);
|
linuxthreads_num = SYMBOL_VALUE_ADDRESS (ms);
|
||||||
|
|
||||||
|
@ -945,7 +953,7 @@ any thread other than the main thread.");
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Unable to find linuxthreads symbol \"%s\"\n",
|
"Unable to find linuxthreads symbol \"%s\"\n",
|
||||||
"__pthread_manager_thread");
|
"__pthread_manager_thread");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
linuxthreads_manager = SYMBOL_VALUE_ADDRESS (ms) + linuxthreads_offset_pid;
|
linuxthreads_manager = SYMBOL_VALUE_ADDRESS (ms) + linuxthreads_offset_pid;
|
||||||
|
|
||||||
|
@ -955,7 +963,7 @@ any thread other than the main thread.");
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Unable to find linuxthreads symbol \"%s\"\n",
|
"Unable to find linuxthreads symbol \"%s\"\n",
|
||||||
"__pthread_initial_thread");
|
"__pthread_initial_thread");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
linuxthreads_initial = SYMBOL_VALUE_ADDRESS (ms) + linuxthreads_offset_pid;
|
linuxthreads_initial = SYMBOL_VALUE_ADDRESS (ms) + linuxthreads_offset_pid;
|
||||||
|
|
||||||
|
@ -970,7 +978,7 @@ any thread other than the main thread.");
|
||||||
fprintf_unfiltered (gdb_stderr,
|
fprintf_unfiltered (gdb_stderr,
|
||||||
"Unable to find linuxthreads symbol \"%s\"\n",
|
"Unable to find linuxthreads symbol \"%s\"\n",
|
||||||
"__pthread_threads_max");
|
"__pthread_threads_max");
|
||||||
return;
|
goto quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate gdb internal structures */
|
/* Allocate gdb internal structures */
|
||||||
|
@ -989,6 +997,11 @@ any thread other than the main thread.");
|
||||||
update_stop_threads (inferior_pid);
|
update_stop_threads (inferior_pid);
|
||||||
linuxthreads_attach_pending = 0;
|
linuxthreads_attach_pending = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
quit:
|
||||||
|
/* Call predecessor on chain, if any. */
|
||||||
|
if (target_new_objfile_chain)
|
||||||
|
target_new_objfile_chain (objfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If we have switched threads from a one that stopped at breakpoint,
|
/* If we have switched threads from a one that stopped at breakpoint,
|
||||||
|
@ -1635,6 +1648,13 @@ _initialize_linuxthreads ()
|
||||||
add_target (&linuxthreads_ops);
|
add_target (&linuxthreads_ops);
|
||||||
child_suppress_run = 1;
|
child_suppress_run = 1;
|
||||||
|
|
||||||
|
/* Hook onto the "new_objfile" event.
|
||||||
|
* If someone else is already hooked onto the event,
|
||||||
|
* then make sure he will be called after we are.
|
||||||
|
*/
|
||||||
|
target_new_objfile_chain = target_new_objfile_hook;
|
||||||
|
target_new_objfile_hook = linuxthreads_new_objfile;
|
||||||
|
|
||||||
/* Attach SIGCHLD handler */
|
/* Attach SIGCHLD handler */
|
||||||
sact.sa_handler = sigchld_handler;
|
sact.sa_handler = sigchld_handler;
|
||||||
sigemptyset (&sact.sa_mask);
|
sigemptyset (&sact.sa_mask);
|
||||||
|
|
144
gdb/main.c
144
gdb/main.c
|
@ -82,11 +82,44 @@ extern char *external_editor_command;
|
||||||
#include <sys/cygwin.h> /* for cygwin32_conv_to_posix_path */
|
#include <sys/cygwin.h> /* for cygwin32_conv_to_posix_path */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int
|
/* Call command_loop. If it happens to return, pass that through as a
|
||||||
main (argc, argv)
|
non-zero return status. */
|
||||||
int argc;
|
|
||||||
char **argv;
|
static int
|
||||||
|
captured_command_loop (void *data)
|
||||||
{
|
{
|
||||||
|
if (command_loop_hook == NULL)
|
||||||
|
command_loop ();
|
||||||
|
else
|
||||||
|
command_loop_hook ();
|
||||||
|
/* FIXME: cagney/1999-11-05: A correct command_loop() implementaton
|
||||||
|
would clean things up (restoring the cleanup chain) to the state
|
||||||
|
they were just prior to the call. Technically, this means that
|
||||||
|
the do_cleanups() below is redundant. Unfortunatly, many FUNC's
|
||||||
|
are not that well behaved. do_cleanups should either be replaced
|
||||||
|
with a do_cleanups call (to cover the problem) or an assertion
|
||||||
|
check to detect bad FUNCs code. */
|
||||||
|
do_cleanups (ALL_CLEANUPS);
|
||||||
|
/* If the command_loop returned, normally (rather than threw an
|
||||||
|
error) we try to quit. If the quit is aborted, catch_errors()
|
||||||
|
which called this catch the signal and restart the command
|
||||||
|
loop. */
|
||||||
|
quit_command (NULL, instream == stdin);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct captured_main_args
|
||||||
|
{
|
||||||
|
int argc;
|
||||||
|
char **argv;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
captured_main (void *data)
|
||||||
|
{
|
||||||
|
struct captured_main_args *context = data;
|
||||||
|
int argc = context->argc;
|
||||||
|
char **argv = context->argv;
|
||||||
int count;
|
int count;
|
||||||
static int quiet = 0;
|
static int quiet = 0;
|
||||||
static int batch = 0;
|
static int batch = 0;
|
||||||
|
@ -139,12 +172,6 @@ main (argc, argv)
|
||||||
alloca (4 - i);
|
alloca (4 - i);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If error() is called from initialization code, just exit */
|
|
||||||
if (SET_TOP_LEVEL ())
|
|
||||||
{
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
cmdsize = 1;
|
cmdsize = 1;
|
||||||
cmdarg = (char **) xmalloc (cmdsize * sizeof (*cmdarg));
|
cmdarg = (char **) xmalloc (cmdsize * sizeof (*cmdarg));
|
||||||
ncmd = 0;
|
ncmd = 0;
|
||||||
|
@ -470,10 +497,8 @@ main (argc, argv)
|
||||||
|
|
||||||
if (!inhibit_gdbinit)
|
if (!inhibit_gdbinit)
|
||||||
{
|
{
|
||||||
if (!SET_TOP_LEVEL ())
|
catch_command_errors (source_command, homeinit, 0, RETURN_MASK_ALL);
|
||||||
source_command (homeinit, 0);
|
|
||||||
}
|
}
|
||||||
do_cleanups (ALL_CLEANUPS);
|
|
||||||
|
|
||||||
/* Do stats; no need to do them elsewhere since we'll only
|
/* Do stats; no need to do them elsewhere since we'll only
|
||||||
need them if homedir is set. Make sure that they are
|
need them if homedir is set. Make sure that they are
|
||||||
|
@ -491,41 +516,30 @@ main (argc, argv)
|
||||||
/* Now perform all the actions indicated by the arguments. */
|
/* Now perform all the actions indicated by the arguments. */
|
||||||
if (cdarg != NULL)
|
if (cdarg != NULL)
|
||||||
{
|
{
|
||||||
if (!SET_TOP_LEVEL ())
|
catch_command_errors (cd_command, cdarg, 0, RETURN_MASK_ALL);
|
||||||
{
|
|
||||||
cd_command (cdarg, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
do_cleanups (ALL_CLEANUPS);
|
|
||||||
|
|
||||||
for (i = 0; i < ndir; i++)
|
for (i = 0; i < ndir; i++)
|
||||||
if (!SET_TOP_LEVEL ())
|
catch_command_errors (directory_command, dirarg[i], 0, RETURN_MASK_ALL);
|
||||||
directory_command (dirarg[i], 0);
|
|
||||||
free ((PTR) dirarg);
|
free ((PTR) dirarg);
|
||||||
do_cleanups (ALL_CLEANUPS);
|
|
||||||
|
|
||||||
if (execarg != NULL
|
if (execarg != NULL
|
||||||
&& symarg != NULL
|
&& symarg != NULL
|
||||||
&& STREQ (execarg, symarg))
|
&& STREQ (execarg, symarg))
|
||||||
{
|
{
|
||||||
/* The exec file and the symbol-file are the same. If we can't open
|
/* The exec file and the symbol-file are the same. If we can't
|
||||||
it, better only print one error message. */
|
open it, better only print one error message.
|
||||||
if (!SET_TOP_LEVEL ())
|
catch_command_errors returns non-zero on success! */
|
||||||
{
|
if (catch_command_errors (exec_file_command, execarg, !batch, RETURN_MASK_ALL))
|
||||||
exec_file_command (execarg, !batch);
|
catch_command_errors (symbol_file_command, symarg, 0, RETURN_MASK_ALL);
|
||||||
symbol_file_command (symarg, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (execarg != NULL)
|
if (execarg != NULL)
|
||||||
if (!SET_TOP_LEVEL ())
|
catch_command_errors (exec_file_command, execarg, !batch, RETURN_MASK_ALL);
|
||||||
exec_file_command (execarg, !batch);
|
|
||||||
if (symarg != NULL)
|
if (symarg != NULL)
|
||||||
if (!SET_TOP_LEVEL ())
|
catch_command_errors (symbol_file_command, symarg, 0, RETURN_MASK_ALL);
|
||||||
symbol_file_command (symarg, 0);
|
|
||||||
}
|
}
|
||||||
do_cleanups (ALL_CLEANUPS);
|
|
||||||
|
|
||||||
/* After the symbol file has been read, print a newline to get us
|
/* After the symbol file has been read, print a newline to get us
|
||||||
beyond the copyright line... But errors should still set off
|
beyond the copyright line... But errors should still set off
|
||||||
|
@ -538,17 +552,16 @@ main (argc, argv)
|
||||||
|
|
||||||
if (corearg != NULL)
|
if (corearg != NULL)
|
||||||
{
|
{
|
||||||
if (!SET_TOP_LEVEL ())
|
if (catch_command_errors (core_file_command, corearg, !batch, RETURN_MASK_ALL) == 0)
|
||||||
core_file_command (corearg, !batch);
|
{
|
||||||
else if (isdigit (corearg[0]) && !SET_TOP_LEVEL ())
|
/* See if the core file is really a PID. */
|
||||||
attach_command (corearg, !batch);
|
if (isdigit (corearg[0]))
|
||||||
|
catch_command_errors (attach_command, corearg, !batch, RETURN_MASK_ALL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
do_cleanups (ALL_CLEANUPS);
|
|
||||||
|
|
||||||
if (ttyarg != NULL)
|
if (ttyarg != NULL)
|
||||||
if (!SET_TOP_LEVEL ())
|
catch_command_errors (tty_command, ttyarg, !batch, RETURN_MASK_ALL);
|
||||||
tty_command (ttyarg, !batch);
|
|
||||||
do_cleanups (ALL_CLEANUPS);
|
|
||||||
|
|
||||||
#ifdef ADDITIONAL_OPTION_HANDLER
|
#ifdef ADDITIONAL_OPTION_HANDLER
|
||||||
ADDITIONAL_OPTION_HANDLER;
|
ADDITIONAL_OPTION_HANDLER;
|
||||||
|
@ -566,14 +579,15 @@ main (argc, argv)
|
||||||
|| memcmp ((char *) &homebuf, (char *) &cwdbuf, sizeof (struct stat)))
|
|| memcmp ((char *) &homebuf, (char *) &cwdbuf, sizeof (struct stat)))
|
||||||
if (!inhibit_gdbinit)
|
if (!inhibit_gdbinit)
|
||||||
{
|
{
|
||||||
if (!SET_TOP_LEVEL ())
|
catch_command_errors (source_command, gdbinit, 0, RETURN_MASK_ALL);
|
||||||
source_command (gdbinit, 0);
|
|
||||||
}
|
}
|
||||||
do_cleanups (ALL_CLEANUPS);
|
|
||||||
|
|
||||||
for (i = 0; i < ncmd; i++)
|
for (i = 0; i < ncmd; i++)
|
||||||
{
|
{
|
||||||
if (!SET_TOP_LEVEL ())
|
#if 0
|
||||||
|
/* NOTE: cagney/1999-11-03: SET_TOP_LEVEL() was a macro that
|
||||||
|
expanded into a call to setjmp(). */
|
||||||
|
if (!SET_TOP_LEVEL ()) /* NB: This is #if 0'd out */
|
||||||
{
|
{
|
||||||
/* NOTE: I am commenting this out, because it is not clear
|
/* NOTE: I am commenting this out, because it is not clear
|
||||||
where this feature is used. It is very old and
|
where this feature is used. It is very old and
|
||||||
|
@ -586,6 +600,8 @@ main (argc, argv)
|
||||||
source_command (cmdarg[i], !batch);
|
source_command (cmdarg[i], !batch);
|
||||||
do_cleanups (ALL_CLEANUPS);
|
do_cleanups (ALL_CLEANUPS);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
catch_command_errors (source_command, cmdarg[i], !batch, RETURN_MASK_ALL);
|
||||||
}
|
}
|
||||||
free ((PTR) cmdarg);
|
free ((PTR) cmdarg);
|
||||||
|
|
||||||
|
@ -632,6 +648,11 @@ main (argc, argv)
|
||||||
The WIN32 Gui calls this main to set up gdb's state, and
|
The WIN32 Gui calls this main to set up gdb's state, and
|
||||||
has its own command loop. */
|
has its own command loop. */
|
||||||
#if !defined _WIN32 || defined __GNUC__
|
#if !defined _WIN32 || defined __GNUC__
|
||||||
|
/* GUIs generally have their own command loop, mainloop, or
|
||||||
|
whatever. This is a good place to gain control because many
|
||||||
|
error conditions will end up here via longjmp(). */
|
||||||
|
#if 0
|
||||||
|
/* FIXME: cagney/1999-11-06: The original main loop was like: */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (!SET_TOP_LEVEL ())
|
if (!SET_TOP_LEVEL ())
|
||||||
|
@ -647,11 +668,40 @@ main (argc, argv)
|
||||||
quit_command ((char *) 0, instream == stdin);
|
quit_command ((char *) 0, instream == stdin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* No exit -- exit is through quit_command. */
|
/* NOTE: If the command_loop() returned normally, the loop would
|
||||||
|
attempt to exit by calling the function quit_command(). That
|
||||||
|
function would either call exit() or throw an error returning
|
||||||
|
control to SET_TOP_LEVEL. */
|
||||||
|
/* NOTE: The function do_cleanups() was called once each time round
|
||||||
|
the loop. The usefulness of the call isn't clear. If an error
|
||||||
|
was thrown, everything would have already been cleaned up. If
|
||||||
|
command_loop() returned normally and quit_command() was called,
|
||||||
|
either exit() or error() (again cleaning up) would be called. */
|
||||||
#endif
|
#endif
|
||||||
|
/* NOTE: cagney/1999-11-07: There is probably no reason for not
|
||||||
|
moving this loop and the code found in captured_command_loop()
|
||||||
|
into the command_loop() proper. The main thing holding back that
|
||||||
|
change - SET_TOP_LEVEL() - has been eliminated. */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
catch_errors (captured_command_loop, 0, "", RETURN_MASK_ALL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/* No exit -- exit is through quit_command. */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
int top_level_val;
|
||||||
|
struct captured_main_args args;
|
||||||
|
args.argc = argc;
|
||||||
|
args.argv = argv;
|
||||||
|
catch_errors (captured_main, &args, "", RETURN_MASK_ALL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Don't use *_filtered for printing help. We don't want to prompt
|
/* Don't use *_filtered for printing help. We don't want to prompt
|
||||||
for continue no matter how small the screen or how much we're going
|
for continue no matter how small the screen or how much we're going
|
||||||
to print. */
|
to print. */
|
||||||
|
|
50
gdb/procfs.c
50
gdb/procfs.c
|
@ -2003,7 +2003,6 @@ unconditionally_kill_inferior (pi)
|
||||||
struct procinfo *pi;
|
struct procinfo *pi;
|
||||||
{
|
{
|
||||||
int ppid;
|
int ppid;
|
||||||
struct proc_ctl pctl;
|
|
||||||
|
|
||||||
ppid = pi->prstatus.pr_ppid;
|
ppid = pi->prstatus.pr_ppid;
|
||||||
|
|
||||||
|
@ -2231,8 +2230,9 @@ init_procinfo (pid, kill)
|
||||||
{
|
{
|
||||||
struct procinfo *pi = (struct procinfo *)
|
struct procinfo *pi = (struct procinfo *)
|
||||||
xmalloc (sizeof (struct procinfo));
|
xmalloc (sizeof (struct procinfo));
|
||||||
|
#ifdef UNIXWARE
|
||||||
struct sig_ctl sctl;
|
struct sig_ctl sctl;
|
||||||
struct flt_ctl fctl;
|
#endif /* UNIXWARE */
|
||||||
|
|
||||||
memset ((char *) pi, 0, sizeof (*pi));
|
memset ((char *) pi, 0, sizeof (*pi));
|
||||||
if (!open_proc_file (pid, pi, O_RDWR, 1))
|
if (!open_proc_file (pid, pi, O_RDWR, 1))
|
||||||
|
@ -2313,8 +2313,9 @@ create_procinfo (pid)
|
||||||
int pid;
|
int pid;
|
||||||
{
|
{
|
||||||
struct procinfo *pi;
|
struct procinfo *pi;
|
||||||
struct sig_ctl sctl;
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
struct flt_ctl fctl;
|
struct flt_ctl fctl;
|
||||||
|
#endif
|
||||||
|
|
||||||
pi = find_procinfo (pid, 1);
|
pi = find_procinfo (pid, 1);
|
||||||
if (pi != NULL)
|
if (pi != NULL)
|
||||||
|
@ -2381,7 +2382,9 @@ procfs_exit_handler (pi, syscall_num, why, rtnvalp, statvalp)
|
||||||
int *statvalp;
|
int *statvalp;
|
||||||
{
|
{
|
||||||
struct procinfo *temp_pi, *next_pi;
|
struct procinfo *temp_pi, *next_pi;
|
||||||
|
#if defined (UNIXWARE) || defined (PROCFS_USE_READ_WRITE)
|
||||||
struct proc_ctl pctl;
|
struct proc_ctl pctl;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef UNIXWARE
|
#ifdef UNIXWARE
|
||||||
pctl.cmd = PCRUN;
|
pctl.cmd = PCRUN;
|
||||||
|
@ -2913,7 +2916,9 @@ proc_set_exec_trap ()
|
||||||
#ifdef PR_ASYNC
|
#ifdef PR_ASYNC
|
||||||
{
|
{
|
||||||
long pr_flags;
|
long pr_flags;
|
||||||
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
struct proc_ctl pctl;
|
struct proc_ctl pctl;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Solaris needs this to make procfs treat all threads seperately. Without
|
/* Solaris needs this to make procfs treat all threads seperately. Without
|
||||||
this, all threads halt whenever something happens to any thread. Since
|
this, all threads halt whenever something happens to any thread. Since
|
||||||
|
@ -3250,8 +3255,9 @@ do_attach (pid)
|
||||||
int pid;
|
int pid;
|
||||||
{
|
{
|
||||||
struct procinfo *pi;
|
struct procinfo *pi;
|
||||||
struct sig_ctl sctl;
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
struct flt_ctl fctl;
|
struct flt_ctl fctl;
|
||||||
|
#endif
|
||||||
int nlwp, *lwps;
|
int nlwp, *lwps;
|
||||||
|
|
||||||
pi = init_procinfo (pid, 0);
|
pi = init_procinfo (pid, 0);
|
||||||
|
@ -3285,7 +3291,9 @@ do_attach (pid)
|
||||||
pi->was_stopped = 0;
|
pi->was_stopped = 0;
|
||||||
if (1 || query ("Process is currently running, stop it? "))
|
if (1 || query ("Process is currently running, stop it? "))
|
||||||
{
|
{
|
||||||
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
long cmd;
|
long cmd;
|
||||||
|
#endif
|
||||||
/* Make it run again when we close it. */
|
/* Make it run again when we close it. */
|
||||||
modify_run_on_last_close_flag (pi->ctl_fd, 1);
|
modify_run_on_last_close_flag (pi->ctl_fd, 1);
|
||||||
#ifdef PROCFS_USE_READ_WRITE
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
|
@ -3447,8 +3455,9 @@ do_detach (signal)
|
||||||
if (signal
|
if (signal
|
||||||
|| (THE_PR_LWP (pi->prstatus).pr_flags & (PR_STOPPED | PR_ISTOP)))
|
|| (THE_PR_LWP (pi->prstatus).pr_flags & (PR_STOPPED | PR_ISTOP)))
|
||||||
{
|
{
|
||||||
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
long cmd;
|
long cmd;
|
||||||
struct proc_ctl pctl;
|
#endif
|
||||||
|
|
||||||
if (signal || !pi->was_stopped ||
|
if (signal || !pi->was_stopped ||
|
||||||
query ("Was stopped when attached, make it runnable again? "))
|
query ("Was stopped when attached, make it runnable again? "))
|
||||||
|
@ -3516,7 +3525,6 @@ procfs_wait (pid, ourstatus)
|
||||||
int checkerr = 0;
|
int checkerr = 0;
|
||||||
int rtnval = -1;
|
int rtnval = -1;
|
||||||
struct procinfo *pi;
|
struct procinfo *pi;
|
||||||
struct proc_ctl pctl;
|
|
||||||
|
|
||||||
scan_again:
|
scan_again:
|
||||||
|
|
||||||
|
@ -3783,7 +3791,9 @@ set_proc_siginfo (pip, signo)
|
||||||
{
|
{
|
||||||
struct siginfo newsiginfo;
|
struct siginfo newsiginfo;
|
||||||
struct siginfo *sip;
|
struct siginfo *sip;
|
||||||
|
#if defined (UNIXWARE) || defined (PROCFS_USE_READ_WRITE)
|
||||||
struct sigi_ctl sictl;
|
struct sigi_ctl sictl;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef PROCFS_DONT_PIOCSSIG_CURSIG
|
#ifdef PROCFS_DONT_PIOCSSIG_CURSIG
|
||||||
/* With Alpha OSF/1 procfs, the kernel gets really confused if it
|
/* With Alpha OSF/1 procfs, the kernel gets really confused if it
|
||||||
|
@ -3844,7 +3854,9 @@ procfs_resume (pid, step, signo)
|
||||||
{
|
{
|
||||||
int signal_to_pass;
|
int signal_to_pass;
|
||||||
struct procinfo *pi, *procinfo, *next_pi;
|
struct procinfo *pi, *procinfo, *next_pi;
|
||||||
|
#if defined (UNIXWARE) || defined (PROCFS_USE_READ_WRITE)
|
||||||
struct proc_ctl pctl;
|
struct proc_ctl pctl;
|
||||||
|
#endif
|
||||||
|
|
||||||
pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
|
pi = find_procinfo (pid == -1 ? inferior_pid : pid, 0);
|
||||||
|
|
||||||
|
@ -4791,7 +4803,9 @@ info_proc_mappings (pip, summary)
|
||||||
int nmap;
|
int nmap;
|
||||||
struct prmap *prmaps;
|
struct prmap *prmaps;
|
||||||
struct prmap *prmap;
|
struct prmap *prmap;
|
||||||
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
struct stat sbuf;
|
struct stat sbuf;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!summary)
|
if (!summary)
|
||||||
{
|
{
|
||||||
|
@ -5116,7 +5130,9 @@ modify_inherit_on_fork_flag (fd, flag)
|
||||||
long pr_flags;
|
long pr_flags;
|
||||||
#endif
|
#endif
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
struct proc_ctl pctl;
|
struct proc_ctl pctl;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined (PIOCSET) || defined (PCSET) /* New method */
|
#if defined (PIOCSET) || defined (PCSET) /* New method */
|
||||||
pr_flags = PR_FORK;
|
pr_flags = PR_FORK;
|
||||||
|
@ -5192,7 +5208,9 @@ modify_run_on_last_close_flag (fd, flag)
|
||||||
long pr_flags;
|
long pr_flags;
|
||||||
#endif
|
#endif
|
||||||
int retval = 0;
|
int retval = 0;
|
||||||
|
#ifdef PROCFS_USE_READ_WRITE
|
||||||
struct proc_ctl pctl;
|
struct proc_ctl pctl;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined (PIOCSET) || defined (PCSET) /* New method */
|
#if defined (PIOCSET) || defined (PCSET) /* New method */
|
||||||
pr_flags = PR_RLC;
|
pr_flags = PR_RLC;
|
||||||
|
@ -5473,7 +5491,9 @@ procfs_lwp_creation_handler (pi, syscall_num, why, rtnvalp, statvalp)
|
||||||
{
|
{
|
||||||
int lwp_id;
|
int lwp_id;
|
||||||
struct procinfo *childpi;
|
struct procinfo *childpi;
|
||||||
|
#ifdef UNIXWARE
|
||||||
struct proc_ctl pctl;
|
struct proc_ctl pctl;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* We've just detected the completion of an lwp_create system call. Now we
|
/* We've just detected the completion of an lwp_create system call. Now we
|
||||||
need to setup a procinfo struct for this thread, and notify the thread
|
need to setup a procinfo struct for this thread, and notify the thread
|
||||||
|
@ -5781,14 +5801,16 @@ procfs_thread_alive (pid)
|
||||||
{
|
{
|
||||||
next_pi = pi->next;
|
next_pi = pi->next;
|
||||||
if (pi->pid == pid)
|
if (pi->pid == pid)
|
||||||
if (procfs_read_status (pi)) /* alive */
|
{
|
||||||
return 1;
|
if (procfs_read_status (pi)) /* alive */
|
||||||
else
|
return 1;
|
||||||
/* defunct (exited) */
|
else
|
||||||
{
|
/* defunct (exited) */
|
||||||
close_proc_file (pi);
|
{
|
||||||
return 0;
|
close_proc_file (pi);
|
||||||
}
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,7 +94,7 @@ CPPFLAGS = @CPPFLAGS@
|
||||||
LDFLAGS = @LDFLAGS@
|
LDFLAGS = @LDFLAGS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
libangsd_a_LIBADD =
|
libangsd_a_LIBADD =
|
||||||
libangsd_a_OBJECTS = ardi.o bytesex.o crc.o devsw.o drivers.o \
|
libangsd_a_OBJECTS = ardi.o angel_bytesex.o crc.o devsw.o drivers.o \
|
||||||
etherdrv.o hostchan.o hsys.o logging.o msgbuild.o params.o rx.o \
|
etherdrv.o hostchan.o hsys.o logging.o msgbuild.o params.o rx.o \
|
||||||
serdrv.o serpardr.o tx.o unixcomm.o
|
serdrv.o serpardr.o tx.o unixcomm.o
|
||||||
AR = ar
|
AR = ar
|
||||||
|
|
|
@ -47,7 +47,9 @@ static void openLogFile ()
|
||||||
perror ("fopen");
|
perror ("fopen");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
setlinebuf (angelDebugLogFile);
|
/* The following line is equivalent to: */
|
||||||
|
/* setlinebuf (angelDebugLogFile); */
|
||||||
|
setvbuf(angelDebugLogFile, (char *)NULL, _IOLBF, 0);
|
||||||
|
|
||||||
time (&t);
|
time (&t);
|
||||||
fprintf (angelDebugLogFile,"ADP log file opened at %s\n",asctime(localtime(&t)));
|
fprintf (angelDebugLogFile,"ADP log file opened at %s\n",asctime(localtime(&t)));
|
||||||
|
|
|
@ -480,7 +480,7 @@ send_rdp (char *template,...)
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
va_end (args);
|
va_end (alist);
|
||||||
|
|
||||||
if (dst != buf)
|
if (dst != buf)
|
||||||
abort ();
|
abort ();
|
||||||
|
|
321
gdb/remote.c
321
gdb/remote.c
|
@ -280,28 +280,6 @@ static serial_t remote_desc = NULL;
|
||||||
to denote that the target is in kernel mode. */
|
to denote that the target is in kernel mode. */
|
||||||
static int cisco_kernel_mode = 0;
|
static int cisco_kernel_mode = 0;
|
||||||
|
|
||||||
/* Maximum number of bytes to read/write at once. The value here
|
|
||||||
is chosen to fill up a packet (the headers account for the 32). */
|
|
||||||
#define MAXBUFBYTES(N) (((N)-32)/2)
|
|
||||||
|
|
||||||
/* Having this larger than 400 causes us to be incompatible with m68k-stub.c
|
|
||||||
and i386-stub.c. Normally, no one would notice because it only matters
|
|
||||||
for writing large chunks of memory (e.g. in downloads). Also, this needs
|
|
||||||
to be more than 400 if required to hold the registers (see below, where
|
|
||||||
we round it up based on REGISTER_BYTES). */
|
|
||||||
/* Round up PBUFSIZ to hold all the registers, at least. */
|
|
||||||
#define PBUFSIZ ((REGISTER_BYTES > MAXBUFBYTES (400)) \
|
|
||||||
? (REGISTER_BYTES * 2 + 32) \
|
|
||||||
: 400)
|
|
||||||
|
|
||||||
|
|
||||||
/* This variable sets the number of bytes to be written to the target
|
|
||||||
in a single packet. Normally PBUFSIZ is satisfactory, but some
|
|
||||||
targets need smaller values (perhaps because the receiving end
|
|
||||||
is slow). */
|
|
||||||
|
|
||||||
static int remote_write_size;
|
|
||||||
|
|
||||||
/* This variable sets the number of bits in an address that are to be
|
/* This variable sets the number of bits in an address that are to be
|
||||||
sent in a memory ("M" or "m") packet. Normally, after stripping
|
sent in a memory ("M" or "m") packet. Normally, after stripping
|
||||||
leading zeros, the entire address would be sent. This variable
|
leading zeros, the entire address would be sent. This variable
|
||||||
|
@ -315,18 +293,226 @@ static int remote_write_size;
|
||||||
|
|
||||||
static int remote_address_size;
|
static int remote_address_size;
|
||||||
|
|
||||||
/* This is the size (in chars) of the first response to the `g' command. This
|
|
||||||
is used to limit the size of the memory read and write commands to prevent
|
|
||||||
stub buffers from overflowing. The size does not include headers and
|
|
||||||
trailers, it is only the payload size. */
|
|
||||||
|
|
||||||
static int remote_register_buf_size = 0;
|
|
||||||
|
|
||||||
/* Tempoary to track who currently owns the terminal. See
|
/* Tempoary to track who currently owns the terminal. See
|
||||||
target_async_terminal_* for more details. */
|
target_async_terminal_* for more details. */
|
||||||
|
|
||||||
static int remote_async_terminal_ours_p;
|
static int remote_async_terminal_ours_p;
|
||||||
|
|
||||||
|
|
||||||
|
/* This is the size (in chars) of the first response to the ``g''
|
||||||
|
packet. It is used as a heuristic when determining the maximum
|
||||||
|
size of memory-read and memory-write packets. A target will
|
||||||
|
typically only reserve a buffer large enough to hold the ``g''
|
||||||
|
packet. The size does not include packet overhead (headers and
|
||||||
|
trailers). */
|
||||||
|
|
||||||
|
static long actual_register_packet_size;
|
||||||
|
|
||||||
|
/* This is the maximum size (in chars) of a non read/write packet. It
|
||||||
|
is also used as a cap on the size of read/write packets. */
|
||||||
|
|
||||||
|
static long remote_packet_size;
|
||||||
|
/* compatibility. */
|
||||||
|
#define PBUFSIZ (remote_packet_size)
|
||||||
|
|
||||||
|
/* User configurable variables for the number of characters in a
|
||||||
|
memory read/write packet. MIN (PBUFSIZ, g-packet-size) is the
|
||||||
|
default. Some targets need smaller values (fifo overruns, et.al.)
|
||||||
|
and some users need larger values (speed up transfers). The
|
||||||
|
variables ``preferred_*'' (the user request), ``current_*'' (what
|
||||||
|
was actually set) and ``forced_*'' (Positive - a soft limit,
|
||||||
|
negative - a hard limit). */
|
||||||
|
|
||||||
|
struct memory_packet_config
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
long size;
|
||||||
|
int fixed_p;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Compute the current size of a read/write packet. Since this makes
|
||||||
|
use of ``actual_register_packet_size'' the computation is dynamic. */
|
||||||
|
|
||||||
|
static long
|
||||||
|
get_memory_packet_size (struct memory_packet_config *config)
|
||||||
|
{
|
||||||
|
/* NOTE: The somewhat arbitrary 16k comes from the knowledge (folk
|
||||||
|
law?) that some hosts don't cope very well with large alloca()
|
||||||
|
calls. Eventually the alloca() code will be replaced by calls to
|
||||||
|
xmalloc() and make_cleanups() allowing this restriction to either
|
||||||
|
be lifted or removed. */
|
||||||
|
#ifndef MAX_REMOTE_PACKET_SIZE
|
||||||
|
#define MAX_REMOTE_PACKET_SIZE 16384
|
||||||
|
#endif
|
||||||
|
/* NOTE: 16 is just chosen at random. */
|
||||||
|
#ifndef MIN_REMOTE_PACKET_SIZE
|
||||||
|
#define MIN_REMOTE_PACKET_SIZE 16
|
||||||
|
#endif
|
||||||
|
long what_they_get;
|
||||||
|
if (config->fixed_p)
|
||||||
|
{
|
||||||
|
if (config->size <= 0)
|
||||||
|
what_they_get = MAX_REMOTE_PACKET_SIZE;
|
||||||
|
else
|
||||||
|
what_they_get = config->size;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
what_they_get = remote_packet_size;
|
||||||
|
/* Limit the packet to the size specified by the user. */
|
||||||
|
if (config->size > 0
|
||||||
|
&& what_they_get > config->size)
|
||||||
|
what_they_get = config->size;
|
||||||
|
/* Limit it to the size of the targets ``g'' response. */
|
||||||
|
if (actual_register_packet_size > 0
|
||||||
|
&& what_they_get > actual_register_packet_size)
|
||||||
|
what_they_get = actual_register_packet_size;
|
||||||
|
}
|
||||||
|
if (what_they_get > MAX_REMOTE_PACKET_SIZE)
|
||||||
|
what_they_get = MAX_REMOTE_PACKET_SIZE;
|
||||||
|
if (what_they_get < MIN_REMOTE_PACKET_SIZE)
|
||||||
|
what_they_get = MIN_REMOTE_PACKET_SIZE;
|
||||||
|
return what_they_get;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update the size of a read/write packet. If they user wants
|
||||||
|
something really big then do a sanity check. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_memory_packet_size (char *args, struct memory_packet_config *config)
|
||||||
|
{
|
||||||
|
int fixed_p = config->fixed_p;
|
||||||
|
long size = config->size;
|
||||||
|
if (args == NULL)
|
||||||
|
error ("Argument required (integer, `fixed' or `limited').");
|
||||||
|
else if (strcmp (args, "hard") == 0
|
||||||
|
|| strcmp (args, "fixed") == 0)
|
||||||
|
fixed_p = 1;
|
||||||
|
else if (strcmp (args, "soft") == 0
|
||||||
|
|| strcmp (args, "limit") == 0)
|
||||||
|
fixed_p = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
size = strtoul (args, &end, 0);
|
||||||
|
if (args == end)
|
||||||
|
error ("Invalid %s (bad syntax).", config->name);
|
||||||
|
#if 0
|
||||||
|
/* Instead of explicitly capping the size of a packet to
|
||||||
|
MAX_REMOTE_PACKET_SIZE or dissallowing it, the user is
|
||||||
|
instead allowed to set the size to something arbitrarily
|
||||||
|
large. */
|
||||||
|
if (size > MAX_REMOTE_PACKET_SIZE)
|
||||||
|
error ("Invalid %s (too large).", config->name);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/* Extra checks? */
|
||||||
|
if (fixed_p && !config->fixed_p)
|
||||||
|
{
|
||||||
|
if (! query ("The target may not be able to correctly handle a %s\n"
|
||||||
|
"of %ld bytes. Change the packet size? ",
|
||||||
|
config->name, size))
|
||||||
|
error ("Packet size not changed.");
|
||||||
|
}
|
||||||
|
/* Update the config. */
|
||||||
|
config->fixed_p = fixed_p;
|
||||||
|
config->size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
show_memory_packet_size (struct memory_packet_config *config)
|
||||||
|
{
|
||||||
|
printf_filtered ("The %s is %ld. ", config->name, config->size);
|
||||||
|
if (config->fixed_p)
|
||||||
|
printf_filtered ("Packets are fixed at %ld bytes.\n",
|
||||||
|
get_memory_packet_size (config));
|
||||||
|
else
|
||||||
|
printf_filtered ("Packets are limited to %ld bytes.\n",
|
||||||
|
get_memory_packet_size (config));
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct memory_packet_config memory_write_packet_config =
|
||||||
|
{
|
||||||
|
"memory-write-packet-size",
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_memory_write_packet_size (char *args, int from_tty)
|
||||||
|
{
|
||||||
|
set_memory_packet_size (args, &memory_write_packet_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
show_memory_write_packet_size (char *args, int from_tty)
|
||||||
|
{
|
||||||
|
show_memory_packet_size (&memory_write_packet_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
static long
|
||||||
|
get_memory_write_packet_size (void)
|
||||||
|
{
|
||||||
|
return get_memory_packet_size (&memory_write_packet_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct memory_packet_config memory_read_packet_config =
|
||||||
|
{
|
||||||
|
"memory-read-packet-size",
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_memory_read_packet_size (char *args, int from_tty)
|
||||||
|
{
|
||||||
|
set_memory_packet_size (args, &memory_read_packet_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
show_memory_read_packet_size (char *args, int from_tty)
|
||||||
|
{
|
||||||
|
show_memory_packet_size (&memory_read_packet_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
static long
|
||||||
|
get_memory_read_packet_size (void)
|
||||||
|
{
|
||||||
|
long size = get_memory_packet_size (&memory_read_packet_config);
|
||||||
|
/* FIXME: cagney/1999-11-07: Functions like getpkt() need to get an
|
||||||
|
extra buffer size argument before the memory read size can be
|
||||||
|
increased beyond PBUFSIZ. */
|
||||||
|
if (size > PBUFSIZ)
|
||||||
|
size = PBUFSIZ;
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Register packet size initialization. Since the bounds change when
|
||||||
|
the architecture changes (namely REGISTER_BYTES) this all needs to
|
||||||
|
be multi-arched. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
register_remote_packet_sizes (void)
|
||||||
|
{
|
||||||
|
REGISTER_GDBARCH_SWAP (remote_packet_size);
|
||||||
|
REGISTER_GDBARCH_SWAP (actual_register_packet_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
build_remote_packet_sizes (void)
|
||||||
|
{
|
||||||
|
/* Maximum number of characters in a packet. This default m68k-stub.c and
|
||||||
|
i386-stub.c stubs. */
|
||||||
|
remote_packet_size = 400;
|
||||||
|
/* Should REGISTER_BYTES needs more space than the default, adjust
|
||||||
|
the size accordingly. Remember that each byte is encoded as two
|
||||||
|
characters. 32 is the overhead for the packet header /
|
||||||
|
footer. NOTE: cagney/1999-10-26: I suspect that 8
|
||||||
|
(``$NN:G...#NN'') is a better guess, the below has been padded a
|
||||||
|
little. */
|
||||||
|
if (REGISTER_BYTES > ((remote_packet_size - 32) / 2))
|
||||||
|
remote_packet_size = (REGISTER_BYTES * 2 + 32);
|
||||||
|
|
||||||
|
/* This one is filled in when a ``g'' packet is received. */
|
||||||
|
actual_register_packet_size = 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Generic configuration support for packets the stub optionally
|
/* Generic configuration support for packets the stub optionally
|
||||||
supports. Allows the user to specify the use of the packet as well
|
supports. Allows the user to specify the use of the packet as well
|
||||||
as allowing GDB to auto-detect support in the remote stub. */
|
as allowing GDB to auto-detect support in the remote stub. */
|
||||||
|
@ -2749,8 +2935,11 @@ remote_fetch_registers (regno)
|
||||||
sprintf (buf, "g");
|
sprintf (buf, "g");
|
||||||
remote_send (buf);
|
remote_send (buf);
|
||||||
|
|
||||||
if (remote_register_buf_size == 0)
|
/* Save the size of the packet sent to us by the target. Its used
|
||||||
remote_register_buf_size = strlen (buf);
|
as a heuristic when determining the max size of packets that the
|
||||||
|
target can safely receive. */
|
||||||
|
if (actual_register_packet_size == 0)
|
||||||
|
actual_register_packet_size = strlen (buf);
|
||||||
|
|
||||||
/* Unimplemented registers read as all bits zero. */
|
/* Unimplemented registers read as all bits zero. */
|
||||||
memset (regs, 0, REGISTER_BYTES);
|
memset (regs, 0, REGISTER_BYTES);
|
||||||
|
@ -3095,9 +3284,7 @@ remote_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
|
||||||
check_binary_download (memaddr);
|
check_binary_download (memaddr);
|
||||||
|
|
||||||
/* Determine the max packet size. */
|
/* Determine the max packet size. */
|
||||||
max_buf_size = min (remote_write_size, PBUFSIZ);
|
max_buf_size = get_memory_write_packet_size ();
|
||||||
if (remote_register_buf_size != 0)
|
|
||||||
max_buf_size = min (max_buf_size, remote_register_buf_size);
|
|
||||||
buf = alloca (max_buf_size + 1);
|
buf = alloca (max_buf_size + 1);
|
||||||
|
|
||||||
/* Subtract header overhead from max payload size - $M<memaddr>,<len>:#nn */
|
/* Subtract header overhead from max payload size - $M<memaddr>,<len>:#nn */
|
||||||
|
@ -3228,15 +3415,13 @@ remote_read_bytes (memaddr, myaddr, len)
|
||||||
char *myaddr;
|
char *myaddr;
|
||||||
int len;
|
int len;
|
||||||
{
|
{
|
||||||
char *buf = alloca (PBUFSIZ);
|
char *buf;
|
||||||
int max_buf_size; /* Max size of packet output buffer */
|
int max_buf_size; /* Max size of packet output buffer */
|
||||||
int origlen;
|
int origlen;
|
||||||
|
|
||||||
/* Chop the transfer down if necessary */
|
/* Create a buffer big enough for this packet. */
|
||||||
|
max_buf_size = get_memory_read_packet_size ();
|
||||||
max_buf_size = min (remote_write_size, PBUFSIZ);
|
buf = alloca (max_buf_size);
|
||||||
if (remote_register_buf_size != 0)
|
|
||||||
max_buf_size = min (max_buf_size, remote_register_buf_size);
|
|
||||||
|
|
||||||
origlen = len;
|
origlen = len;
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
|
@ -3477,7 +3662,7 @@ putpkt_binary (buf, cnt)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned char csum = 0;
|
unsigned char csum = 0;
|
||||||
char *buf2 = alloca (PBUFSIZ);
|
char *buf2 = alloca (cnt + 6);
|
||||||
char *junkbuf = alloca (PBUFSIZ);
|
char *junkbuf = alloca (PBUFSIZ);
|
||||||
|
|
||||||
int ch;
|
int ch;
|
||||||
|
@ -3487,9 +3672,6 @@ putpkt_binary (buf, cnt)
|
||||||
/* Copy the packet into buffer BUF2, encapsulating it
|
/* Copy the packet into buffer BUF2, encapsulating it
|
||||||
and giving it a checksum. */
|
and giving it a checksum. */
|
||||||
|
|
||||||
if (cnt > BUFSIZ - 5) /* Prosanity check */
|
|
||||||
abort ();
|
|
||||||
|
|
||||||
p = buf2;
|
p = buf2;
|
||||||
*p++ = '$';
|
*p++ = '$';
|
||||||
|
|
||||||
|
@ -5220,7 +5402,11 @@ set_remote_cmd (args, from_tty)
|
||||||
static void
|
static void
|
||||||
build_remote_gdbarch_data ()
|
build_remote_gdbarch_data ()
|
||||||
{
|
{
|
||||||
|
build_remote_packet_sizes ();
|
||||||
|
|
||||||
|
/* Cisco stuff */
|
||||||
tty_input = xmalloc (PBUFSIZ);
|
tty_input = xmalloc (PBUFSIZ);
|
||||||
|
remote_address_size = TARGET_PTR_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -5228,16 +5414,16 @@ _initialize_remote ()
|
||||||
{
|
{
|
||||||
static struct cmd_list_element *remote_set_cmdlist;
|
static struct cmd_list_element *remote_set_cmdlist;
|
||||||
static struct cmd_list_element *remote_show_cmdlist;
|
static struct cmd_list_element *remote_show_cmdlist;
|
||||||
|
struct cmd_list_element *tmpcmd;
|
||||||
|
|
||||||
/* architecture specific data */
|
/* architecture specific data */
|
||||||
build_remote_gdbarch_data ();
|
build_remote_gdbarch_data ();
|
||||||
register_gdbarch_swap (&tty_input, sizeof (&tty_input), NULL);
|
register_gdbarch_swap (&tty_input, sizeof (&tty_input), NULL);
|
||||||
|
register_remote_packet_sizes ();
|
||||||
|
register_gdbarch_swap (&remote_address_size,
|
||||||
|
sizeof (&remote_address_size), NULL);
|
||||||
register_gdbarch_swap (NULL, 0, build_remote_gdbarch_data);
|
register_gdbarch_swap (NULL, 0, build_remote_gdbarch_data);
|
||||||
|
|
||||||
/* runtime constants - we retain the value of remote_write_size
|
|
||||||
across architecture swaps. */
|
|
||||||
remote_write_size = PBUFSIZ;
|
|
||||||
|
|
||||||
init_remote_ops ();
|
init_remote_ops ();
|
||||||
add_target (&remote_ops);
|
add_target (&remote_ops);
|
||||||
|
|
||||||
|
@ -5298,14 +5484,39 @@ terminating `#' character and checksum.",
|
||||||
&setlist),
|
&setlist),
|
||||||
&showlist);
|
&showlist);
|
||||||
|
|
||||||
add_show_from_set
|
/* Install commands for configuring memory read/write packets. */
|
||||||
(add_set_cmd ("remotewritesize", no_class,
|
|
||||||
var_integer, (char *) &remote_write_size,
|
add_cmd ("remotewritesize", no_class, set_memory_write_packet_size,
|
||||||
"Set the maximum number of bytes per memory write packet.\n",
|
"Set the maximum number of bytes per memory write packet (deprecated).\n",
|
||||||
&setlist),
|
&setlist);
|
||||||
&showlist);
|
add_cmd ("remotewritesize", no_class, set_memory_write_packet_size,
|
||||||
|
"Show the maximum number of bytes per memory write packet (deprecated).\n",
|
||||||
|
&showlist);
|
||||||
|
add_cmd ("memory-write-packet-size", no_class,
|
||||||
|
set_memory_write_packet_size,
|
||||||
|
"Set the maximum number of bytes per memory-write packet.\n"
|
||||||
|
"Specify the number of bytes in a packet or 0 (zero) for the\n"
|
||||||
|
"default packet size. The actual limit is further reduced\n"
|
||||||
|
"dependent on the target. Specify ``fixed'' to disable the\n"
|
||||||
|
"further restriction and ``limit'' to enable that restriction\n",
|
||||||
|
&remote_set_cmdlist);
|
||||||
|
add_cmd ("memory-read-packet-size", no_class,
|
||||||
|
set_memory_read_packet_size,
|
||||||
|
"Set the maximum number of bytes per memory-read packet.\n"
|
||||||
|
"Specify the number of bytes in a packet or 0 (zero) for the\n"
|
||||||
|
"default packet size. The actual limit is further reduced\n"
|
||||||
|
"dependent on the target. Specify ``fixed'' to disable the\n"
|
||||||
|
"further restriction and ``limit'' to enable that restriction\n",
|
||||||
|
&remote_set_cmdlist);
|
||||||
|
add_cmd ("memory-write-packet-size", no_class,
|
||||||
|
show_memory_write_packet_size,
|
||||||
|
"Show the maximum number of bytes per memory-write packet.\n",
|
||||||
|
&remote_show_cmdlist);
|
||||||
|
add_cmd ("memory-read-packet-size", no_class,
|
||||||
|
show_memory_read_packet_size,
|
||||||
|
"Show the maximum number of bytes per memory-read packet.\n",
|
||||||
|
&remote_show_cmdlist);
|
||||||
|
|
||||||
remote_address_size = TARGET_PTR_BIT;
|
|
||||||
add_show_from_set
|
add_show_from_set
|
||||||
(add_set_cmd ("remoteaddresssize", class_obscure,
|
(add_set_cmd ("remoteaddresssize", class_obscure,
|
||||||
var_integer, (char *) &remote_address_size,
|
var_integer, (char *) &remote_address_size,
|
||||||
|
|
|
@ -288,7 +288,7 @@ do_serial_close (serial_t scb, int really_close)
|
||||||
serial_current_type = 0;
|
serial_current_type = 0;
|
||||||
|
|
||||||
/* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
|
/* XXX - What if serial_logfp == gdb_stdout or gdb_stderr? */
|
||||||
gdb_fclose (&serial_logfp);
|
gdb_file_delete (serial_logfp);
|
||||||
serial_logfp = NULL;
|
serial_logfp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -857,6 +857,13 @@ sol_thread_create_inferior (exec_file, allargs, env)
|
||||||
those variables don't show up until the library gets mapped and the symbol
|
those variables don't show up until the library gets mapped and the symbol
|
||||||
table is read in. */
|
table is read in. */
|
||||||
|
|
||||||
|
/* This new_objfile event is now managed by a chained function pointer.
|
||||||
|
* It is the callee's responsability to call the next client on the chain.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Saved pointer to previous owner of the new_objfile event. */
|
||||||
|
static void (*target_new_objfile_chain) PARAMS ((struct objfile *));
|
||||||
|
|
||||||
void
|
void
|
||||||
sol_thread_new_objfile (objfile)
|
sol_thread_new_objfile (objfile)
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
|
@ -866,13 +873,12 @@ sol_thread_new_objfile (objfile)
|
||||||
if (!objfile)
|
if (!objfile)
|
||||||
{
|
{
|
||||||
sol_thread_active = 0;
|
sol_thread_active = 0;
|
||||||
|
goto quit;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* don't do anything if init failed to resolve the libthread_db library */
|
/* don't do anything if init failed to resolve the libthread_db library */
|
||||||
if (!procfs_suppress_run)
|
if (!procfs_suppress_run)
|
||||||
return;
|
goto quit;
|
||||||
|
|
||||||
/* Now, initialize the thread debugging library. This needs to be done after
|
/* Now, initialize the thread debugging library. This needs to be done after
|
||||||
the shared libraries are located because it needs information from the
|
the shared libraries are located because it needs information from the
|
||||||
|
@ -880,15 +886,25 @@ sol_thread_new_objfile (objfile)
|
||||||
|
|
||||||
val = p_td_init ();
|
val = p_td_init ();
|
||||||
if (val != TD_OK)
|
if (val != TD_OK)
|
||||||
error ("target_new_objfile: td_init: %s", td_err_string (val));
|
{
|
||||||
|
warning ("sol_thread_new_objfile: td_init: %s", td_err_string (val));
|
||||||
|
goto quit;
|
||||||
|
}
|
||||||
|
|
||||||
val = p_td_ta_new (&main_ph, &main_ta);
|
val = p_td_ta_new (&main_ph, &main_ta);
|
||||||
if (val == TD_NOLIBTHREAD)
|
if (val == TD_NOLIBTHREAD)
|
||||||
return;
|
goto quit;
|
||||||
else if (val != TD_OK)
|
else if (val != TD_OK)
|
||||||
error ("target_new_objfile: td_ta_new: %s", td_err_string (val));
|
{
|
||||||
|
warning ("sol_thread_new_objfile: td_ta_new: %s", td_err_string (val));
|
||||||
|
goto quit;
|
||||||
|
}
|
||||||
|
|
||||||
sol_thread_active = 1;
|
sol_thread_active = 1;
|
||||||
|
quit:
|
||||||
|
/* Call predecessor on chain, if any. */
|
||||||
|
if (target_new_objfile_chain)
|
||||||
|
target_new_objfile_chain (objfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clean up after the inferior dies. */
|
/* Clean up after the inferior dies. */
|
||||||
|
@ -1698,6 +1714,9 @@ _initialize_sol_thread ()
|
||||||
memcpy (&core_ops, &sol_core_ops, sizeof (struct target_ops));
|
memcpy (&core_ops, &sol_core_ops, sizeof (struct target_ops));
|
||||||
add_target (&core_ops);
|
add_target (&core_ops);
|
||||||
|
|
||||||
|
/* Hook into new_objfile notification. */
|
||||||
|
target_new_objfile_chain = target_new_objfile_hook;
|
||||||
|
target_new_objfile_hook = sol_thread_new_objfile;
|
||||||
return;
|
return;
|
||||||
|
|
||||||
die:
|
die:
|
||||||
|
|
|
@ -66,6 +66,7 @@ extern int hp_cxx_exception_support_initialized;
|
||||||
int (*ui_load_progress_hook) (const char *section, unsigned long num);
|
int (*ui_load_progress_hook) (const char *section, unsigned long num);
|
||||||
void (*pre_add_symbol_hook) PARAMS ((char *));
|
void (*pre_add_symbol_hook) PARAMS ((char *));
|
||||||
void (*post_add_symbol_hook) PARAMS ((void));
|
void (*post_add_symbol_hook) PARAMS ((void));
|
||||||
|
void (*target_new_objfile_hook) PARAMS ((struct objfile *));
|
||||||
|
|
||||||
/* Global variables owned by this file */
|
/* Global variables owned by this file */
|
||||||
int readnow_symbol_files; /* Read full symbols immediately */
|
int readnow_symbol_files; /* Read full symbols immediately */
|
||||||
|
@ -920,7 +921,8 @@ symbol_file_add (name, from_tty, addrs, mainline, flags)
|
||||||
|
|
||||||
new_symfile_objfile (objfile, mainline, from_tty);
|
new_symfile_objfile (objfile, mainline, from_tty);
|
||||||
|
|
||||||
target_new_objfile (objfile);
|
if (target_new_objfile_hook)
|
||||||
|
target_new_objfile_hook (objfile);
|
||||||
|
|
||||||
return (objfile);
|
return (objfile);
|
||||||
}
|
}
|
||||||
|
@ -2096,7 +2098,8 @@ clear_symtab_users ()
|
||||||
current_source_symtab = 0;
|
current_source_symtab = 0;
|
||||||
current_source_line = 0;
|
current_source_line = 0;
|
||||||
clear_pc_function_cache ();
|
clear_pc_function_cache ();
|
||||||
target_new_objfile (NULL);
|
if (target_new_objfile_hook)
|
||||||
|
target_new_objfile_hook (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clear_symtab_users_once:
|
/* clear_symtab_users_once:
|
||||||
|
|
|
@ -543,7 +543,7 @@ Arguments missing: an output file name and an optional symbol file name");
|
||||||
outfile = gdb_fopen (filename, FOPEN_WT);
|
outfile = gdb_fopen (filename, FOPEN_WT);
|
||||||
if (outfile == 0)
|
if (outfile == 0)
|
||||||
perror_with_name (filename);
|
perror_with_name (filename);
|
||||||
make_cleanup ((make_cleanup_func) gdb_fclose, (char *) &outfile);
|
make_cleanup_gdb_file_delete (outfile);
|
||||||
|
|
||||||
immediate_quit++;
|
immediate_quit++;
|
||||||
ALL_SYMTABS (objfile, s)
|
ALL_SYMTABS (objfile, s)
|
||||||
|
@ -780,7 +780,7 @@ maintenance_print_psymbols (args, from_tty)
|
||||||
outfile = gdb_fopen (filename, FOPEN_WT);
|
outfile = gdb_fopen (filename, FOPEN_WT);
|
||||||
if (outfile == 0)
|
if (outfile == 0)
|
||||||
perror_with_name (filename);
|
perror_with_name (filename);
|
||||||
make_cleanup ((make_cleanup_func) gdb_fclose, &outfile);
|
make_cleanup_gdb_file_delete (outfile);
|
||||||
|
|
||||||
immediate_quit++;
|
immediate_quit++;
|
||||||
ALL_PSYMTABS (objfile, ps)
|
ALL_PSYMTABS (objfile, ps)
|
||||||
|
@ -928,7 +928,7 @@ maintenance_print_msymbols (args, from_tty)
|
||||||
outfile = gdb_fopen (filename, FOPEN_WT);
|
outfile = gdb_fopen (filename, FOPEN_WT);
|
||||||
if (outfile == 0)
|
if (outfile == 0)
|
||||||
perror_with_name (filename);
|
perror_with_name (filename);
|
||||||
make_cleanup ((make_cleanup_func) gdb_fclose, &outfile);
|
make_cleanup_gdb_file_delete (outfile);
|
||||||
|
|
||||||
immediate_quit++;
|
immediate_quit++;
|
||||||
ALL_OBJFILES (objfile)
|
ALL_OBJFILES (objfile)
|
||||||
|
|
|
@ -272,6 +272,12 @@ target_ignore ()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
target_load (char *arg, int from_tty)
|
||||||
|
{
|
||||||
|
(*current_target.to_load) (arg, from_tty);
|
||||||
|
}
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
static int
|
static int
|
||||||
nomemory (memaddr, myaddr, len, write, t)
|
nomemory (memaddr, myaddr, len, write, t)
|
||||||
|
|
31
gdb/target.h
31
gdb/target.h
|
@ -755,8 +755,7 @@ print_section_info PARAMS ((struct target_ops *, bfd *));
|
||||||
not only bring new code into the target process, but also to update
|
not only bring new code into the target process, but also to update
|
||||||
GDB's symbol tables to match. */
|
GDB's symbol tables to match. */
|
||||||
|
|
||||||
#define target_load(arg, from_tty) \
|
extern void target_load (char *arg, int from_tty);
|
||||||
(*current_target.to_load) (arg, from_tty)
|
|
||||||
|
|
||||||
/* Look up a symbol in the target's symbol table. NAME is the symbol
|
/* Look up a symbol in the target's symbol table. NAME is the symbol
|
||||||
name. ADDRP is a CORE_ADDR * pointing to where the value of the symbol
|
name. ADDRP is a CORE_ADDR * pointing to where the value of the symbol
|
||||||
|
@ -1063,10 +1062,30 @@ extern char *normal_pid_to_str PARAMS ((int pid));
|
||||||
extern char *normal_pid_to_str PARAMS ((int pid));
|
extern char *normal_pid_to_str PARAMS ((int pid));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* New Objfile Event Hook:
|
||||||
|
*
|
||||||
|
* Sometimes a GDB component wants to get notified whenever a new
|
||||||
|
* objfile is loaded. Mainly this is used by thread-debugging
|
||||||
|
* implementations that need to know when symbols for the target
|
||||||
|
* thread implemenation are available.
|
||||||
|
*
|
||||||
|
* The old way of doing this is to define a macro 'target_new_objfile'
|
||||||
|
* that points to the function that you want to be called on every
|
||||||
|
* objfile/shlib load.
|
||||||
|
*
|
||||||
|
* The new way is to grab the function pointer, 'target_new_objfile_hook',
|
||||||
|
* and point it to the function that you want to be called on every
|
||||||
|
* objfile/shlib load.
|
||||||
|
*
|
||||||
|
* If multiple clients are willing to be cooperative, they can each
|
||||||
|
* save a pointer to the previous value of target_new_objfile_hook
|
||||||
|
* before modifying it, and arrange for their function to call the
|
||||||
|
* previous function in the chain. In that way, multiple clients
|
||||||
|
* can receive this notification (something like with signal handlers).
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef target_new_objfile
|
extern void (*target_new_objfile_hook) PARAMS ((struct objfile *));
|
||||||
#define target_new_objfile(OBJFILE)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef target_pid_or_tid_to_str
|
#ifndef target_pid_or_tid_to_str
|
||||||
#define target_pid_or_tid_to_str(ID) \
|
#define target_pid_or_tid_to_str(ID) \
|
||||||
|
@ -1338,7 +1357,7 @@ extern void push_remote_target PARAMS ((char *name, int from_tty));
|
||||||
|
|
||||||
#ifndef SOFTWARE_SINGLE_STEP_P
|
#ifndef SOFTWARE_SINGLE_STEP_P
|
||||||
#define SOFTWARE_SINGLE_STEP_P 0
|
#define SOFTWARE_SINGLE_STEP_P 0
|
||||||
#define SOFTWARE_SINGLE_STEP(sig,bp_p) abort ()
|
#define SOFTWARE_SINGLE_STEP(sig,bp_p) (internal_error ("SOFTWARE_SINGLE_STEP"), 0)
|
||||||
#endif /* SOFTWARE_SINGLE_STEP_P */
|
#endif /* SOFTWARE_SINGLE_STEP_P */
|
||||||
|
|
||||||
/* Blank target vector entries are initialized to target_ignore. */
|
/* Blank target vector entries are initialized to target_ignore. */
|
||||||
|
|
|
@ -1,3 +1,44 @@
|
||||||
|
Mon Nov 8 23:07:09 1999 Andrew Cagney <cagney@amy.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/remote.exp: Test ``set remote memory-write-packet-sized
|
||||||
|
{limit,fixed}''. Test ``set download-write-size''.
|
||||||
|
|
||||||
|
Sun Nov 7 17:37:01 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/funcargs.exp: Rewrite stack traceback checks using
|
||||||
|
gdb_expect_list.
|
||||||
|
|
||||||
|
Fri Nov 5 18:40:52 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* lib/gdb.exp (gdb_expect_list): Return a success/fail indication.
|
||||||
|
|
||||||
|
1999-11-03 Mark Salter <msalter@cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/break.exp: Fix "stub continue" pattern.
|
||||||
|
|
||||||
|
1999-11-03 Jim Blandy <jimb@zwingli.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/shlib-call.exp ("next to shr1"): Fix test name.
|
||||||
|
|
||||||
|
1999-11-02 Jim Blandy <jimb@zwingli.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/display.exp ("finish"): Add timeout clause.
|
||||||
|
|
||||||
|
* gdb.base/condbreak.exp ("run until breakpoint at marker1"): Add
|
||||||
|
plain prompt clause, so this doesn't have to time out in order to
|
||||||
|
fail.
|
||||||
|
|
||||||
|
* gdb.base/condbreak.exp, gdb.base/ena-dis-br.exp: XFAIL if the
|
||||||
|
breakpoint hit messages include an address.
|
||||||
|
|
||||||
|
* gdb.base/display.exp: Don't forget to escape parens in regular
|
||||||
|
expressions. Unix regexp notatation sucks.
|
||||||
|
|
||||||
|
1999-11-02 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/annota1.exp: Test for annotate-signalled: change output
|
||||||
|
order for 'signalled' message.
|
||||||
|
|
||||||
1999-11-01 Stan Shebs <shebs@andros.cygnus.com>
|
1999-11-01 Stan Shebs <shebs@andros.cygnus.com>
|
||||||
|
|
||||||
From Jimmy Guo <guo@cup.hp.com>:
|
From Jimmy Guo <guo@cup.hp.com>:
|
||||||
|
|
|
@ -420,7 +420,7 @@ gdb_expect {
|
||||||
#
|
#
|
||||||
send_gdb "signal SIGTRAP\n"
|
send_gdb "signal SIGTRAP\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re ".*\032\032post-prompt\r\nContinuing with signal SIGTRAP.\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032signalled\r\n\r\n\032\032frames-invalid\r\n\r\nProgram terminated with signal \r\n\032\032signal-name\r\nSIGTRAP\r\n\032\032signal-name-end\r\n, \r\n\032\032signal-string\r\nTrace.breakpoint trap\r\n\032\032signal-string-end\r\n.\r\nThe program no longer exists.\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \
|
-re ".*\032\032post-prompt\r\nContinuing with signal SIGTRAP.\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032frames-invalid\r\n\r\n\032\032signalled\r\n\r\nProgram terminated with signal \r\n\032\032signal-name\r\nSIGTRAP\r\n\032\032signal-name-end\r\n, \r\n\032\032signal-string\r\nTrace.breakpoint trap\r\n\032\032signal-string-end\r\n.\r\nThe program no longer exists.\r\n\r\n\032\032stopped\r\n$gdb_prompt$" \
|
||||||
{ pass "signal sent" }
|
{ pass "signal sent" }
|
||||||
-re ".*$gdb_prompt$" { fail "signal sent" }
|
-re ".*$gdb_prompt$" { fail "signal sent" }
|
||||||
timeout { fail "signal sent (timeout)" }
|
timeout { fail "signal sent (timeout)" }
|
||||||
|
@ -443,7 +443,6 @@ if [ regexp "core not found" $exec_output] {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# restore the original prompt for the rest of the testsuite
|
# restore the original prompt for the rest of the testsuite
|
||||||
|
|
||||||
set gdb_prompt $old_gdb_prompt
|
set gdb_prompt $old_gdb_prompt
|
||||||
|
|
|
@ -166,7 +166,7 @@ if ![target_info exists use_gdb_stub] {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ![target_info exists gdb_stub] {
|
if ![target_info exists gdb_stub] {
|
||||||
gdb_test continue "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:75.*75\[\t \]+if .argc.*\{" "stub continue"
|
gdb_test continue ".*Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.*, envp=.*\\) at .*$srcfile:75.*75\[\t \]+if .argc.*\{.*" "stub continue"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,8 +143,58 @@ gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, main \\(argc=.*, argv=.
|
||||||
#
|
#
|
||||||
# run until the breakpoint at marker1
|
# run until the breakpoint at marker1
|
||||||
#
|
#
|
||||||
gdb_test "continue" "Continuing\\..*Breakpoint \[0-9\]+, marker1 \\(\\) at .*$srcfile:4\[38\].*4\[38\]\[\t \]+.*" \
|
# If the inferior stops at the first instruction of a source line, GDB
|
||||||
"run until breakpoint at marker1"
|
# won't print the actual PC value; the source line is enough to
|
||||||
|
# exactly specify the PC. But if the inferior is instead stopped in
|
||||||
|
# the midst of a source line, GDB will include the PC in the
|
||||||
|
# breakpoint hit message. This way, GDB always provides the exact
|
||||||
|
# stop location, but avoids clutter when possible.
|
||||||
|
#
|
||||||
|
# Suppose you have a function written completely on one source line, like:
|
||||||
|
# int foo (int x) { return 0; }
|
||||||
|
# Setting a breakpoint at `foo' actually places the breakpoint after
|
||||||
|
# foo's prologue.
|
||||||
|
#
|
||||||
|
# GCC's STABS writer always emits a line entry attributing the
|
||||||
|
# prologue instructions to the line containing the function's open
|
||||||
|
# brace, even if the first user instruction is also on that line.
|
||||||
|
# This means that, in the case of a one-line function, you will get
|
||||||
|
# two line entries in the debug info for the same line: one at the
|
||||||
|
# function's entry point, and another at the first user instruction.
|
||||||
|
# GDB preserves these duplicated line entries, and prefers the later
|
||||||
|
# one; thus, when the program stops after the prologue, at the first
|
||||||
|
# user instruction, GDB's search finds the second line entry, decides
|
||||||
|
# that the PC is indeed at the beginning of a source line, and doesn't
|
||||||
|
# print an address in the breakpoint hit message.
|
||||||
|
#
|
||||||
|
# GCC's Dwarf2 writer, on the other hand, squeezes out duplicate line
|
||||||
|
# entries, so GDB considers the source line to begin at the start of
|
||||||
|
# the function's prologue. Thus, if the program stops at the
|
||||||
|
# breakpoint, GDB will decide that the PC is not at the beginning of a
|
||||||
|
# source line, and will print an address.
|
||||||
|
#
|
||||||
|
# I think the Dwarf2 writer's behavior is arguably correct, but not
|
||||||
|
# helpful. If the user sets a breakpoint at that source line, they
|
||||||
|
# want that breakpoint to fall after the prologue. Identifying the
|
||||||
|
# prologue's code with the opening brace is nice, but it shouldn't
|
||||||
|
# take precedence over real code.
|
||||||
|
#
|
||||||
|
# Until the Dwarf2 writer gets fixed, I'm going to XFAIL its behavior.
|
||||||
|
send_gdb "continue\n"
|
||||||
|
gdb_expect {
|
||||||
|
-re "Continuing\\..*Breakpoint \[0-9\]+, marker1 \\(\\) at .*$srcfile:4\[38\].*4\[38\]\[\t \]+.*" {
|
||||||
|
pass "run until breakpoint at marker1"
|
||||||
|
}
|
||||||
|
-re "Continuing\\..*Breakpoint \[0-9\]+, $hex in marker1 \\(\\) at .*$srcfile:4\[38\].*4\[38\]\[\t \]+.*" {
|
||||||
|
xfail "run until breakpoint at marker1"
|
||||||
|
}
|
||||||
|
-re "$gdb_prompt $" {
|
||||||
|
fail "run until breakpoint at marker1"
|
||||||
|
}
|
||||||
|
timeout {
|
||||||
|
fail "(timeout) run until breakpoint at marker1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# run until the breakpoint at marker2
|
# run until the breakpoint at marker2
|
||||||
|
|
|
@ -136,14 +136,21 @@ gdb_test "c" ".*Breakpoint 4.*" "watch off"
|
||||||
# "do_vars".
|
# "do_vars".
|
||||||
send_gdb "finish\n"
|
send_gdb "finish\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re ".*do_loops();.*$gdb_prompt $" {
|
-re ".*do_loops\\(\\);.*$gdb_prompt $" {
|
||||||
send_gdb "step\n"
|
send_gdb "step\n"
|
||||||
exp_continue
|
exp_continue
|
||||||
}
|
}
|
||||||
-re ".*do_vars.*$gdb_prompt $" {
|
-re ".*do_vars.*$gdb_prompt $" {
|
||||||
pass "finish"
|
pass "finish"
|
||||||
}
|
}
|
||||||
default { fail "finish" ; gdb_suppress_tests; }
|
-re ".*$gdb_prompt $" {
|
||||||
|
fail "finish"
|
||||||
|
gdb_suppress_tests
|
||||||
|
}
|
||||||
|
timeout {
|
||||||
|
fail "(timeout) finish"
|
||||||
|
gdb_suppress_tests
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gdb_test "s" ".*do_vars.*.*27.*"
|
gdb_test "s" ".*do_vars.*.*27.*"
|
||||||
|
|
|
@ -97,10 +97,14 @@ gdb_expect {
|
||||||
timeout {fail "(timeout) info break marker1"}
|
timeout {fail "(timeout) info break marker1"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# See the comments in condbreak.exp for "run until breakpoint at marker1"
|
||||||
|
# for an explanation of the xfail below.
|
||||||
send_gdb "continue\n"
|
send_gdb "continue\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $"\
|
-re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $"\
|
||||||
{pass "continue to break marker1"}
|
{pass "continue to break marker1"}
|
||||||
|
-re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $"\
|
||||||
|
{xfail "continue to break marker1"}
|
||||||
-re "$gdb_prompt $"\
|
-re "$gdb_prompt $"\
|
||||||
{fail "continue to break marker1"}
|
{fail "continue to break marker1"}
|
||||||
timeout {fail "(timeout) continue to break marker1"}
|
timeout {fail "(timeout) continue to break marker1"}
|
||||||
|
@ -141,10 +145,14 @@ gdb_expect {
|
||||||
timeout {fail "(timeout) info auto-disabled break marker2"}
|
timeout {fail "(timeout) info auto-disabled break marker2"}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# See the comments in condbreak.exp for "run until breakpoint at marker1"
|
||||||
|
# for an explanation of the xfail below.
|
||||||
send_gdb "continue\n"
|
send_gdb "continue\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "Breakpoint \[0-9\]*, marker2.*$gdb_prompt $"\
|
-re "Breakpoint \[0-9\]*, marker2.*$gdb_prompt $"\
|
||||||
{pass "continue to auto-disabled break marker2"}
|
{pass "continue to auto-disabled break marker2"}
|
||||||
|
-re "Breakpoint \[0-9\]*, $hex in marker2.*$gdb_prompt $"\
|
||||||
|
{xfail "continue to auto-disabled break marker2"}
|
||||||
-re "$gdb_prompt $"\
|
-re "$gdb_prompt $"\
|
||||||
{fail "continue to auto-disabled break marker2"}
|
{fail "continue to auto-disabled break marker2"}
|
||||||
timeout {fail "(timeout) continue to auto-disabled break marker2"}
|
timeout {fail "(timeout) continue to auto-disabled break marker2"}
|
||||||
|
@ -325,13 +333,17 @@ gdb_expect {
|
||||||
gdb_continue_to_end "no stop at ignored break marker1"
|
gdb_continue_to_end "no stop at ignored break marker1"
|
||||||
rerun_to_main
|
rerun_to_main
|
||||||
|
|
||||||
|
# See the comments in condbreak.exp for "run until breakpoint at marker1"
|
||||||
|
# for an explanation of the xfail below.
|
||||||
send_gdb "continue\n"
|
send_gdb "continue\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $"\
|
-re "Breakpoint \[0-9\]*, marker1.*$gdb_prompt $"\
|
||||||
{pass "continue to break marker1"}
|
{pass "continue to break marker1, 2nd time"}
|
||||||
|
-re "Breakpoint \[0-9\]*, $hex in marker1.*$gdb_prompt $"\
|
||||||
|
{xfail "continue to break marker1, 2nd time"}
|
||||||
-re "$gdb_prompt $"\
|
-re "$gdb_prompt $"\
|
||||||
{fail "continue to break marker1"}
|
{fail "continue to break marker1, 2nd time"}
|
||||||
timeout {fail "(timeout) continue to break marker1"}
|
timeout {fail "(timeout) continue to break marker1, 2nd time"}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Verify that we can specify both an ignore count and an auto-delete.
|
# Verify that we can specify both an ignore count and an auto-delete.
|
||||||
|
|
|
@ -527,7 +527,12 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6b
|
gdb_continue call6b
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\]*.* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\]" "backtrace from call6b"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6b" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,7 +542,13 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6c
|
gdb_continue call6c
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6c"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6c" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
# Continue; should stop at call6d and print actual arguments.
|
# Continue; should stop at call6d and print actual arguments.
|
||||||
|
@ -546,7 +557,14 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6d
|
gdb_continue call6d
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6d"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6d" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#4 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -556,7 +574,15 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6e
|
gdb_continue call6e
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6e"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6e" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#4 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#5 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -566,7 +592,16 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6f
|
gdb_continue call6f
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6f"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6f" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#4 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#5 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#6 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -576,7 +611,17 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6g
|
gdb_continue call6g
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6g"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6g" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#4 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#5 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#6 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#7 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -586,7 +631,18 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6h
|
gdb_continue call6h
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6h \\(us=6, ui=7, ul=8\\) .*\[\r\n\].* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6h"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6h" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6h \\(us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#4 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#5 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#6 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#7 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#8 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -603,7 +659,19 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6i
|
gdb_continue call6i
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6i \\(ui=7, ul=8\\) .*\[\r\n\].* call6h \\(us=6, ui=7, ul=8\\) .*\[\r\n\].* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6i"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6i" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6i \\(ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6h \\(us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#4 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#5 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#6 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#7 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#8 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#9 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -613,7 +681,20 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6j
|
gdb_continue call6j
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6j \\(ul=8\\) .*\[\r\n\].* call6i \\(ui=7, ul=8\\) .*\[\r\n\].* call6h \\(us=6, ui=7, ul=8\\) .*\[\r\n\].* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6j"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6j" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6j \\(ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6i \\(ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6h \\(us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#4 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#5 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#6 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#7 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#8 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#9 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#10 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -625,7 +706,21 @@ $gdb_prompt $" {
|
||||||
gdb_continue call6k
|
gdb_continue call6k
|
||||||
|
|
||||||
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
if {$hp_cc_compiler} {setup_xfail hppa2.0w-*-*}
|
||||||
if [gdb_test "backtrace 100" ".* call6k \\(\\) .*\[\r\n\].* call6j \\(ul=8\\) .*\[\r\n\].* call6i \\(ui=7, ul=8\\) .*\[\r\n\].* call6h \\(us=6, ui=7, ul=8\\) .*\[\r\n\].* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n\].* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) .*\[\r\n].* main \\(.*\\) .*" "backtrace from call6k"] {
|
send_gdb "backtrace 100\n"
|
||||||
|
if [gdb_expect_list "backtrace from call6k" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call6k \\(\\) "
|
||||||
|
".*\[\r\n\]#1 .* call6j \\(ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call6i \\(ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#3 .* call6h \\(us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#4 .* call6g \\(uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#5 .* call6f \\(d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#6 .* call6e \\(f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#7 .* call6d \\(l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#8 .* call6c \\(i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#9 .* call6b \\(s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#10 .* call6a \\(c=97 'a', s=1, i=2, l=3, f=4, d=5, uc=98 'b', us=6, ui=7, ul=8\\) "
|
||||||
|
".*\[\r\n\]#11 .* main \\(.*\\) "
|
||||||
|
} ] {
|
||||||
gdb_suppress_tests;
|
gdb_suppress_tests;
|
||||||
}
|
}
|
||||||
gdb_stop_suppressing_tests;
|
gdb_stop_suppressing_tests;
|
||||||
|
@ -699,43 +794,99 @@ $gdb_prompt $" {
|
||||||
|
|
||||||
if {$gcc_compiled} then { setup_xfail "rs6000-*-*" }
|
if {$gcc_compiled} then { setup_xfail "rs6000-*-*" }
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7b"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7b" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#2 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
# Continue; should stop at call7c and print actual arguments.
|
# Continue; should stop at call7c and print actual arguments.
|
||||||
# Print backtrace.
|
# Print backtrace.
|
||||||
|
|
||||||
gdb_continue call7c
|
gdb_continue call7c
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7c"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7c" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#3 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
# Continue; should stop at call7d and print actual arguments.
|
# Continue; should stop at call7d and print actual arguments.
|
||||||
# Print backtrace.
|
# Print backtrace.
|
||||||
|
|
||||||
gdb_continue call7d
|
gdb_continue call7d
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) .*\[\r\n\].* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7d"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7d" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#3 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#4 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
gdb_continue call7e
|
gdb_continue call7e
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) .*\[\r\n\].* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) .*\[\r\n\].* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7e"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7e" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#3 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#4 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#5 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
# Continue; should stop at call7f and print actual arguments.
|
# Continue; should stop at call7f and print actual arguments.
|
||||||
# Print backtrace.
|
# Print backtrace.
|
||||||
|
|
||||||
gdb_continue call7f
|
gdb_continue call7f
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) .*\[\r\n\].* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) .*\[\r\n\].* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) .*\[\r\n\].* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7f"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7f" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) "
|
||||||
|
".*\[\r\n\]#3 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#4 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#5 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#6 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
# Continue; should stop at call7g and print actual arguments.
|
# Continue; should stop at call7g and print actual arguments.
|
||||||
# Print backtrace.
|
# Print backtrace.
|
||||||
|
|
||||||
gdb_continue call7g
|
gdb_continue call7g
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) .*\[\r\n\].* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) .*\[\r\n\].* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) .*\[\r\n\].* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) .*\[\r\n\].* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7g"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7g" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) "
|
||||||
|
".*\[\r\n\]#3 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) "
|
||||||
|
".*\[\r\n\]#4 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#5 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#6 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#7 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
gdb_continue call7h
|
gdb_continue call7h
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) .*\[\r\n\].* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) .*\[\r\n\].* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) .*\[\r\n\].* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) .*\[\r\n\].* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) .*\[\r\n\].* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7h"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7h" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) "
|
||||||
|
".*\[\r\n\]#3 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) "
|
||||||
|
".*\[\r\n\]#4 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) "
|
||||||
|
".*\[\r\n\]#5 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#6 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#7 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#8 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
# monitor only allows 8 breakpoints; w89k board allows 10, so
|
# monitor only allows 8 breakpoints; w89k board allows 10, so
|
||||||
# break them up into two groups.
|
# break them up into two groups.
|
||||||
|
@ -749,14 +900,39 @@ $gdb_prompt $" {
|
||||||
|
|
||||||
gdb_continue call7i
|
gdb_continue call7i
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) .*\[\r\n\].* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) .*\[\r\n\].* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) .*\[\r\n\].* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) .*\[\r\n\].* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) .*\[\r\n\].* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) .*\[\r\n\].* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7i"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7i" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) "
|
||||||
|
".*\[\r\n\]#3 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) "
|
||||||
|
".*\[\r\n\]#4 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) "
|
||||||
|
".*\[\r\n\]#5 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) "
|
||||||
|
".*\[\r\n\]#6 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#7 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#8 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#9 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
# Continue; should stop at call7j and print actual arguments.
|
# Continue; should stop at call7j and print actual arguments.
|
||||||
# Print backtrace.
|
# Print backtrace.
|
||||||
|
|
||||||
gdb_continue call7j
|
gdb_continue call7j
|
||||||
|
|
||||||
gdb_test "backtrace 100" ".* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\) .*\[\r\n\].* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) .*\[\r\n\].* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) .*\[\r\n\].* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) .*\[\r\n\].* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) .*\[\r\n\].* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) .*\[\r\n\].* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) .*\[\r\n\].* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7j"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7j" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) "
|
||||||
|
".*\[\r\n\]#3 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) "
|
||||||
|
".*\[\r\n\]#4 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) "
|
||||||
|
".*\[\r\n\]#5 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) "
|
||||||
|
".*\[\r\n\]#6 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) "
|
||||||
|
".*\[\r\n\]#7 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#8 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#9 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#10 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
|
|
||||||
# Continue; should stop at call7k and print actual arguments.
|
# Continue; should stop at call7k and print actual arguments.
|
||||||
# Print backtrace.
|
# Print backtrace.
|
||||||
|
@ -764,7 +940,21 @@ $gdb_prompt $" {
|
||||||
gdb_continue call7k
|
gdb_continue call7k
|
||||||
|
|
||||||
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" }
|
if {!$gcc_compiled} then { setup_xfail "mips-sgi-irix*" }
|
||||||
gdb_test "backtrace 100" ".* call7k \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\) .*\[\r\n\].* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) .*\[\r\n\].* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) .*\[\r\n\].* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) .*\[\r\n\].* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) .*\[\r\n\].* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) .*\[\r\n\].* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) .*\[\r\n\].* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) .*\[\r\n\].* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) .*\[\r\n\].* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\].*" "backtrace from call7k"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "backtrace from call7k" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* call7k \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#1 .* call7j \\(ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8\\) "
|
||||||
|
".*\[\r\n\]#2 .* call7i \\(ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6\\) "
|
||||||
|
".*\[\r\n\]#3 .* call7h \\(us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5\\) "
|
||||||
|
".*\[\r\n\]#4 .* call7g \\(d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b'\\) "
|
||||||
|
".*\[\r\n\]#5 .* call7f \\(uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3, f=4\\) "
|
||||||
|
".*\[\r\n\]#6 .* call7e \\(f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1, l=3\\) "
|
||||||
|
".*\[\r\n\]#7 .* call7d \\(l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2, s=1\\) "
|
||||||
|
".*\[\r\n\]#8 .* call7c \\(s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a', i=2\\) "
|
||||||
|
".*\[\r\n\]#9 .* call7b \\(i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7, c=97 'a'\\) "
|
||||||
|
".*\[\r\n\]#10 .* call7a \\(c=97 'a', i=2, s=1, l=3, f=4, uc=98 'b', d=5, us=6, ul=8, ui=7\\) "
|
||||||
|
".*\[\r\n\]#11 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
gdb_stop_suppressing_tests;
|
gdb_stop_suppressing_tests;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -795,7 +985,17 @@ proc recursive_structs_by_value {} {
|
||||||
# The a29k fails all of these tests, perhaps because the prologue
|
# The a29k fails all of these tests, perhaps because the prologue
|
||||||
# code is broken.
|
# code is broken.
|
||||||
setup_xfail "a29k-*-udi"
|
setup_xfail "a29k-*-udi"
|
||||||
gdb_test "backtrace 100" ".* hitbottom \\(\\) .*\[\r\n\].* recurse \\(a=\{s = 0, i = 0, l = 0\}, depth=0\\) .*\[\r\n\].* recurse \\(a=\{s = 1, i = 1, l = 1\}, depth=1\\) .*\[\r\n\].* recurse \\(a=\{s = 2, i = 2, l = 2\}, depth=2\\) .*\[\r\n\].* recurse \\(a=\{s = 3, i = 3, l = 3\}, depth=3\\) .*\[\r\n\].* recurse \\(a=\{s = 4, i = 4, l = 4\}, depth=4\\) .*\[\r\n\].* test_struct_args \\(\\) .*\[\r\n\].* main \\(.*\\) .*\[\r\n\]" "recursive passing of structs by value"
|
send_gdb "backtrace 100\n"
|
||||||
|
gdb_expect_list "recursive passing of structs by value" ".*$gdb_prompt $" {
|
||||||
|
".*\[\r\n\]#0 .* hitbottom \\(\\) "
|
||||||
|
".*\[\r\n\]#1 .* recurse \\(a=\{s = 0, i = 0, l = 0\}, depth=0\\) "
|
||||||
|
".*\[\r\n\]#2 .* recurse \\(a=\{s = 1, i = 1, l = 1\}, depth=1\\) "
|
||||||
|
".*\[\r\n\]#3 .* recurse \\(a=\{s = 2, i = 2, l = 2\}, depth=2\\) "
|
||||||
|
".*\[\r\n\]#4 .* recurse \\(a=\{s = 3, i = 3, l = 3\}, depth=3\\) "
|
||||||
|
".*\[\r\n\]#5 .* recurse \\(a=\{s = 4, i = 4, l = 4\}, depth=4\\) "
|
||||||
|
".*\[\r\n\]#6 .* test_struct_args \\(\\) "
|
||||||
|
".*\[\r\n\]#7 .* main \\(.*\\) "
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fail "recursive passing of structs by value (sparclet)"
|
fail "recursive passing of structs by value (sparclet)"
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,16 +35,85 @@ set testfile "remote"
|
||||||
set srcfile ${testfile}.c
|
set srcfile ${testfile}.c
|
||||||
set binfile ${objdir}/${subdir}/${testfile}
|
set binfile ${objdir}/${subdir}/${testfile}
|
||||||
|
|
||||||
|
gdb_start
|
||||||
|
|
||||||
proc gdb_load_timed {executable writesize} {
|
set result [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}]
|
||||||
|
if {$result != "" } then {
|
||||||
|
gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Part ONE: Check the down load commands
|
||||||
|
#
|
||||||
|
|
||||||
|
gdb_test "show download-write-size" \
|
||||||
|
"The write size used when downloading a program is 512." \
|
||||||
|
"download limit default"
|
||||||
|
|
||||||
|
gdb_test "set download-write-size" "Argument required.*"
|
||||||
|
|
||||||
|
gdb_test "set download-write-size 0" ""
|
||||||
|
gdb_test "show download-write-size" \
|
||||||
|
"The write size used when downloading a program is unlimited." \
|
||||||
|
"set download limit - unlimited"
|
||||||
|
|
||||||
|
gdb_test "show remote memory-write-packet-size" \
|
||||||
|
"The memory-write-packet-size is 0. Packets are limited to \[0-9\]+ bytes." \
|
||||||
|
"write-packet default"
|
||||||
|
|
||||||
|
gdb_test "set remote memory-write-packet-size" \
|
||||||
|
"Argument required .integer, `fixed' or `limited'.\." \
|
||||||
|
"set write-packet - NULL"
|
||||||
|
|
||||||
|
gdb_test "set remote memory-write-packet-size 16" ""
|
||||||
|
gdb_test "show remote memory-write-packet-size" \
|
||||||
|
"The memory-write-packet-size is 16. Packets are limited to 16 bytes." \
|
||||||
|
"set write-packet - small"
|
||||||
|
|
||||||
|
gdb_test "set remote memory-write-packet-size 1" ""
|
||||||
|
gdb_test "show remote memory-write-packet-size" \
|
||||||
|
"The memory-write-packet-size is 1. Packets are limited to 16 bytes." \
|
||||||
|
"set write-packet - very-small"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Part TWO: Check the download behavour
|
||||||
|
#
|
||||||
|
|
||||||
|
proc gdb_load_timed {executable downloadsize class writesize} {
|
||||||
global test gdb_prompt
|
global test gdb_prompt
|
||||||
set test "timed download `[file tail $executable]' ($writesize)"
|
set test "timed download `[file tail $executable]' - $downloadsize, $class, $writesize"
|
||||||
|
|
||||||
if {$writesize != ""} then {
|
if {$writesize != ""} then {
|
||||||
send_gdb "set remotewritesize $writesize\n"
|
gdb_test "set remote memory-write-packet-size $writesize" \
|
||||||
|
"" "$test - set packet size"
|
||||||
|
}
|
||||||
|
|
||||||
|
if {$downloadsize != ""} then {
|
||||||
|
gdb_test "set download-write-size $downloadsize" \
|
||||||
|
"" "$test - set download size"
|
||||||
|
}
|
||||||
|
|
||||||
|
if {$downloadsize != ""} then {
|
||||||
|
send_gdb "set remote memory-write-packet-size $class\n"
|
||||||
gdb_expect 5 {
|
gdb_expect 5 {
|
||||||
|
-re ".*Change the packet size.*$" {
|
||||||
|
send_gdb "y\n"
|
||||||
|
gdb_expect 5 {
|
||||||
|
-re ".*$gdb_prompt $" {
|
||||||
|
pass "$test - set write size class"
|
||||||
|
}
|
||||||
|
timeout {
|
||||||
|
fail "$test - set write size class"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
-re ".*$gdb_prompt $" { }
|
-re ".*$gdb_prompt $" { }
|
||||||
timeout { fail "$test - setting remotewritesize" ; return }
|
timeout {
|
||||||
|
fail "$test - set write size class"
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,26 +127,17 @@ proc gdb_load_timed {executable writesize} {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# tests
|
gdb_load_timed $binfile {} "" {}
|
||||||
|
|
||||||
gdb_start
|
# Typically about 400 bytes can be downloaded
|
||||||
|
gdb_load_timed $binfile 0 "limit" 399
|
||||||
|
gdb_load_timed $binfile 0 "limit" 401
|
||||||
|
|
||||||
set result [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}]
|
# fall back to the default
|
||||||
if {$result != "" } then {
|
gdb_load_timed $binfile 0 "limit" 0
|
||||||
gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
|
|
||||||
}
|
|
||||||
|
|
||||||
gdb_load_timed $binfile {}
|
# Absolute max is 16384
|
||||||
gdb_load_timed $binfile 50
|
gdb_load_timed $binfile 0 "fixed" 0
|
||||||
gdb_load_timed $binfile 100
|
gdb_load_timed $binfile 0 "fixed" 16385
|
||||||
gdb_load_timed $binfile 200
|
|
||||||
gdb_load_timed $binfile 400
|
|
||||||
|
|
||||||
# extra tests for capable targets
|
|
||||||
if {[target_info gdb,big_rx_buffers] != ""} then {
|
|
||||||
gdb_load_timed $binfile 800
|
|
||||||
gdb_load_timed $binfile 8000
|
|
||||||
gdb_load_timed $binfile 80000
|
|
||||||
}
|
|
||||||
|
|
||||||
gdb_exit
|
gdb_exit
|
||||||
|
|
|
@ -119,9 +119,9 @@ if ![runto_main] then {
|
||||||
|
|
||||||
send_gdb "next\n"
|
send_gdb "next\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re ".*g = shr1\\(g\\).*$gdb_prompt $" {pass "next to shr2"}
|
-re ".*g = shr1\\(g\\).*$gdb_prompt $" {pass "next to shr1"}
|
||||||
-re ".*$gdb_prompt $" { fail "next to shr2" }
|
-re ".*$gdb_prompt $" { fail "next to shr1" }
|
||||||
timeout { fail "next to shr2 (timeout)" }
|
timeout { fail "next to shr1 (timeout)" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1164,17 +1164,27 @@ proc gdb_expect { args } {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# gdb_expect_list MESSAGE SENTINAL LIST -- expect a sequence of outputs
|
||||||
#
|
#
|
||||||
# Check for long sequence of output by parts.
|
# Check for long sequence of output by parts.
|
||||||
# TEST: is the test message.
|
# MESSAGE: is the test message to be printed with the test success/fail.
|
||||||
# SENTINEL: Is the terminal pattern indicating that output has finished.
|
# SENTINEL: Is the terminal pattern indicating that output has finished.
|
||||||
# LIST: is the sequence of outputs to match.
|
# LIST: is the sequence of outputs to match.
|
||||||
# If the sentinel is recognized early, it is considered an error.
|
# If the sentinel is recognized early, it is considered an error.
|
||||||
#
|
#
|
||||||
|
# Returns:
|
||||||
|
# 1 if the test failed,
|
||||||
|
# 0 if the test passes,
|
||||||
|
# -1 if there was an internal error.
|
||||||
|
#
|
||||||
proc gdb_expect_list {test sentinal list} {
|
proc gdb_expect_list {test sentinal list} {
|
||||||
global gdb_prompt
|
global gdb_prompt
|
||||||
|
global suppress_flag
|
||||||
set index 0
|
set index 0
|
||||||
set ok 1
|
set ok 1
|
||||||
|
if { $suppress_flag } {
|
||||||
|
set ok 0
|
||||||
|
}
|
||||||
while { ${index} < [llength ${list}] } {
|
while { ${index} < [llength ${list}] } {
|
||||||
set pattern [lindex ${list} ${index}]
|
set pattern [lindex ${list} ${index}]
|
||||||
set index [expr ${index} + 1]
|
set index [expr ${index} + 1]
|
||||||
|
@ -1212,6 +1222,11 @@ proc gdb_expect_list {test sentinal list} {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if { ${ok} } {
|
||||||
|
return 0
|
||||||
|
} else {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
62
gdb/top.c
62
gdb/top.c
|
@ -524,6 +524,25 @@ return_to_top_level (reason)
|
||||||
catch_errors. Note that quit should return to the command line
|
catch_errors. Note that quit should return to the command line
|
||||||
fairly quickly, even if some further processing is being done. */
|
fairly quickly, even if some further processing is being done. */
|
||||||
|
|
||||||
|
/* MAYBE: cagney/1999-11-05: catch_errors() in conjunction with
|
||||||
|
error() et.al. could maintain a set of flags that indicate the the
|
||||||
|
current state of each of the longjmp buffers. This would give the
|
||||||
|
longjmp code the chance to detect a longjmp botch (before it gets
|
||||||
|
to longjmperror()). Prior to 1999-11-05 this wasn't possible as
|
||||||
|
code also randomly used a SET_TOP_LEVEL macro that directly
|
||||||
|
initialize the longjmp buffers. */
|
||||||
|
|
||||||
|
/* MAYBE: cagney/1999-11-05: Since the SET_TOP_LEVEL macro has been
|
||||||
|
eliminated it is now possible to use the stack to directly store
|
||||||
|
each longjmp buffer. The global code would just need to update a
|
||||||
|
pointer (onto the stack - ulgh!?) indicating the current longjmp
|
||||||
|
buffers. It would certainly improve the performance of the longjmp
|
||||||
|
code since the memcpy's would be eliminated. */
|
||||||
|
|
||||||
|
/* MAYBE: cagney/1999-11-05: Should the catch_erros and cleanups code
|
||||||
|
be consolidated into a single file instead of being distributed
|
||||||
|
between utils.c and top.c? */
|
||||||
|
|
||||||
int
|
int
|
||||||
catch_errors (func, args, errstring, mask)
|
catch_errors (func, args, errstring, mask)
|
||||||
catch_errors_ftype *func;
|
catch_errors_ftype *func;
|
||||||
|
@ -561,6 +580,14 @@ catch_errors (func, args, errstring, mask)
|
||||||
if (mask & RETURN_MASK_QUIT)
|
if (mask & RETURN_MASK_QUIT)
|
||||||
memcpy (quit_return, tmp_jmp, sizeof (SIGJMP_BUF));
|
memcpy (quit_return, tmp_jmp, sizeof (SIGJMP_BUF));
|
||||||
val = (*func) (args);
|
val = (*func) (args);
|
||||||
|
/* FIXME: cagney/1999-11-05: A correct FUNC implementaton will
|
||||||
|
clean things up (restoring the cleanup chain) to the state
|
||||||
|
they were just prior to the call. Technically, this means
|
||||||
|
that the below restore_cleanups call is redundant.
|
||||||
|
Unfortunatly, many FUNC's are not that well behaved.
|
||||||
|
restore_cleanups should either be replaced with a do_cleanups
|
||||||
|
call (to cover the problem) or an assertion check to detect
|
||||||
|
bad FUNCs code. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
val = 0;
|
val = 0;
|
||||||
|
@ -580,6 +607,41 @@ catch_errors (func, args, errstring, mask)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct captured_command_args
|
||||||
|
{
|
||||||
|
catch_command_errors_ftype *command;
|
||||||
|
char *arg;
|
||||||
|
int from_tty;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
do_captured_command (void *data)
|
||||||
|
{
|
||||||
|
struct captured_command_args *context = data;
|
||||||
|
context->command (context->arg, context->from_tty);
|
||||||
|
/* FIXME: cagney/1999-11-07: Technically this do_cleanups() call
|
||||||
|
isn't needed. Instead an assertion check could be made that
|
||||||
|
simply confirmed that the called function correctly cleaned up
|
||||||
|
after its self. Unfortunatly, old code (prior to 1999-11-04) in
|
||||||
|
main.c was calling SET_TOP_LEVEL(), calling the command function,
|
||||||
|
and then *always* calling do_cleanups(). For the moment we
|
||||||
|
remain ``bug compatible'' with that old code.. */
|
||||||
|
do_cleanups (ALL_CLEANUPS);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
catch_command_errors (catch_command_errors_ftype *command,
|
||||||
|
char *arg, int from_tty, return_mask mask)
|
||||||
|
{
|
||||||
|
struct captured_command_args args;
|
||||||
|
args.command = command;
|
||||||
|
args.arg = arg;
|
||||||
|
args.from_tty = from_tty;
|
||||||
|
return catch_errors (do_captured_command, &args, "", mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Handler for SIGHUP. */
|
/* Handler for SIGHUP. */
|
||||||
|
|
||||||
#ifdef SIGHUP
|
#ifdef SIGHUP
|
||||||
|
|
13
gdb/top.h
13
gdb/top.h
|
@ -42,19 +42,6 @@ extern char gdbinit[];
|
||||||
#define SIGLONGJMP(buf,val) longjmp(buf,val)
|
#define SIGLONGJMP(buf,val) longjmp(buf,val)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Temporary variable for SET_TOP_LEVEL. */
|
|
||||||
|
|
||||||
int top_level_val;
|
|
||||||
|
|
||||||
/* Do a setjmp on error_return and quit_return. catch_errors is
|
|
||||||
generally a cleaner way to do this, but main() would look pretty
|
|
||||||
ugly if it had to use catch_errors each time. */
|
|
||||||
|
|
||||||
#define SET_TOP_LEVEL() \
|
|
||||||
(((top_level_val = SIGSETJMP (error_return)) \
|
|
||||||
? (PTR) 0 : (PTR) memcpy (quit_return, error_return, sizeof (SIGJMP_BUF))) \
|
|
||||||
, top_level_val)
|
|
||||||
|
|
||||||
extern SIGJMP_BUF error_return;
|
extern SIGJMP_BUF error_return;
|
||||||
extern SIGJMP_BUF quit_return;
|
extern SIGJMP_BUF quit_return;
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
Mon Nov 8 17:47:37 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* tuiRegs.c (_tuiRegisterFormat), tuiDisassem.c
|
||||||
|
(tuiSetDisassemContent): Replace gdb_file_init_astring with
|
||||||
|
tui_sfileopen. Replace gdb_file_get_strbuf with
|
||||||
|
tui_file_get_strbuf.
|
||||||
|
|
||||||
|
Mon Nov 8 16:54:51 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
|
* tuiRegs.c (_tuiRegisterFormat), tuiDisassem.c
|
||||||
|
(tuiSetDisassemContent): Repace gdb_file_deallocate with
|
||||||
|
gdb_file_delete. Replace gdb_file_init_astring with tui_sfileopen.
|
||||||
|
|
||||||
Fri Sep 17 19:34:38 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
Fri Sep 17 19:34:38 1999 Andrew Cagney <cagney@b1.cygnus.com>
|
||||||
|
|
||||||
* tuiSource.c: Include "source.h".
|
* tuiSource.c: Include "source.h".
|
||||||
|
|
|
@ -66,7 +66,7 @@ tuiSetDisassemContent (s, startAddr)
|
||||||
threshold = (lineWidth - 1) + offset;
|
threshold = (lineWidth - 1) + offset;
|
||||||
|
|
||||||
/* now init the gdb_file structure */
|
/* now init the gdb_file structure */
|
||||||
gdb_dis_out = gdb_file_init_astring (threshold);
|
gdb_dis_out = tui_sfileopen (threshold);
|
||||||
|
|
||||||
INIT_DISASSEMBLE_INFO_NO_ARCH (asmInfo, gdb_dis_out, (fprintf_ftype) fprintf_filtered);
|
INIT_DISASSEMBLE_INFO_NO_ARCH (asmInfo, gdb_dis_out, (fprintf_ftype) fprintf_filtered);
|
||||||
asmInfo.read_memory_func = dis_asm_read_memory;
|
asmInfo.read_memory_func = dis_asm_read_memory;
|
||||||
|
@ -82,27 +82,27 @@ tuiSetDisassemContent (s, startAddr)
|
||||||
|
|
||||||
print_address (pc, gdb_dis_out);
|
print_address (pc, gdb_dis_out);
|
||||||
|
|
||||||
curLen = strlen (gdb_file_get_strbuf (gdb_dis_out));
|
curLen = strlen (tui_file_get_strbuf (gdb_dis_out));
|
||||||
i = curLen - ((curLen / tab_len) * tab_len);
|
i = curLen - ((curLen / tab_len) * tab_len);
|
||||||
|
|
||||||
/* adjust buffer length if necessary */
|
/* adjust buffer length if necessary */
|
||||||
gdb_file_adjust_strbuf ((tab_len - i > 0) ? (tab_len - i) : 0, gdb_dis_out);
|
tui_file_adjust_strbuf ((tab_len - i > 0) ? (tab_len - i) : 0, gdb_dis_out);
|
||||||
|
|
||||||
/* Add spaces to make the instructions start onthe same column */
|
/* Add spaces to make the instructions start onthe same column */
|
||||||
while (i < tab_len)
|
while (i < tab_len)
|
||||||
{
|
{
|
||||||
gdb_file_get_strbuf (gdb_dis_out)[curLen] = ' ';
|
tui_file_get_strbuf (gdb_dis_out)[curLen] = ' ';
|
||||||
i++;
|
i++;
|
||||||
curLen++;
|
curLen++;
|
||||||
}
|
}
|
||||||
gdb_file_get_strbuf (gdb_dis_out)[curLen] = '\0';
|
tui_file_get_strbuf (gdb_dis_out)[curLen] = '\0';
|
||||||
|
|
||||||
newpc = pc + ((*tm_print_insn) (pc, &asmInfo));
|
newpc = pc + ((*tm_print_insn) (pc, &asmInfo));
|
||||||
|
|
||||||
/* Now copy the line taking the offset into account */
|
/* Now copy the line taking the offset into account */
|
||||||
if (strlen (gdb_file_get_strbuf (gdb_dis_out)) > offset)
|
if (strlen (tui_file_get_strbuf (gdb_dis_out)) > offset)
|
||||||
strcpy (element->whichElement.source.line,
|
strcpy (element->whichElement.source.line,
|
||||||
&(gdb_file_get_strbuf (gdb_dis_out)[offset]));
|
&(tui_file_get_strbuf (gdb_dis_out)[offset]));
|
||||||
else
|
else
|
||||||
element->whichElement.source.line[0] = '\0';
|
element->whichElement.source.line[0] = '\0';
|
||||||
element->whichElement.source.lineOrAddr.addr = (Opaque) pc;
|
element->whichElement.source.lineOrAddr.addr = (Opaque) pc;
|
||||||
|
@ -116,9 +116,10 @@ tuiSetDisassemContent (s, startAddr)
|
||||||
curLine++;
|
curLine++;
|
||||||
pc = newpc;
|
pc = newpc;
|
||||||
/* reset the buffer to empty */
|
/* reset the buffer to empty */
|
||||||
gdb_file_get_strbuf (gdb_dis_out)[0] = '\0';
|
tui_file_get_strbuf (gdb_dis_out)[0] = '\0';
|
||||||
}
|
}
|
||||||
gdb_file_deallocate (&gdb_dis_out);
|
gdb_file_delete (gdb_dis_out);
|
||||||
|
gdb_dis_out = NULL;
|
||||||
disassemWin->generic.contentSize = curLine;
|
disassemWin->generic.contentSize = curLine;
|
||||||
ret = TUI_SUCCESS;
|
ret = TUI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -671,10 +671,10 @@ _tuiRegisterFormat (buf, bufLen, regNum, dataElement, precision)
|
||||||
char *fmt;
|
char *fmt;
|
||||||
GDB_FILE *stream;
|
GDB_FILE *stream;
|
||||||
|
|
||||||
stream = gdb_file_init_astring (bufLen);
|
stream = tui_sfileopen (bufLen);
|
||||||
pa_do_strcat_registers_info (regNum, 0, stream, precision);
|
pa_do_strcat_registers_info (regNum, 0, stream, precision);
|
||||||
strcpy (buf, gdb_file_get_strbuf (stream));
|
strcpy (buf, tui_file_get_strbuf (stream));
|
||||||
gdb_file_deallocate (&stream);
|
gdb_file_delete (stream);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} /* _tuiRegisterFormat */
|
} /* _tuiRegisterFormat */
|
||||||
|
|
179
gdb/utils.c
179
gdb/utils.c
|
@ -211,6 +211,18 @@ make_cleanup_freeargv (arg)
|
||||||
return make_my_cleanup (&cleanup_chain, do_freeargv, arg);
|
return make_my_cleanup (&cleanup_chain, do_freeargv, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_gdb_file_delete (void *arg)
|
||||||
|
{
|
||||||
|
gdb_file_delete (arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cleanup *
|
||||||
|
make_cleanup_gdb_file_delete (struct gdb_file *arg)
|
||||||
|
{
|
||||||
|
return make_my_cleanup (&cleanup_chain, do_gdb_file_delete, arg);
|
||||||
|
}
|
||||||
|
|
||||||
struct cleanup *
|
struct cleanup *
|
||||||
make_my_cleanup (pmy_chain, function, arg)
|
make_my_cleanup (pmy_chain, function, arg)
|
||||||
struct cleanup **pmy_chain;
|
struct cleanup **pmy_chain;
|
||||||
|
@ -535,7 +547,7 @@ error (const char *string,...)
|
||||||
NORETURN void
|
NORETURN void
|
||||||
error_stream (GDB_FILE *stream)
|
error_stream (GDB_FILE *stream)
|
||||||
{
|
{
|
||||||
error (gdb_file_get_strbuf (stream));
|
error (tui_file_get_strbuf (stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the last error message issued by gdb */
|
/* Get the last error message issued by gdb */
|
||||||
|
@ -543,7 +555,7 @@ error_stream (GDB_FILE *stream)
|
||||||
char *
|
char *
|
||||||
error_last_message (void)
|
error_last_message (void)
|
||||||
{
|
{
|
||||||
return (gdb_file_get_strbuf (gdb_lasterr));
|
return (tui_file_get_strbuf (gdb_lasterr));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is to be called by main() at the very beginning */
|
/* This is to be called by main() at the very beginning */
|
||||||
|
@ -1643,6 +1655,7 @@ begin_line ()
|
||||||
/* ``struct gdb_file'' implementation that maps directly onto
|
/* ``struct gdb_file'' implementation that maps directly onto
|
||||||
<stdio.h>'s FILE. */
|
<stdio.h>'s FILE. */
|
||||||
|
|
||||||
|
static gdb_file_write_ftype stdio_file_write;
|
||||||
static gdb_file_fputs_ftype stdio_file_fputs;
|
static gdb_file_fputs_ftype stdio_file_fputs;
|
||||||
static gdb_file_isatty_ftype stdio_file_isatty;
|
static gdb_file_isatty_ftype stdio_file_isatty;
|
||||||
static gdb_file_delete_ftype stdio_file_delete;
|
static gdb_file_delete_ftype stdio_file_delete;
|
||||||
|
@ -1670,6 +1683,7 @@ stdio_file_new (file, close_p)
|
||||||
stdio->close_p = close_p;
|
stdio->close_p = close_p;
|
||||||
set_gdb_file_data (gdb_file, stdio, stdio_file_delete);
|
set_gdb_file_data (gdb_file, stdio, stdio_file_delete);
|
||||||
set_gdb_file_flush (gdb_file, stdio_file_flush);
|
set_gdb_file_flush (gdb_file, stdio_file_flush);
|
||||||
|
set_gdb_file_write (gdb_file, stdio_file_write);
|
||||||
set_gdb_file_fputs (gdb_file, stdio_file_fputs);
|
set_gdb_file_fputs (gdb_file, stdio_file_fputs);
|
||||||
set_gdb_file_isatty (gdb_file, stdio_file_isatty);
|
set_gdb_file_isatty (gdb_file, stdio_file_isatty);
|
||||||
return gdb_file;
|
return gdb_file;
|
||||||
|
@ -1681,7 +1695,7 @@ stdio_file_delete (file)
|
||||||
{
|
{
|
||||||
struct stdio_file *stdio = gdb_file_data (file);
|
struct stdio_file *stdio = gdb_file_data (file);
|
||||||
if (stdio->magic != &stdio_file_magic)
|
if (stdio->magic != &stdio_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("stdio_file_delete: bad magic number");
|
||||||
if (stdio->close_p)
|
if (stdio->close_p)
|
||||||
{
|
{
|
||||||
fclose (stdio->file);
|
fclose (stdio->file);
|
||||||
|
@ -1695,10 +1709,19 @@ stdio_file_flush (file)
|
||||||
{
|
{
|
||||||
struct stdio_file *stdio = gdb_file_data (file);
|
struct stdio_file *stdio = gdb_file_data (file);
|
||||||
if (stdio->magic != &stdio_file_magic)
|
if (stdio->magic != &stdio_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("stdio_file_flush: bad magic number");
|
||||||
fflush (stdio->file);
|
fflush (stdio->file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
stdio_file_write (struct gdb_file *file, const char *buf, long length_buf)
|
||||||
|
{
|
||||||
|
struct stdio_file *stdio = gdb_file_data (file);
|
||||||
|
if (stdio->magic != &stdio_file_magic)
|
||||||
|
internal_error ("stdio_file_write: bad magic number");
|
||||||
|
fwrite (buf, length_buf, 1, stdio->file);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
stdio_file_fputs (linebuffer, file)
|
stdio_file_fputs (linebuffer, file)
|
||||||
const char *linebuffer;
|
const char *linebuffer;
|
||||||
|
@ -1706,7 +1729,7 @@ stdio_file_fputs (linebuffer, file)
|
||||||
{
|
{
|
||||||
struct stdio_file *stdio = gdb_file_data (file);
|
struct stdio_file *stdio = gdb_file_data (file);
|
||||||
if (stdio->magic != &stdio_file_magic)
|
if (stdio->magic != &stdio_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("stdio_file_fputs: bad magic number");
|
||||||
fputs (linebuffer, stdio->file);
|
fputs (linebuffer, stdio->file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1716,7 +1739,7 @@ stdio_file_isatty (file)
|
||||||
{
|
{
|
||||||
struct stdio_file *stdio = gdb_file_data (file);
|
struct stdio_file *stdio = gdb_file_data (file);
|
||||||
if (stdio->magic != &stdio_file_magic)
|
if (stdio->magic != &stdio_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("stdio_file_isatty: bad magic number");
|
||||||
return (isatty (fileno (stdio->file)));
|
return (isatty (fileno (stdio->file)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1882,7 +1905,7 @@ tui_file_delete (file)
|
||||||
{
|
{
|
||||||
struct tui_stream *tmpstream = gdb_file_data (file);
|
struct tui_stream *tmpstream = gdb_file_data (file);
|
||||||
if (tmpstream->ts_magic != &tui_file_magic)
|
if (tmpstream->ts_magic != &tui_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("tui_file_delete: bad magic number");
|
||||||
if ((tmpstream->ts_streamtype == astring) &&
|
if ((tmpstream->ts_streamtype == astring) &&
|
||||||
(tmpstream->ts_strbuf != NULL))
|
(tmpstream->ts_strbuf != NULL))
|
||||||
{
|
{
|
||||||
|
@ -1919,7 +1942,7 @@ tui_sfileopen (n)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* Do not allocate the buffer now. The first time something is printed
|
/* Do not allocate the buffer now. The first time something is printed
|
||||||
one will be allocated by gdb_file_adjust_strbuf() */
|
one will be allocated by tui_file_adjust_strbuf() */
|
||||||
tmpstream->ts_strbuf = NULL;
|
tmpstream->ts_strbuf = NULL;
|
||||||
tmpstream->ts_buflen = n;
|
tmpstream->ts_buflen = n;
|
||||||
return file;
|
return file;
|
||||||
|
@ -1931,7 +1954,7 @@ tui_file_isatty (file)
|
||||||
{
|
{
|
||||||
struct tui_stream *stream = gdb_file_data (file);
|
struct tui_stream *stream = gdb_file_data (file);
|
||||||
if (stream->ts_magic != &tui_file_magic)
|
if (stream->ts_magic != &tui_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("tui_file_isatty: bad magic number");
|
||||||
if (stream->ts_streamtype == afile)
|
if (stream->ts_streamtype == afile)
|
||||||
return (isatty (fileno (stream->ts_filestream)));
|
return (isatty (fileno (stream->ts_filestream)));
|
||||||
else
|
else
|
||||||
|
@ -1944,7 +1967,7 @@ tui_file_rewind (file)
|
||||||
{
|
{
|
||||||
struct tui_stream *stream = gdb_file_data (file);
|
struct tui_stream *stream = gdb_file_data (file);
|
||||||
if (stream->ts_magic != &tui_file_magic)
|
if (stream->ts_magic != &tui_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("tui_file_rewind: bad magic number");
|
||||||
stream->ts_strbuf[0] = '\0';
|
stream->ts_strbuf[0] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1955,7 +1978,7 @@ tui_file_put (file, dest)
|
||||||
{
|
{
|
||||||
struct tui_stream *stream = gdb_file_data (file);
|
struct tui_stream *stream = gdb_file_data (file);
|
||||||
if (stream->ts_magic != &tui_file_magic)
|
if (stream->ts_magic != &tui_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("tui_file_put: bad magic number");
|
||||||
if (stream->ts_streamtype == astring)
|
if (stream->ts_streamtype == astring)
|
||||||
{
|
{
|
||||||
fputs_unfiltered (stream->ts_strbuf, dest);
|
fputs_unfiltered (stream->ts_strbuf, dest);
|
||||||
|
@ -2001,7 +2024,7 @@ tui_file_fputs (linebuffer, file)
|
||||||
|
|
||||||
if (stream->ts_streamtype == astring)
|
if (stream->ts_streamtype == astring)
|
||||||
{
|
{
|
||||||
gdb_file_adjust_strbuf (strlen (linebuffer), stream);
|
tui_file_adjust_strbuf (strlen (linebuffer), stream);
|
||||||
strcat (stream->ts_strbuf, linebuffer);
|
strcat (stream->ts_strbuf, linebuffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2020,7 +2043,7 @@ tui_file_fputs (linebuffer, file)
|
||||||
/* The normal case - just do a fputs() */
|
/* The normal case - just do a fputs() */
|
||||||
if (stream->ts_streamtype == astring)
|
if (stream->ts_streamtype == astring)
|
||||||
{
|
{
|
||||||
gdb_file_adjust_strbuf (strlen (linebuffer), stream);
|
tui_file_adjust_strbuf (strlen (linebuffer), stream);
|
||||||
strcat (stream->ts_strbuf, linebuffer);
|
strcat (stream->ts_strbuf, linebuffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2031,7 +2054,7 @@ tui_file_fputs (linebuffer, file)
|
||||||
#else
|
#else
|
||||||
if (stream->ts_streamtype == astring)
|
if (stream->ts_streamtype == astring)
|
||||||
{
|
{
|
||||||
gdb_file_adjust_strbuf (strlen (linebuffer), file);
|
tui_file_adjust_strbuf (strlen (linebuffer), file);
|
||||||
strcat (stream->ts_strbuf, linebuffer);
|
strcat (stream->ts_strbuf, linebuffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2040,60 +2063,24 @@ tui_file_fputs (linebuffer, file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* DEPRECATED: Use tui_sfileopen() instead */
|
|
||||||
|
|
||||||
GDB_FILE *
|
|
||||||
gdb_file_init_astring (n)
|
|
||||||
int n;
|
|
||||||
{
|
|
||||||
struct gdb_file *file = tui_file_new ();
|
|
||||||
struct tui_stream *tmpstream = gdb_file_data (file);
|
|
||||||
if (tmpstream->ts_magic != &tui_file_magic)
|
|
||||||
error ("Internal error: bad magic number");
|
|
||||||
|
|
||||||
tmpstream->ts_streamtype = astring;
|
|
||||||
tmpstream->ts_filestream = NULL;
|
|
||||||
if (n > 0)
|
|
||||||
{
|
|
||||||
tmpstream->ts_strbuf = xmalloc ((n + 1) * sizeof (char));
|
|
||||||
tmpstream->ts_strbuf[0] = '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
tmpstream->ts_strbuf = NULL;
|
|
||||||
tmpstream->ts_buflen = n;
|
|
||||||
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gdb_file_deallocate (streamptr)
|
|
||||||
GDB_FILE **streamptr;
|
|
||||||
{
|
|
||||||
gdb_file_delete (*streamptr);
|
|
||||||
*streamptr = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *
|
char *
|
||||||
gdb_file_get_strbuf (file)
|
tui_file_get_strbuf (struct gdb_file *file)
|
||||||
GDB_FILE *file;
|
|
||||||
{
|
{
|
||||||
struct tui_stream *stream = gdb_file_data (file);
|
struct tui_stream *stream = gdb_file_data (file);
|
||||||
if (stream->ts_magic != &tui_file_magic)
|
if (stream->ts_magic != &tui_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("tui_file_get_strbuf: bad magic number");
|
||||||
return (stream->ts_strbuf);
|
return (stream->ts_strbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adjust the length of the buffer by the amount necessary
|
/* adjust the length of the buffer by the amount necessary
|
||||||
to accomodate appending a string of length N to the buffer contents */
|
to accomodate appending a string of length N to the buffer contents */
|
||||||
void
|
void
|
||||||
gdb_file_adjust_strbuf (n, file)
|
tui_file_adjust_strbuf (int n, struct gdb_file *file)
|
||||||
int n;
|
|
||||||
GDB_FILE *file;
|
|
||||||
{
|
{
|
||||||
struct tui_stream *stream = gdb_file_data (file);
|
struct tui_stream *stream = gdb_file_data (file);
|
||||||
int non_null_chars;
|
int non_null_chars;
|
||||||
if (stream->ts_magic != &tui_file_magic)
|
if (stream->ts_magic != &tui_file_magic)
|
||||||
error ("Internal error: bad magic number");
|
internal_error ("tui_file_adjust_strbuf: bad magic number");
|
||||||
|
|
||||||
if (stream->ts_streamtype != astring)
|
if (stream->ts_streamtype != astring)
|
||||||
return;
|
return;
|
||||||
|
@ -2150,18 +2137,10 @@ tui_file_flush (file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
gdb_fclose (streamptr)
|
|
||||||
GDB_FILE **streamptr;
|
|
||||||
{
|
|
||||||
gdb_file_delete (*streamptr);
|
|
||||||
*streamptr = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Implement the ``struct gdb_file'' object. */
|
/* Implement the ``struct gdb_file'' object. */
|
||||||
|
|
||||||
static gdb_file_isatty_ftype null_file_isatty;
|
static gdb_file_isatty_ftype null_file_isatty;
|
||||||
|
static gdb_file_write_ftype null_file_write;
|
||||||
static gdb_file_fputs_ftype null_file_fputs;
|
static gdb_file_fputs_ftype null_file_fputs;
|
||||||
static gdb_file_flush_ftype null_file_flush;
|
static gdb_file_flush_ftype null_file_flush;
|
||||||
static gdb_file_delete_ftype null_file_delete;
|
static gdb_file_delete_ftype null_file_delete;
|
||||||
|
@ -2171,6 +2150,7 @@ static gdb_file_put_ftype null_file_put;
|
||||||
struct gdb_file
|
struct gdb_file
|
||||||
{
|
{
|
||||||
gdb_file_flush_ftype *to_flush;
|
gdb_file_flush_ftype *to_flush;
|
||||||
|
gdb_file_write_ftype *to_write;
|
||||||
gdb_file_fputs_ftype *to_fputs;
|
gdb_file_fputs_ftype *to_fputs;
|
||||||
gdb_file_delete_ftype *to_delete;
|
gdb_file_delete_ftype *to_delete;
|
||||||
gdb_file_isatty_ftype *to_isatty;
|
gdb_file_isatty_ftype *to_isatty;
|
||||||
|
@ -2185,6 +2165,7 @@ gdb_file_new ()
|
||||||
struct gdb_file *file = xmalloc (sizeof (struct gdb_file));
|
struct gdb_file *file = xmalloc (sizeof (struct gdb_file));
|
||||||
set_gdb_file_data (file, NULL, null_file_delete);
|
set_gdb_file_data (file, NULL, null_file_delete);
|
||||||
set_gdb_file_flush (file, null_file_flush);
|
set_gdb_file_flush (file, null_file_flush);
|
||||||
|
set_gdb_file_write (file, null_file_write);
|
||||||
set_gdb_file_fputs (file, null_file_fputs);
|
set_gdb_file_fputs (file, null_file_fputs);
|
||||||
set_gdb_file_isatty (file, null_file_isatty);
|
set_gdb_file_isatty (file, null_file_isatty);
|
||||||
set_gdb_file_rewind (file, null_file_rewind);
|
set_gdb_file_rewind (file, null_file_rewind);
|
||||||
|
@ -2229,12 +2210,48 @@ null_file_flush (file)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
null_file_write (struct gdb_file *file,
|
||||||
|
const char *buf,
|
||||||
|
long sizeof_buf)
|
||||||
|
{
|
||||||
|
if (file->to_fputs == null_file_fputs)
|
||||||
|
/* Both the write and fputs methods are null. Discard the
|
||||||
|
request. */
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The fputs method isn't null, slowly pass the write request
|
||||||
|
onto that. FYI, this isn't as bad as it may look - the
|
||||||
|
current (as of 1999-11-07) printf_* function calls fputc and
|
||||||
|
fputc does exactly the below. By having a write function it
|
||||||
|
is possible to clean up that code. */
|
||||||
|
int i;
|
||||||
|
char b[2];
|
||||||
|
b[1] = '\0';
|
||||||
|
for (i = 0; i < sizeof_buf; i++)
|
||||||
|
{
|
||||||
|
b[0] = buf[i];
|
||||||
|
file->to_fputs (b, file);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
null_file_fputs (buf, file)
|
null_file_fputs (buf, file)
|
||||||
const char *buf;
|
const char *buf;
|
||||||
struct gdb_file *file;
|
struct gdb_file *file;
|
||||||
{
|
{
|
||||||
return;
|
if (file->to_write == null_file_write)
|
||||||
|
/* Both the write and fputs methods are null. Discard the
|
||||||
|
request. */
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The write method was implemented, use that. */
|
||||||
|
file->to_write (file, buf, strlen (buf));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2280,6 +2297,14 @@ gdb_file_put (file, dest)
|
||||||
file->to_put (file, dest);
|
file->to_put (file, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gdb_file_write (struct gdb_file *file,
|
||||||
|
const char *buf,
|
||||||
|
long length_buf)
|
||||||
|
{
|
||||||
|
file->to_write (file, buf, length_buf);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fputs_unfiltered (buf, file)
|
fputs_unfiltered (buf, file)
|
||||||
const char *buf;
|
const char *buf;
|
||||||
|
@ -2320,6 +2345,13 @@ set_gdb_file_put (file, put)
|
||||||
file->to_put = put;
|
file->to_put = put;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
set_gdb_file_write (struct gdb_file *file,
|
||||||
|
gdb_file_write_ftype *write)
|
||||||
|
{
|
||||||
|
file->to_write = write;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
set_gdb_file_fputs (file, fputs)
|
set_gdb_file_fputs (file, fputs)
|
||||||
struct gdb_file *file;
|
struct gdb_file *file;
|
||||||
|
@ -2467,11 +2499,8 @@ int
|
||||||
putchar_unfiltered (c)
|
putchar_unfiltered (c)
|
||||||
int c;
|
int c;
|
||||||
{
|
{
|
||||||
char buf[2];
|
char buf = c;
|
||||||
|
gdb_file_write (gdb_stdout, &buf, 1);
|
||||||
buf[0] = c;
|
|
||||||
buf[1] = 0;
|
|
||||||
fputs_unfiltered (buf, gdb_stdout);
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2480,11 +2509,8 @@ fputc_unfiltered (c, stream)
|
||||||
int c;
|
int c;
|
||||||
GDB_FILE *stream;
|
GDB_FILE *stream;
|
||||||
{
|
{
|
||||||
char buf[2];
|
char buf = c;
|
||||||
|
gdb_file_write (stream, &buf, 1);
|
||||||
buf[0] = c;
|
|
||||||
buf[1] = 0;
|
|
||||||
fputs_unfiltered (buf, stream);
|
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3122,9 +3148,12 @@ floatformat_to_doublest (fmt, from, to)
|
||||||
|
|
||||||
special_exponent = exponent == 0 || exponent == fmt->exp_nan;
|
special_exponent = exponent == 0 || exponent == fmt->exp_nan;
|
||||||
|
|
||||||
/* Don't bias zero's, denorms or NaNs. */
|
/* Don't bias NaNs. Use minimum exponent for denorms. For simplicity,
|
||||||
|
we don't check for zero as the exponent doesn't matter. */
|
||||||
if (!special_exponent)
|
if (!special_exponent)
|
||||||
exponent -= fmt->exp_bias;
|
exponent -= fmt->exp_bias;
|
||||||
|
else if (exponent == 0)
|
||||||
|
exponent = 1 - fmt->exp_bias;
|
||||||
|
|
||||||
/* Build the result algebraically. Might go infinite, underflow, etc;
|
/* Build the result algebraically. Might go infinite, underflow, etc;
|
||||||
who cares. */
|
who cares. */
|
||||||
|
|
|
@ -1,3 +1,16 @@
|
||||||
|
1999-11-04 Dave Brolley <brolley@cygnus.com>
|
||||||
|
|
||||||
|
* cgen-par.h (cgen_write_queue_kind): Add CGEN_FN_XI_WRITE and
|
||||||
|
CGEN_MEM_XI_WRITE members.
|
||||||
|
(CGEN_WRITE_QUEUE_ELEMENT): Add fn_xi_write and mem_xi_write members.
|
||||||
|
(sim_queue_fn_xi_write): New function.
|
||||||
|
(sim_queue_mem_xi_write): New function.
|
||||||
|
|
||||||
|
* cgen-par.c (sim_queue_fn_xi_write): New function.
|
||||||
|
(sim_queue_mem_xi_write): New function.
|
||||||
|
(cgen_write_queue_element_execute): Handle CGEN_FN_XI_WRITE and
|
||||||
|
CGEN_MEM_XI_WRITE.
|
||||||
|
|
||||||
1999-10-22 Dave Brolley <brolley@cygnus.com>
|
1999-10-22 Dave Brolley <brolley@cygnus.com>
|
||||||
|
|
||||||
* cgen-par.h (insn_address): New field in CGEN_WRITE_QUEUE_ELEMENT.
|
* cgen-par.h (insn_address): New field in CGEN_WRITE_QUEUE_ELEMENT.
|
||||||
|
|
|
@ -121,6 +121,25 @@ void sim_queue_fn_di_write (
|
||||||
element->kinds.fn_di_write.value = value;
|
element->kinds.fn_di_write.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sim_queue_fn_xi_write (
|
||||||
|
SIM_CPU *cpu,
|
||||||
|
void (*write_function)(SIM_CPU *cpu, UINT, SI *),
|
||||||
|
UINT regno,
|
||||||
|
SI *value
|
||||||
|
)
|
||||||
|
{
|
||||||
|
CGEN_WRITE_QUEUE *q = CPU_WRITE_QUEUE (cpu);
|
||||||
|
CGEN_WRITE_QUEUE_ELEMENT *element = CGEN_WRITE_QUEUE_NEXT (q);
|
||||||
|
element->kind = CGEN_FN_XI_WRITE;
|
||||||
|
element->insn_address = CPU_PC_GET (cpu);
|
||||||
|
element->kinds.fn_xi_write.function = write_function;
|
||||||
|
element->kinds.fn_xi_write.regno = regno;
|
||||||
|
element->kinds.fn_xi_write.value[0] = value[0];
|
||||||
|
element->kinds.fn_xi_write.value[1] = value[1];
|
||||||
|
element->kinds.fn_xi_write.value[2] = value[2];
|
||||||
|
element->kinds.fn_xi_write.value[3] = value[3];
|
||||||
|
}
|
||||||
|
|
||||||
void sim_queue_fn_df_write (
|
void sim_queue_fn_df_write (
|
||||||
SIM_CPU *cpu,
|
SIM_CPU *cpu,
|
||||||
void (*write_function)(SIM_CPU *cpu, UINT, DI),
|
void (*write_function)(SIM_CPU *cpu, UINT, DI),
|
||||||
|
@ -201,6 +220,19 @@ void sim_queue_mem_df_write (SIM_CPU *cpu, SI address, DF value)
|
||||||
element->kinds.mem_df_write.value = value;
|
element->kinds.mem_df_write.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sim_queue_mem_xi_write (SIM_CPU *cpu, SI address, SI *value)
|
||||||
|
{
|
||||||
|
CGEN_WRITE_QUEUE *q = CPU_WRITE_QUEUE (cpu);
|
||||||
|
CGEN_WRITE_QUEUE_ELEMENT *element = CGEN_WRITE_QUEUE_NEXT (q);
|
||||||
|
element->kind = CGEN_MEM_XI_WRITE;
|
||||||
|
element->insn_address = CPU_PC_GET (cpu);
|
||||||
|
element->kinds.mem_xi_write.address = address;
|
||||||
|
element->kinds.mem_xi_write.value[0] = value[0];
|
||||||
|
element->kinds.mem_xi_write.value[1] = value[1];
|
||||||
|
element->kinds.mem_xi_write.value[2] = value[2];
|
||||||
|
element->kinds.mem_xi_write.value[3] = value[3];
|
||||||
|
}
|
||||||
|
|
||||||
/* Execute a write stored on the write queue. */
|
/* Execute a write stored on the write queue. */
|
||||||
void
|
void
|
||||||
cgen_write_queue_element_execute (SIM_CPU *cpu, CGEN_WRITE_QUEUE_ELEMENT *item)
|
cgen_write_queue_element_execute (SIM_CPU *cpu, CGEN_WRITE_QUEUE_ELEMENT *item)
|
||||||
|
@ -243,6 +275,11 @@ cgen_write_queue_element_execute (SIM_CPU *cpu, CGEN_WRITE_QUEUE_ELEMENT *item)
|
||||||
item->kinds.fn_df_write.regno,
|
item->kinds.fn_df_write.regno,
|
||||||
item->kinds.fn_df_write.value);
|
item->kinds.fn_df_write.value);
|
||||||
break;
|
break;
|
||||||
|
case CGEN_FN_XI_WRITE:
|
||||||
|
item->kinds.fn_xi_write.function (cpu,
|
||||||
|
item->kinds.fn_xi_write.regno,
|
||||||
|
item->kinds.fn_xi_write.value);
|
||||||
|
break;
|
||||||
case CGEN_FN_PC_WRITE:
|
case CGEN_FN_PC_WRITE:
|
||||||
item->kinds.fn_pc_write.function (cpu, item->kinds.fn_pc_write.value);
|
item->kinds.fn_pc_write.function (cpu, item->kinds.fn_pc_write.value);
|
||||||
break;
|
break;
|
||||||
|
@ -271,6 +308,17 @@ cgen_write_queue_element_execute (SIM_CPU *cpu, CGEN_WRITE_QUEUE_ELEMENT *item)
|
||||||
SETMEMDF (cpu, pc, item->kinds.mem_df_write.address,
|
SETMEMDF (cpu, pc, item->kinds.mem_df_write.address,
|
||||||
item->kinds.mem_df_write.value);
|
item->kinds.mem_df_write.value);
|
||||||
break;
|
break;
|
||||||
|
case CGEN_MEM_XI_WRITE:
|
||||||
|
pc = item->insn_address;
|
||||||
|
SETMEMSI (cpu, pc, item->kinds.mem_xi_write.address,
|
||||||
|
item->kinds.mem_xi_write.value[0]);
|
||||||
|
SETMEMSI (cpu, pc, item->kinds.mem_xi_write.address + 4,
|
||||||
|
item->kinds.mem_xi_write.value[1]);
|
||||||
|
SETMEMSI (cpu, pc, item->kinds.mem_xi_write.address + 8,
|
||||||
|
item->kinds.mem_xi_write.value[2]);
|
||||||
|
SETMEMSI (cpu, pc, item->kinds.mem_xi_write.address + 12,
|
||||||
|
item->kinds.mem_xi_write.value[3]);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break; /* FIXME: for now....print message later. */
|
break; /* FIXME: for now....print message later. */
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,9 +26,9 @@ enum cgen_write_queue_kind {
|
||||||
CGEN_BI_WRITE, CGEN_QI_WRITE, CGEN_SI_WRITE, CGEN_SF_WRITE,
|
CGEN_BI_WRITE, CGEN_QI_WRITE, CGEN_SI_WRITE, CGEN_SF_WRITE,
|
||||||
CGEN_PC_WRITE,
|
CGEN_PC_WRITE,
|
||||||
CGEN_FN_HI_WRITE, CGEN_FN_SI_WRITE, CGEN_FN_DI_WRITE, CGEN_FN_DF_WRITE,
|
CGEN_FN_HI_WRITE, CGEN_FN_SI_WRITE, CGEN_FN_DI_WRITE, CGEN_FN_DF_WRITE,
|
||||||
CGEN_FN_PC_WRITE,
|
CGEN_FN_XI_WRITE, CGEN_FN_PC_WRITE,
|
||||||
CGEN_MEM_QI_WRITE, CGEN_MEM_HI_WRITE, CGEN_MEM_SI_WRITE, CGEN_MEM_DI_WRITE,
|
CGEN_MEM_QI_WRITE, CGEN_MEM_HI_WRITE, CGEN_MEM_SI_WRITE, CGEN_MEM_DI_WRITE,
|
||||||
CGEN_MEM_DF_WRITE,
|
CGEN_MEM_DF_WRITE, CGEN_MEM_XI_WRITE,
|
||||||
CGEN_NUM_WRITE_KINDS
|
CGEN_NUM_WRITE_KINDS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -76,6 +76,11 @@ typedef struct {
|
||||||
DI value;
|
DI value;
|
||||||
void (*function)(SIM_CPU *, UINT, DI);
|
void (*function)(SIM_CPU *, UINT, DI);
|
||||||
} fn_df_write;
|
} fn_df_write;
|
||||||
|
struct {
|
||||||
|
UINT regno;
|
||||||
|
SI value[4];
|
||||||
|
void (*function)(SIM_CPU *, UINT, SI *);
|
||||||
|
} fn_xi_write;
|
||||||
struct {
|
struct {
|
||||||
USI value;
|
USI value;
|
||||||
void (*function)(SIM_CPU *, USI);
|
void (*function)(SIM_CPU *, USI);
|
||||||
|
@ -100,6 +105,10 @@ typedef struct {
|
||||||
SI address;
|
SI address;
|
||||||
DI value;
|
DI value;
|
||||||
} mem_df_write;
|
} mem_df_write;
|
||||||
|
struct {
|
||||||
|
SI address;
|
||||||
|
SI value[4];
|
||||||
|
} mem_xi_write;
|
||||||
} kinds;
|
} kinds;
|
||||||
} CGEN_WRITE_QUEUE_ELEMENT;
|
} CGEN_WRITE_QUEUE_ELEMENT;
|
||||||
|
|
||||||
|
@ -143,6 +152,7 @@ extern void sim_queue_fn_hi_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, UHI), UI
|
||||||
extern void sim_queue_fn_si_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, USI), UINT, SI);
|
extern void sim_queue_fn_si_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, USI), UINT, SI);
|
||||||
extern void sim_queue_fn_di_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, DI), UINT, DI);
|
extern void sim_queue_fn_di_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, DI), UINT, DI);
|
||||||
extern void sim_queue_fn_df_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, DI), UINT, DF);
|
extern void sim_queue_fn_df_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, DI), UINT, DF);
|
||||||
|
extern void sim_queue_fn_xi_write (SIM_CPU *, void (*)(SIM_CPU *, UINT, SI *), UINT, SI *);
|
||||||
extern void sim_queue_fn_pc_write (SIM_CPU *, void (*)(SIM_CPU *, USI), USI);
|
extern void sim_queue_fn_pc_write (SIM_CPU *, void (*)(SIM_CPU *, USI), USI);
|
||||||
|
|
||||||
extern void sim_queue_mem_qi_write (SIM_CPU *, SI, QI);
|
extern void sim_queue_mem_qi_write (SIM_CPU *, SI, QI);
|
||||||
|
@ -150,5 +160,6 @@ extern void sim_queue_mem_hi_write (SIM_CPU *, SI, HI);
|
||||||
extern void sim_queue_mem_si_write (SIM_CPU *, SI, SI);
|
extern void sim_queue_mem_si_write (SIM_CPU *, SI, SI);
|
||||||
extern void sim_queue_mem_di_write (SIM_CPU *, SI, DI);
|
extern void sim_queue_mem_di_write (SIM_CPU *, SI, DI);
|
||||||
extern void sim_queue_mem_df_write (SIM_CPU *, SI, DF);
|
extern void sim_queue_mem_df_write (SIM_CPU *, SI, DF);
|
||||||
|
extern void sim_queue_mem_xi_write (SIM_CPU *, SI, SI *);
|
||||||
|
|
||||||
#endif /* CGEN_PAR_H */
|
#endif /* CGEN_PAR_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue