------- Comment #7 from jb at gcc dot gnu dot org 2007-05-22 06:52 ------- (In reply to comment #6) > The following simplistic patch solves this problem. Sometimes I think we get > overzealous with definitions and fancy configury. We all know the size is 10 > bytes and 12 works.
No. The non-padded size is always 10, yes, but the amount of padding varies. On x86 the total size is 12 bytes and on x86-64 it's 16 bytes. That's just how the ABI defines the types, there's nothing we can do about it. > Index: size_from_kind.c > =================================================================== > --- size_from_kind.c (revision 124927) > +++ size_from_kind.c (working copy) > @@ -50,7 +50,7 @@ size_from_real_kind (int kind) > #endif > #ifdef HAVE_GFC_REAL_10 > case 10: > - return sizeof (GFC_REAL_10); > + return (sizeof (GFC_REAL_4) + sizeof (GFC_REAL_8)); > #endif It's identical on x86, but on x86-64 it returns the wrong size. > #ifdef HAVE_GFC_REAL_16 > case 16: > > In the file mk-kinds-h.sh we have the following snippet: > > 4) ctype="float" ;; > 8) ctype="double" ;; > 10) ctype="long double" ;; > 16) ctype="long double" ;; > *) echo "$0: Unknown type" >&2 ; exit 1 ;; > > All fine and dandy, except in the library we don't want a ctype, we want the > size of a real kind=10 (which I think really ought to be 10, not 12) No. It's 12 or 16, depending on the platform. Again, the ABI specifies this, we can't change it. > I don't think there is an equivalent ctype. At least not for writing bytes to > a file. That's right, when writing to files we can in principle do whatever we want. The size deals with the in-memory representation. In practice, it's easier and faster to have the on-disk representation be identical to the in-memory representation. > I am not sure why we don't just do this: > > size_from_real_kind (int kind) > { > return kind; > } > > It would probably work. Which implies maybe we could do without this function > altogether. Isn't the implementation of kind up to the compiler and it could > equal kind if we so choose? (with respect to unformatted I/O, why write more > bytes than needed?) It's needed for array I/O. If the on-disk representation agrees with the in-memory representation, we can just do a single read/write for an entire array (provided it's contiguous etc.), whereas if the on-disk representation doesn't include the padding we would need to do array I/O element-by-element which is much slower. In general, the reason we need both the kind and the size (which are different if the type includes padding like real(10)) is that formatted I/O works with kind and unformatted with size. Also, for formatted array I/O we need the size as well to know how much to step forward for each element in the array. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31933