re PR middle-end/31541 (cannot take address of bit field)

PR middle-end/31541
	* gimplify.c (mark_addressable): New function.
	(gimplify_modify_expr_rhs, gimplify_addr_expr, gimplify_expr): Use it.

	* gcc.c-torture/compile/pr31541.c: New.

From-SVN: r125971
This commit is contained in:
Jan Hubicka 2007-06-23 13:58:18 +02:00 committed by Jan Hubicka
parent bedd4d06f7
commit 936d04b695
4 changed files with 39 additions and 8 deletions

View File

@ -1,3 +1,9 @@
2007-06-23 Jan Hubicka <jh@suse.cz>
PR middle-end/31541
* gimplify.c (mark_addressable): New function.
(gimplify_modify_expr_rhs, gimplify_addr_expr, gimplify_expr): Use it.
2007-06-19 Uros Bizjak <ubizjak@gmail.com>
PR middle-end/32374

View File

@ -117,6 +117,17 @@ static enum gimplify_status gimplify_compound_expr (tree *, tree *, bool);
static bool cpt_same_type (tree a, tree b);
#endif
/* Mark X addressable. Unlike the langhook we expect X to be in gimple
form and we don't do any syntax checking. */
static void
mark_addressable (tree x)
{
while (handled_component_p (x))
x = TREE_OPERAND (x, 0);
if (TREE_CODE (x) != VAR_DECL && TREE_CODE (x) != PARM_DECL)
return ;
TREE_ADDRESSABLE (x) = 1;
}
/* Return a hash value for a formal temporary table entry. */
@ -3434,7 +3445,7 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
if (use_target)
{
CALL_EXPR_RETURN_SLOT_OPT (*from_p) = 1;
lang_hooks.mark_addressable (*to_p);
mark_addressable (*to_p);
}
}
@ -3957,6 +3968,8 @@ gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
the address of a call that returns a struct; see
gcc.dg/c99-array-lval-1.c. The gimplifier will correctly make
the implied temporary explicit. */
/* Mark the RHS addressable. */
ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p,
is_gimple_addressable, fb_either);
if (ret != GS_ERROR)
@ -3972,8 +3985,7 @@ gimplify_addr_expr (tree *expr_p, tree *pre_p, tree *post_p)
is set properly. */
recompute_tree_invariant_for_addr_expr (expr);
/* Mark the RHS addressable. */
lang_hooks.mark_addressable (TREE_OPERAND (expr, 0));
mark_addressable (TREE_OPERAND (expr, 0));
}
break;
}
@ -4011,7 +4023,7 @@ gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
&allows_mem, &allows_reg, &is_inout);
if (!allows_reg && allows_mem)
lang_hooks.mark_addressable (TREE_VALUE (link));
mark_addressable (TREE_VALUE (link));
tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
is_inout ? is_gimple_min_lval : is_gimple_lvalue,
@ -4140,7 +4152,7 @@ gimplify_asm_expr (tree *expr_p, tree *pre_p, tree *post_p)
{
tret = gimplify_expr (&TREE_VALUE (link), pre_p, post_p,
is_gimple_lvalue, fb_lvalue | fb_mayfail);
lang_hooks.mark_addressable (TREE_VALUE (link));
mark_addressable (TREE_VALUE (link));
if (tret == GS_ERROR)
{
error ("memory input %d is not directly addressable", i);
@ -5562,7 +5574,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
if (fallback == fb_lvalue)
{
*expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
lang_hooks.mark_addressable (*expr_p);
mark_addressable (*expr_p);
}
break;
@ -5575,7 +5587,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
if (fallback == fb_lvalue)
{
*expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
lang_hooks.mark_addressable (*expr_p);
mark_addressable (*expr_p);
}
break;
@ -5763,7 +5775,7 @@ gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p,
else if (fallback == fb_lvalue)
{
*expr_p = get_initialized_tmp_var (*expr_p, pre_p, post_p);
lang_hooks.mark_addressable (*expr_p);
mark_addressable (*expr_p);
}
else
ret = GS_ALL_DONE;

View File

@ -1,3 +1,7 @@
2007-06-22 Jan Hubicka <jh@suse.cz>
* gcc.c-torture/compile/pr31541.c: New.
2007-06-22 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/large-size-array-3.c: Fix dg-do compile directive.

View File

@ -0,0 +1,9 @@
typedef unsigned char Uchar;
struct scsi_mode_header {
unsigned char sense_data_len : 8;
};
int f(void)
{
struct scsi_mode_header md;
return *(Uchar*)&md;
}