]> Git Repo - binutils.git/blobdiff - gdb/config/i386/tm-i386.h
+ * gdbarch.sh (DEPRECATED_EXTRACT_RETURN_VALUE): Rename
[binutils.git] / gdb / config / i386 / tm-i386.h
index 3507d822ef53c3021773adc16667d7f7ce0ec533..0ea151b4a14635c2744aab3dc9a4a8fbab394526 100644 (file)
@@ -1,5 +1,6 @@
 /* Macro definitions for GDB on an Intel i[345]86.
-   Copyright (C) 1995, 1996, 2000 Free Software Foundation, Inc.
+   Copyright 1995, 1996, 1998, 1999, 2000, 2001
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #ifndef TM_I386_H
 #define TM_I386_H 1
 
+#define GDB_MULTI_ARCH GDB_MULTI_ARCH_PARTIAL
+
+#include "regcache.h"
+
 /* Forward declarations for prototypes.  */
 struct frame_info;
 struct frame_saved_regs;
 struct value;
 struct type;
 
-#define TARGET_BYTE_ORDER LITTLE_ENDIAN
-
-/* The format used for `long double' on almost all i386 targets is the
-   i387 extended floating-point format.  In fact, of all targets in the
-   GCC 2.95 tree, only OSF/1 does it different, and insists on having
-   a `long double' that's not `long' at all.  */
-
-#define TARGET_LONG_DOUBLE_FORMAT &floatformat_i387_ext
-
-/* Although the i386 extended floating-point has only 80 significant
-   bits, a `long double' actually takes up 96, probably to enforce
-   alignment.  */
-
-#define TARGET_LONG_DOUBLE_BIT 96
-
-/* Used for example in valprint.c:print_floating() to enable checking
-   for NaN's */
-
-#define IEEE_FLOAT (1)
-
-/* Number of traps that happen between exec'ing the shell to run an
-   inferior, and when we finally get to the inferior code.  This is 2
-   on most implementations. */
-
-#define START_INFERIOR_TRAPS_EXPECTED 2
-
 /* Offset from address of function to start of its code.
    Zero on most machines.  */
 
@@ -65,12 +44,6 @@ struct type;
 
 extern int i386_skip_prologue (int);
 
-/* Immediately after a function call, return the saved pc.  Can't always go
-   through the frames for this because on some machines the new frame is not
-   set up until the new function executes some instructions.  */
-
-#define SAVED_PC_AFTER_CALL(frame) (read_memory_integer (read_register (SP_REGNUM), 4))
-
 /* Stack grows downward.  */
 
 #define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
@@ -120,29 +93,8 @@ extern int i386_skip_prologue (int);
 #define NUM_SSE_REGS (0)
 #endif
 
-#define NUM_REGS (NUM_GREGS + NUM_FREGS + NUM_SSE_REGS)
-
 /* Largest number of registers we could have in any configuration.  */
-#define MAX_NUM_REGS (16 + 16 + 9)
-
-/* Initializer for an array of names of registers.  There should be at least
-   NUM_REGS strings in this initializer.  Any excess ones are simply ignored.
-   The order of the first 8 registers must match the compiler's numbering
-   scheme (which is the same as the 386 scheme) and also regmap in the various
-   *-nat.c files. */
-
-#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",  "fiseg",   \
-                         "fioff", "foseg",  "fooff", "fop",    \
-                        "xmm0",  "xmm1",   "xmm2",  "xmm3",    \
-                        "xmm4",  "xmm5",   "xmm6",  "xmm7",    \
-                         "mxcsr"                               \
-                      }
+#define MAX_NUM_REGS (16 + 16 + 9 + 1)
 
 /* Register numbers of various important registers.
    Note that some of these values are "real" register numbers,
@@ -157,108 +109,41 @@ extern int i386_skip_prologue (int);
 #define PC_REGNUM 8            /* (eip) Contains program counter */
 #define PS_REGNUM 9            /* (ps)  Contains processor status */
 
-/* These registers are present only if HAVE_I387_REGS is #defined.
-   We promise that FP0 .. FP7 will always be consecutive register numbers.  */
-#define FP0_REGNUM   16                /* first FPU floating-point register */
-#define FP7_REGNUM   23                /* last  FPU floating-point register */
-
-/* All of these control registers (except for FCOFF and FDOFF) are
-   sixteen bits long (at most) in the FPU, but are zero-extended to
-   thirty-two bits in GDB's register file.  This makes it easier to
-   compute the size of the control register file, and somewhat easier
-   to convert to and from the FSAVE instruction's 32-bit format.  */
-#define FIRST_FPU_CTRL_REGNUM 24
-#define FCTRL_REGNUM 24                /* FPU control word */
-#define FPC_REGNUM   24                /* old name for FCTRL_REGNUM */
-#define FSTAT_REGNUM 25                /* FPU status word */
-#define FTAG_REGNUM  26                /* FPU register tag word */
-#define FCS_REGNUM   27                /* FPU instruction's code segment selector
-                                  16 bits, called "FPU Instruction Pointer
-                                  Selector" in the x86 manuals  */
-#define FCOFF_REGNUM 28                /* FPU instruction's offset within segment
-                                  ("Fpu Code OFFset") */
-#define FDS_REGNUM   29                /* FPU operand's data segment */
-#define FDOFF_REGNUM 30                /* FPU operand's offset within segment */
-#define FOP_REGNUM   31                /* FPU opcode, bottom eleven bits */
-#define LAST_FPU_CTRL_REGNUM 31
-
-/* These registers are present only if HAVE_SSE_REGS is #defined.
-   We promise that XMM0 .. XMM7 will always have consecutive reg numbers. */
-#define XMM0_REGNUM  32                /* first SSE data register */
-#define XMM7_REGNUM  39                /* last  SSE data register */
-#define MXCSR_REGNUM 40                /* Streaming SIMD Extension control/status */
-
-#define IS_FP_REGNUM(n) (FP0_REGNUM <= (n) && (n) <= FP7_REGNUM)
-#define IS_SSE_REGNUM(n) (XMM0_REGNUM <= (n) && (n) <= XMM7_REGNUM)
-
-#define FPU_REG_RAW_SIZE (10)
-
-/* Sizes of individual register sets.  These cover the entire register
-   file, so summing up the sizes of those portions actually present
-   yields REGISTER_BYTES.  */
-#define SIZEOF_GREGS (NUM_GREGS * 4)
-#define SIZEOF_FPU_REGS (8 * FPU_REG_RAW_SIZE)
-#define SIZEOF_FPU_CTRL_REGS \
-  ((LAST_FPU_CTRL_REGNUM - FIRST_FPU_CTRL_REGNUM + 1) * 4)
-#define SIZEOF_SSE_REGS (8 * 16 + 4)
-
-
-/* Total amount of space needed to store our copies of the machine's register
-   state, the array `registers'. */
-#ifdef HAVE_SSE_REGS
-#define REGISTER_BYTES \
-  (SIZEOF_GREGS + SIZEOF_FPU_REGS + SIZEOF_FPU_CTRL_REGS + SIZEOF_SSE_REGS)
-#else
+/* First FPU data register.  */
 #ifdef HAVE_I387_REGS
-#define REGISTER_BYTES (SIZEOF_GREGS + SIZEOF_FPU_REGS + SIZEOF_FPU_CTRL_REGS)
+#define FP0_REGNUM 16
 #else
-#define REGISTER_BYTES (SIZEOF_GREGS)
-#endif
+#define FP0_REGNUM 0
 #endif
-
-/* Index within `registers' of the first byte of the space for register N. */
-#define REGISTER_BYTE(n) (i386_register_byte[(n)])
-extern int i386_register_byte[];
-
-/* Number of bytes of storage in the actual machine representation for
-   register N.  */
-#define REGISTER_RAW_SIZE(n) (i386_register_raw_size[(n)])
-extern int i386_register_raw_size[];
+\f
 
 /* Largest value REGISTER_RAW_SIZE can have.  */
 #define MAX_REGISTER_RAW_SIZE 16
 
-/* Number of bytes of storage in the program's representation
-   for register N. */
-#define REGISTER_VIRTUAL_SIZE(n) (i386_register_virtual_size[(n)])
-extern int i386_register_virtual_size[];
+/* Return the size in bytes of the virtual type of register REG.  */
+#define REGISTER_VIRTUAL_SIZE(reg) i386_register_virtual_size ((reg))
+extern int i386_register_virtual_size (int reg);
 
 /* Largest value REGISTER_VIRTUAL_SIZE can have.  */
 #define MAX_REGISTER_VIRTUAL_SIZE 16
 
-/* 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.  */
+/* Return the GDB type object for the "standard" data type of data in
+   register REGNUM.  */
+
+#define REGISTER_VIRTUAL_TYPE(regnum) i386_register_virtual_type (regnum)
+extern struct type *i386_register_virtual_type (int regnum);
 
-#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 true iff register REGNUM's virtual format is different from
+   its raw format.  */
 
-/* REGISTER_CONVERTIBLE(N) is true iff register N's virtual format is
-   different from its raw format.  Note that this definition assumes
-   that the host supports IEEE 32-bit floats, since it doesn't say
-   that SSE registers need conversion.  Even if we can't find a
-   counterexample, this is still sloppy.  */
-#define REGISTER_CONVERTIBLE(n) (IS_FP_REGNUM (n))
+#define REGISTER_CONVERTIBLE(regnum) i386_register_convertible (regnum)
+extern int i386_register_convertible (int regnum);
 
 /* 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) \
-  i386_register_convert_to_virtual ((regnum), (type), (from), (to));
+  i386_register_convert_to_virtual ((regnum), (type), (from), (to))
 extern void i386_register_convert_to_virtual (int regnum, struct type *type,
                                              char *from, char *to);
 
@@ -266,7 +151,7 @@ extern void i386_register_convert_to_virtual (int regnum, struct type *type,
    raw format for register REGNUM in buffer TO.  */
 
 #define REGISTER_CONVERT_TO_RAW(type, regnum, from, to) \
-  i386_register_convert_to_raw ((type), (regnum), (from), (to));
+  i386_register_convert_to_raw ((type), (regnum), (from), (to))
 extern void i386_register_convert_to_raw (struct type *type, int regnum,
                                          char *from, char *to);
 
@@ -275,77 +160,52 @@ extern void i386_register_convert_to_raw (struct type *type, int regnum,
 extern void i387_float_info (void);
 #define FLOAT_INFO { i387_float_info (); }
 #endif
-
 \f
+
+#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
+  i386_push_arguments ((nargs), (args), (sp), (struct_return), (struct_addr))
+extern CORE_ADDR i386_push_arguments (int nargs, struct value **args,
+                                     CORE_ADDR sp, int struct_return,
+                                     CORE_ADDR struct_addr);
+
 /* Store the address of the place in which to copy the structure the
-   subroutine will return.  This is called from call_function. */
+   subroutine will return.  This is called from call_function.  */
 
-#define STORE_STRUCT_RETURN(ADDR, SP) \
-  { char buf[REGISTER_SIZE];   \
-    (SP) -= sizeof (ADDR);     \
-    store_address (buf, sizeof (ADDR), ADDR);  \
-    write_memory ((SP), buf, sizeof (ADDR)); }
+#define STORE_STRUCT_RETURN(addr, sp) \
+  i386_store_struct_return ((addr), (sp))
+extern void i386_store_struct_return (CORE_ADDR addr, CORE_ADDR sp);
 
 /* Extract from an array REGBUF containing the (raw) register state
    a function return value of type TYPE, and copy that, in virtual format,
    into VALBUF.  */
 
-#define EXTRACT_RETURN_VALUE(type, regbuf, valbuf) \
+#define DEPRECATED_EXTRACT_RETURN_VALUE(type, regbuf, valbuf) \
   i386_extract_return_value ((type), (regbuf), (valbuf))
 extern void i386_extract_return_value (struct type *type, char *regbuf,
                                       char *valbuf);
 
-/* Write into appropriate registers a function return value of type TYPE, given
-   in virtual format.  */
-
-#define STORE_RETURN_VALUE(TYPE,VALBUF) \
-  {                                                                                 \
-    if (TYPE_CODE (TYPE) == TYPE_CODE_FLT)                                  \
-      write_register_bytes (REGISTER_BYTE (FP0_REGNUM), (VALBUF),           \
-                           TYPE_LENGTH (TYPE));                             \
-    else                                                                    \
-      write_register_bytes (0, (VALBUF), TYPE_LENGTH (TYPE));                       \
-  }
-
-/* Extract from an array REGBUF containing the (raw) register state the address
-   in which a function should return its structure value, as a CORE_ADDR (or an
-   expression that can be used as one).  */
-
-#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(int *)(REGBUF))
-
-/* The following redefines make backtracing through sigtramp work.
-   They manufacture a fake sigtramp frame and obtain the saved pc in sigtramp
-   from the sigcontext structure which is pushed by the kernel on the
-   user stack, along with a pointer to it.  */
-
-/* FRAME_CHAIN takes a frame's nominal address and produces the frame's
-   chain-pointer.
-   In the case of the i386, the frame's nominal address
-   is the address of a 4-byte word containing the calling frame's address.  */
-
-#define FRAME_CHAIN(thisframe)  \
-  ((thisframe)->signal_handler_caller \
-   ? (thisframe)->frame \
-   : (!inside_entry_file ((thisframe)->pc) \
-      ? read_memory_integer ((thisframe)->frame, 4) \
-      : 0))
-
-/* A macro that tells us whether the function invocation represented
-   by FI does not have a frame on the stack associated with it.  If it
-   does not, FRAMELESS is set to 1, else 0.  */
-
-#define FRAMELESS_FUNCTION_INVOCATION(FI) \
-     (((FI)->signal_handler_caller) ? 0 : frameless_look_for_prologue(FI))
-
-/* Saved Pc.  Get it from sigcontext if within sigtramp.  */
-
-#define FRAME_SAVED_PC(FRAME) \
-  (((FRAME)->signal_handler_caller \
-    ? sigtramp_saved_pc (FRAME) \
-    : read_memory_integer ((FRAME)->frame + 4, 4)) \
-   )
-
-extern CORE_ADDR sigtramp_saved_pc (struct frame_info *);
+/* Write into the appropriate registers a function return value stored
+   in VALBUF of type TYPE, given in virtual format.  */
+
+#define STORE_RETURN_VALUE(type, valbuf) \
+  i386_store_return_value ((type), (valbuf))
+extern void i386_store_return_value (struct type *type, char *valbuf);
+
+/* Extract from an array REGBUF containing the (raw) register state
+   the address in which a function should return its structure value,
+   as a CORE_ADDR.  */
+
+#define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(regbuf) \
+  i386_extract_struct_value_address ((regbuf))
+extern CORE_ADDR i386_extract_struct_value_address (char *regbuf);
+
+/* Determine whether the function invocation represented by FRAME does
+   not have a from on the stack associated with it.  If it does not,
+   return non-zero, otherwise return zero.  */
+
+#define FRAMELESS_FUNCTION_INVOCATION(frame) \
+  i386_frameless_function_invocation (frame)
+extern int i386_frameless_function_invocation (struct frame_info *frame);
 
 #define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
 
This page took 0.036663 seconds and 4 git commands to generate.