On Sep 29, 2005, at 8:32 PM, Daniel Berlin wrote:


Any suggestions how to fix this?

The easiest thing is to store a version of unsigned_char_type_node
somewhere that has it's TYPE_ALIAS_SET set to 0, and use it there.
Whether this is the best solution, i'll leave to others :)


Something like this will fix the issue with TYPE_REF_CAN_ALIAS_ALL
by removing the use.  Maybe we could move may_alias to a bit in the
types and move TYPE_REF_CAN_ALIAS_ALL from the pointer type to the
type which is being accessed instead of this mess.

-- Pinski


Index: c-common.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-common.c,v
retrieving revision 1.653
diff -u -p -r1.653 c-common.c
--- c-common.c  27 Sep 2005 16:04:06 -0000      1.653
+++ c-common.c  30 Sep 2005 17:46:42 -0000
@@ -2668,9 +2668,6 @@ c_common_get_alias_set (tree t)
       || t == unsigned_char_type_node)
     return 0;
 
-  /* If it has the may_alias attribute, it can alias anything.  */
-  if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (t)))
-    return 0;
 
   /* The C standard specifically allows aliasing between signed and
      unsigned variants of the same type.  We treat the signed
Index: alias.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/alias.c,v
retrieving revision 1.254
diff -u -p -r1.254 alias.c
--- alias.c     21 Jul 2005 22:34:33 -0000      1.254
+++ alias.c     30 Sep 2005 17:46:42 -0000
@@ -587,6 +587,10 @@ get_alias_set (tree t)
       /* Now all we care about is the type.  */
       t = TREE_TYPE (t);
     }
+  
+  /* If it has the may_alias attribute, it can alias anything.  */
+  if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (t)))
+    return 0;
 
   /* Variant qualifiers don't affect the alias set, so get the main
      variant. If this is a type with a known alias set, return it.  */
Index: tree.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree.c,v
retrieving revision 1.505
diff -u -p -r1.505 tree.c
--- tree.c      14 Sep 2005 15:04:56 -0000      1.505
+++ tree.c      30 Sep 2005 17:46:42 -0000
@@ -4705,6 +4705,17 @@ build_pointer_type_for_mode (tree to_typ
 
   if (to_type == error_mark_node)
     return error_mark_node;
+  
+  if (can_alias_all)
+    {
+      to_type =
+       build_type_attribute_variant (ttype,
+                                     merge_attributes
+                                       (TYPE_ATTRIBUTES (to_type), 
+                                        tree_cons (get_identifier 
("may_alias"),
+                                                   NULL_TREE, NULL_TREE)));
+                                        
+    }
 
   /* In some cases, languages will have things that aren't a POINTER_TYPE
      (such as a RECORD_TYPE for fat pointers in Ada) as TYPE_POINTER_TO.
@@ -4721,14 +4732,13 @@ build_pointer_type_for_mode (tree to_typ
   /* First, if we already have a type for pointers to TO_TYPE and it's
      the proper mode, use it.  */
   for (t = TYPE_POINTER_TO (to_type); t; t = TYPE_NEXT_PTR_TO (t))
-    if (TYPE_MODE (t) == mode && TYPE_REF_CAN_ALIAS_ALL (t) == can_alias_all)
+    if (TYPE_MODE (t) == mode)
       return t;
 
   t = make_node (POINTER_TYPE);
 
   TREE_TYPE (t) = to_type;
   TYPE_MODE (t) = mode;
-  TYPE_REF_CAN_ALIAS_ALL (t) = can_alias_all;
   TYPE_NEXT_PTR_TO (t) = TYPE_POINTER_TO (to_type);
   TYPE_POINTER_TO (to_type) = t;
 
@@ -4754,6 +4764,18 @@ build_reference_type_for_mode (tree to_t
                               bool can_alias_all)
 {
   tree t;
+  
+    
+  if (can_alias_all)
+    {
+      to_type =
+       build_type_attribute_variant (ttype,
+                                     merge_attributes
+                                       (TYPE_ATTRIBUTES (to_type), 
+                                        tree_cons (get_identifier 
("may_alias"),
+                                                   NULL_TREE, NULL_TREE)));
+                                        
+    }
 
   /* In some cases, languages will have things that aren't a REFERENCE_TYPE
      (such as a RECORD_TYPE for fat pointers in Ada) as TYPE_REFERENCE_TO.
@@ -4770,14 +4792,13 @@ build_reference_type_for_mode (tree to_t
   /* First, if we already have a type for pointers to TO_TYPE and it's
      the proper mode, use it.  */
   for (t = TYPE_REFERENCE_TO (to_type); t; t = TYPE_NEXT_REF_TO (t))
-    if (TYPE_MODE (t) == mode && TYPE_REF_CAN_ALIAS_ALL (t) == can_alias_all)
+    if (TYPE_MODE (t) == mode)
       return t;
 
   t = make_node (REFERENCE_TYPE);
 
   TREE_TYPE (t) = to_type;
   TYPE_MODE (t) = mode;
-  TYPE_REF_CAN_ALIAS_ALL (t) = can_alias_all;
   TYPE_NEXT_REF_TO (t) = TYPE_REFERENCE_TO (to_type);
   TYPE_REFERENCE_TO (to_type) = t;
 
@@ -4809,12 +4830,12 @@ build_type_no_quals (tree t)
     case POINTER_TYPE:
       return build_pointer_type_for_mode (build_type_no_quals (TREE_TYPE (t)),
                                          TYPE_MODE (t),
-                                         TYPE_REF_CAN_ALIAS_ALL (t));
+                                         false);
     case REFERENCE_TYPE:
       return
        build_reference_type_for_mode (build_type_no_quals (TREE_TYPE (t)),
                                       TYPE_MODE (t),
-                                      TYPE_REF_CAN_ALIAS_ALL (t));
+                                      false);
     default:
       return TYPE_MAIN_VARIANT (t);
     }

Reply via email to