diff options
Diffstat (limited to 'contrib/gcc/expr.h')
-rw-r--r-- | contrib/gcc/expr.h | 193 |
1 files changed, 157 insertions, 36 deletions
diff --git a/contrib/gcc/expr.h b/contrib/gcc/expr.h index cac7381..a53a036 100644 --- a/contrib/gcc/expr.h +++ b/contrib/gcc/expr.h @@ -1,5 +1,5 @@ /* Definitions for code generation pass of GNU compiler. - Copyright (C) 1987, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. + Copyright (C) 1987, 91-97, 1998 Free Software Foundation, Inc. This file is part of GNU CC. @@ -18,13 +18,6 @@ along with GNU CC; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#ifndef __STDC__ -#ifndef const -#define const -#endif -#endif - /* The default branch cost is 1. */ #ifndef BRANCH_COST #define BRANCH_COST 1 @@ -37,7 +30,8 @@ Boston, MA 02111-1307, USA. */ /* The variable for which an increment is queued. */ #define QUEUED_VAR(P) XEXP (P, 0) /* If the increment has been emitted, this is the insn - that does the increment. It is zero before the increment is emitted. */ + that does the increment. It is zero before the increment is emitted. + If more than one insn is emitted, this is the first insn. */ #define QUEUED_INSN(P) XEXP (P, 1) /* If a pre-increment copy has been generated, this is the copy (it is a temporary reg). Zero if no copy made yet. */ @@ -52,9 +46,27 @@ Boston, MA 02111-1307, USA. */ EXPAND_SUM means it is ok to return a PLUS rtx or MULT rtx. EXPAND_INITIALIZER is similar but also record any labels on forced_labels. EXPAND_CONST_ADDRESS means it is ok to return a MEM whose address - is a constant that is not a legitimate address. */ + is a constant that is not a legitimate address. + EXPAND_MEMORY_USE_* are explained below. */ enum expand_modifier {EXPAND_NORMAL, EXPAND_SUM, - EXPAND_CONST_ADDRESS, EXPAND_INITIALIZER}; + EXPAND_CONST_ADDRESS, EXPAND_INITIALIZER, + EXPAND_MEMORY_USE_WO, EXPAND_MEMORY_USE_RW, + EXPAND_MEMORY_USE_BAD, EXPAND_MEMORY_USE_DONT}; + +/* Argument for chkr_* functions. + MEMORY_USE_RO: the pointer reads memory. + MEMORY_USE_WO: the pointer writes to memory. + MEMORY_USE_RW: the pointer modifies memory (ie it reads and writes). An + example is (*ptr)++ + MEMORY_USE_BAD: use this if you don't know the behavior of the pointer, or + if you know there are no pointers. Using an INDIRECT_REF + with MEMORY_USE_BAD will abort. + MEMORY_USE_TW: just test for writing, without update. Special. + MEMORY_USE_DONT: the memory is neither read nor written. This is used by + '->' and '.'. */ +enum memory_use_mode {MEMORY_USE_BAD = 0, MEMORY_USE_RO = 1, + MEMORY_USE_WO = 2, MEMORY_USE_RW = 3, + MEMORY_USE_TW = 6, MEMORY_USE_DONT = 99}; /* List of labels that must never be deleted. */ extern rtx forced_labels; @@ -115,17 +127,15 @@ extern tree nonlocal_labels; These are the arguments to function calls that have already returned. */ extern int pending_stack_adjust; -/* A list of all cleanups which belong to the arguments of - function calls being expanded by expand_call. */ -#ifdef TREE_CODE /* Don't lose if tree.h not included. */ -extern tree cleanups_this_call; -#endif - /* When temporaries are created by TARGET_EXPRs, they are created at this level of temp_slot_level, so that they can remain allocated until no longer needed. CLEANUP_POINT_EXPRs define the lifetime of TARGET_EXPRs. */ extern int target_temp_slot_level; + +/* Current level for normal temporaries. */ + +extern int temp_slot_level; #ifdef TREE_CODE /* Don't lose if tree.h not included. */ /* Structure to record the size of a sequence of arguments @@ -133,7 +143,7 @@ extern int target_temp_slot_level; struct args_size { - int constant; + HOST_WIDE_INT constant; tree var; }; #endif @@ -163,7 +173,7 @@ struct args_size ((SIZE).var == 0 ? GEN_INT ((SIZE).constant) \ : expand_expr (size_binop (PLUS_EXPR, (SIZE).var, \ size_int ((SIZE).constant)), \ - NULL_RTX, VOIDmode, 0)) + NULL_RTX, VOIDmode, EXPAND_MEMORY_USE_BAD)) /* Convert the implicit sum in a `struct args_size' into a tree. */ #define ARGS_SIZE_TREE(SIZE) \ @@ -195,6 +205,11 @@ enum direction {none, upward, downward}; /* Value has this type. */ #define FUNCTION_ARG_BOUNDARY(MODE, TYPE) PARM_BOUNDARY #endif +/* Provide a default value for STRICT_ARGUMENT_NAMING. */ +#ifndef STRICT_ARGUMENT_NAMING +#define STRICT_ARGUMENT_NAMING 0 +#endif + /* Nonzero if we do not know how to pass TYPE solely in registers. We cannot do so in the following cases: @@ -211,6 +226,7 @@ enum direction {none, upward, downward}; /* Value has this type. */ So a value padded in memory at the upper end can't go in a register. For a little-endian machine, the reverse is true. */ +#ifndef MUST_PASS_IN_STACK #define MUST_PASS_IN_STACK(MODE,TYPE) \ ((TYPE) != 0 \ && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \ @@ -221,6 +237,7 @@ enum direction {none, upward, downward}; /* Value has this type. */ % (PARM_BOUNDARY / BITS_PER_UNIT))) \ && (FUNCTION_ARG_PADDING (MODE, TYPE) \ == (BYTES_BIG_ENDIAN ? upward : downward))))) +#endif /* Nonzero if type TYPE should be returned in memory. Most machines can use the following default definition. */ @@ -228,6 +245,60 @@ enum direction {none, upward, downward}; /* Value has this type. */ #ifndef RETURN_IN_MEMORY #define RETURN_IN_MEMORY(TYPE) (TYPE_MODE (TYPE) == BLKmode) #endif + +/* Supply a default definition of STACK_SAVEAREA_MODE for emit_stack_save. + Normally move_insn, so Pmode stack pointer. */ + +#ifndef STACK_SAVEAREA_MODE +#define STACK_SAVEAREA_MODE(LEVEL) Pmode +#endif + +/* Supply a default definition of STACK_SIZE_MODE for + allocate_dynamic_stack_space. Normally PLUS/MINUS, so word_mode. */ + +#ifndef STACK_SIZE_MODE +#define STACK_SIZE_MODE word_mode +#endif + +/* Provide default values for the macros controlling stack checking. */ + +#ifndef STACK_CHECK_BUILTIN +#define STACK_CHECK_BUILTIN 0 +#endif + +/* The default interval is one page. */ +#ifndef STACK_CHECK_PROBE_INTERVAL +#define STACK_CHECK_PROBE_INTERVAL 4096 +#endif + +/* The default is to do a store into the stack. */ +#ifndef STACK_CHECK_PROBE_LOAD +#define STACK_CHECK_PROBE_LOAD 0 +#endif + +/* This value is arbitrary, but should be sufficient for most machines. */ +#ifndef STACK_CHECK_PROTECT +#define STACK_CHECK_PROTECT (75 * UNITS_PER_WORD) +#endif + +/* Make the maximum frame size be the largest we can and still only need + one probe per function. */ +#ifndef STACK_CHECK_MAX_FRAME_SIZE +#define STACK_CHECK_MAX_FRAME_SIZE \ + (STACK_CHECK_PROBE_INTERVAL - UNITS_PER_WORD) +#endif + +/* This is arbitrary, but should be large enough everywhere. */ +#ifndef STACK_CHECK_FIXED_FRAME_SIZE +#define STACK_CHECK_FIXED_FRAME_SIZE (4 * UNITS_PER_WORD) +#endif + +/* Provide a reasonable default for the maximum size of an object to + allocate in the fixed frame. We may need to be able to make this + controllable by the user at some point. */ +#ifndef STACK_CHECK_MAX_VAR_SIZE +#define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100) +#endif /* Optabs are tables saying how to generate insn bodies for various machine modes and numbers of operands. @@ -270,7 +341,7 @@ typedef struct optab #define GEN_FCN(CODE) (*insn_gen_function[(int) (CODE)]) #endif -extern rtx (*const insn_gen_function[]) (); +extern rtx (*const insn_gen_function[]) PROTO ((rtx, ...)); extern optab add_optab; extern optab sub_optab; @@ -365,6 +436,13 @@ extern rtx bcmp_libfunc; extern rtx memset_libfunc; extern rtx bzero_libfunc; +extern rtx throw_libfunc; +extern rtx sjthrow_libfunc; +extern rtx sjpopnthrow_libfunc; +extern rtx terminate_libfunc; +extern rtx setjmp_libfunc; +extern rtx longjmp_libfunc; + extern rtx eqhf2_libfunc; extern rtx nehf2_libfunc; extern rtx gthf2_libfunc; @@ -447,8 +525,15 @@ extern rtx fixunsxfti_libfunc; extern rtx fixunstfsi_libfunc; extern rtx fixunstfdi_libfunc; extern rtx fixunstfti_libfunc; + +/* For check-memory-usage. */ +extern rtx chkr_check_addr_libfunc; +extern rtx chkr_set_right_libfunc; +extern rtx chkr_copy_bitmap_libfunc; +extern rtx chkr_check_exec_libfunc; +extern rtx chkr_check_str_libfunc; -typedef rtx (*rtxfun) (); +typedef rtx (*rtxfun) PROTO ((rtx)); /* Indexed by the rtx-code for a conditional (eg. EQ, LT,...) gives the gen_function to make a branch to test that condition. */ @@ -462,7 +547,7 @@ extern rtxfun bcc_gen_fctn[NUM_RTX_CODE]; extern enum insn_code setcc_gen_code[NUM_RTX_CODE]; #ifdef HAVE_conditional_move -/* Indexed by the the machine mode, gives the insn code to make a conditional +/* Indexed by the machine mode, gives the insn code to make a conditional move insn. */ extern enum insn_code movcc_gen_code[NUM_MACHINE_MODES]; @@ -471,6 +556,9 @@ extern enum insn_code movcc_gen_code[NUM_MACHINE_MODES]; /* This array records the insn_code of insns to perform block moves. */ extern enum insn_code movstr_optab[NUM_MACHINE_MODES]; +/* This array records the insn_code of insns to perform block clears. */ +extern enum insn_code clrstr_optab[NUM_MACHINE_MODES]; + /* Define functions given in optabs.c. */ /* Expand a binary operation given optab and rtx operands. */ @@ -533,6 +621,7 @@ rtx emit_conditional_move PROTO((rtx, enum rtx_code, rtx, rtx, /* Return non-zero if the conditional move is supported. */ int can_conditionally_move_p PROTO((enum machine_mode mode)); + #endif /* Create but don't emit one rtl instruction to add one rtx into another. @@ -582,10 +671,17 @@ extern rtx expand_and PROTO((rtx, rtx, rtx)); extern rtx emit_store_flag PROTO((rtx, enum rtx_code, rtx, rtx, enum machine_mode, int, int)); +/* Like emit_store_flag, but always succeeds. */ +extern rtx emit_store_flag_force PROTO((rtx, enum rtx_code, rtx, rtx, + enum machine_mode, int, int)); + /* Functions from loop.c: */ /* Given a JUMP_INSN, return a description of the test being made. */ extern rtx get_condition PROTO((rtx, rtx *)); + +/* Generate a conditional trap instruction. */ +extern rtx gen_cond_trap PROTO((enum rtx_code, rtx, rtx, rtx)); /* Functions from expr.c: */ @@ -614,7 +710,7 @@ extern rtx convert_to_mode PROTO((enum machine_mode, rtx, int)); extern rtx convert_modes PROTO((enum machine_mode, enum machine_mode, rtx, int)); /* Emit code to move a block Y to a block X. */ -extern void emit_block_move PROTO((rtx, rtx, rtx, int)); +extern rtx emit_block_move PROTO((rtx, rtx, rtx, int)); /* Copy all or part of a value X into registers starting at REGNO. The number of registers to be filled is NREGS. */ @@ -624,15 +720,25 @@ extern void move_block_to_reg PROTO((int, rtx, int, enum machine_mode)); The number of registers to be filled is NREGS. */ extern void move_block_from_reg PROTO((int, rtx, int, int)); +/* Load a BLKmode value into non-consecutive registers represented by a + PARALLEL. */ +extern void emit_group_load PROTO((rtx, rtx, int, int)); +/* Store a BLKmode value from non-consecutive registers represented by a + PARALLEL. */ +extern void emit_group_store PROTO((rtx, rtx, int, int)); + /* Mark REG as holding a parameter for the next CALL_INSN. */ -extern void use_reg PROTO((rtx*, rtx)); +extern void use_reg PROTO((rtx *, rtx)); /* Mark NREGS consecutive regs, starting at REGNO, as holding parameters for the next CALL_INSN. */ -extern void use_regs PROTO((rtx*, int, int)); +extern void use_regs PROTO((rtx *, int, int)); +/* Mark a PARALLEL as holding a parameter for the next CALL_INSN. */ +extern void use_group_regs PROTO((rtx *, rtx)); /* Write zeros through the storage of OBJECT. - If OBJECT has BLKmode, SIZE is its length in bytes. */ -extern void clear_storage PROTO((rtx, rtx)); + If OBJECT has BLKmode, SIZE is its length in bytes and ALIGN is its + alignment. */ +extern rtx clear_storage PROTO((rtx, rtx, int)); /* Emit insns to set X from Y. */ extern rtx emit_move_insn PROTO((rtx, rtx)); @@ -650,7 +756,7 @@ extern rtx gen_push_operand PROTO((void)); #ifdef TREE_CODE /* Generate code to push something onto the stack, given its mode and type. */ extern void emit_push_insn PROTO((rtx, enum machine_mode, tree, rtx, int, - int, rtx, int, rtx, rtx)); + int, rtx, int, rtx, rtx, int)); /* Emit library call. */ extern void emit_library_call PVPROTO((rtx orgfun, int no_queue, @@ -673,6 +779,8 @@ extern rtx store_expr PROTO((tree, rtx, int)); Useful after calling expand_expr with 1 as sum_ok. */ extern rtx force_operand PROTO((rtx, rtx)); +extern rtx expand_builtin_setjmp PROTO((rtx, rtx, rtx, rtx)); + #ifdef TREE_CODE /* Generate code for computing expression EXP. An rtx for the computed value is returned. The value is never null. @@ -693,9 +801,6 @@ extern void clear_pending_stack_adjust PROTO((void)); extern void do_pending_stack_adjust PROTO((void)); #ifdef TREE_CODE -/* Expand all cleanups up to OLD_CLEANUPS. */ -extern void expand_cleanups_to PROTO((tree)); - /* Generate code to evaluate EXP and jump to LABEL if the value is zero. */ extern void jumpifnot PROTO((tree, rtx)); @@ -828,8 +933,12 @@ extern void emit_stack_restore PROTO((enum save_level, rtx, rtx)); says how many bytes. */ extern rtx allocate_dynamic_stack_space PROTO((rtx, rtx, int)); -/* Emit code to copy function value to a new temp reg and return that reg. */ -extern rtx function_value (); +/* Probe a range of stack addresses from FIRST to FIRST+SIZE, inclusive. + FIRST is a constant and size is a Pmode RTX. These are offsets from the + current stack pointer. STACK_GROWS_DOWNWARD says whether to add or + subtract from the stack. If SIZE is constant, this is done + with a fixed number of probes. Otherwise, we must make a loop. */ +extern void probe_stack_range PROTO((HOST_WIDE_INT, rtx)); /* Return an rtx that refers to the value returned by a library call in its original home. This becomes invalid if any more code is emitted. */ @@ -839,16 +948,28 @@ extern rtx hard_libcall_value PROTO((enum machine_mode)); of STACK_BOUNDARY / BITS_PER_UNIT. */ extern rtx round_push PROTO((rtx)); -extern void emit_block_move PROTO((rtx, rtx, rtx, int)); - extern rtx store_bit_field PROTO((rtx, int, int, enum machine_mode, rtx, int, int)); extern rtx extract_bit_field PROTO((rtx, int, int, int, rtx, enum machine_mode, enum machine_mode, int, int)); extern rtx expand_mult PROTO((enum machine_mode, rtx, rtx, rtx, int)); extern rtx expand_mult_add PROTO((rtx, rtx, rtx, rtx,enum machine_mode, int)); +extern rtx expand_mult_highpart_adjust PROTO((enum machine_mode, rtx, rtx, rtx, rtx, int)); extern rtx assemble_static_space PROTO((int)); /* Hook called by expand_expr for language-specific tree codes. It is up to the language front end to install a hook if it has any such codes that expand_expr needs to know about. */ -extern rtx (*lang_expand_expr) (); +extern rtx (*lang_expand_expr) PROTO ((union tree_node *, rtx, + enum machine_mode, + enum expand_modifier modifier)); + +extern void init_all_optabs PROTO ((void)); +extern void init_mov_optab PROTO ((void)); +extern void do_jump_by_parts_equality_rtx PROTO((rtx, rtx, rtx)); +extern void do_jump_by_parts_greater_rtx PROTO ((enum machine_mode, int, + rtx, rtx, rtx, rtx)); + +#ifdef TREE_CODE /* Don't lose if tree.h not included. */ +extern void mark_seen_cases PROTO ((tree, unsigned char *, + long, int)); +#endif |