OSDN Git Service

Fix for sparc va_arg macro aliasing problem.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Oct 1998 12:40:21 +0000 (12:40 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Oct 1998 12:40:21 +0000 (12:40 +0000)
* c-common.c (c_get_alias_set): Handle ARRAY_REF of union field.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@23427 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/c-common.c

index 8eb81d2..9670a1b 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 508a8c2..ddb87cd 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