X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcfgexpand.c;h=1d3ec8498269cc4fee57f5562744cec83a61999d;hb=c627001c253cefb4fbec1d0502a8710b6f746bbd;hp=fcae897a3925e11a491a8fe05e55f556fcf66c72;hpb=e6db644e168e952eba485ba7727808b3d24d4335;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index fcae897a392..1d3ec849826 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -36,6 +36,8 @@ along with GCC; see the file COPYING3. If not see #include "except.h" #include "flags.h" #include "diagnostic.h" +#include "tree-pretty-print.h" +#include "gimple-pretty-print.h" #include "toplev.h" #include "debug.h" #include "params.h" @@ -77,8 +79,12 @@ gimple_assign_rhs_to_tree (gimple stmt) { t = gimple_assign_rhs1 (stmt); /* Avoid modifying this tree in place below. */ - if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t) - && gimple_location (stmt) != EXPR_LOCATION (t)) + if ((gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t) + && gimple_location (stmt) != EXPR_LOCATION (t)) + || (gimple_block (stmt) + && currently_expanding_to_rtl + && EXPR_P (t) + && gimple_block (stmt) != TREE_BLOCK (t))) t = copy_node (t); } else @@ -86,6 +92,8 @@ gimple_assign_rhs_to_tree (gimple stmt) if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t)) SET_EXPR_LOCATION (t, gimple_location (stmt)); + if (gimple_block (stmt) && currently_expanding_to_rtl && EXPR_P (t)) + TREE_BLOCK (t) = gimple_block (stmt); return t; } @@ -494,12 +502,12 @@ update_alias_info_with_stack_vars (void) for (j = i; j != EOC; j = stack_vars[j].next) { tree decl = stack_vars[j].decl; - unsigned int uid = DECL_UID (decl); + unsigned int uid = DECL_PT_UID (decl); /* We should never end up partitioning SSA names (though they may end up on the stack). Neither should we allocate stack space to something that is unused and thus unreferenced. */ gcc_assert (DECL_P (decl) - && referenced_var_lookup (uid)); + && referenced_var_lookup (DECL_UID (decl))); bitmap_set_bit (part, uid); *((bitmap *) pointer_map_insert (decls_to_partitions, (void *)(size_t) uid)) = part; @@ -509,7 +517,7 @@ update_alias_info_with_stack_vars (void) /* Make the SSA name point to all partition members. */ pi = get_ptr_info (name); - pt_solution_set (&pi->pt, part); + pt_solution_set (&pi->pt, part, false, false); } /* Make all points-to sets that contain one member of a partition @@ -534,8 +542,6 @@ update_alias_info_with_stack_vars (void) add_partitioned_vars_to_ptset (&cfun->gimple_df->escaped, decls_to_partitions, visited, temp); - add_partitioned_vars_to_ptset (&cfun->gimple_df->callused, - decls_to_partitions, visited, temp); pointer_set_destroy (visited); pointer_map_destroy (decls_to_partitions); @@ -2352,7 +2358,8 @@ expand_debug_expr (tree exp) /* If op0 is not BLKmode, but BLKmode is, adjust_mode below would ICE. While it is likely a FE bug, try to be robust here. See PR43166. */ - || mode == BLKmode) + || mode == BLKmode + || (mode == VOIDmode && GET_MODE (op0) != VOIDmode)) { gcc_assert (MEM_P (op0)); op0 = adjust_address_nv (op0, mode, 0); @@ -2495,7 +2502,8 @@ expand_debug_expr (tree exp) { enum machine_mode addrmode, offmode; - gcc_assert (MEM_P (op0)); + if (!MEM_P (op0)) + return NULL; op0 = XEXP (op0, 0); addrmode = GET_MODE (op0); @@ -2555,13 +2563,14 @@ expand_debug_expr (tree exp) if (bitpos < 0) return NULL; + if (GET_MODE (op0) == BLKmode) + return NULL; + if ((bitpos % BITS_PER_UNIT) == 0 && bitsize == GET_MODE_BITSIZE (mode1)) { enum machine_mode opmode = GET_MODE (op0); - gcc_assert (opmode != BLKmode); - if (opmode == VOIDmode) opmode = mode1; @@ -2610,6 +2619,22 @@ expand_debug_expr (tree exp) return gen_rtx_FIX (mode, op0); case POINTER_PLUS_EXPR: + /* For the rare target where pointers are not the same size as + size_t, we need to check for mis-matched modes and correct + the addend. */ + if (op0 && op1 + && GET_MODE (op0) != VOIDmode && GET_MODE (op1) != VOIDmode + && GET_MODE (op0) != GET_MODE (op1)) + { + if (GET_MODE_BITSIZE (GET_MODE (op0)) < GET_MODE_BITSIZE (GET_MODE (op1))) + op1 = gen_rtx_TRUNCATE (GET_MODE (op0), op1); + else + /* We always sign-extend, regardless of the signedness of + the operand, because the operand is always unsigned + here even if the original C expression is signed. */ + op1 = gen_rtx_SIGN_EXTEND (GET_MODE (op0), op1); + } + /* Fall through. */ case PLUS_EXPR: return gen_rtx_PLUS (mode, op0, op1); @@ -3001,14 +3026,15 @@ expand_debug_expr (tree exp) if (SCALAR_INT_MODE_P (GET_MODE (op0)) && SCALAR_INT_MODE_P (mode)) { + enum machine_mode inner_mode = GET_MODE (op0); if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))) - op0 = gen_rtx_ZERO_EXTEND (mode, op0); + op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode); else - op0 = gen_rtx_SIGN_EXTEND (mode, op0); + op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode); if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1)))) - op1 = gen_rtx_ZERO_EXTEND (mode, op1); + op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode); else - op1 = gen_rtx_SIGN_EXTEND (mode, op1); + op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode); return gen_rtx_MULT (mode, op0, op1); } return NULL; @@ -3616,7 +3642,8 @@ discover_nonconstant_array_refs (void) for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { gimple stmt = gsi_stmt (gsi); - walk_gimple_op (stmt, discover_nonconstant_array_refs_r, NULL); + if (!is_gimple_debug (stmt)) + walk_gimple_op (stmt, discover_nonconstant_array_refs_r, NULL); } } @@ -3757,10 +3784,12 @@ gimple_expand_cfg (void) { if (cfun->calls_alloca) warning (OPT_Wstack_protector, - "not protecting local variables: variable length buffer"); + "stack protector not protecting local variables: " + "variable length buffer"); if (has_short_buffer && !crtl->stack_protect_guard) warning (OPT_Wstack_protector, - "not protecting function: no buffer at least %d bytes long", + "stack protector not protecting function: " + "all local arrays are less than %d bytes long", (int) PARAM_VALUE (PARAM_SSP_BUFFER_SIZE)); }