Re: Compile error on the aarch64 platform: Missing asm/hwcap.h - Mailing list pgsql-hackers
| From | 高增琦 |
|---|---|
| Subject | Re: Compile error on the aarch64 platform: Missing asm/hwcap.h |
| Date | |
| Msg-id | CAFmBtr03NN9XzeAMZY6TjsCaE-hBUhFxH1Wu2nmVXRX=_OW8vw@mail.gmail.com Whole thread Raw |
| In response to | Re: Compile error on the aarch64 platform: Missing asm/hwcap.h (Steven Niu <niushiji@gmail.com>) |
| List | pgsql-hackers |
The build farm success because the configure result: checking which CRC-32C implementation to use... slicing-by-8
My test machine's configure result: checking which CRC-32C implementation to use... ARMv8 CRC instructions with runtime check
More info about the machine:
uname -a:
Linux xxx 4.18.0-348.20.1.el7.aarch64 #1 SMP Wed Apr 13 20:57:50 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
cat /usr/include/bits/hwcap.h
/* Defines for bits in AT_HWCAP.
Copyright (C) 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_AUXV_H
# error "Never include <bits/hwcap.h> directly; use <sys/auxv.h> instead."
#endif
/* No bits defined for this architecture. */
rpm -qa | grep glibc
glibc-headers-2.17-326.el7_9.aarch64
glibc-common-2.17-326.el7_9.aarch64
glibc-devel-2.17-326.el7_9.aarch64
glibc-2.17-326.el7_9.aarch64
/etc/redhat-release
CentOS Linux release 7.6.1810 (AltArch)
both __linux__ and __aarch64__ is defined
My test machine's configure result: checking which CRC-32C implementation to use... ARMv8 CRC instructions with runtime check
More info about the machine:
uname -a:
Linux xxx 4.18.0-348.20.1.el7.aarch64 #1 SMP Wed Apr 13 20:57:50 UTC 2022 aarch64 aarch64 aarch64 GNU/Linux
cat /usr/include/bits/hwcap.h
/* Defines for bits in AT_HWCAP.
Copyright (C) 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_AUXV_H
# error "Never include <bits/hwcap.h> directly; use <sys/auxv.h> instead."
#endif
/* No bits defined for this architecture. */
rpm -qa | grep glibc
glibc-headers-2.17-326.el7_9.aarch64
glibc-common-2.17-326.el7_9.aarch64
glibc-devel-2.17-326.el7_9.aarch64
glibc-2.17-326.el7_9.aarch64
/etc/redhat-release
CentOS Linux release 7.6.1810 (AltArch)
both __linux__ and __aarch64__ is defined
May be is better to always include "asm/hwcap.h"?
or check HWCAP_CRC32 for pg_crc32c_armv8_choose.c and HWCAP_SVE for pg_popcount_aarch64.c
or check HWCAP_CRC32 for pg_crc32c_armv8_choose.c and HWCAP_SVE for pg_popcount_aarch64.c
Steven Niu <niushiji@gmail.com> 于2025年11月17日周一 11:56写道:
Hi, John, Thomas,IvorySQL team found the same build issue on our building machine when we built IvorySQL code which is based on PG 18.0.pg_crc32c_armv8_choose.c:58:32:error:'HWCAP CRC32' undeclared(first use in this function)58 | return (getauxval(AT_HWCAP) & HWCAP_CRC32) != θ;| ^~~~~~~~~~~Then we tried to build source code of PG 18.1 and got the same failure result.I made some investigation to test the following code in src/port/pg_crc32c_armv8_choose.c+#if defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)+#include <sys/auxv.h>+#if defined(__linux__) && !defined(__aarch64__) && !defined(HWCAP2_CRC32)+#include <asm/hwcap.h>+#endif// 1. Test defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)// Got #warning "CONDITION IS FALSE"echo '#if defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)#warning "CONDITION IS TRUE"#else#warning "CONDITION IS FALSE"#endif' | gcc -E -x c - -o -// 2. Test defined(__linux__)// Got trueecho '#if defined(__linux__)#warning "CONDITION IS TRUE"#else#warning "CONDITION IS FALSE"#endif' | gcc -E -x c - -o -// 3. Test !defined(__aarch64__)// Got falseecho '#if !defined(__aarch64__)#warning "CONDITION IS TRUE"#else#warning "CONDITION IS FALSE"#endif' | gcc -E -x c - -o -// Test !defined(HWCAP2_CRC32)// Got trueecho '#if !defined(HWCAP2_CRC32)#warning "CONDITION IS TRUE"#else#warning "CONDITION IS FALSE"#endif' | gcc -E -x c - -o -As a result, hwcap.h has no chance to be included in the building path.So, my question is, why we exclude __aarch64__ in the second #if condition?Thanks,StevenFrom: John Naylor <johncnaylorls@gmail.com>
Sent: Friday, November 14, 2025 13:06
To: 高增琦 <pgf00a@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Subject: Re: Compile error on the aarch64 platform: Missing asm/hwcap.hOn Fri, Nov 14, 2025 at 11:02 AM 高增琦 <pgf00a@gmail.com> wrote:
> Compile error on CentOS Linux release 7.6.1810 (AltArch) with the message “‘HWCAP_CRC32’ undeclared”.
We still have at least one CentOS 7 aarch64 machine that gets regular
testing (not sure of the reason, since it's been EOL for a year and a
half IIUC), and it builds fine:
https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=arowana&dt=2025-11-04%2004%3A56%3A57
> After modifying the code to add `include <asm/hwcap.h>`, the compilation succeeded.
We already have the following, so I'm not sure what you mean (or even
what architecture you're running on):
#if defined(HAVE_ELF_AUX_INFO) || defined(HAVE_GETAUXVAL)
#include <sys/auxv.h>
#if defined(__linux__) && !defined(__aarch64__) && !defined(HWCAP2_CRC32)
#include <asm/hwcap.h>
#endif
#endif
--
John Naylor
Amazon Web Services
pgsql-hackers by date: