Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!

Bug 870001

Summary: sys-devel/clang: doesn't include <stdc-predef.h> (dev-libs/libedit: fails to compile with Clang 15 (and musl?) (error: wchar_t must store ISO 10646 characters))
Product: Gentoo Linux Reporter: Sam James <sam>
Component: Current packagesAssignee: LLVM support project <llvm>
Status: RESOLVED FIXED    
Severity: normal CC: arsen, eike.beyer, mgorny, srcshelton
Priority: Normal    
Version: unspecified   
Hardware: All   
OS: Linux   
See Also: https://reviews.llvm.org/D34158
https://reviews.llvm.org/D106577
https://reviews.llvm.org/D137043
https://bugs.gentoo.org/show_bug.cgi?id=560228
Whiteboard:
Package list:
Runtime testing required: ---
Bug Depends on:    
Bug Blocks: 408963, 430702    
Attachments: build.log

Description Sam James archtester Gentoo Infrastructure gentoo-dev Security 2022-09-13 18:09:45 UTC
Created attachment 804988 [details]
build.log

libtool: compile:  clang -DHAVE_CONFIG_H -I. -I/var/tmp/portage/dev-libs/libedit-20210419.3.1/work/libedit-20210419-3.1/src -I.. -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -c /var/tmp/portage/dev-libs/libedit-20210419.3.1/work/libedit-20210419-3.1/src/vis.c  -fPIC -DPIC -o .libs/vis.o
In file included from /var/tmp/portage/dev-libs/libedit-20210419.3.1/work/libedit-20210419-3.1/src/el.c:60:
In file included from /var/tmp/portage/dev-libs/libedit-20210419.3.1/work/libedit-20210419-3.1/src/el.h:50:
/var/tmp/portage/dev-libs/libedit-20210419.3.1/work/libedit-20210419-3.1/src/chartype.h:46:3: error: wchar_t must store ISO 10646 characters
        #error wchar_t must store ISO 10646 characters
         ^
In file included from /var/tmp/portage/dev-libs/libedit-20210419.3.1/work/libedit-20210419-3.1/src/chared.c:51:
In file included from /var/tmp/portage/dev-libs/libedit-20210419.3.1/work/libedit-20210419-3.1/src/el.h:50:
/var/tmp/portage/dev-libs/libedit-20210419.3.1/work/libedit-20210419-3.1/src/chartype.h:46:3: error: wchar_t must store ISO 10646 characters
        #error wchar_t must store ISO 10646 characters
         ^
[...]

----

# emerge --info
!!! No gcc found. You probably need to 'source /etc/profile'
!!! to update the environment of this terminal and possibly
!!! other terminals also.
Portage 3.0.36 (python 3.10.7-final-0, default/linux/amd64/17.0/musl/clang, [unavailable], musl-1.2.3-r3, 5.15.67-gentoo-dist-hardened x86_64)
=================================================================
System uname: Linux-5.15.67-gentoo-dist-hardened-x86_64-AMD_Ryzen_9_3950X_16-Core_Processor-with-libc
KiB Mem:    65765036 total,  31630744 free
KiB Swap:    8290300 total,   6431228 free
Timestamp of repository gentoo: Tue, 13 Sep 2022 18:02:01 +0000
sh dash 0.5.11.5
app-misc/pax-utils:        1.3.5::gentoo
app-shells/bash:           5.1_p16-r2::gentoo
dev-lang/perl:             5.36.0::gentoo
dev-lang/python:           3.10.7::gentoo, 3.11.0_rc2::gentoo
dev-util/cmake:            3.24.1::gentoo
dev-util/meson:            0.63.2-r1::gentoo
sys-apps/baselayout:       2.8-r2::gentoo
sys-apps/openrc:           0.45.2::gentoo
sys-apps/sandbox:          2.29::gentoo
sys-devel/autoconf:        2.71-r2::gentoo
sys-devel/automake:        1.16.5::gentoo
sys-devel/binutils:        2.39-r2::gentoo
sys-devel/binutils-config: 5.4.1::gentoo
sys-devel/clang:           13.0.1::gentoo, 14.0.6-r1::gentoo, 15.0.0::gentoo
sys-devel/gcc-config:      2.5-r1::gentoo
sys-devel/libtool:         2.4.7::gentoo
sys-devel/lld:             13.0.1::gentoo
sys-devel/llvm:            13.0.1::gentoo, 14.0.6-r2::gentoo, 15.0.0::gentoo
sys-devel/make:            4.3::gentoo
sys-kernel/linux-headers:  5.19::gentoo (virtual/os-headers)
sys-libs/musl:             1.2.3-r3::gentoo
Repositories:

gentoo
    location: /var/db/repos/gentoo
    sync-type: rsync
    sync-uri: rsync://rsync.gentoo.org/gentoo-portage
    priority: -1000
    sync-rsync-verify-jobs: 1
    sync-rsync-verify-max-age: 24
    sync-rsync-extra-opts: 
    sync-rsync-verify-metamanifest: yes

Installed sets: @sam
ACCEPT_KEYWORDS="amd64 ~amd64"
ACCEPT_LICENSE="*"
ADDR2LINE="llvm-addr2line"
AR="llvm-ar"
AS="clang -c"
CBUILD="x86_64-gentoo-linux-musl"
CC="clang"
CFLAGS="-O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches"
CHOST="x86_64-gentoo-linux-musl"
CONFIG_PROTECT="/etc /usr/share/config /usr/share/gnupg/qualified.txt"
CONFIG_PROTECT_MASK="/etc/ca-certificates.conf /etc/env.d /etc/fonts/fonts.conf /etc/gconf /etc/gentoo-release /etc/revdep-rebuild /etc/sandbox.d /etc/terminfo"
CPP="clang-cpp"
CXX="clang++"
CXXFLAGS="-O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches"
DISTDIR="/var/cache/distfiles"
EMERGE_DEFAULT_OPTS="--keep-going=y --complete-graph"
ENV_UNSET="CARGO_HOME DBUS_SESSION_BUS_ADDRESS DISPLAY GOBIN GOPATH PERL5LIB PERL5OPT PERLPREFIX PERL_CORE PERL_MB_OPT PERL_MM_OPT XAUTHORITY XDG_CACHE_HOME XDG_CONFIG_HOME XDG_DATA_HOME XDG_RUNTIME_DIR"
FCFLAGS="-O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches"
FEATURES="assume-digests binpkg-docompress binpkg-dostrip binpkg-logs binpkg-multi-instance buildpkg-live config-protect-if-modified distlocks ebuild-locks fixlafiles ipc-sandbox network-sandbox news parallel-fetch parallel-install pid-sandbox preserve-libs protect-owned qa-unresolved-soname-deps sandbox sfperms strict unknown-features-warn unmerge-logs unmerge-orphans userfetch userpriv usersandbox usersync xattr"
FFLAGS="-O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches"
GENTOO_MIRRORS="http://distfiles.gentoo.org"
INSTALL_MASK="charset.alias /usr/share/locale/locale.alias"
LANG="C.UTF8"
LD="ld.lld"
LDFLAGS="-Wl,-O1 -Wl,--as-needed -fuse-ld=lld -rtlib=compiler-rt -unwindlib=libunwind -Wl,--as-needed  -Wl,--defsym=__gentoo_check_ldflags__=0"
NM="llvm-nm"
OBJCOPY="llvm-objcopy"
OBJDUMP="llvm-objdump"
PKGDIR="/var/cache/binpkgs"
PORTAGE_CONFIGROOT="/"
PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --omit-dir-times --compress --force --whole-file --delete --stats --human-readable --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages --exclude=/.git"
PORTAGE_TMPDIR="/var/tmp"
RANLIB="llvm-ranlib"
READELF="llvm-readelf"
STRINGS="llvm-strings"
STRIP="llvm-strip"
USE="acl amd64 bzip2 clang cli crypt dri fortran iconv ipv6 libglvnd libtirpc llvm-libunwind ncurses nls nptl openmp pam pcre readline seccomp split-usr ssl timidity unicode xattr zlib" ABI_X86="64" ADA_TARGET="gnat_2020" APACHE2_MODULES="authn_core authz_core socache_shmcb unixd actions alias auth_basic authn_alias authn_anon authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cgi cgid dav dav_fs dav_lock deflate dir disk_cache env expires ext_filter file_cache filter headers include info log_config logio mem_cache mime mime_magic negotiation rewrite setenvif speling status unique_id userdir usertrack vhost_alias" CALLIGRA_FEATURES="karbon sheets words" COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog" CPU_FLAGS_X86="mmx mmxext sse sse2" ELIBC="musl" GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock greis isync itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf skytraq superstar2 timing tsip tripmate tnt ublox ubx" INPUT_DEVICES="libinput" KERNEL="linux" LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text" LIBREOFFICE_EXTENSIONS="presenter-console presenter-minimizer" LUA_SINGLE_TARGET="lua5-1" LUA_TARGETS="lua5-1" OFFICE_IMPLEMENTATION="libreoffice" PHP_TARGETS="php7-4 php8-0" POSTGRES_TARGETS="postgres12 postgres13" PYTHON_SINGLE_TARGET="python3_10" PYTHON_TARGETS="python3_10" RUBY_TARGETS="ruby27" USERLAND="GNU" VIDEO_CARDS="amdgpu fbdev intel nouveau radeon radeonsi vesa dummy v4l" XTABLES_ADDONS="quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq proto steal rawnat logmark ipmark dhcpmac delude chaos account"
Unset:  ARFLAGS, ASFLAGS, CCLD, CONFIG_SHELL, CPPFLAGS, CTARGET, CXXFILT, ELFEDIT, EXTRA_ECONF, F77FLAGS, FC, GCOV, GPROF, LC_ALL, LEX, LFLAGS, LIBTOOL, LINGUAS, MAKE, MAKEFLAGS, MAKEOPTS, PORTAGE_BINHOST, PORTAGE_BUNZIP2_COMMAND, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS, PORTAGE_RSYNC_EXTRA_OPTS, RUSTFLAGS, SHELL, SIZE, YACC, YFLAGS
Comment 1 Sam James archtester Gentoo Infrastructure gentoo-dev Security 2022-09-13 21:16:36 UTC
Arsen helped dig into this and the issue is that Clang never ends up getting #include <stdc-predef.h> on e.g. musl systems. On glibc systems, it's fine, because /usr/include/features.h contains it.

See:
- https://www.openwall.com/lists/musl/2021/04/16/8
- https://reviews.llvm.org/D34158
- https://reviews.llvm.org/D106577
Comment 2 Michał Górny archtester Gentoo Infrastructure gentoo-dev Security 2022-09-19 10:22:39 UTC
I'm a bit confused how this works, to be honest.

FWICS on glibc targets, GCC preincludes <stdc-predef.h>.  However, this seems specific to glibc -- so do we patch GCC on musl to do that as well, or does this rule get applied to musl target as well?

Furthermore, glibc has the <features.h> fallback-include for this file.  Since clang doesn't do what GCC does, apparently it relies on this fallback on glibc systems.

Now, FWICS musl also includes such a file and expects the compiler to preinclude it.  However, it does not include the fallback which basically means that it's going to cause issues on every compiler that doesn't preinclude it.

From the linked threads I can only establish the following:

- musl upstream shifts blame to clang (so effectively every compiler that doesn't follow some magic code?)

- the original patch to include <stdc-predef.h> in clang got reverted because of some test failures and because apparently "it broke chromium build", with no info how it was broken and no reply to the questions asked there

- the newer patch to define the macro directly got stuck on some standards-related discussion, and is waiting "to hear back" for a year now

So we're basically stuck between people throwing blame around and not caring at all about user systems working.
Comment 3 Arsen Arsenović gentoo-dev 2022-09-19 14:38:42 UTC
(In reply to Michał Górny from comment #2)
> I'm a bit confused how this works, to be honest.
See gccint link below.

> FWICS on glibc targets, GCC preincludes <stdc-predef.h>.  However, this
> seems specific to glibc -- so do we patch GCC on musl to do that as well, or
> does this rule get applied to musl target as well?
It's fine on Alpine:
/ # gcc -E -x c - </dev/null
# 0 "<stdin>"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "<stdin>"
/ # cat /etc/os-release 
NAME="Alpine Linux"

... and with Crossdev:
[i] ~$ </dev/null x86_64-linux-musl-gcc -E -x c -
# 0 "<stdin>"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/x86_64-linux-musl/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "<stdin>"
[i] ~$ 

Though, I can't quite discern why (I could give looking at it throughly another try later, if so desired).

> Now, FWICS musl also includes such a file and expects the compiler to
> preinclude it.  However, it does not include the fallback which basically
> means that it's going to cause issues on every compiler that doesn't
> preinclude it.
> 
> From the linked threads I can only establish the following:
> 
> - musl upstream shifts blame to clang (so effectively every compiler that
> doesn't follow some magic code?)
The protocol for this falls into the libc<->compiler category and is pretty simple: put a header somewhere (and tell the compiler about it) so that macros that are supposed to be predefined are predefined. Glibc, as always, has a workaround for misbehaving compilers, but this shouldn't be needed ultimately.

IMO, this is a compiler concern. GCC does this per-target via a hook in gcc/gcc/config (see https://gcc.gnu.org/onlinedocs/gccint/Misc.html#index-TARGET_005fC_005fPREINCLUDE), and Clang could pretty easily do a similar/equivalent thing. A solution we could adopt between now and when Clang solves this issue is via -include in the config file.

PS: I'm not certain, but, if I had to guess, the Chromium build broke because Bionic didn't have the predef header or something, or Chromium relied on a macro in there to do some fixup.
Comment 4 Sam James archtester Gentoo Infrastructure gentoo-dev Security 2022-12-06 12:39:35 UTC
To be clear, workaround for now until it's fixed upstream in LLVM:

Add '-include stdc-predef.h' (no quotes around it) to /etc/clang/default.cfg on a new line.
Comment 5 Sam James archtester Gentoo Infrastructure gentoo-dev Security 2023-01-08 00:45:47 UTC
(In reply to Sam James from comment #4)
> To be clear, workaround for now until it's fixed upstream in LLVM:
> 
> Add '-include stdc-predef.h' (no quotes around it) to /etc/clang/default.cfg
> on a new line.

meowray points out: this should be /etc/clang/clang.cfg nowadays.
Comment 6 Josh Klar (klardotsh) 2023-02-09 21:50:10 UTC
I was unable to build sys-kernel/gentoo-kernel-6.1.11 with the clang.cfg patch applied: commenting it out fixed the build issue of "<built-in>:2:10: fatal error: 'stdc-predef.h' file not found"
Comment 7 Agostino Sarubbo gentoo-dev 2023-02-16 08:14:57 UTC
I get the same on clang16+musl
Comment 8 Arsen Arsenović gentoo-dev 2023-02-17 09:03:09 UTC
~$ clang -nostdinc -include stdc-predef.h -E -x c - <<<''
# 1 "<stdin>"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 375 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "/usr/include/gentoo/fortify.h" 1
# 2 "<built-in>" 2
<built-in>:2:10: fatal error: 'stdc-predef.h' file not found
#include "stdc-predef.h"
         ^~~~~~~~~~~~~~~
# 1 "<stdin>" 2

1 error generated.
~ 1 $ 


Annoying...  GCC, of course, does the same thing, but -nostdinc disables this include for GCC:

~$ gcc -E -x c - <<<''
# 0 "<stdin>"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "<stdin>"
~$ gcc -nostdinc -E -x c - <<<''
# 0 "<stdin>"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "<stdin>"
~$ 

Does this config parser have some conditional support, or something?
Comment 9 Sam James archtester Gentoo Infrastructure gentoo-dev Security 2023-02-17 09:09:27 UTC
I forgot, I had a hack for this which I gave immolo last week.

We can use __has_include and when -nostdinc, it'll fail - similar to the FORTIFY_SOURCE hack we do in /usr/include/gentoo/fortify.h.

```
/* __has_include is an extension, but it's fine, because this is only
  for Clang anyway. */
#if defined __has_include && __has_include (<stdc-predef.h>)
# include <stdc-predef.h>
#endif
```

then -include /usr/include/gentoo/maybe-stddefs.h in clang.cfg.
Comment 10 Arsen Arsenović gentoo-dev 2023-02-17 09:31:25 UTC
That seems OK.
Comment 11 Sam James archtester Gentoo Infrastructure gentoo-dev Security 2023-04-20 10:28:06 UTC
*** Bug 904696 has been marked as a duplicate of this bug. ***
Comment 12 Sam James archtester Gentoo Infrastructure gentoo-dev Security 2023-04-20 10:28:23 UTC
I'll chuck this in later then, I'd forgot we hadn't.
Comment 13 Larry the Git Cow gentoo-dev 2023-05-16 23:13:37 UTC
The bug has been closed via the following commit(s):

https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=14dd0724ad00c2968202e46b4fc11f6f18cb440f

commit 14dd0724ad00c2968202e46b4fc11f6f18cb440f
Author:     Sam James <sam@gentoo.org>
AuthorDate: 2023-05-16 23:11:59 +0000
Commit:     Sam James <sam@gentoo.org>
CommitDate: 2023-05-16 23:11:59 +0000

    sys-devel/clang-common: add maybe-stddefs.h helper
    
    This is needed for musl (and any non-glibc target actually) with Clang, as
    GCC adds it by itself (but glibc covers for the compiler even if it doesn't),
    but neither Clang nor musl include it by themselves.
    
    See also:
    - https://www.openwall.com/lists/musl/2021/04/16/8
    - https://reviews.llvm.org/D34158
    - https://reviews.llvm.org/D106577
    - https://reviews.llvm.org/D137043
    
    Closes: https://bugs.gentoo.org/870001
    Signed-off-by: Sam James <sam@gentoo.org>

 .../clang-common/clang-common-16.0.3-r1.ebuild     | 190 +++++++++++++++++++++
 .../clang-common/clang-common-16.0.4.9999.ebuild   |  10 ++
 .../clang-common/clang-common-17.0.0.9999.ebuild   |  10 ++
 .../clang-common-17.0.0_pre20230502.ebuild         |  10 ++
 .../clang-common-17.0.0_pre20230512.ebuild         |  10 ++
 5 files changed, 230 insertions(+)
Comment 14 Larry the Git Cow gentoo-dev 2023-05-16 23:18:09 UTC
The bug has been referenced in the following commit(s):

https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=3d3dbcb7be81dae3816aff400f7461beba4ddb22

commit 3d3dbcb7be81dae3816aff400f7461beba4ddb22
Author:     Sam James <sam@gentoo.org>
AuthorDate: 2023-05-16 23:17:29 +0000
Commit:     Sam James <sam@gentoo.org>
CommitDate: 2023-05-16 23:17:29 +0000

    sys-devel/clang-common: add __GLIBC__ guard to maybe-stddefs.h too
    
    It should be fine without this, but we know glibc has a safeguard to make
    sure it's included, so let's not interfere there.
    
    Bug: https://bugs.gentoo.org/870001
    Signed-off-by: Sam James <sam@gentoo.org>

 sys-devel/clang-common/clang-common-16.0.3-r1.ebuild          | 2 +-
 sys-devel/clang-common/clang-common-16.0.4.9999.ebuild        | 2 +-
 sys-devel/clang-common/clang-common-17.0.0.9999.ebuild        | 2 +-
 sys-devel/clang-common/clang-common-17.0.0_pre20230502.ebuild | 2 +-
 sys-devel/clang-common/clang-common-17.0.0_pre20230512.ebuild | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)
Comment 15 Larry the Git Cow gentoo-dev 2023-05-27 07:30:36 UTC
The bug has been closed via the following commit(s):

https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=c87fedc1002c0bb9971c07eb4937733b18533ebc

commit c87fedc1002c0bb9971c07eb4937733b18533ebc
Author:     Sam James <sam@gentoo.org>
AuthorDate: 2023-05-27 07:28:51 +0000
Commit:     Sam James <sam@gentoo.org>
CommitDate: 2023-05-27 07:30:30 +0000

    sys-devel/clang-common: backport maybe-stddefs to 15.x
    
    Closes: https://bugs.gentoo.org/870001
    Signed-off-by: Sam James <sam@gentoo.org>

 .../clang-common/clang-common-15.0.7-r6.ebuild     | 185 +++++++++++++++++++++
 1 file changed, 185 insertions(+)