import gdb-1999-09-08 snapshot
[deliverable/binutils-gdb.git] / gdb / config / i386 / tm-linux.h
index 0767bd9ba97911fe87f3c92d7e3e515e1836aa75..e4f70a2078dc6a6f03f44a24600af45614fe49d1 100644 (file)
@@ -21,8 +21,7 @@
 #ifndef TM_LINUX_H
 #define TM_LINUX_H
 
-/* FIXME:  If nothing else gets added to this file, it could be removed
-   and configure could just use tm-i386.h instead. -fnf */
+#define I386_GNULINUX_TARGET
 
 #include "i386/tm-i386.h"
 
 
 #include "tm-sysv4.h"
 
+/* copy of tm-cygwin32.h */
+#undef REGISTER_RAW_SIZE
+#undef REGISTER_VIRTUAL_SIZE
+#undef REGISTER_VIRTUAL_TYPE
+#undef REGISTER_NAMES
+#undef REGISTER_BYTES
+#undef REGISTER_BYTE
+#undef MAX_REGISTER_VIRTUAL_SIZE
+#undef NUM_REGS
+#undef NUM_FREGS
+
+/* Number of machine registers */
+
+#define NUM_REGS 31
+#define NUM_FREGS 15 
+
+/* 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)
+ * also, this table must match regmap in i386-pinsn.c.
+ */
+
+#define REGISTER_NAMES { "eax",  "ecx",  "edx",  "ebx",  \
+                        "esp",  "ebp",  "esi",  "edi",  \
+                        "eip",  "eflags","cs",  "ss",   \
+                        "ds",   "es",   "fs",   "gs",   \
+                        "cwd",  "swd",  "twd",  "fip",  \
+                        "fcs",  "fopo", "fos",          \
+                        "st",   "st1",  "st2",  "st3",  \
+                         "st4",  "st5",  "st6",  "st7",}
+
+#define LOW_RETURN_REGNUM 0    /* holds low four bytes of result */
+#define HIGH_RETURN_REGNUM 2   /* holds high four bytes of result */
+
+#define FPSTART_REGNUM   16    /* start of FPU registers */
+#define FPCONTROL_REGNUM  16   /* FPU control register */
+#define FPSTATUS_REGNUM   17   /* FPU status register */
+#define FPTAG_REGNUM     18    /* FPU tag register */
+#define FPDATA_REGNUM     23   /* actual floating-point values */
+#define FPEND_REGNUM     (FPSTART_REGNUM + 14) /* last FPU register */
+
+#define FPENV_BYTES (7 * 4)
+
+#define FPREG_RAW_SIZE (10)
+
+/* Total amount of space needed to store our copies of the machine's
+   FPU state.  */
+
+#define FPREG_BYTES (FPENV_BYTES + 8 * FPREG_RAW_SIZE)
+
+/* Total amount of space needed to store our copies of the machine's
+   register state, the array `registers'.  */
+
+#define REGISTER_BYTES (FPSTART_REGNUM * 4 + FPREG_BYTES)
+
+/* Index within `registers' of the first byte of the space for
+   register N.  */
+
+#define REGISTER_BYTE(N) (((N) < FPDATA_REGNUM) ? \
+                         (N) * 4 : \
+                         (((N) - FPDATA_REGNUM) * FPREG_RAW_SIZE) \
+                         + (FPDATA_REGNUM * 4))
+
+/* Number of bytes of storage in the actual machine representation
+   for register N.  */
+
+#define REGISTER_RAW_SIZE(N) (((N) < FPDATA_REGNUM) ? 4 : FPREG_RAW_SIZE)
+
+/* Number of bytes of storage in the program's representation
+   for register N. */
+
+#define REGISTER_VIRTUAL_SIZE(N) (((N) < FPDATA_REGNUM) ? 4 : FPREG_RAW_SIZE)
+
+/* Largest value REGISTER_RAW_SIZE can have.  */
+
+#undef MAX_REGISTER_RAW_SIZE
+#define MAX_REGISTER_RAW_SIZE FPREG_RAW_SIZE
+
+/* Largest value REGISTER_VIRTUAL_SIZE can have.  */
+
+#define MAX_REGISTER_VIRTUAL_SIZE FPREG_RAW_SIZE
+
+#if defined(HAVE_LONG_DOUBLE) && defined(HOST_I386)
+/* The host and target are i386 machines and the compiler supports
+   long doubles. Long doubles on the host therefore have the same
+   layout as a 387 FPU stack register. */
+#define LD_I387
+#endif
+
+#define TARGET_LONG_DOUBLE_BIT 80
+
+#ifdef LD_I387
+extern int i387_extract_floating (PTR addr, int len, long double *dretptr);
+extern int i387_store_floating   (PTR addr, int len, long double val);
+
+#define TARGET_EXTRACT_FLOATING i387_extract_floating
+#define TARGET_STORE_FLOATING   i387_store_floating
+
+#define TARGET_ANALYZE_FLOATING                                        \
+  do                                                           \
+    {                                                          \
+      unsigned expon;                                          \
+                                                               \
+      low = extract_unsigned_integer (valaddr, 4);             \
+      high = extract_unsigned_integer (valaddr + 4, 4);                \
+      expon = extract_unsigned_integer (valaddr + 8, 2);       \
+                                                               \
+      nonnegative = ((expon & 0x8000) == 0);                   \
+      is_nan = ((expon & 0x7fff) == 0x7fff)                    \
+       && ((high & 0x80000000) == 0x80000000)                  \
+       && (((high & 0x7fffffff) | low) != 0);                  \
+    }                                                          \
+  while (0)
+#endif
+
+#ifndef LD_I387
+/* Nonzero if register N requires conversion
+   from raw format to virtual format.  */
+#define REGISTER_CONVERTIBLE(N) \
+  ((N < FPDATA_REGNUM) ? 0 : 1)
+#endif
+
+#ifdef LD_I387
+#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.  */
+extern void
+i387_to_double PARAMS ((char *, char *));
+
+#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
+
+#ifdef LD_I387
+#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \
+{ \
+  long double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \
+  *((long double *)TO) = val; \
+}
+#else
+extern void
+double_to_i387 PARAMS ((char *, char *));
+
+#define REGISTER_CONVERT_TO_RAW(TYPE,REGNUM,FROM,TO) \
+{ \
+  double val = extract_floating ((FROM), TYPE_LENGTH (TYPE)); \
+  double_to_i387((char *)&val, (TO)); \
+}
+#endif
+
+/* Return the GDB type object for the "standard" data type
+   of data in register N.  */
+
+#ifdef LD_I387
+#define REGISTER_VIRTUAL_TYPE(N) \
+  ((N < FPDATA_REGNUM) ? builtin_type_int : \
+   builtin_type_long_double)
+#else
+#define REGISTER_VIRTUAL_TYPE(N) \
+  ((N < FPDATA_REGNUM) ? builtin_type_int : \
+   builtin_type_double)
+#endif
+
+/* end of copy */
+
+extern void i387_float_info(void);
+#define FLOAT_INFO { i387_float_info (); }
+
 /* The following works around a problem with /usr/include/sys/procfs.h  */
 #define sys_quotactl 1
 
+/* Define DO_REGISTERS_INFO() to do machine-specific formatting
+   of register dumps. */
+
+#define DO_REGISTERS_INFO(_regnum, fp) i386_do_registers_info(_regnum, fp)
+extern void i386_do_registers_info PARAMS ((int, int));
+
+extern void i387_print_register PARAMS ((char *, int));
+
 /* When the i386 Linux kernel calls a signal handler, the return
    address points to a bit of code on the stack.  These definitions
    are used to identify this bit of code as a signal trampoline in
@@ -104,4 +290,29 @@ extern CORE_ADDR i386_linux_sigtramp_saved_pc PARAMS ((struct frame_info *));
 
 extern CORE_ADDR i386_linux_sigtramp_saved_sp PARAMS ((struct frame_info *));
 
+/* Some versions of Linux have real-time signal support in the C library, and
+   some don't.  We have to include this file to find out.  */
+#include <signal.h>
+
+#ifdef __SIGRTMIN
+#define REALTIME_LO __SIGRTMIN
+#define REALTIME_HI (__SIGRTMAX + 1)
+#else
+#define REALTIME_LO 32
+#define REALTIME_HI 64
+#endif
+
+/* When we call a function in a shared library, and the PLT sends us
+   into the dynamic linker to find the function's real address, we
+   need to skip over the dynamic linker call.  This function decides
+   when to skip, and where to skip to.  See the comments for
+   SKIP_SOLIB_RESOLVER at the top of infrun.c.  */
+#define SKIP_SOLIB_RESOLVER i386_linux_skip_solib_resolver
+extern CORE_ADDR i386_linux_skip_solib_resolver (CORE_ADDR pc);
+
+/* N_FUN symbols in shared libaries have 0 for their values and need
+   to be relocated. */
+#define SOFUN_ADDRESS_MAYBE_MISSING
+
 #endif /* #ifndef TM_LINUX_H */
+
This page took 0.02527 seconds and 4 git commands to generate.