trans-common.c (build_common_decl): Fix the alignment for BIND(C) common blocks.
authorChristopher D. Rickett <crickett@lanl.gov>
Sat, 24 Nov 2007 05:42:07 +0000 (05:42 +0000)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Sat, 24 Nov 2007 05:42:07 +0000 (05:42 +0000)
2007-11-23 Christopher D. Rickett <crickett@lanl.gov>

* trans-common.c (build_common_decl): Fix the alignment for
BIND(C) common blocks.

From-SVN: r130393

gcc/fortran/ChangeLog
gcc/fortran/trans-common.c

index ce45d6041be71bfd3d12f84011f823783cbbff7c..e7c00b2a4ab0f0ed368a56d11399068d20351be4 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-23 Christopher D. Rickett <crickett@lanl.gov>
+
+       * trans-common.c (build_common_decl): Fix the alignment for
+       BIND(C) common blocks.
+
 2007-11-23  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/34209
index 604078226b7ec1b992dff95b5d756e006b964a45..64cee0db5c102bb866f1a9dcb31a8c8837de048c 100644 (file)
@@ -407,7 +407,20 @@ build_common_decl (gfc_common_head *com, tree union_type, bool is_init)
       SET_DECL_ASSEMBLER_NAME (decl, gfc_sym_mangled_common_id (com));
       TREE_PUBLIC (decl) = 1;
       TREE_STATIC (decl) = 1;
-      DECL_ALIGN (decl) = BIGGEST_ALIGNMENT;
+      if (!com->is_bind_c)
+       DECL_ALIGN (decl) = BIGGEST_ALIGNMENT;
+      else
+        {
+         /* Do not set the alignment for bind(c) common blocks to
+            BIGGEST_ALIGNMENT because that won't match what C does.  Also,
+            for common blocks with one element, the alignment must be
+            that of the field within the common block in order to match
+            what C will do.  */
+         tree field = NULL_TREE;
+         field = TYPE_FIELDS (TREE_TYPE (decl));
+         if (TREE_CHAIN (field) == NULL_TREE)
+           DECL_ALIGN (decl) = TYPE_ALIGN (TREE_TYPE (field));
+       }
       DECL_USER_ALIGN (decl) = 0;
       GFC_DECL_COMMON_OR_EQUIV (decl) = 1;