common block alignment

Jack Howarth howarth@bromo.msbb.uc.edu
Mon Aug 6 16:03:00 GMT 2007


   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



More information about the Fortran mailing list