import gdb-1999-06-14 snapshot
[deliverable/binutils-gdb.git] / gdb / inferior.h
index fa59c2a5ff7e91008e9e9af8eaddc0b4b52855fd..b87bca9899db1d56efe9cfbff18bd6808b85e42f 100644 (file)
@@ -27,42 +27,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 /* For enum target_signal.  */
 #include "target.h"
 
-/* Structure in which to save the status of the inferior.  Save
+/* Structure in which to save the status of the inferior.  Create/Save
    through "save_inferior_status", restore through
    "restore_inferior_status".
+
    This pair of routines should be called around any transfer of
    control to the inferior which you don't want showing up in your
    control variables.  */
 
-struct inferior_status
-  {
-    enum target_signal stop_signal;
-    CORE_ADDR stop_pc;
-    bpstat stop_bpstat;
-    int stop_step;
-    int stop_stack_dummy;
-    int stopped_by_random_signal;
-    int trap_expected;
-    CORE_ADDR step_range_start;
-    CORE_ADDR step_range_end;
-    CORE_ADDR step_frame_address;
-    int step_over_calls;
-    CORE_ADDR step_resume_break_address;
-    int stop_after_trap;
-    int stop_soon_quietly;
-    CORE_ADDR selected_frame_address;
-    char stop_registers[REGISTER_BYTES];
-
-    /* These are here because if call_function_by_hand has written some
-     registers and then decides to call error(), we better not have changed
-     any registers.  */
-    char registers[REGISTER_BYTES];
-
-    int selected_level;
-    int breakpoint_proceeded;
-    int restore_stack_info;
-    int proceed_to_finish;
-  };
+#ifdef __STDC__
+struct inferior_status;
+#endif
+
+extern struct inferior_status *save_inferior_status PARAMS ((int));
+
+extern void restore_inferior_status PARAMS ((struct inferior_status *));
+
+extern void discard_inferior_status PARAMS ((struct inferior_status *));
+
+extern void write_inferior_status_register PARAMS ((struct inferior_status *inf_status, int regno, LONGEST val));
 
 /* This macro gives the number of registers actually in use by the
    inferior.  This may be less than the total number of registers,
@@ -72,10 +55,6 @@ struct inferior_status
 #define ARCH_NUM_REGS NUM_REGS
 #endif
 
-extern void save_inferior_status PARAMS ((struct inferior_status *, int));
-
-extern void restore_inferior_status PARAMS ((struct inferior_status *));
-
 extern void set_sigint_trap PARAMS ((void));
 
 extern void clear_sigint_trap PARAMS ((void));
@@ -117,15 +96,15 @@ extern int inferior_ignoring_leading_exec_events;
 
 extern struct environ *inferior_environ;
 
-/* Character array containing an image of the inferior programs' registers.  */
+/* Character array containing an image of the inferior programs'
+   registers. */
 
-extern char registers[];
+extern char *registers;
 
-/* Array of validity bits (one per register).  Nonzero at position XXX_REGNUM
-   means that `registers' contains a valid copy of inferior register XXX.
-   -1 if register value is not available. */
+/* Character array containing the current state of each register
+   (unavailable<0, valid=0, invalid>0). */
 
-extern SIGNED char register_valid[NUM_REGS];
+extern signed char *register_valid;
 
 extern void clear_proceed_status PARAMS ((void));
 
@@ -137,24 +116,36 @@ extern void generic_mourn_inferior PARAMS ((void));
 
 extern void terminal_ours PARAMS ((void));
 
-extern int run_stack_dummy PARAMS ((CORE_ADDR, char[REGISTER_BYTES]));
+extern int run_stack_dummy PARAMS ((CORE_ADDR, char*));
 
 extern CORE_ADDR read_pc PARAMS ((void));
 
 extern CORE_ADDR read_pc_pid PARAMS ((int));
 
+extern CORE_ADDR generic_target_read_pc PARAMS ((int));
+
 extern void write_pc PARAMS ((CORE_ADDR));
 
 extern void write_pc_pid PARAMS ((CORE_ADDR, int));
 
+extern void generic_target_write_pc PARAMS ((CORE_ADDR, int));
+
 extern CORE_ADDR read_sp PARAMS ((void));
 
+extern CORE_ADDR generic_target_read_sp PARAMS ((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 init_wait_for_inferior PARAMS ((void));
@@ -202,6 +193,7 @@ extern int attach PARAMS ((int));
 
 extern void detach PARAMS ((int));
 
+/* PTRACE method of waiting for inferior process.  */
 int ptrace_wait PARAMS ((int, int *));
 
 extern void child_resume PARAMS ((int, int, enum target_signal));
@@ -340,7 +332,7 @@ 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[REGISTER_BYTES];
+extern char *stop_registers;
 
 /* Nonzero if the child process in inferior_pid was attached rather
    than forked.  */
@@ -376,57 +368,111 @@ extern int attach_flag;
 #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.  */
 
-/* Are we in a call dummy?  The code below which allows DECR_PC_AFTER_BREAK
-   below is for infrun.c, which may give the macro a pc without that
-   subtracted out.  */
-#if !defined (PC_IN_CALL_DUMMY)
-#if CALL_DUMMY_LOCATION == BEFORE_TEXT_END
-extern CORE_ADDR text_end;
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address) \
-  ((pc) >= text_end - CALL_DUMMY_LENGTH         \
-   && (pc) <= text_end + DECR_PC_AFTER_BREAK)
+#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
 
-#if CALL_DUMMY_LOCATION == AFTER_TEXT_END
-extern CORE_ADDR text_end;
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address) \
-  ((pc) >= text_end   \
-   && (pc) <= text_end + CALL_DUMMY_LENGTH + DECR_PC_AFTER_BREAK)
-#endif /* After text_end.  */
-
-#if CALL_DUMMY_LOCATION == ON_STACK
-/* Is the PC in a call dummy?  SP and FRAME_ADDRESS are the bottom and
-   top of the stack frame which we are checking, where "bottom" and
-   "top" refer to some section of memory which contains the code for
-   the call dummy.  Calls to this macro assume that the contents of
-   SP_REGNUM and FP_REGNUM (or the saved values thereof), respectively,
-   are the things to pass.
-
-   This won't work on the 29k, where SP_REGNUM and FP_REGNUM don't
-   have that meaning, but the 29k doesn't use ON_STACK.  This could be
-   fixed by generalizing this scheme, perhaps by passing in a frame
-   and adding a few fields, at least on machines which need them for
-   PC_IN_CALL_DUMMY.
-
-   Something simpler, like checking for the stack segment, doesn't work,
-   since various programs (threads implementations, gcc nested function
-   stubs, etc) may either allocate stack frames in another segment, or
-   allocate other kinds of code on the stack.  */
-
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address) \
-  (INNER_THAN ((sp), (pc)) && (frame_address != 0) && INNER_THAN ((pc), (frame_address)))
-#endif /* On stack.  */
-
-#if CALL_DUMMY_LOCATION == AT_ENTRY_POINT
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address)                        \
-  ((pc) >= CALL_DUMMY_ADDRESS ()                               \
-   && (pc) <= (CALL_DUMMY_ADDRESS () + DECR_PC_AFTER_BREAK))
-#endif /* At entry point.  */
-#endif /* No PC_IN_CALL_DUMMY.  */
+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
This page took 0.025513 seconds and 4 git commands to generate.