------- Comment #16 from hubicka at ucw dot cz  2007-06-22 23:59 -------
Subject: Re:  [4.3 Regression] cannot take address of bit field

> 
> Yes.  It looks like a frontend bug if the tree was not marked addressable
> before gimplification but would need to after.

This does not seem to be so easy, sadly.  The occurences of missing
addressables are in a cases gimplifier expanding stuff into address
expression (so the address is not strictly taken in the language sense)

The attached patch bootstraps/regtests. I am simply using the gimple
code a-la ssa-alias.c to set the addressable flag instead of hooking
into frontend.

In some sense I like it because I don't think frontends needs to be in
busyness in computing TREE_ADDRESSABLE bit for middle end. On the other
hand I guess I should spend some time tomorrow to produce simple C++
testcases where the FE fails to set the bit.


Index: gimplify.c
===================================================================
--- gimplify.c  (revision 125921)
+++ gimplify.c  (working copy)
@@ -117,6 +117,17 @@ static enum gimplify_status gimplify_com
 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, 
            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 *
         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 *
             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 *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 *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
          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
          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
          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;


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31541

Reply via email to