Bug 37614 - Change position of padding for aligned COMMONs
Change position of padding for aligned COMMONs
Status: RESOLVED FIXED
Product: gcc
Classification: Unclassified
Component: fortran
4.4.0
: P3 normal
: ---
Assigned To: Paul Thomas
: wrong-code
Depends on:
Blocks: 32834
  Show dependency treegraph
 
Reported: 2008-09-22 13:28 UTC by Tobias Burnus
Modified: 2009-04-04 16:47 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2009-01-15 09:19:04


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Tobias Burnus 2008-09-22 13:28:18 UTC
Follow up to PR 37486.
see also http://gcc.gnu.org/ml/fortran/2008-09/msg00366.html

The following program should print "5" but it prints "0" with default options in gfortran. The problem is that in the program, the common object is padded as
   <4bytes padding> + i + r8
and then in the subroutine, only the first 4 bytes are read and assigned to the local variable "i".

The program is valid as "Named common blocks of the same name shall be of the same size in all scoping units of a program in which they appear, but blank common blocks may be of different sizes."

As tests with NAG f95, Portland pgf95 and Pathscale pathf95 show, these compilers use
  i + <4bytes padding> + r8
which allows this program to run correctly without sacrificing the alignment. 

(ifort, sunf95 and g95 - and "gfortran -fno-align-commons" work as no padding is added.)

There are still used but not standard conform versions which fail (cf. examples in PR 37486) but for those, gfortran has -fno-align-commons.


Test program:
----------------------------------------
subroutine one()
  integer :: i, j
  common i
  print *, i ! shall print "5", in gfortran it is "0"
!
! Testing alternative (invalid standard Fortran):
!  common i,j
!  print *, i,j
end subroutine one

program test
  integer :: i
  real*8 r8
  common i, r8
  i = 5
  r8 = 123457891234d88
  call one()
end program test
----------------------------------------

If one enables the "common  i, j" and runs the program with several compilers, details about their implementation is revealed:

- gfortran and g77 print "0 5"
- ifort, sunf95 and g95 print "5 1267487353" (= gfortran -fno-align-commons)
- pathscale, pgi, and NAG f95 print "5 0" << expected result when PR is fixed
Comment 1 Thomas Koenig 2008-10-25 08:26:57 UTC
This would mean an ABI change, but it is worth thinking about.
Comment 2 Paul Thomas 2009-01-15 09:19:04 UTC
(In reply to comment #1)
> This would mean an ABI change, but it is worth thinking about.
> 

The required fix is trivial, although I have not regtested yet; eliminate 1127-1131 in trans-common.c.

Cheers

Paul
Comment 3 Paul Thomas 2009-01-27 20:53:01 UTC
See http://gcc.gnu.org/ml/fortran/2009-01/msg00217.html and subsequent postings.

Paul
Comment 4 Paul Thomas 2009-04-04 16:41:53 UTC
Subject: Bug 37614

Author: pault
Date: Sat Apr  4 16:41:30 2009
New Revision: 145541

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=145541
Log:
2009-04-04  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/37614
	* trans-common.c (translate_common): Do not offset the whole
	coomon block.

2009-04-04  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/37614
	* gfortran.dg/common_align_2.f90: New test.


Added:
    trunk/gcc/testsuite/gfortran.dg/common_align_2.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/trans-common.c
    trunk/gcc/testsuite/ChangeLog

Comment 5 Paul Thomas 2009-04-04 16:47:46 UTC
Fixed on 4.5.  Because of the ABI change, I will not backport this unless there is an overwhelming public demand.  Equally, the desire for an option to revert it, -fg77-common-align, will only be implemented if there is demand for it.

Thanks for the report.

Paul