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]

Re: common block alignment


hi Jack,

i forgot to mention that the assembly snippets below appear to be for x86, but a similar mismatch occurs on ppc64.

Chris

On Mon, 6 Aug 2007, Christopher D. Rickett wrote:

hi Jack,

thanks for raising this question; i had not had a chance to do so yet.

the mismatch in alignment also occurs on x86 linux, but the linux linker didn't warn about the problem. the code snippet below does fix the issue, and i plan to submit it as a formal patch shortly.

Chris

On Mon, 6 Aug 2007, Jack Howarth wrote:

  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]