This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [Patch, fortran] PR25289 Cannot handle record numbers large than huge(0_4)
:REVIEWMAIL:
Janne Blomqvist wrote:
On Mon, Jun 19, 2006 at 01:13:39PM +0200, François-Xavier Coudert wrote:
The patch converts the record number used for direct I/O to type
gfc_offset in
the library and on the front end changes the type to int8 to match.
A gfc_offset is an off_t, which might not always be an int8.
The current situation is for the front-end to use
/* Choose the integer kind the same size as "void*" for our index kind.
*/
gfc_index_integer_kind = POINTER_SIZE / 8;
which means supposing that an off_t is always the same as a (void *).
I don't know if that assumption is right...
It's incorrect. E.g. off_t is 64 bits on systems with large file
support, even though they may have a 32 bit void*.
This is an interesting discussion.
First, yes this is an ABI change so I will only commit to 4.2 when approved.
Second ...
In libgfortran you can see that gfc_offset is defined in terms of off_t and it
is 64 bits there. However, at the point of interest in trans-io.c, off_t is
int4 and not int8.
I found this out trying gfc_get_int_type (sizeof(off_t)) which fails miserably
and in -fdump-tree-original you can see that rec is assigned (int4) n, with the
int4 cast.
Looking in types.h, off_t is defined depending on features.h which defines
__USE_FILE_OFFSET64. Without digging further I am guessing that off_t on the
frontend side is defined elsewhere or __USE_FILE_OFFSET64 is not defined.
Is this difference a bug?
If I use gfc_get_int_type (sizeof(off64_t)) all appears to work fine. Is it
safe to assume off64_t is defined for all targets of interest?
The following is an extract from types.h:
#ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
#endif
#if defined __USE_LARGEFILE64 && !defined __off64_t_defined
typedef __off64_t off64_t;
# define __off64_t_defined
#endif
Is __USE_LARGEFILE64 defined in all cases?
If not should I put some conditional compile directives both on library side and
front end side to assure the sizes match?
Regards,
Jerry