[Patch, fortran] PR25289 Cannot handle record numbers large than huge(0_4)
Jerry DeLisle
jvdelisle@verizon.net
Tue Jun 20 06:00:00 GMT 2006
: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
More information about the Gcc-patches
mailing list