other/8947: Please add a Warning about "-malign-double" in docs
Norbert Wolff
norbert_wolff@t-online.de
Sun Dec 29 10:32:00 GMT 2002
Subject: stat-calls fail with certain gcc-switches
>Submitter-Id: net
>Confidential: no
>Synopsis: Problems with stat-calls and "-malign-double"
>Severity: critical
>Priority: high
>Category: libc
>Class: sw-bug
>Release: libc-2.3.1
>Environment:
System: linux-2.4.19
Arch: i686
>Description: please see below
> Please add a note in your docs that is not possible to compile
> the GNU-libc (i tried it with 2.3.1) with the options
> "-malign-double" and/or "-m128bit-long-double".
>
> The increased aligment of long doubles caused by this switches
> crashes the calculations in glibc-2.3.1/io/fts.c,
> so every call of one of the stat-functions will fail...
On 21 Dec 2002 17:40:22 -0000
bangerth@dealii.org wrote:
> Can you give any indications as to what exactly goes wrong?
> It is not very helpful just to document that some option
> might not work in some circumstances. I think it would be
> much better if we actually _fixed_ the problem that was
> causing the problem.
Hi Wolfgang,
In the glibc-sources the alignment of long doubles is used
to calculate the fts_statp component of the FTSENT
---------------------------- file: io/fts.c
/* Largest alignment size needed, minus one.
Usually long double is the worst case. */
#ifndef ALIGNBYTES
#define ALIGNBYTES (__alignof__ (long double) - 1)
#endif
/* Align P to that size. */
#ifndef ALIGN
#define ALIGN(p) (((unsigned long int) (p) + ALIGNBYTES) & ~ALIGNBYTES)
#endif
...
static FTSENT *
internal_function
fts_alloc(sp, name, namelen)
FTS *sp;
const char *name;
register int namelen;
{
register FTSENT *p;
size_t len;
len = sizeof(FTSENT) + namelen;
if (!ISSET(FTS_NOSTAT))
len += sizeof(struct stat) + ALIGNBYTES;
if ((p = malloc(len)) == NULL)
return (NULL);
memmove(p->fts_name, name, namelen);
p->fts_name[namelen] = '\0';
if (!ISSET(FTS_NOSTAT))
p->fts_statp = (struct stat *)ALIGN(p->fts_name + namelen + 2);
----------------------------
I dont understand what long doubles have to do with stat-calls,
but when you increase the alignment of them to 16 instead of 4, which is
one consequence of the gcc-switches
"-malign-double" and/or "-m128bit-long-double"
every stat-call will fail with errno set to EOVERFLOW.
I agree with you that it would be better to _fix_ the problem, than
adding a note in the docs, but that is a job for the glibc-people,
as gcc creates correct code.
I have send a copy of this mail to the glibc-buglist and hope for the
best...
Thanks,
Norbert
More information about the Gcc-bugs
mailing list