common block alignment

Christopher D. Rickett crickett@lanl.gov
Mon Aug 6 17:06:00 GMT 2007


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
>> 
>



More information about the Fortran mailing list