Re: Broken build on macOS (Universal / Intel): cpuid instruction not available - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Broken build on macOS (Universal / Intel): cpuid instruction not available
Date
Msg-id 871806.1778168884@sss.pgh.pa.us
Whole thread
In response to Broken build on macOS (Universal / Intel): cpuid instruction not available  (Jakob Egger <jakob@eggerapps.at>)
Responses Re: Broken build on macOS (Universal / Intel): cpuid instruction not available
Re: Broken build on macOS (Universal / Intel): cpuid instruction not available
List pgsql-hackers
Jakob Egger <jakob@eggerapps.at> writes:
> Universal builds are broken since this commit:
> 16743db: Centralize detection of x86 CPU features

> To reproduce:

> export CFLAGS="-arch arm64 -arch x86_64"
> ./configure --without-icu
> make

> This results in an error "cpuid instruction not available"

I can reproduce this here.  But after looking at it briefly,
I think it's purely accidental that universal builds ever worked,
and they could have done so only for small values of "work".

The fundamental problem is that we make only one probe at
configure time to set flags such as HAVE__GET_CPUID.
With a single arch selected in CFLAGS, you get the appropriate
answer for that arch, and everything's fine.  With both selected,
one build or the other will fail such probes with errors like

In file included from conftest.c:135:
/Library/Developer/CommandLineTools/usr/lib/clang/21/include/cpuid.h:14:2: erro\
r: this header is for x86 only
   14 | #error this header is for x86 only
      |  ^

so that we end up with essentially no CPU-specific optimizations
enabled.  That's not a place that you really want to be.  (I've
not checked into how s_lock.h manages to work at all under these
conditions, but maybe it ends up picking a compiler-intrinsic
implementation?)

The proximate reason that it broke is that v18 and before had
code like

#ifdef HAVE_X86_64_POPCNTQ
#if defined(HAVE__GET_CPUID) || defined(HAVE__CPUID)
#define TRY_POPCNT_X86_64 1
#endif
#endif

and didn't try to compile the cpuid-dependent function unless
TRY_POPCNT_X86_64 was set.  The code in HEAD doesn't have
that guard, and is essentially assuming that every x86 platform
wil provide HAVE__GET_CPUID or HAVE__CPUID.

To make this actually work well, we'd have to do two sets of configure
probes, one for each arch, and somehow apply the correct set of
#defines depending on arch.  That's a lot of work that I personally
have no interest in doing, seeing that the handwriting is on the wall
for Apple's support of x86.

I wonder whether we shouldn't just disclaim support for multi-arch
builds.  If it's easy to un-break, then sure we might as well restore
the status quo ante, but I don't think it's worth putting a ton of
work into.

            regards, tom lane



pgsql-hackers by date:

Previous
From: David Geier
Date:
Subject: Re: Avoid calling SetMatViewPopulatedState if possible
Next
From: Nathan Bossart
Date:
Subject: Re: Broken build on macOS (Universal / Intel): cpuid instruction not available