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

📄 avr.h

📁 linux下的gcc编译器
💻 H
📖 第 1 页 / 共 5 页
字号:
   address.  On some machines it may depend on the data type of the   function.   If `ARGS_GROW_DOWNWARD', this is the offset to the location above   the first argument's address.  *//* `STACK_DYNAMIC_OFFSET (FUNDECL)'   Offset from the stack pointer register to an item dynamically   allocated on the stack, e.g., by `alloca'.   The default value for this macro is `STACK_POINTER_OFFSET' plus the   length of the outgoing arguments.  The default is correct for most   machines.  See `function.c' for details.  */#define STACK_BOUNDARY 8/* Define this macro if there is a guaranteed alignment for the stack   pointer on this machine.  The definition is a C expression for the   desired alignment (measured in bits).  This value is used as a   default if PREFERRED_STACK_BOUNDARY is not defined.  */#define STACK_POINTER_REGNUM 32/* The register number of the stack pointer register, which must also   be a fixed register according to `FIXED_REGISTERS'.  On most   machines, the hardware determines which register this is.  */#define FRAME_POINTER_REGNUM REG_Y/* The register number of the frame pointer register, which is used to   access automatic variables in the stack frame.  On some machines,   the hardware determines which register this is.  On other   machines, you can choose any register you wish for this purpose.  */#define ARG_POINTER_REGNUM 34/* The register number of the arg pointer register, which is used to   access the function's argument list.  On some machines, this is   the same as the frame pointer register.  On some machines, the   hardware determines which register this is.  On other machines,   you can choose any register you wish for this purpose.  If this is   not the same register as the frame pointer register, then you must   mark it as a fixed register according to `FIXED_REGISTERS', or   arrange to be able to eliminate it (*note Elimination::.).  */#define STATIC_CHAIN_REGNUM 2/* Register numbers used for passing a function's static chain   pointer.  If register windows are used, the register number as   seen by the called function is `STATIC_CHAIN_INCOMING_REGNUM',   while the register number as seen by the calling function is   `STATIC_CHAIN_REGNUM'.  If these registers are the same,   `STATIC_CHAIN_INCOMING_REGNUM' need not be defined.   The static chain register need not be a fixed register.   If the static chain is passed in memory, these macros should not be   defined; instead, the next two macros should be defined.  */#define FRAME_POINTER_REQUIRED frame_pointer_required_p()/* A C expression which is nonzero if a function must have and use a   frame pointer.  This expression is evaluated  in the reload pass.   If its value is nonzero the function will have a frame pointer.   The expression can in principle examine the current function and   decide according to the facts, but on most machines the constant 0   or the constant 1 suffices.  Use 0 when the machine allows code to   be generated with no frame pointer, and doing so saves some time   or space.  Use 1 when there is no possible advantage to avoiding a   frame pointer.   In certain cases, the compiler does not know how to produce valid   code without a frame pointer.  The compiler recognizes those cases   and automatically gives the function a frame pointer regardless of   what `FRAME_POINTER_REQUIRED' says.  You don't need to worry about   them.   In a function that does not require a frame pointer, the frame   pointer register can be allocated for ordinary usage, unless you   mark it as a fixed register.  See `FIXED_REGISTERS' for more   information.  */#define ELIMINABLE_REGS {					\      {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM},		\	{FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}		\       ,{FRAME_POINTER_REGNUM+1,STACK_POINTER_REGNUM+1}}/* If defined, this macro specifies a table of register pairs used to   eliminate unneeded registers that point into the stack frame.  If   it is not defined, the only elimination attempted by the compiler   is to replace references to the frame pointer with references to   the stack pointer.   The definition of this macro is a list of structure   initializations, each of which specifies an original and   replacement register.   On some machines, the position of the argument pointer is not   known until the compilation is completed.  In such a case, a   separate hard register must be used for the argument pointer.   This register can be eliminated by replacing it with either the   frame pointer or the argument pointer, depending on whether or not   the frame pointer has been eliminated.   In this case, you might specify:   #define ELIMINABLE_REGS  \   {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \   {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \   {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}   Note that the elimination of the argument pointer with the stack   pointer is specified first since that is the preferred elimination.  */#define CAN_ELIMINATE(FROM, TO) (((FROM) == ARG_POINTER_REGNUM		   \				  && (TO) == FRAME_POINTER_REGNUM)	   \				 || (((FROM) == FRAME_POINTER_REGNUM	   \				      || (FROM) == FRAME_POINTER_REGNUM+1) \				     && ! FRAME_POINTER_REQUIRED	   \				     ))/* A C expression that returns nonzero if the compiler is allowed to   try to replace register number FROM-REG with register number   TO-REG.  This macro need only be defined if `ELIMINABLE_REGS' is   defined, and will usually be the constant 1, since most of the   cases preventing register elimination are things that the compiler   already knows about.  */#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET)			\     OFFSET = initial_elimination_offset (FROM, TO)/* This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'.  It   specifies the initial difference between the specified pair of   registers.  This macro must be defined if `ELIMINABLE_REGS' is   defined.  */#define RETURN_ADDR_RTX(count, x) \  gen_rtx_MEM (Pmode, memory_address (Pmode, plus_constant (tem, 1)))#define PUSH_ROUNDING(NPUSHED) (NPUSHED)/* A C expression that is the number of bytes actually pushed onto the   stack when an instruction attempts to push NPUSHED bytes.   If the target machine does not have a push instruction, do not   define this macro.  That directs GNU CC to use an alternate   strategy: to allocate the entire argument block and then store the   arguments into it.   On some machines, the definition   #define PUSH_ROUNDING(BYTES) (BYTES)   will suffice.  But on other machines, instructions that appear to   push one byte actually push two bytes in an attempt to maintain   alignment.  Then the definition should be   #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1)  */#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0/* A C expression that should indicate the number of bytes of its own   arguments that a function pops on returning, or 0 if the function   pops no arguments and the caller must therefore pop them all after   the function returns.   FUNDECL is a C variable whose value is a tree node that describes   the function in question.  Normally it is a node of type   `FUNCTION_DECL' that describes the declaration of the function.   From this you can obtain the DECL_ATTRIBUTES of the   function.   FUNTYPE is a C variable whose value is a tree node that describes   the function in question.  Normally it is a node of type   `FUNCTION_TYPE' that describes the data type of the function.   From this it is possible to obtain the data types of the value and   arguments (if known).   When a call to a library function is being considered, FUNDECL   will contain an identifier node for the library function.  Thus, if   you need to distinguish among various library functions, you can   do so by their names.  Note that "library function" in this   context means a function used to perform arithmetic, whose name is   known specially in the compiler and was not mentioned in the C   code being compiled.   STACK-SIZE is the number of bytes of arguments passed on the   stack.  If a variable number of bytes is passed, it is zero, and   argument popping will always be the responsibility of the calling   function.   On the VAX, all functions always pop their arguments, so the   definition of this macro is STACK-SIZE.  On the 68000, using the   standard calling convention, no functions pop their arguments, so   the value of the macro is always 0 in this case.  But an   alternative calling convention is available in which functions   that take a fixed number of arguments pop them but other functions   (such as `printf') pop nothing (the caller pops all).  When this   convention is in use, FUNTYPE is examined to determine whether a   function takes a fixed number of arguments.  */#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) (function_arg (&(CUM), MODE, TYPE, NAMED))/* A C expression that controls whether a function argument is passed   in a register, and which register.   The arguments are CUM, which summarizes all the previous   arguments; MODE, the machine mode of the argument; TYPE, the data   type of the argument as a tree node or 0 if that is not known   (which happens for C support library functions); and NAMED, which   is 1 for an ordinary argument and 0 for nameless arguments that   correspond to `...' in the called function's prototype.   The value of the expression is usually either a `reg' RTX for the   hard register in which to pass the argument, or zero to pass the   argument on the stack.   For machines like the VAX and 68000, where normally all arguments   are pushed, zero suffices as a definition.   The value of the expression can also be a `parallel' RTX.  This is   used when an argument is passed in multiple locations.  The mode   of the of the `parallel' should be the mode of the entire   argument.  The `parallel' holds any number of `expr_list' pairs;   each one describes where part of the argument is passed.  In each   `expr_list', the first operand can be either a `reg' RTX for the   hard register in which to pass this part of the argument, or zero   to pass the argument on the stack.  If this operand is a `reg',   then the mode indicates how large this part of the argument is.   The second operand of the `expr_list' is a `const_int' which gives   the offset in bytes into the entire argument where this part   starts.   The usual way to make the ANSI library `stdarg.h' work on a machine   where some arguments are usually passed in registers, is to cause   nameless arguments to be passed on the stack instead.  This is done   by making `FUNCTION_ARG' return 0 whenever NAMED is 0.   You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the   definition of this macro to determine if this argument is of a   type that must be passed in the stack.  If `REG_PARM_STACK_SPACE'   is not defined and `FUNCTION_ARG' returns nonzero for such an   argument, the compiler will abort.  If `REG_PARM_STACK_SPACE' is   defined, the argument will be computed in the stack and then   loaded into a register.  */typedef struct avr_args {  int nregs;			/* # registers available for passing */  int regno;			/* next available register number */} CUMULATIVE_ARGS;/* A C type for declaring a variable that is used as the first   argument of `FUNCTION_ARG' and other related values.  For some   target machines, the type `int' suffices and can hold the number   of bytes of argument so far.   There is no need to record in `CUMULATIVE_ARGS' anything about the   arguments that have been passed on the stack.  The compiler has   other variables to keep track of that.  For target machines on   which all arguments are passed on the stack, there is no need to   store anything in `CUMULATIVE_ARGS'; however, the data structure   must exist and should not be empty, so use `int'.  */#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) init_cumulative_args (&(CUM), FNTYPE, LIBNAME, INDIRECT)/* A C statement (sans semicolon) for initializing the variable CUM   for the state at the beginning of the argument list.  The variable   has type `CUMULATIVE_ARGS'.  The value of FNTYPE is the tree node   for the data type of the function which will receive the args, or 0   if the args are to a compiler support library function.  The value   of INDIRECT is nonzero when processing an indirect call, for   example a call through a function pointer.  The value of INDIRECT   is zero for a call to an explicitly named function, a library   function call, or when `INIT_CUMULATIVE_ARGS' is used to find   arguments for the function being compiled.      When processing a call to a compiler support library function,   LIBNAME identifies which one.  It is a `symbol_ref' rtx which   contains the name of the function, as a string.  LIBNAME is 0 when   an ordinary C function call is being processed.  Thus, each time   this macro is called, either LIBNAME or FNTYPE is nonzero, but   never both of them at once.   */#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED)	\  (function_arg_advance (&CUM, MODE, TYPE, NAMED))/* A C statement (sans semicolon) to update the summarizer variable   CUM to advance past an argument in the argument list.  The values   MODE, TYPE and NAMED describe that argument.  Once this is done,   the variable CUM is suitable for analyzing the *following*   argument with `FUNCTION_ARG', etc.      This macro need not do anything if the argument in question was   passed on the stack.  The compiler knows how to track the amount   of stack space used for arguments without any special help. */#define FUNCTION_ARG_REGNO_P(r) function_arg_regno_p(r)/* A C expression that is nonzero if REGNO is the number of a hard   register in which function arguments are sometimes passed.  This   does *not* include implicit arguments such as the static chain and   the structure-value address.  On many machines, no registers can be   used for this purpose since all function arguments are pushed on   the stack.  */extern int avr_reg_order[];#define RET_REGISTER avr_ret_register ()#define FUNCTION_VALUE(VALTYPE, FUNC) avr_function_value (VALTYPE, FUNC)

⌨️ 快捷键说明

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