⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tm-i386.h

📁 arm-linux-gcc编译器
💻 H
📖 第 1 页 / 共 2 页
字号:
/* 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[];/* 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[];/* 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.  */#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)/* 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))/* 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_REGSextern void i387_float_info (void);#define FLOAT_INFO { i387_float_info (); }#endif/* 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) \  { char buf[REGISTER_SIZE];	\    (SP) -= sizeof (ADDR);	\    store_address (buf, sizeof (ADDR), ADDR);	\    write_memory ((SP), buf, sizeof (ADDR)); }/* 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 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 PARAMS ((struct frame_info *));#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 PARAMS ((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 PARAMS ((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 PARAMS ((void));/* Discard from the stack the innermost frame, restoring all registers.  */#define POP_FRAME  { i386_pop_frame (); }extern void i386_pop_frame PARAMS ((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)   \{ \	int from, to, delta, loc; \	loc = (int)(read_register (SP_REGNUM) - CALL_DUMMY_LENGTH); \	from = loc + 5; \	to = (int)(fun); \	delta = to - from; \	*((char *)(dummyname) + 1) = (delta & 0xff); \	*((char *)(dummyname) + 2) = ((delta >> 8) & 0xff); \	*((char *)(dummyname) + 3) = ((delta >> 16) & 0xff); \	*((char *)(dummyname) + 4) = ((delta >> 24) & 0xff); \}extern void print_387_control_word PARAMS ((unsigned int));extern void print_387_status_word PARAMS ((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 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -