X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Finferior.h;h=b92b081e1cd8b6baf28b6c3aee72a619f7de02c0;hb=e23fc6de1ad692fa06ce203d28bfe6244f49766e;hp=b0a6fa62c0202624208722270882fd282867013d;hpb=c2c6d25f0d5eea4f834420870021a8c52db24018;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/inferior.h b/gdb/inferior.h index b0a6fa62c0..b92b081e1c 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -1,6 +1,9 @@ /* Variables that describe the inferior process running under GDB: Where it is, why it stopped, and how to step it. - Copyright 1986, 1989, 1992, 1996, 1998 Free Software Foundation, Inc. + + Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, + 1996, 1998, 1999, 2000, 2001, 2003, 2004, 2005 + Free Software Foundation, Inc. This file is part of GDB. @@ -16,18 +19,28 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ #if !defined (INFERIOR_H) #define INFERIOR_H 1 +struct target_waitstatus; +struct frame_info; +struct ui_file; +struct type; +struct gdbarch; +struct regcache; + /* For bpstat. */ #include "breakpoint.h" /* For enum target_signal. */ #include "target.h" +/* For struct frame_id. */ +#include "frame.h" + /* Structure in which to save the status of the inferior. Create/Save through "save_inferior_status", restore through "restore_inferior_status". @@ -38,37 +51,67 @@ struct inferior_status; -extern struct inferior_status *save_inferior_status PARAMS ((int)); +extern struct inferior_status *save_inferior_status (int); -extern void restore_inferior_status PARAMS ((struct inferior_status *)); +extern void restore_inferior_status (struct inferior_status *); -extern void discard_inferior_status PARAMS ((struct inferior_status *)); +extern struct cleanup *make_cleanup_restore_inferior_status (struct inferior_status *); -extern void write_inferior_status_register PARAMS ((struct inferior_status * inf_status, int regno, LONGEST val)); +extern void discard_inferior_status (struct inferior_status *); -/* This macro gives the number of registers actually in use by the - inferior. This may be less than the total number of registers, - perhaps depending on the actual CPU in use or program being run. */ +extern void write_inferior_status_register (struct inferior_status + *inf_status, int regno, + LONGEST val); -#ifndef ARCH_NUM_REGS -#define ARCH_NUM_REGS NUM_REGS -#endif +/* The -1 ptid, often used to indicate either an error condition + or a "don't care" condition, i.e, "run all threads." */ +extern ptid_t minus_one_ptid; + +/* The null or zero ptid, often used to indicate no process. */ +extern ptid_t null_ptid; + +/* Attempt to find and return an existing ptid with the given PID, LWP, + and TID components. If none exists, create a new one and return + that. */ +ptid_t ptid_build (int pid, long lwp, long tid); + +/* Find/Create a ptid from just a pid. */ +ptid_t pid_to_ptid (int pid); + +/* Fetch the pid (process id) component from a ptid. */ +int ptid_get_pid (ptid_t ptid); + +/* Fetch the lwp (lightweight process) component from a ptid. */ +long ptid_get_lwp (ptid_t ptid); + +/* Fetch the tid (thread id) component from a ptid. */ +long ptid_get_tid (ptid_t ptid); + +/* Compare two ptids to see if they are equal */ +extern int ptid_equal (ptid_t p1, ptid_t p2); + +/* Save value of inferior_ptid so that it may be restored by + a later call to do_cleanups(). Returns the struct cleanup + pointer needed for later doing the cleanup. */ +extern struct cleanup * save_inferior_ptid (void); -extern void set_sigint_trap PARAMS ((void)); +extern void set_sigint_trap (void); -extern void clear_sigint_trap PARAMS ((void)); +extern void clear_sigint_trap (void); -extern void set_sigio_trap PARAMS ((void)); +extern void set_sigio_trap (void); -extern void clear_sigio_trap PARAMS ((void)); +extern void clear_sigio_trap (void); -/* File name for default use for standard in/out in the inferior. */ +/* Set/get file name for default use for standard in/out in the inferior. */ -extern char *inferior_io_terminal; +extern void set_inferior_io_terminal (const char *terminal_name); +extern const char *get_inferior_io_terminal (void); -/* Pid of our debugged inferior, or 0 if no inferior now. */ +/* Collected pid, tid, etc. of the debugged inferior. When there's + no inferior, PIDGET (inferior_ptid) will be 0. */ -extern int inferior_pid; +extern ptid_t inferior_ptid; /* Is the inferior running right now, as a result of a 'run&', 'continue&' etc command? This is used in asycn gdb to determine @@ -81,7 +124,7 @@ extern int target_executing; redisplay the prompt until the execution is actually over. */ extern int sync_execution; -/* This is only valid when inferior_pid is non-zero. +/* This is only valid when inferior_ptid is non-zero. If this is 0, then exec events should be noticed and responded to by the debugger (i.e., be reported to the user). @@ -104,171 +147,172 @@ extern int inferior_ignoring_leading_exec_events; /* Inferior environment. */ -extern struct environ *inferior_environ; +extern struct gdb_environ *inferior_environ; -/* Character array containing an image of the inferior programs' - registers. */ +extern void clear_proceed_status (void); -extern char *registers; +extern void proceed (CORE_ADDR, enum target_signal, int); -/* Character array containing the current state of each register - (unavailable<0, valid=0, invalid>0). */ +/* When set, stop the 'step' command if we enter a function which has + no line number information. The normal behavior is that we step + over such function. */ +extern int step_stop_if_no_debug; -extern signed char *register_valid; +extern void kill_inferior (void); -extern void clear_proceed_status PARAMS ((void)); +extern void generic_mourn_inferior (void); -extern void proceed PARAMS ((CORE_ADDR, enum target_signal, int)); +extern void terminal_save_ours (void); -extern void kill_inferior PARAMS ((void)); +extern void terminal_ours (void); -extern void generic_mourn_inferior PARAMS ((void)); +extern CORE_ADDR read_pc (void); -extern void terminal_ours PARAMS ((void)); +extern CORE_ADDR read_pc_pid (ptid_t); -extern int run_stack_dummy PARAMS ((CORE_ADDR, char *)); +extern void write_pc (CORE_ADDR); -extern CORE_ADDR read_pc PARAMS ((void)); +extern void write_pc_pid (CORE_ADDR, ptid_t); -extern CORE_ADDR read_pc_pid PARAMS ((int)); +extern void generic_target_write_pc (CORE_ADDR, ptid_t); -extern CORE_ADDR generic_target_read_pc PARAMS ((int)); +extern CORE_ADDR read_sp (void); -extern void write_pc PARAMS ((CORE_ADDR)); +extern CORE_ADDR unsigned_pointer_to_address (struct type *type, + const gdb_byte *buf); +extern void unsigned_address_to_pointer (struct type *type, gdb_byte *buf, + CORE_ADDR addr); +extern CORE_ADDR signed_pointer_to_address (struct type *type, + const gdb_byte *buf); +extern void address_to_signed_pointer (struct type *type, gdb_byte *buf, + CORE_ADDR addr); -extern void write_pc_pid PARAMS ((CORE_ADDR, int)); +extern void wait_for_inferior (void); -extern void generic_target_write_pc PARAMS ((CORE_ADDR, int)); +extern void fetch_inferior_event (void *); -extern CORE_ADDR read_sp PARAMS ((void)); +extern void init_wait_for_inferior (void); -extern CORE_ADDR generic_target_read_sp PARAMS ((void)); +extern void close_exec_file (void); -extern void write_sp PARAMS ((CORE_ADDR)); - -extern void generic_target_write_sp PARAMS ((CORE_ADDR)); - -extern CORE_ADDR read_fp PARAMS ((void)); - -extern CORE_ADDR generic_target_read_fp PARAMS ((void)); - -extern void write_fp PARAMS ((CORE_ADDR)); - -extern void generic_target_write_fp PARAMS ((CORE_ADDR)); - -extern void wait_for_inferior PARAMS ((void)); - -extern void fetch_inferior_event PARAMS ((void *)); - -extern void init_wait_for_inferior PARAMS ((void)); - -extern void close_exec_file PARAMS ((void)); - -extern void reopen_exec_file PARAMS ((void)); +extern void reopen_exec_file (void); /* The `resume' routine should only be called in special circumstances. Normally, use `proceed', which handles a lot of bookkeeping. */ -extern void resume PARAMS ((int, enum target_signal)); +extern void resume (int, enum target_signal); /* From misc files */ -extern void store_inferior_registers PARAMS ((int)); +extern void default_print_registers_info (struct gdbarch *gdbarch, + struct ui_file *file, + struct frame_info *frame, + int regnum, int all); -extern void fetch_inferior_registers PARAMS ((int)); +extern void store_inferior_registers (int); -extern void solib_create_inferior_hook PARAMS ((void)); +extern void fetch_inferior_registers (int); -extern void child_terminal_info PARAMS ((char *, int)); +extern void solib_create_inferior_hook (void); -extern void term_info PARAMS ((char *, int)); +extern void child_terminal_info (char *, int); -extern void terminal_ours_for_output PARAMS ((void)); +extern void term_info (char *, int); -extern void terminal_inferior PARAMS ((void)); +extern void terminal_ours_for_output (void); -extern void terminal_init_inferior PARAMS ((void)); +extern void terminal_inferior (void); -extern void terminal_init_inferior_with_pgrp PARAMS ((int pgrp)); +extern void terminal_init_inferior (void); -/* From infptrace.c or infttrace.c */ +extern void terminal_init_inferior_with_pgrp (int pgrp); -extern int attach PARAMS ((int)); - -#if !defined(REQUIRE_ATTACH) -#define REQUIRE_ATTACH attach -#endif +/* From infptrace.c or infttrace.c */ -#if !defined(REQUIRE_DETACH) -#define REQUIRE_DETACH(pid,siggnal) detach (siggnal) -#endif +extern int attach (int); -extern void detach PARAMS ((int)); +extern void detach (int); /* PTRACE method of waiting for inferior process. */ -int ptrace_wait PARAMS ((int, int *)); +int ptrace_wait (ptid_t, int *); -extern void child_resume PARAMS ((int, int, enum target_signal)); +extern void child_resume (ptid_t, int, enum target_signal); #ifndef PTRACE_ARG3_TYPE -#define PTRACE_ARG3_TYPE int /* Correct definition for most systems. */ +#define PTRACE_ARG3_TYPE PTRACE_TYPE_ARG3 #endif -extern int call_ptrace PARAMS ((int, int, PTRACE_ARG3_TYPE, int)); +extern int call_ptrace (int, int, PTRACE_ARG3_TYPE, int); -extern void pre_fork_inferior PARAMS ((void)); +extern void pre_fork_inferior (void); /* From procfs.c */ -extern int proc_iterate_over_mappings PARAMS ((int (*)(int, CORE_ADDR))); - -extern int procfs_first_available PARAMS ((void)); +extern int proc_iterate_over_mappings (int (*)(int, CORE_ADDR)); -extern int procfs_get_pid_fd PARAMS ((int)); +extern ptid_t procfs_first_available (void); /* From fork-child.c */ -extern void fork_inferior PARAMS ((char *, char *, char **, - void (*)(void), - void (*)(int), - void (*)(void), - char *)); +extern void fork_inferior (char *, char *, char **, + void (*)(void), + void (*)(int), void (*)(void), char *); -extern void -clone_and_follow_inferior PARAMS ((int, int *)); +extern void startup_inferior (int); -extern void startup_inferior PARAMS ((int)); +extern char *construct_inferior_arguments (struct gdbarch *, int, char **); /* From inflow.c */ -extern void new_tty_prefork PARAMS ((char *)); +extern void new_tty_prefork (const char *); -extern int gdb_has_a_terminal PARAMS ((void)); +extern int gdb_has_a_terminal (void); /* From infrun.c */ -extern void start_remote PARAMS ((void)); +extern void start_remote (void); + +extern void normal_stop (void); -extern void normal_stop PARAMS ((void)); +extern int signal_stop_state (int); -extern int signal_stop_state PARAMS ((int)); +extern int signal_print_state (int); -extern int signal_print_state PARAMS ((int)); +extern int signal_pass_state (int); -extern int signal_pass_state PARAMS ((int)); +extern int signal_stop_update (int, int); -extern int signal_stop_update PARAMS ((int, int)); +extern int signal_print_update (int, int); -extern int signal_print_update PARAMS ((int, int)); +extern int signal_pass_update (int, int); -extern int signal_pass_update PARAMS ((int, int)); +extern void get_last_target_status(ptid_t *ptid, + struct target_waitstatus *status); + +extern void follow_inferior_reset_breakpoints (void); /* From infcmd.c */ -extern void tty_command PARAMS ((char *, int)); +extern void tty_command (char *, int); + +extern void attach_command (char *, int); + +extern char *get_inferior_args (void); + +extern char *set_inferior_args (char *); + +extern void set_inferior_args_vector (int, char **); -extern void attach_command PARAMS ((char *, int)); +extern void registers_info (char *, int); + +extern void nexti_command (char *, int); + +extern void stepi_command (char *, int); + +extern void continue_command (char *, int); + +extern void interrupt_target_command (char *args, int from_tty); /* Last signal that the inferior received (why it stopped). */ @@ -316,16 +360,19 @@ extern CORE_ADDR step_range_end; /* Exclusive */ This is how we know when we step into a subroutine call, and how to set the frame for the breakpoint used to step out. */ -extern CORE_ADDR step_frame_address; - -/* Our notion of the current stack pointer. */ - -extern CORE_ADDR step_sp; +extern struct frame_id step_frame_id; /* 1 means step over all subroutine calls. -1 means step over calls to undebuggable functions. */ -extern int step_over_calls; +enum step_over_calls_kind + { + STEP_OVER_NONE, + STEP_OVER_ALL, + STEP_OVER_UNDEBUGGABLE + }; + +extern enum step_over_calls_kind step_over_calls; /* If stepping, nonzero means step count is > 1 so don't print frame next time inferior stops @@ -333,12 +380,37 @@ extern int step_over_calls; extern int step_multi; -/* Nonzero means expecting a trap and caller will handle it themselves. - It is used after attach, due to attaching to a process; - when running in the shell before the child program has been exec'd; - and when running some kinds of remote stuff (FIXME?). */ - -extern int stop_soon_quietly; +/* Nonzero means expecting a trap and caller will handle it + themselves. It is used when running in the shell before the child + program has been exec'd; and when running some kinds of remote + stuff (FIXME?). */ + +/* It is also used after attach, due to attaching to a process. This + is a bit trickier. When doing an attach, the kernel stops the + debuggee with a SIGSTOP. On newer GNU/Linux kernels (>= 2.5.61) + the handling of SIGSTOP for a ptraced process has changed. Earlier + versions of the kernel would ignore these SIGSTOPs, while now + SIGSTOP is treated like any other signal, i.e. it is not muffled. + + If the gdb user does a 'continue' after the 'attach', gdb passes + the global variable stop_signal (which stores the signal from the + attach, SIGSTOP) to the ptrace(PTRACE_CONT,...) call. This is + problematic, because the kernel doesn't ignore such SIGSTOP + now. I.e. it is reported back to gdb, which in turn presents it + back to the user. + + To avoid the problem, we use STOP_QUIETLY_NO_SIGSTOP, which allows + gdb to clear the value of stop_signal after the attach, so that it + is not passed back down to the kernel. */ + +enum stop_kind + { + NO_STOP_QUIETLY = 0, + STOP_QUIETLY, + STOP_QUIETLY_NO_SIGSTOP + }; + +extern enum stop_kind stop_soon; /* Nonzero if proceed is being used for a "finish" command or a similar situation when stop_registers should be saved. */ @@ -350,169 +422,17 @@ extern int proceed_to_finish; Thus this contains the return value from the called function (assuming values are returned in a register). */ -extern char *stop_registers; +extern struct regcache *stop_registers; -/* Nonzero if the child process in inferior_pid was attached rather +/* Nonzero if the child process in inferior_ptid was attached rather than forked. */ extern int attach_flag; -/* Sigtramp is a routine that the kernel calls (which then calls the - signal handler). On most machines it is a library routine that - is linked into the executable. - - This macro, given a program counter value and the name of the - function in which that PC resides (which can be null if the - name is not known), returns nonzero if the PC and name show - that we are in sigtramp. - - On most machines just see if the name is sigtramp (and if we have - no name, assume we are not in sigtramp). */ -#if !defined (IN_SIGTRAMP) -#if defined (SIGTRAMP_START) -#define IN_SIGTRAMP(pc, name) \ - ((pc) >= SIGTRAMP_START(pc) \ - && (pc) < SIGTRAMP_END(pc) \ - ) -#else -#define IN_SIGTRAMP(pc, name) \ - (name && STREQ ("_sigtramp", name)) -#endif -#endif - /* Possible values for CALL_DUMMY_LOCATION. */ #define ON_STACK 1 -#define BEFORE_TEXT_END 2 -#define AFTER_TEXT_END 3 #define AT_ENTRY_POINT 4 - -#if !defined (USE_GENERIC_DUMMY_FRAMES) -#define USE_GENERIC_DUMMY_FRAMES 0 -#endif - -#if !defined (CALL_DUMMY_LOCATION) -#define CALL_DUMMY_LOCATION ON_STACK -#endif /* No CALL_DUMMY_LOCATION. */ - -#if !defined (CALL_DUMMY_ADDRESS) -#define CALL_DUMMY_ADDRESS() (abort (), 0) /* anything to abort GDB */ -#endif -#if !defined (CALL_DUMMY_START_OFFSET) -#define CALL_DUMMY_START_OFFSET (abort (), 0) /* anything to abort GDB */ -#endif -#if !defined (CALL_DUMMY_BREAKPOINT_OFFSET) -#define CALL_DUMMY_BREAKPOINT_OFFSET_P (0) -#define CALL_DUMMY_BREAKPOINT_OFFSET (abort (), 0) /* anything to abort GDB */ -#endif -#if !defined CALL_DUMMY_BREAKPOINT_OFFSET_P -#define CALL_DUMMY_BREAKPOINT_OFFSET_P (1) -#endif -#if !defined (CALL_DUMMY_LENGTH) -#define CALL_DUMMY_LENGTH (abort (), 0) /* anything to abort GDB */ -#endif - -#if defined (CALL_DUMMY_STACK_ADJUST) -#if !defined (CALL_DUMMY_STACK_ADJUST_P) -#define CALL_DUMMY_STACK_ADJUST_P (1) -#endif -#endif -#if !defined (CALL_DUMMY_STACK_ADJUST) -#define CALL_DUMMY_STACK_ADJUST (abort (), 0) -#endif -#if !defined (CALL_DUMMY_STACK_ADJUST_P) -#define CALL_DUMMY_STACK_ADJUST_P (0) -#endif - -#if !defined (CALL_DUMMY_P) -#if defined (CALL_DUMMY) -#define CALL_DUMMY_P 1 -#else -#define CALL_DUMMY_P 0 -#endif -#endif - -#if !defined (CALL_DUMMY_WORDS) -#if defined (CALL_DUMMY) -extern LONGEST call_dummy_words[]; -#define CALL_DUMMY_WORDS (call_dummy_words) -#else -#define CALL_DUMMY_WORDS (abort (), (void*) 0) /* anything to abort GDB */ -#endif -#endif - -#if !defined (SIZEOF_CALL_DUMMY_WORDS) -#if defined (CALL_DUMMY) -extern int sizeof_call_dummy_words; -#define SIZEOF_CALL_DUMMY_WORDS (sizeof_call_dummy_words) -#else -#define SIZEOF_CALL_DUMMY_WORDS (abort (), 0) /* anything to abort GDB */ -#endif -#endif - -#if !defined PUSH_DUMMY_FRAME -#define PUSH_DUMMY_FRAME (abort ()) -#endif - -#if !defined FIX_CALL_DUMMY -#define FIX_CALL_DUMMY(a1,a2,a3,a4,a5,a6,a7) (abort ()) -#endif - -#if !defined STORE_STRUCT_RETURN -#define STORE_STRUCT_RETURN(a1,a2) (abort ()) -#endif - - -/* Are we in a call dummy? */ - -extern int pc_in_call_dummy_before_text_end PARAMS ((CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address)); -#if !GDB_MULTI_ARCH -#if !defined (PC_IN_CALL_DUMMY) && CALL_DUMMY_LOCATION == BEFORE_TEXT_END -#define PC_IN_CALL_DUMMY(pc, sp, frame_address) pc_in_call_dummy_before_text_end (pc, sp, frame_address) -#endif /* Before text_end. */ -#endif - -extern int pc_in_call_dummy_after_text_end PARAMS ((CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address)); -#if !GDB_MULTI_ARCH -#if !defined (PC_IN_CALL_DUMMY) && CALL_DUMMY_LOCATION == AFTER_TEXT_END -#define PC_IN_CALL_DUMMY(pc, sp, frame_address) pc_in_call_dummy_after_text_end (pc, sp, frame_address) -#endif -#endif - -extern int pc_in_call_dummy_on_stack PARAMS ((CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address)); -#if !GDB_MULTI_ARCH -#if !defined (PC_IN_CALL_DUMMY) && CALL_DUMMY_LOCATION == ON_STACK -#define PC_IN_CALL_DUMMY(pc, sp, frame_address) pc_in_call_dummy_on_stack (pc, sp, frame_address) -#endif -#endif - -extern int pc_in_call_dummy_at_entry_point PARAMS ((CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address)); -#if !GDB_MULTI_ARCH -#if !defined (PC_IN_CALL_DUMMY) && CALL_DUMMY_LOCATION == AT_ENTRY_POINT -#define PC_IN_CALL_DUMMY(pc, sp, frame_address) pc_in_call_dummy_at_entry_point (pc, sp, frame_address) -#endif -#endif - -/* It's often not enough for our clients to know whether the PC is merely - somewhere within the call dummy. They may need to know whether the - call dummy has actually completed. (For example, wait_for_inferior - wants to know when it should truly stop because the call dummy has - completed. If we're single-stepping because of slow watchpoints, - then we may find ourselves stopped at the entry of the call dummy, - and want to continue stepping until we reach the end.) - - Note that this macro is intended for targets (like HP-UX) which - require more than a single breakpoint in their call dummies, and - therefore cannot use the CALL_DUMMY_BREAKPOINT_OFFSET mechanism. - - If a target does define CALL_DUMMY_BREAKPOINT_OFFSET, then this - default implementation of CALL_DUMMY_HAS_COMPLETED is sufficient. - Else, a target may wish to supply an implementation that works in - the presense of multiple breakpoints in its call dummy. - */ -#if !defined(CALL_DUMMY_HAS_COMPLETED) -#define CALL_DUMMY_HAS_COMPLETED(pc, sp, frame_address) \ - PC_IN_CALL_DUMMY((pc), (sp), (frame_address)) -#endif +#define AT_SYMBOL 5 /* If STARTUP_WITH_SHELL is set, GDB's "run" will attempts to start up the debugee under a shell.