8201327c40
i386bsd-tdep.o. Remove solib.o, solib-svr4.o and solib-legacy.o. Move these to ... * config/i386/i386sol2.mh: ... here. * config/i386/tm-i386sol2.h (STAB_REG_TO_REGNUM): Remove define. (sigtramp_saved_pc, I386V4_SIGTRAMP_SAVED_PC): Don't #undef. (SIGCONTEXT_PC_OFFSET): Remove define. (IN_SIGTRAMP): Remove define. * i386-sol2-tdep.c: New file. * config/i386/i386nw.mt (TM_FILE): Change to tm-i386.h. * config/i386/tm-i386nw.h: Removed. * config/i386/tm-fbsd.h (STAB_REG_TO_REGNUM, USE_STRUCT_CONVENTION): Remove defines. (JB_ELEMENT_SIZE, JB_PC, GET_LONGJMP_TARGET): Remove defines. (get_longjmp_target): Remove prototype. (IN_SIGTRAMP): Remove define. (i386bsd_in_sigtramp): Remove prototype. (i386bsd_sigtramp_start, i386bsd_sigtramp_end): Turn into a function. Update comment accordingly (SIGTRAMP_START, SIGTRAMP): Adjust definition accordingly. (FRAME_SAVED_PC): Remove define. (i386bsd_frame_saved_pc): Remove prototype. * config/i386/tm-nbsd.h (JB_ELEMENT_SIZE, JB_PC, GET_LONGJMP_TARGET): Remove defines. (get_longjmp_target): Remove prototype. (IN_SIGTRAMP): Remove define. (i386bsd_in_sigtramp): Remove prototype. (i386bsd_sigtramp_start, i386bsd_sigtramp_end): Turn into a function. Update comment accordingly (SIGTRAMP_START, SIGTRAMP): Adjust definition accordingly. (FRAME_SAVED_PC): Remove define. (i386bsd_frame_saved_pc): Remove prototype. * config/i386/tm-nbsdaout.h (i386nbsd_aout_use_struct_convention): Remove prototype. (USE_STRUCT_CONVENTION): Remove prototype. * i386bsd-nat.c (i386bsd_sigcontext_pc_offset): Remove declaration. (_initialize_i386bsd_nat): Revise logic to determine some constants at compile time when compiling a native GDB. Warn if things don't match up with what we expect. * i386bsd-tdep.c (i386bsd_sigtramp_start, i386bsd_sigtramp_end): Remove variables. (i386bsd_in_sigtramp): Rename tp i386bsd_pc_in_sigtramp. Rewrite to use date stored in `struct gdbarch_tdep'. (i386bsd_sigcontext_offset): Remove varaible. (i386bsd_sigtramp_saved_pc): Make public. Rewrite to use data stored in `struct gdbarch_tdep'. (i386bsd_frame_saved_pc): Make static. (i386bsd_sigtramp_start, i386bsd_sigtramp_end): New functions. (i386bsd_sc_pc_offset, i386nbsd_sc_pc_offset, i386fbsd_sigtramp_start, i386fbsd_sigtramp_end, i386fbsd4_sc_pc_offset): New variables. (i386bsd_init_abi, i386nbsd_init_abi, i386nbsdelf_init_abi, i386fbsdaout_init_abi, i386fbsd_init_abi, i386fbsd4_init_abi): New functions. (i386bsd_aout_osabi_sniffer, _initialize_i386bsd_tdep): New functions. * i386fbsd-nat.c (_initialize_i386fbsd_nat): Fix type in comment. Modify the value of i386fbsd_sigtramp_start and i386fbsd_sigtramp_end instead of i386bsd_sigtramp_start and i386fbsd_sigtramp_end. * i386nbsd-tdep.c: (i386nbsd_aout_use_struct_convention): Remove function. * config/i386/tm-linux.h (I386_LINUX_ORIG_EAX_REGNUM): Move define to i386-linux-tdep.h. (NUM_REGS, MAX_NUM_REGS, REGISTER_BYTES, REGISTER_NAME, REGISTER_BYTE, REGISTER_RAW_SIZE, STAB_REG_TO_REGNUM): Remove defines. (i386_linux_register_name, i386_linux_register_byte, i386_linux_register_raw_size): Remove prototypes. (i386_linux_svr4_fetch_link_map_offsets): Remove prototype. (SVR4_FETCH_LINK_MAP_OFFSETS): Remove define. (IN_SIGTRAMP, FRAME_CHAIN, FRAME_SAVED_PC, SAVED_PC_AFTER_CALL, TARGET_WRITE_PC): Remove defines. (i386_linux_in_sigtramp, i386_linux_frame_chain, i386_linux_frame_saved_pc, i386_linux_saved_pc_after_call, i386_linux_write_pc): Remove prototypes. (JB_ELEMENT_SIZE, JB_PC, GET_LONGJMP_TARGET): Remove defines. (get_longjmp_target): Remove prototype. * i386-linux-tdep.h: New file. * i386-linux-nat.c: Include "i386-linux-tdep.h". * i386-linux-tdep.c: Include "i386-tdep.h" and "i386-linux-tdep.h". (i386_linux_register_name, i386_linux_register_byte, i386_linux_register_raw_size, i386_linux_in_sigtramp, i386_linux_write_pc, i386_linux_svr4_fetch_link_map_offsets): Make static. (i386_linux_init_abi): New function. (_initialize_i386_linux_tdep): New function. * config/i386/tm-i386.h (SAVED_PC_AFTER_CALL): Remove define. (i386_saved_pc_after_call): Remove prototype. (MAX_NUM_REGS): Increase to deal with Linux's orig_eax "register". (REGISTER_NAME, STAB_REG_TO_REGNUM, SDB_REG_TO_REGNUM, DWARF_REG_TO_REGNUM, DWARF2_REG_TO_REGNUM): Remove defines. (i386_register_name, i386_stab_reg_to_regnum, i386_dwarf_reg_to_regnum): Remove prototypes. (SIZEOF_GREGS, SIZEOF_FPU_REGS, SIZEOF_FPU_CTL_REGS, SIZEOF_SSE_REGS): Remove defines. (REGISTER_BYTES): Remove define. (REGISTER_BYTE, REGISTER_RAW_SIZE): Remove defines. (i386_register_byte, i386_register_raw_size): Remove prototypes. (FRAME_CHAIN, FRAME_SAVED_PC): Remove defines. (i386_frame_chain, i386_frame_saved_pc): Remove prototypes. * config/i386/tm-i386v4.h (FRAME_CHAIN_VALID): Remove define. (JB_ELEMENT_SIZE, JB_PC, JB_EBX, JB_ESI, JB_EDI, JB_EBP, JB_ESP, JB_EDX, GET_LONGJMP_TARGET): Remove defines. (get_longjmp_target): Remove prototype. (I386V4_SIGTRAMP_SAVED_PC, IN_SIGTRAMP): Remove defines. (sigtramp_saved_pc): Remove define. (i386v4_sigtramp_saved_pc): Remove prototype. * config/i386/tm-go32.h (FRAME_CHAIN, FRAMELESS_FUNCTION_INVOCATION, FRAME_SAVED_PC): Remove defines. (i386go32_frame_saved_pc): Remove prototype. (JB_ELEMENT_SIZE, JB_PC, GET_LONGJMP_TARGET): Remove defines. (get_longjmp_target): Remove prototype. * i386-tdep.h: Include "osabi.h". (enum i386_abi): Removed. (enum struct_return): New enum. (struct gdbarch_tdep): Remove abi member, add osabi, jb_pc_offset, struct_return, sigtramp_saved_pc, sigtramp_start, sigtramp_end and sc_pc_offset members. (i386_gdbarch_register_os_abi): Remove prototype. (I386_NUM_GREGS, I386_NUM_FREGS, I386_NUM_XREGS, I386_SSE_NUM_REGS): New defines. (I386_SIZEOF_GREGS, I386_SIZEOF_FREGS, I386_SIZEOF_XREGS, I386_SSE_SIZEOF_REGS): New defines. (i386_register_name, i386_register_byte, i386_register_raw_size): New prototypes. (i386_elf_init_abi, i386_svr4_init_abi): New prototypes. (i386bsd_sigtramp_saved_pc): New prototype. * i386-tdep.c: Don't include "elf-bfd.h". (i386_stab_reg_to_regnum, i386_dwarf_reg_to_regnum, i386_frame_chain, i386_saved_pc_after_call): Make static. (i386_frame_saved_pc): Rewrite to call architecture dependent function to deal with signal handlers. Make static. (i386go32_frame_saved_pc): Removed. [GET_LONGJMP_TARGET] (JB_PC, JB_ELEMENT_SIZE, get_longjmp_target): Removed. (i386_get_longjmp_target): New function. (default_struct_convention, pcc_struct_convention, reg_struct_convention, valid_conventions, struct_convention): New variables. (i386_use_struct_convention): New function. (i386v4_sigtramp_saved_pc): Renamed to i386_svr4_sigtramp_saved_pc. Made static. Moved. (i386_pc_in_sigtramp): New function. (i386_abi_names): Removed. (ABI_TAG_OS_GNU_LINUX, ABI_TAG_OS_GNU_HURD, ABI_TAG_OS_GNU_SOLARIS, ABI_TAG_OS_FREEBSD, ABI_TAG_OS_NETBSD): Removed. (process_note_sections, i386_elf_abi_from_note, i386_elf_abi, i386_gdbarch_register_os_abi): Removed. (struct i386_abi_handler): Removed. (i386_abi_handler_list): Removed. (i386_svr4_pc_in_sigtramp, i386_go32_pc_in_sigtramp): New functions. (i386_elf_init_abi, i386_svr4_init_abi, i386_go32_init_abi, i386_nw_init_abi): New functions. (i386_gdbarch_init): Rewritten to use generic OS ABI framework. Use set_gdbarch_xxx() calls instead of relying on macros for a number of calls. (i386_coff_osabi_sniffer, i386_nlm_osabi_sniffer): New functions. (_initialize_i386_tdep): Add new 'struct-convcention' command. Register the various architecture variants defined in this file.
305 lines
10 KiB
C
305 lines
10 KiB
C
/* Macro definitions for GDB on an Intel i[345]86.
|
||
Copyright 1995, 1996, 1998, 1999, 2000, 2001
|
||
Free Software Foundation, Inc.
|
||
|
||
This file is part of GDB.
|
||
|
||
This program is free software; you can redistribute it and/or modify
|
||
it under the terms of the GNU General Public License as published by
|
||
the Free Software Foundation; either version 2 of the License, or
|
||
(at your option) any later version.
|
||
|
||
This program is distributed in the hope that it will be useful,
|
||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
GNU General Public License for more details.
|
||
|
||
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. */
|
||
|
||
#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;
|
||
|
||
/* 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
|
||
|
||
/* 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. */
|
||
|
||
#define FUNCTION_START_OFFSET 0
|
||
|
||
/* Advance PC across any function entry prologue instructions to reach some
|
||
"real" code. */
|
||
|
||
#define SKIP_PROLOGUE(frompc) (i386_skip_prologue (frompc))
|
||
|
||
extern int i386_skip_prologue (int);
|
||
|
||
/* Stack grows downward. */
|
||
|
||
#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
|
||
|
||
/* Sequence of bytes for breakpoint instruction. */
|
||
|
||
#define BREAKPOINT {0xcc}
|
||
|
||
/* Amount PC must be decremented by after a breakpoint. This is often the
|
||
number of bytes in BREAKPOINT but not always. */
|
||
|
||
#define DECR_PC_AFTER_BREAK 1
|
||
|
||
/* Say how long (ordinary) registers are. This is a piece of bogosity
|
||
used in push_word and a few other places; REGISTER_RAW_SIZE is the
|
||
real way to know how big a register is. */
|
||
|
||
#define REGISTER_SIZE 4
|
||
|
||
/* This register file is parameterized by two macros:
|
||
HAVE_I387_REGS --- register file should include i387 registers
|
||
HAVE_SSE_REGS --- register file should include SSE registers
|
||
If HAVE_SSE_REGS is #defined, then HAVE_I387_REGS must also be #defined.
|
||
|
||
However, GDB code should not test those macros with #ifdef, since
|
||
that makes code which is annoying to multi-arch. Instead, GDB code
|
||
should check the values of NUM_GREGS, NUM_FREGS, and NUM_SSE_REGS,
|
||
which will eventually get mapped onto architecture vector entries.
|
||
|
||
It's okay to use the macros in tm-*.h files, though, since those
|
||
files will get completely replaced when we multi-arch anyway. */
|
||
|
||
/* Number of general registers, present on every 32-bit x86 variant. */
|
||
#define NUM_GREGS (16)
|
||
|
||
/* Number of floating-point unit registers. */
|
||
#ifdef HAVE_I387_REGS
|
||
#define NUM_FREGS (16)
|
||
#else
|
||
#define NUM_FREGS (0)
|
||
#endif
|
||
|
||
/* Number of SSE registers. */
|
||
#ifdef HAVE_SSE_REGS
|
||
#define NUM_SSE_REGS (9)
|
||
#else
|
||
#define NUM_SSE_REGS (0)
|
||
#endif
|
||
|
||
/* Largest number of registers we could have in any configuration. */
|
||
#define MAX_NUM_REGS (16 + 16 + 9 + 1)
|
||
|
||
/* Register numbers of various important registers.
|
||
Note that some of these values are "real" register numbers,
|
||
and correspond to the general registers of the machine,
|
||
and some are "phony" register numbers which are too large
|
||
to be actual register numbers as far as the user is concerned
|
||
but do serve to get the desired values when passed to read_register. */
|
||
|
||
#define FP_REGNUM 5 /* (ebp) Contains address of executing stack
|
||
frame */
|
||
#define SP_REGNUM 4 /* (usp) Contains address of top of stack */
|
||
#define PC_REGNUM 8 /* (eip) Contains program counter */
|
||
#define PS_REGNUM 9 /* (ps) Contains processor status */
|
||
|
||
/* First FPU data register. */
|
||
#ifdef HAVE_I387_REGS
|
||
#define FP0_REGNUM 16
|
||
#else
|
||
#define FP0_REGNUM 0
|
||
#endif
|
||
|
||
|
||
/* Largest value REGISTER_RAW_SIZE can have. */
|
||
#define MAX_REGISTER_RAW_SIZE 16
|
||
|
||
/* 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 REGNUM. */
|
||
|
||
#define REGISTER_VIRTUAL_TYPE(regnum) i386_register_virtual_type (regnum)
|
||
extern struct type *i386_register_virtual_type (int regnum);
|
||
|
||
/* Return true iff register REGNUM's virtual format is different from
|
||
its raw format. */
|
||
|
||
#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))
|
||
extern void i386_register_convert_to_virtual (int regnum, struct type *type,
|
||
char *from, char *to);
|
||
|
||
/* Convert data from virtual format with type TYPE in buffer FROM to
|
||
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))
|
||
extern void i386_register_convert_to_raw (struct type *type, int regnum,
|
||
char *from, char *to);
|
||
|
||
/* Print out the i387 floating point state. */
|
||
#ifdef HAVE_I387_REGS
|
||
extern void i387_float_info (void);
|
||
#define FLOAT_INFO { i387_float_info (); }
|
||
#endif
|
||
|
||
|
||
#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. */
|
||
|
||
#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) \
|
||
i386_extract_return_value ((type), (regbuf), (valbuf))
|
||
extern void i386_extract_return_value (struct type *type, char *regbuf,
|
||
char *valbuf);
|
||
|
||
/* 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 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)
|
||
|
||
#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
|
||
|
||
/* Return number of args passed to a frame. Can return -1, meaning no way
|
||
to tell, which is typical now that the C compiler delays popping them. */
|
||
|
||
#define FRAME_NUM_ARGS(fi) (i386_frame_num_args(fi))
|
||
|
||
extern int i386_frame_num_args (struct frame_info *);
|
||
|
||
/* Return number of bytes at start of arglist that are not really args. */
|
||
|
||
#define FRAME_ARGS_SKIP 8
|
||
|
||
/* Put here the code to store, into a struct frame_saved_regs,
|
||
the addresses of the saved registers of frame described by FRAME_INFO.
|
||
This includes special registers such as pc and fp saved in special
|
||
ways in the stack frame. sp is even more special:
|
||
the address we return for it IS the sp for the next frame. */
|
||
|
||
extern void i386_frame_init_saved_regs (struct frame_info *);
|
||
#define FRAME_INIT_SAVED_REGS(FI) i386_frame_init_saved_regs (FI)
|
||
|
||
|
||
|
||
/* Things needed for making the inferior call functions. */
|
||
|
||
/* "An argument's size is increased, if necessary, to make it a
|
||
multiple of [32 bit] words. This may require tail padding,
|
||
depending on the size of the argument" - from the x86 ABI. */
|
||
#define PARM_BOUNDARY 32
|
||
|
||
/* Push an empty stack frame, to record the current PC, etc. */
|
||
|
||
#define PUSH_DUMMY_FRAME { i386_push_dummy_frame (); }
|
||
|
||
extern void i386_push_dummy_frame (void);
|
||
|
||
/* Discard from the stack the innermost frame, restoring all registers. */
|
||
|
||
#define POP_FRAME { i386_pop_frame (); }
|
||
|
||
extern void i386_pop_frame (void);
|
||
|
||
|
||
/* this is
|
||
* call 11223344 (32 bit relative)
|
||
* int3
|
||
*/
|
||
|
||
#define CALL_DUMMY { 0x223344e8, 0xcc11 }
|
||
|
||
#define CALL_DUMMY_LENGTH 8
|
||
|
||
#define CALL_DUMMY_START_OFFSET 0 /* Start execution at beginning of dummy */
|
||
|
||
#define CALL_DUMMY_BREAKPOINT_OFFSET 5
|
||
|
||
/* Insert the specified number of args and function address
|
||
into a call sequence of the above form stored at DUMMYNAME. */
|
||
|
||
#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
|
||
i386_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p)
|
||
extern void i386_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun,
|
||
int nargs, struct value **args,
|
||
struct type *type, int gcc_p);
|
||
|
||
/* FIXME: kettenis/2000-06-12: These do not belong here. */
|
||
extern void print_387_control_word (unsigned int);
|
||
extern void print_387_status_word (unsigned int);
|
||
|
||
/* Offset from SP to first arg on stack at first instruction of a function */
|
||
|
||
#define SP_ARG0 (1 * 4)
|
||
|
||
#endif /* ifndef TM_I386_H */
|