This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

common block alignment


   I haven't seen Christopher Rickett ask this yet on
the list. Using a powerpc-apple-darwin9 cross-compiler
(which adds an additional alignment field to the .comm
assembly lines), we discovered a mismatch between the
code generated in bind_c_coms .f90...

>>        .size   main, .-main
>>        .comm   com,16,8
>>        .comm   single,8,8
>>        .comm   mycom,4,4
>>        .comm   mycom2,8,8
>>        .comm   f03_com2,8,4
>>        .section        .rodata
>>        .align 

...and bind_c_coms_driver.c...

>>        .size   test_coms, .-test_coms
>>        .comm   mycom,4,16
>>        .comm   com3,8,16
>>        .comm   com,16,16
>>        .comm   f03_com2,8,16
>>        .comm   single,8,16
>>        .comm   mycom2,8,16
>>        .section        .rodata
>>        .align 8

Chris fixed this issue for the iso c binding tests with
the following patch...

Index: gcc/fortran/trans-common.c
===================================================================
--- gcc/fortran/trans-common.c	(revision 127182)
+++ gcc/fortran/trans-common.c	(working copy)
@@ -413,7 +413,20 @@ build_common_decl (gfc_common_head *com,
       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;

However we still have the question of why the common blocks in fortran
are aligned according to BIGGEST_ALIGNMENT and if we shouldn't just
have all of fortran use the same alignment as in c? I assume we would
have to do this with the soversion bump for libgfortran in gcc 4.3.
Thanks in advance for any clarifications on this.
                 Jack


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]