This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: i386: Are we settled?



These are the patches for go32-specific config files following the new
tm-i386.h.

--- gdb/config/i386/tm-go32.h~1	Wed Jul  7 20:13:00 1999
+++ gdb/config/i386/tm-go32.h	Wed Nov 10 18:08:46 1999
@@ -18,108 +18,10 @@
    Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include "i386/tm-i386v.h"
+#undef HAVE_SSE_REGS	/* FIXME! go32-nat.c needs to support XMMi registers */
+#define HAVE_I387_REGS
 
-/* Number of machine registers. */
-
-#undef NUM_FREGS
-#define NUM_FREGS 15
-#undef NUM_REGS
-#define NUM_REGS (16+NUM_FREGS)
-
-/* Initializer for an array of names of registers.  There should be
-   NUM_REGS strings in this initializer.  */
-
-/* The order of the first 8 registers must match the compiler's
-   numbering scheme (which is the same as the 386 scheme).  */
-
-#undef REGISTER_NAMES
-#define REGISTER_NAMES { "eax",  "ecx",   "edx",  "ebx",  \
-			 "esp",  "ebp",   "esi",  "edi",  \
-			 "eip",  "eflags","cs",   "ss",   \
-			 "ds",   "es",    "fs",   "gs",   \
-			 "st0",  "st1",   "st2",  "st3",  \
-                         "st4",  "st5",   "st6",  "st7",  \
-			 "fctrl","fstat", "ftag", "fcs",  \
-			 "fopsel","fip",  "fopoff" }
-
-#undef FP_REGNUM
-#define FP_REGNUM  5		/* (ebp) Contains addr of stack frame */
-#undef  SP_REGNUM
-#define SP_REGNUM  4		/* (usp) Contains address of top of stack */
-#undef  PS_REGNUM
-#define PS_REGNUM  9		/* (ps)  Contains processor status */
-#undef  PC_REGNUM
-#define PC_REGNUM  8		/* (eip) Contains program counter */
-#undef  FP0_REGNUM
-#define FP0_REGNUM 16		/* Floating point register 0 */
-#undef  FPC_REGNUM
-#define FPC_REGNUM 24		/* 80387 control register */
-#undef  FPCWD_REGNUM
-#define FPCWD_REGNUM FPC_REGNUM
-#undef  FPSWD_REGNUM
-#define FPSWD_REGNUM 25		/* 80387 status register */
-#undef  FPTWD_REGNUM
-#define FPTWD_REGNUM 26		/* 80387 tag register */
-#undef  FPIPO_REGNUM
-#define FPIPO_REGNUM 29		/* 80387 instruction pointer offset reg */
-#undef  FPIPS_REGNUM
-#define FPIPS_REGNUM 27		/* 80387 instruction pointer selector reg */
-#undef  FPOOS_REGNUM
-#define FPOOS_REGNUM 30		/* 80387 operand pointer offset reg */
-#undef  FPOPS_REGNUM
-#define FPOPS_REGNUM 28		/* 80387 operand pointer selector reg */
-
-/* Total amount of space needed to store our copies of the machine's
-   register state, the array `registers'.  */
-
-#undef REGISTER_BYTES
-#define REGISTER_BYTES (10*4 + 6*2 + 8*10 + 5*2 + 2*4)
-
-/* Index within `registers' of the first byte of the space for
-   register N.  */
-
-#undef REGISTER_BYTE
-#define REGBYTE_0  0
-#define REGBYTE_10 (REGBYTE_0+10*4)
-#define REGBYTE_16 (REGBYTE_10+6*2)
-#define REGBYTE_24 (REGBYTE_16+8*10)
-#define REGBYTE_29 (REGBYTE_24+5*2)
-#define REGISTER_BYTE(N) (((N) < 10) ? (N) * 4 : \
-                          (N) < 16 ? REGBYTE_10 +((N) - 10) * 2 : \
-                          (N) < 24 ? REGBYTE_16 +((N) - 16) * 10 : \
-                          (N) < 29 ? REGBYTE_24 +((N) - 24) * 2 : \
-                          REGBYTE_29 + ((N) - 29) * 4)
-
-/* Number of bytes of storage in the actual machine representation
-   for register N.  */
-
-#undef REGISTER_RAW_SIZE
-#define REGISTER_RAW_SIZE(N) ((N) < 10 ? 4 : (N) < 16 ? 2 : (N) < 24 ? 10 : \
-                              (N) < 29 ? 2 : 4)
-
-/* Number of bytes of storage in the program's representation
-   for register N. */
-
-#undef REGISTER_VIRTUAL_SIZE
-#define REGISTER_VIRTUAL_SIZE(N) REGISTER_RAW_SIZE(N)
-
-/* Largest value REGISTER_RAW_SIZE can have.  */
-
-#undef MAX_REGISTER_RAW_SIZE
-#define MAX_REGISTER_RAW_SIZE 10
-
-/* Largest value REGISTER_VIRTUAL_SIZE can have.  */
-
-#undef MAX_REGISTER_VIRTUAL_SIZE
-#define MAX_REGISTER_VIRTUAL_SIZE 10
-
-/* Nonzero if register N requires conversion
-   from raw format to virtual format.  */
-
-#undef REGISTER_CONVERTIBLE
-#define REGISTER_CONVERTIBLE(N) ((N) < FP0_REGNUM ? 0 :\
-                                 (N) < FPC_REGNUM ? 1 : 0)
+#include "i386/tm-i386.h"
 
 /* The host and target are i386 machines and the compiler supports
    long doubles. Long doubles on the host therefore have the same
@@ -142,70 +44,34 @@
 
 extern int i387_hex_long_double_input (char *p, long double *putithere);
 
+#ifdef LD_I387	/* otherwise, definitions from tm-i386.h are good enough */
+
 #undef REGISTER_CONVERT_TO_VIRTUAL
-#ifdef LD_I387
-#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO) \
-{ \
-  if (TYPE == REGISTER_VIRTUAL_TYPE (REGNUM)) \
-    { \
-      memcpy (TO, FROM, TYPE_LENGTH (TYPE)); \
-    } \
-  else \
-    { \
-      long double val = *((long double *)FROM); \
-      store_floating ((TO), TYPE_LENGTH (TYPE), val); \
-    } \
+#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO)	\
+{								\
+  long double val = *((long double *)(FROM));			\
+  store_floating ((TO), TYPE_LENGTH (TYPE), val);		\
 }
-#else
-/* Convert data from raw format for register REGNUM in buffer FROM to
-   virtual format with type TYPE in buffer TO.  */
-#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,TYPE,FROM,TO) \
-{ \
-  double val; \
-  i387_to_double ((FROM), (char *)&val); \
-  store_floating ((TO), TYPE_LENGTH (TYPE), val); \
-}
-#endif
-
-extern void i387_to_double PARAMS ((char *, char *));
 
 #undef REGISTER_CONVERT_TO_RAW
-#ifdef LD_I387
-#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \
-{ \
-  if (TYPE == REGISTER_VIRTUAL_TYPE (REGNUM)) \
-    { \
-      memcpy (TO, FROM, TYPE_LENGTH (TYPE)); \
-    } \
-  else \
-    { \
-      long double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \
-      *((long double *)TO) = val; \
-    } \
-}
-#else
-#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \
-{ \
-  double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \
-  double_to_i387((char *)&val, (TO)); \
+#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO)			\
+{									\
+  long double val = extract_floating ((FROM), TYPE_LENGTH (TYPE));	\
+  *((long double *)(TO)) = val;						\
 }
-#endif
 
-extern void double_to_i387 PARAMS ((char *, char *));
+/* Return the GDB type object for the "standard" data type of data in 
+   register N.  Perhaps si and di should go here, but potentially they
+   could be used for things other than address.  */
+
+#define REGISTER_VIRTUAL_TYPE(N)				\
+  (((N) == PC_REGNUM || (N) == FP_REGNUM || (N) == SP_REGNUM)	\
+   ? lookup_pointer_type (builtin_type_void)			\
+   : IS_FP_REGNUM(N) ? builtin_type_long_double 		\
+   : IS_SSE_REGNUM(N) ? builtin_type_v4sf			\
+   : builtin_type_int)
 
-/* Return the GDB type object for the "standard" data type of data in
-   register N.  */
-
-#undef REGISTER_VIRTUAL_TYPE
-#ifdef LD_I387
-#define REGISTER_VIRTUAL_TYPE(N) \
-  ((N < FP0_REGNUM) ? builtin_type_int : \
-   (N < FPC_REGNUM) ? builtin_type_long_double : builtin_type_int)
-#else
-#define REGISTER_VIRTUAL_TYPE(N) \
-  ((N < FP0_REGNUM) ? builtin_type_int : \
-   (N < FPC_REGNUM) ? builtin_type_double : builtin_type_int)
-#endif
+#endif /* LD_I387 */
 
 #undef TARGET_LONG_DOUBLE_BIT
 #define TARGET_LONG_DOUBLE_BIT 96
--- gdb/config/i386/xm-go32.h~1	Mon Apr 26 18:26:22 1999
+++ gdb/config/i386/xm-go32.h	Wed Aug 18 08:30:52 1999
@@ -25,7 +25,7 @@
 
 #define SLASH_P(X) ((X)=='\\' || (X) == '/')
 
-#define ROOTED_P(X) ((SLASH_P((X)[0]))|| ((X)[1] ==':'))
+#define ROOTED_P(X) ((SLASH_P((X)[0])) || ((X)[0] && (X)[1] ==':'))
 
 #define SLASH_CHAR '/'
 #define SLASH_STRING "/"
--- gdb/config/i386/nm-go32.h~1	Sun Aug  8 12:41:38 1999
+++ gdb/config/i386/nm-go32.h	Sat Aug 14 14:59:08 1999
@@ -24,8 +23,31 @@
 
 #define TARGET_HAS_HARDWARE_WATCHPOINTS
 
+/* Returns the number of hardware watchpoints of type TYPE that we can
+   set.  Value is positive if we can set CNT watchpoints, zero if
+   setting watchpoints of type TYPE is not supported, and negative if
+   CNT is more than the maximum number of watchpoints of type TYPE
+   that we can support.  TYPE is one of bp_hardware_watchpoint,
+   bp_read_watchpoint, bp_write_watchpoint, or bp_hardware_breakpoint.
+   CNT is the number of such watchpoints used so far (including this
+   one).  OTHERTYPE is non-zero if other types of watchpoints are
+   currently enabled.
+
+   We always return 1 here because we don't have enough information
+   about possible overlap of addresses that they want to watch.  As
+   an extreme example, consider the case where all the watchpoints
+   watch the same address and the same region length: then we can
+   handle a virtually unlimited number of watchpoints, due to debug
+   register sharing implemented via reference counts in go32-nat.c.  */
+
 #define TARGET_CAN_USE_HARDWARE_WATCHPOINT(type, cnt, ot) 1
 
+/* Returns non-zero if we can use hardware watchpoints to watch a region
+   whose address is ADDR and whose length is LEN.  */
+
+#define TARGET_REGION_OK_FOR_HW_WATCHPOINT(addr,len) \
+	go32_region_ok_for_watchpoint(addr,len)
+
 /* After a watchpoint trap, the PC points to the instruction after the
    one that caused the trap.  Therefore we don't need to step over it.
    But we do need to reset the status register to avoid another trap.  */
@@ -33,19 +55,22 @@
 #define HAVE_CONTINUABLE_WATCHPOINT
 
 #define STOPPED_BY_WATCHPOINT(W)  \
-  go32_stopped_by_watchpoint (inferior_pid)
+  go32_stopped_by_watchpoint (inferior_pid, 0)
+
+#define target_stopped_data_address() \
+  go32_stopped_by_watchpoint (inferior_pid, 1)
 
 /* Use these macros for watchpoint insertion/removal.  */
 
 #define target_insert_watchpoint(addr, len, type)  \
-  go32_insert_watchpoint (inferior_pid, addr, len, 2)
+  go32_insert_watchpoint (inferior_pid, addr, len, type)
 
 #define target_remove_watchpoint(addr, len, type)  \
-  go32_remove_watchpoint (inferior_pid, addr, len)
+  go32_remove_watchpoint (inferior_pid, addr, len, type)
 
 #define target_insert_hw_breakpoint(addr, shadow)  \
   go32_insert_hw_breakpoint(addr, shadow)
-
+  
 #define target_remove_hw_breakpoint(addr, shadow)  \
   go32_remove_hw_breakpoint(addr, shadow)
 
@@ -55,3 +80,4 @@
 #define FLOAT_INFO { i386_go32_float_info (); }
 
 extern void i386_go32_float_info (void);
+

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]