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

📄 tm-sparc.h

📁 早期freebsd实现
💻 H
📖 第 1 页 / 共 2 页
字号:
#define MAX_REGISTER_VIRTUAL_SIZE 8/* Nonzero if register N requires conversion   from raw format to virtual format.  */#define REGISTER_CONVERTIBLE(N) (0)/* Convert data from raw format for register REGNUM   to virtual format for register REGNUM.  */#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,FROM,TO) \{ memcpy ((TO), (FROM), 4); }/* Convert data from virtual format for register REGNUM   to raw format for register REGNUM.  */#define REGISTER_CONVERT_TO_RAW(REGNUM,FROM,TO)	\{ memcpy ((TO), (FROM), 4); }/* Return the GDB type object for the "standard" data type   of data in register N.  */#define REGISTER_VIRTUAL_TYPE(N) \ ((N) < 32 ? builtin_type_int : (N) < 64 ? builtin_type_float : \  builtin_type_int)/* Writing to %g0 is a noop (not an error or exception or anything like   that, however).  */#define CANNOT_STORE_REGISTER(regno) ((regno) == G0_REGNUM)/* 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) \  { target_write_memory ((SP)+(16*4), (char *)&(ADDR), 4); }/* 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)	      \  {      	       	       	       	       	       	       	           \    if (TYPE_CODE (TYPE) == TYPE_CODE_FLT)		       		   \      {							       		   \	memcpy ((VALBUF), ((int *)(REGBUF))+FP0_REGNUM, TYPE_LENGTH(TYPE));\      }							       		   \    else						       		   \      memcpy ((VALBUF),						   	   \	      (char *)(REGBUF) + 4 * 8 +				   \	      (TYPE_LENGTH(TYPE) >= 4 ? 0 : 4 - TYPE_LENGTH(TYPE)),	   \	      TYPE_LENGTH(TYPE));					   \  }/* Write into appropriate registers a function return value   of type TYPE, given in virtual format.  *//* On sparc, values are returned in register %o0.  */#define STORE_RETURN_VALUE(TYPE,VALBUF) \  {    	       	       	       	       	       	       	       	       	     \    if (TYPE_CODE (TYPE) == TYPE_CODE_FLT)				     \      /* Floating-point values are returned in the register pair */          \      /* formed by %f0 and %f1 (doubles are, anyway).  */                    \      write_register_bytes (REGISTER_BYTE (FP0_REGNUM), (VALBUF),	     \			    TYPE_LENGTH (TYPE));			     \    else								     \      /* Other values are returned in register %o0.  */                      \      write_register_bytes (REGISTER_BYTE (O0_REGNUM), (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) \  (sparc_extract_struct_value_address (REGBUF))extern CORE_ADDRsparc_extract_struct_value_address PARAMS ((char [REGISTER_BYTES]));/* Describe the pointer in each stack frame to the previous stack frame   (its caller).  *//* FRAME_CHAIN takes a frame's nominal address   and produces the frame's chain-pointer. *//* In the case of the Sun 4, the frame-chain's nominal address   is held in the frame pointer register.   On the Sun4, the frame (in %fp) is %sp for the previous frame.   From the previous frame's %sp, we can find the previous frame's   %fp: it is in the save area just above the previous frame's %sp.   If we are setting up an arbitrary frame, we'll need to know where   it ends.  Hence the following.  This part of the frame cache   structure should be checked before it is assumed that this frame's   bottom is in the stack pointer.   If there isn't a frame below this one, the bottom of this frame is   in the stack pointer.   If there is a frame below this one, and the frame pointers are   identical, it's a leaf frame and the bottoms are the same also.   Otherwise the bottom of this frame is the top of the next frame.  */#define EXTRA_FRAME_INFO	FRAME_ADDR bottom;#define INIT_EXTRA_FRAME_INFO(fromleaf, fci)  \  (fci)->bottom =					\   ((fci)->next ?					\    ((fci)->frame == (fci)->next_frame ?		\     (fci)->next->bottom : (fci)->next->frame) :	\    read_register (SP_REGNUM));#define FRAME_CHAIN(thisframe) (sparc_frame_chain (thisframe))CORE_ADDR sparc_frame_chain ();/* Define other aspects of the stack frame.  *//* 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, FRAMELESS) \  (FRAMELESS) = frameless_look_for_prologue(FI)/* Where is the PC for a specific frame */#define FRAME_SAVED_PC(FRAME) frame_saved_pc (FRAME)CORE_ADDR frame_saved_pc ();/* If the argument is on the stack, it will be here.  */#define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)#define FRAME_STRUCT_ARGS_ADDRESS(fi) ((fi)->frame)#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)/* Set VAL to the number of args passed to frame described by FI.   Can set VAL to -1, meaning no way to tell.  *//* We can't tell how many args there are   now that the C compiler delays popping them.  */#define FRAME_NUM_ARGS(val,fi) (val = -1)/* Return number of bytes at start of arglist that are not really args.  */#define FRAME_ARGS_SKIP 68/* * The LBL version of gdb uses a modified approach for calling functions * in the inferior.  Vanilla gdb saves the inferior's cpu on the inferior's * stack.  This is silly since it easier to save it in the debugger. */#define NEW_CALL_FUNCTION#define FRAME_FIND_SAVED_REGS(fi, sr) \	frame_find_saved_regs(fi, &(sr))#define POP_FRAME sparc_pop_frame()/* Sparc has no reliable single step ptrace call */#define NO_SINGLE_STEP 1extern void single_step ();/* We need two arguments (in general) to the "info frame" command.   Note that the definition of this macro implies that there exists a   function "setup_arbitrary_frame" in sparc-tdep.c */#define FRAME_SPECIFICATION_DYADIC/* To print every pair of float registers as a double, we use this hook.  */#define	PRINT_REGISTER_HOOK(regno)	\  if (((regno) >= FP0_REGNUM)		\   && ((regno) <  FP0_REGNUM + 32)	\   && (0 == (regno & 1))) {		\    char doublereg[8];		/* two float regs */	\    if (!read_relative_register_raw_bytes (i  , doublereg  )	\     && !read_relative_register_raw_bytes (i+1, doublereg+4)) {	\      printf("\t");			\      print_floating (doublereg, builtin_type_double, stdout);	\    }					\  }/* Optimization for storing registers to the inferior.  The hook   DO_DEFERRED_STORES   actually executes any deferred stores.  It is called any time   we are going to proceed the child, or read its registers.   The hook CLEAR_DEFERRED_STORES is called when we want to throw   away the inferior process, e.g. when it dies or we kill it.   FIXME, this does not handle remote debugging cleanly.  */extern int deferred_stores;#define	DO_DEFERRED_STORES	\  if (deferred_stores)		\    target_store_registers (-2);#define	CLEAR_DEFERRED_STORES	\  deferred_stores = 0;/* * Where to find function arguments that don't have dbx symbols. * (i.e., this allows us to see function args in a backtrace when * no debugging symbols are present) */#define NAMELESS_ARG(fi, n, v) \	target_read_memory(32 + (fi)->bottom + 4 * n, (char *)&v, 4)

⌨️ 快捷键说明

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