Re: C99 compliance for src/port/snprintf.c

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Andres Freund <andres(at)anarazel(dot)de>
Cc: Andrew Dunstan <andrew(at)dunslane(dot)net>, Dave Page <dpage(at)pgadmin(dot)org>, David Steele <david(at)pgmasters(dot)net>, pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: C99 compliance for src/port/snprintf.c
Date: 2018-08-25 17:08:18
Message-ID: 16652.1535216898@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-www

Andres Freund <andres(at)anarazel(dot)de> writes:
> On 2018-08-16 11:41:30 -0400, Tom Lane wrote:
>> Andres Freund <andres(at)anarazel(dot)de> writes:
>>> While I'd personally have no problem kicking gcc 3.4 to the curb, I'm
>>> still confused what causes this error mode. Kinda looks like
>>> out-of-sync headers with gcc or something.

>> Yeah, this is *absolutely* unsurprising for a non-native gcc installation
>> on an old platform.

> Sure, but that still requires the headers to behave differently between
> C89 and C99 mode, as this worked before. But it turns out there's two
> different math.h implementation headers, depending on c99 being enabled
> (math_c99.h being the troublesome). If I understand correctly the
> problem is more that the system library headers are *newer* (and assume
> a sun studio emulating/copying quite a bit of gcc) than the gcc that's
> being used, and therefore gcc fails.

I have some more info on this issue, based on having successfully
updated "gaur" using gcc 3.4.6 (which I picked because it was the last
of the 3.x release series). It seems very unlikely that there's much
difference between 3.4.3 and 3.4.6 as far as external features go.
What I find in the 3.4.6 documentation is

-- Built-in Function: double __builtin_inf (void)
Similar to `__builtin_huge_val', except a warning is generated if
the target floating-point format does not support infinities.
This function is suitable for implementing the ISO C99 macro
`INFINITY'.

Note that the function is called "__builtin_inf", whereas what we see
protosciurus choking on is "__builtin_infinity". So I don't think this
is a version skew issue at all. I think that the system headers are
written for the Solaris cc, and its name for the equivalent function is
__builtin_infinity, whereas what gcc wants is __builtin_inf. Likewise,
the failures we see for __builtin_isinf and __builtin_isnan are because
Solaris cc provides those but gcc does not.

If we wanted to keep protosciurus going without a compiler update, my
thought would be to modify gcc's copy of math_c99.h to correct the
function name underlying INFINITY, and change the definitions of isinf()
and isnan() back to whatever was being used pre-C99.

It's possible that newer gcc releases have been tweaked so that they
make appropriate corrections in this header file automatically, but
that's not a sure thing.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2018-08-25 17:35:47 Re: Doc patch: pg_upgrade page and checkpoint location consistency with replicas
Previous Message Bruce Momjian 2018-08-25 17:01:39 Re: Reference link for applicable_roles view is missing in the documentation of enabled_roles

Browse pgsql-www by date

  From Date Subject
Next Message Bruce Momjian 2018-08-25 18:41:11 Re: Postgres 11 release notes
Previous Message Andrew Dunstan 2018-08-24 19:42:33 Re: Windows vs C99 (was Re: C99 compliance for src/port/snprintf.c)