Fix for sparc va_arg macro aliasing problem.
authorJim Wilson <wilson@cygnus.com>
Thu, 29 Oct 1998 12:40:21 +0000 (12:40 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Thu, 29 Oct 1998 12:40:21 +0000 (04:40 -0800)
* c-common.c (c_get_alias_set): Handle ARRAY_REF of union field.

From-SVN: r23427

gcc/ChangeLog
gcc/c-common.c

index 8eb81d2c43fe0ecca5322631e23fb87c10f2320c..9670a1be0a32a64a73020036cdc9574c3d73c96b 100644 (file)
@@ -1,3 +1,7 @@
+Thu Oct 29 12:39:35 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * c-common.c (c_get_alias_set): Handle ARRAY_REF of union field.
+
 Thu Oct 29 14:10:22 EST 1998  Andrew MacLeod  <amacleod@cygnus.com>
 
        * except.c (emit_eh_context): Make the EH context register stay alive
index 508a8c2e59913b145c119149e90e23749d615a7e..ddb87cd4a004370f0bb3f7312df72698f3b85f7b 100644 (file)
@@ -3155,8 +3155,15 @@ c_get_alias_set (t)
        the conservative assumption.  */
     return 0;
 
-  if (TREE_CODE (t) == COMPONENT_REF
-      && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == UNION_TYPE)
+  if ((TREE_CODE (t) == COMPONENT_REF
+       && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == UNION_TYPE)
+      /* Also permit punning when accessing an array which is a union
+        member.  This makes the current sparc va_arg macro work, but may
+        not be otherwise necessary.  */
+      || (TREE_CODE (t) == ARRAY_REF
+         && TREE_CODE (TREE_OPERAND (t, 0)) == COMPONENT_REF
+         && (TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
+             == UNION_TYPE)))
     /* Permit type-punning when accessing a union, provided the
        access is directly through the union.  For example, this code does
        not permit taking the address of a union member and then