X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fexpr.h;h=4fddde6006ef6650d00ec69bf0af51aa80bb1986;hb=73faef308beb68f43956ec108d6dc61a4ed1b3d6;hp=24a391cc7f6d2a647e90a2e9af1ef3b62979c421;hpb=4b297e2e8e39dbf2c0c3ac6c00da3c3f4ac0f1e5;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/expr.h b/gcc/expr.h index 24a391cc7f6..4fddde6006e 100644 --- a/gcc/expr.h +++ b/gcc/expr.h @@ -1,6 +1,6 @@ /* Definitions for code generation pass of GNU compiler. Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -36,7 +36,7 @@ along with GCC; see the file COPYING3. If not see /* The default branch cost is 1. */ #ifndef BRANCH_COST -#define BRANCH_COST 1 +#define BRANCH_COST(speed_p, predictable_p) 1 #endif /* This is the 4th arg to `expand_expr'. @@ -66,10 +66,10 @@ enum expand_modifier {EXPAND_NORMAL = 0, EXPAND_STACK_PARM, EXPAND_SUM, #ifndef MOVE_RATIO #if defined (HAVE_movmemqi) || defined (HAVE_movmemhi) || defined (HAVE_movmemsi) || defined (HAVE_movmemdi) || defined (HAVE_movmemti) -#define MOVE_RATIO 2 +#define MOVE_RATIO(speed) 2 #else /* If we are optimizing for space (-Os), cut down the default move ratio. */ -#define MOVE_RATIO (optimize_size ? 3 : 15) +#define MOVE_RATIO(speed) ((speed) ? 15 : 3) #endif #endif @@ -78,10 +78,10 @@ enum expand_modifier {EXPAND_NORMAL = 0, EXPAND_STACK_PARM, EXPAND_SUM, #ifndef CLEAR_RATIO #if defined (HAVE_setmemqi) || defined (HAVE_setmemhi) || defined (HAVE_setmemsi) || defined (HAVE_setmemdi) || defined (HAVE_setmemti) -#define CLEAR_RATIO 2 +#define CLEAR_RATIO(speed) 2 #else /* If we are optimizing for space, cut down the default clear ratio. */ -#define CLEAR_RATIO (optimize_size ? 3 : 15) +#define CLEAR_RATIO(speed) ((speed) ? 15 :3) #endif #endif @@ -89,7 +89,7 @@ enum expand_modifier {EXPAND_NORMAL = 0, EXPAND_STACK_PARM, EXPAND_SUM, SET_RATIO or more simple move-instruction sequences, we will do a movmem or libcall instead. */ #ifndef SET_RATIO -#define SET_RATIO MOVE_RATIO +#define SET_RATIO(speed) MOVE_RATIO(speed) #endif enum direction {none, upward, downward}; @@ -208,30 +208,51 @@ do { \ /* Provide default values for the macros controlling stack checking. */ +/* The default is neither full builtin 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 +/* ...nor static builtin stack checking. */ +#ifndef STACK_CHECK_STATIC_BUILTIN +#define STACK_CHECK_STATIC_BUILTIN 0 #endif -/* The default is to do a store into the stack. */ -#ifndef STACK_CHECK_PROBE_LOAD -#define STACK_CHECK_PROBE_LOAD 0 +/* The default interval is one page (4096 bytes). */ +#ifndef STACK_CHECK_PROBE_INTERVAL_EXP +#define STACK_CHECK_PROBE_INTERVAL_EXP 12 #endif -/* This value is arbitrary, but should be sufficient for most machines. */ +/* The default is not to move the stack pointer. */ +#ifndef STACK_CHECK_MOVING_SP +#define STACK_CHECK_MOVING_SP 0 +#endif + +/* This is a kludge to try to capture the discrepancy between the old + mechanism (generic stack checking) and the new mechanism (static + builtin stack checking). STACK_CHECK_PROTECT needs to be bumped + for the latter because part of the protection area is effectively + included in STACK_CHECK_MAX_FRAME_SIZE for the former. */ +#ifdef STACK_CHECK_PROTECT +#define STACK_OLD_CHECK_PROTECT STACK_CHECK_PROTECT +#else +#define STACK_OLD_CHECK_PROTECT \ + (USING_SJLJ_EXCEPTIONS ? 75 * UNITS_PER_WORD : 8 * 1024) +#endif + +/* Minimum amount of stack required to recover from an anticipated stack + overflow detection. The default value conveys an estimate of the amount + of stack required to propagate an exception. */ #ifndef STACK_CHECK_PROTECT -#define STACK_CHECK_PROTECT (75 * UNITS_PER_WORD) +#define STACK_CHECK_PROTECT \ + (USING_SJLJ_EXCEPTIONS ? 75 * UNITS_PER_WORD : 12 * 1024) #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) + ((1 << STACK_CHECK_PROBE_INTERVAL_EXP) - UNITS_PER_WORD) #endif /* This is arbitrary, but should be large enough everywhere. */ @@ -246,6 +267,17 @@ do { \ #define STACK_CHECK_MAX_VAR_SIZE (STACK_CHECK_MAX_FRAME_SIZE / 100) #endif +/* This structure is used to pass around information about exploded + unary, binary and trinary expressions between expand_expr_real_1 and + friends. */ +typedef struct separate_ops +{ + enum tree_code code; + tree type; + tree op0, op1, op2; + location_t location; +} *sepops; + /* Functions from optabs.c, commonly used, and without need for the optabs tables: */ @@ -277,6 +309,9 @@ extern rtx expand_simple_unop (enum machine_mode, enum rtx_code, rtx, rtx, perform the operation described by CODE and MODE. */ extern int have_insn_for (enum rtx_code, enum machine_mode); +extern rtx prepare_operand (int, rtx, int, enum machine_mode, enum machine_mode, + int); + /* Emit code to make a call to a constant function or a library call. */ extern void emit_libcall_block (rtx, rtx, rtx, rtx); @@ -342,6 +377,9 @@ extern rtx emit_store_flag_force (rtx, enum rtx_code, rtx, rtx, /* Functions from builtins.c: */ extern rtx expand_builtin (tree, rtx, rtx, enum machine_mode, int); extern tree std_build_builtin_va_list (void); +extern tree std_fn_abi_va_list (tree); +extern tree std_canonical_va_list_type (tree); + extern void std_expand_builtin_va_start (tree, rtx); extern rtx default_expand_builtin (tree, rtx, rtx, enum machine_mode, int); extern void expand_builtin_setjmp_setup (rtx, rtx); @@ -352,9 +390,9 @@ extern rtx builtin_strncpy_read_str (void *, HOST_WIDE_INT, enum machine_mode); /* Functions from expr.c: */ -/* This is run once per compilation to set up which modes can be used - directly in memory and to initialize the block move optab. */ -extern void init_expr_once (void); +/* This is run during target initialization to set up which modes can be + used directly in memory and to initialize the block move optab. */ +extern void init_expr_target (void); /* This is run at the start of compiling a function. */ extern void init_expr (void); @@ -380,6 +418,7 @@ enum block_op_methods BLOCK_OP_TAILCALL }; +extern GTY(()) tree block_clear_fn; extern void init_block_move_fn (const char *); extern void init_block_clear_fn (const char *); @@ -387,6 +426,7 @@ extern rtx emit_block_move (rtx, rtx, rtx, enum block_op_methods); extern rtx emit_block_move_via_libcall (rtx, rtx, rtx, bool); extern rtx emit_block_move_hints (rtx, rtx, rtx, enum block_op_methods, unsigned int, HOST_WIDE_INT); +extern bool emit_storent_insn (rtx to, rtx from); /* Copy all or part of a value X into registers starting at REGNO. The number of registers to be filled is NREGS. */ @@ -439,7 +479,7 @@ extern rtx clear_storage_hints (rtx, rtx, enum block_op_methods, rtx set_storage_via_libcall (rtx, rtx, rtx, bool); /* Expand a setmem pattern; return true if successful. */ -extern bool set_storage_via_setmem (rtx, rtx, rtx, unsigned int, +extern bool set_storage_via_setmem (rtx, rtx, rtx, unsigned int, unsigned int, HOST_WIDE_INT); /* Determine whether the LEN bytes can be moved by using several move @@ -500,9 +540,13 @@ extern rtx store_expr (tree, rtx, int, bool); Useful after calling expand_expr with 1 as sum_ok. */ extern rtx force_operand (rtx, rtx); -/* Work horse for expand_expr. */ -extern rtx expand_expr_real (tree, rtx, enum machine_mode, +/* Work horses for expand_expr. */ +extern rtx expand_expr_real (tree, rtx, enum machine_mode, enum expand_modifier, rtx *); +extern rtx expand_expr_real_1 (tree, rtx, enum machine_mode, + enum expand_modifier, rtx *); +extern rtx expand_expr_real_2 (sepops, rtx, enum machine_mode, + enum expand_modifier); /* Generate code for computing expression EXP. An rtx for the computed value is returned. The value is never null. @@ -520,8 +564,6 @@ expand_normal (tree exp) return expand_expr_real (exp, NULL_RTX, VOIDmode, EXPAND_NORMAL, NULL); } -extern void expand_var (tree); - /* At the start of a function, record that we have no previously-pushed arguments waiting to be popped. */ extern void init_pending_stack_adjust (void); @@ -541,29 +583,25 @@ extern void do_pending_stack_adjust (void); extern tree string_constant (tree, tree *); /* Generate code to evaluate EXP and jump to LABEL if the value is zero. */ -extern void jumpifnot (tree, rtx); +extern void jumpifnot (tree, rtx, int); +extern void jumpifnot_1 (enum tree_code, tree, tree, rtx, int); /* Generate code to evaluate EXP and jump to LABEL if the value is nonzero. */ -extern void jumpif (tree, rtx); +extern void jumpif (tree, rtx, int); +extern void jumpif_1 (enum tree_code, tree, tree, rtx, int); /* Generate code to evaluate EXP and jump to IF_FALSE_LABEL if the result is zero, or IF_TRUE_LABEL if the result is one. */ -extern void do_jump (tree, rtx, rtx); +extern void do_jump (tree, rtx, rtx, int); +extern void do_jump_1 (enum tree_code, tree, tree, rtx, rtx, int); -/* Generate rtl to compare two rtx's, will call emit_cmp_insn. */ -extern rtx compare_from_rtx (rtx, rtx, enum rtx_code, int, enum machine_mode, - rtx); extern void do_compare_rtx_and_jump (rtx, rtx, enum rtx_code, int, - enum machine_mode, rtx, rtx, rtx); + enum machine_mode, rtx, rtx, rtx, int); /* Two different ways of generating switch statements. */ -extern int try_casesi (tree, tree, tree, tree, rtx, rtx); +extern int try_casesi (tree, tree, tree, tree, rtx, rtx, rtx); extern int try_tablejump (tree, tree, tree, tree, rtx, rtx); -/* Smallest number of adjacent cases before we use a jump table. - XXX Should be a target hook. */ -extern unsigned int case_values_threshold (void); - /* Functions from alias.c */ #include "alias.h" @@ -580,7 +618,7 @@ extern HOST_WIDE_INT int_expr_size (tree); in its original home. This becomes invalid if any more code is emitted. */ extern rtx hard_function_value (const_tree, const_tree, const_tree, int); -extern rtx prepare_call_address (rtx, rtx, rtx *, int, int); +extern rtx prepare_call_address (tree, rtx, rtx, rtx *, int, int); extern bool shift_return_value (enum machine_mode, bool, rtx); @@ -612,12 +650,15 @@ extern rtx force_label_rtx (tree); The constant terms are added and stored via a second arg. */ extern rtx eliminate_constant_term (rtx, rtx *); -/* Convert arg to a valid memory address for specified machine mode, - by emitting insns to perform arithmetic if nec. */ -extern rtx memory_address (enum machine_mode, rtx); +/* Convert arg to a valid memory address for specified machine mode that points + to a specific named address space, by emitting insns to perform arithmetic + if necessary. */ +extern rtx memory_address_addr_space (enum machine_mode, rtx, addr_space_t); -/* Like `memory_address' but pretend `flag_force_addr' is 0. */ -extern rtx memory_address_noforce (enum machine_mode, rtx); +/* Like memory_address_addr_space, except assume the memory address points to + the generic named address space. */ +#define memory_address(MODE,RTX) \ + memory_address_addr_space ((MODE), (RTX), ADDR_SPACE_GENERIC) /* Return a memory reference like MEMREF, but with its mode changed to MODE and its address changed to ADDR. @@ -676,6 +717,11 @@ extern void set_mem_attributes (rtx, tree, int); expecting that it'll be added back in later. */ extern void set_mem_attributes_minus_bitpos (rtx, tree, int, HOST_WIDE_INT); +/* Return OFFSET if XEXP (MEM, 0) - OFFSET is known to be ALIGN + bits aligned for 0 <= OFFSET < ALIGN / BITS_PER_UNIT, or + -1 if not known. */ +extern int get_mem_align_offset (rtx, unsigned int); + /* Assemble the static constant template for function entry trampolines. */ extern rtx assemble_trampoline_template (void); @@ -698,8 +744,17 @@ extern rtx force_reg (enum machine_mode, rtx); /* Return given rtx, copied into a new temp reg if it was in memory. */ extern rtx force_not_mem (rtx); +/* Return mode and signedness to use when an argument or result in the + given mode is promoted. */ +extern enum machine_mode promote_function_mode (const_tree, enum machine_mode, int *, + const_tree, int); + +/* Return mode and signedness to use when an object in the given mode + is promoted. */ +extern enum machine_mode promote_mode (const_tree, enum machine_mode, int *); + /* Return mode and signedness to use when object is promoted. */ -extern enum machine_mode promote_mode (const_tree, enum machine_mode, int *, int); +enum machine_mode promote_decl_mode (const_tree, int *); /* Remove some bytes from the stack. An rtx says how many. */ extern void adjust_stack (rtx); @@ -707,6 +762,9 @@ extern void adjust_stack (rtx); /* Add some bytes to the stack. An rtx says how many. */ extern void anti_adjust_stack (rtx); +/* Add some bytes to the stack while probing it. An rtx says how many. */ +extern void anti_adjust_stack_and_probe (rtx, bool); + /* This enum is used for the following two functions. */ enum save_level {SAVE_BLOCK, SAVE_FUNCTION, SAVE_NONLOCAL}; @@ -724,15 +782,14 @@ extern void update_nonlocal_goto_save_area (void); extern rtx allocate_dynamic_stack_space (rtx, rtx, int); /* 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. */ + 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 them from the stack pointer. */ extern void probe_stack_range (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. */ -extern rtx hard_libcall_value (enum machine_mode); +extern rtx hard_libcall_value (enum machine_mode, rtx); /* Return the mode desired by operand N of a particular bitfield insert/extract insn, or MAX_MACHINE_MODE if no such insn is @@ -747,11 +804,14 @@ extern void store_bit_field (rtx, unsigned HOST_WIDE_INT, extern rtx extract_bit_field (rtx, unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, int, rtx, enum machine_mode, enum machine_mode); +extern rtx extract_low_bits (enum machine_mode, enum machine_mode, rtx); extern rtx expand_mult (enum machine_mode, rtx, rtx, rtx, int); extern rtx expand_mult_highpart_adjust (enum machine_mode, rtx, rtx, rtx, rtx, int); extern rtx assemble_static_space (unsigned HOST_WIDE_INT); extern int safe_from_p (const_rtx, tree, int); +extern bool split_comparison (enum rtx_code, enum machine_mode, + enum rtx_code *, enum rtx_code *); /* Call this once to initialize the contents of the optabs appropriately for the current target machine. */ @@ -760,6 +820,13 @@ extern void init_all_optabs (void); /* Call this to initialize an optab function entry. */ extern rtx init_one_libfunc (const char *); +extern rtx set_user_assembler_libfunc (const char *, const char *); + +/* Build a decl for a libfunc named NAME. */ +extern tree build_libfunc_function (const char *); + +/* Get the personality libfunc for a function decl. */ +rtx get_personality_function (tree); extern int vector_mode_valid_p (enum machine_mode);