2681 Commits

Author SHA1 Message Date
Joseph Huber
00570c36a3
[libc] Fix incorrectly enabled GPU math functions (#83594)
Summary:
These functions were implemented via builtins that aren't acually
supported. See https://godbolt.org/z/Wq6q6T1za. This caused the build to
crash if they were included. Remove these and replace with correct
implementations.
2024-03-01 13:02:27 -06:00
Joseph Huber
18d0d9b9b2
[libc] Update install directory for offloading versions of libraries (#83592)
Summary:
These currently go to `lib/`, but if the user has `lib/<triple>` they
should go there because it's always searched first.
2024-03-01 10:48:32 -06:00
jameshu15869
39c24c52f6
[libc] Allow libc to build on Red Hat (#83517)
Currently, `libc` fails when building on redhat because the triple
format uses `redhat` instead of `linux` (The same problem as openSUSE).
This PR changes `libc` to accept `redhat` as a valid Linux triple.

---------

Co-authored-by: Joseph Huber <huberjn@outlook.com>
2024-02-29 21:04:02 -06:00
lntue
cf68c0427d
[libc] Ignore -Winclude-next-absolute-path warning in float-macros.h (#83513) 2024-02-29 21:08:17 -05:00
Guillaume Chatelet
75fb825bcc
[libc][NFC] Rename LIBC_COMPILER_HAS_FLOAT128 to LIBC_TYPES_HAS_FLOAT128 (#83395)
Umbrella bug #83182
2024-02-29 21:59:58 +01:00
Guillaume Chatelet
22f5e30c17
[libc][NFC] Rename LIBC_COMPILER_HAS_C23_FLOAT16 to LIBC_TYPES_HAS_FLOAT16 (#83396)
Umbrella bug #83182
2024-02-29 21:19:42 +01:00
lntue
73aab2f697
[libc] Revert https://github.com/llvm/llvm-project/pull/83199 since it broke Fuchsia. (#83374)
With some header fix forward for GPU builds.
2024-02-29 14:43:53 -05:00
Joseph Huber
23f3651c7c
[libc] Remove workaround for fmin / fmax after being fixed in LLVM (#83421)
Summary:
These hacks can be removed now that
https://github.com/llvm/llvm-project/pull/83376 fixed the underlying
problem.
2024-02-29 06:51:01 -06:00
Guillaume Chatelet
53bd411e51
[libc][NFC] rename float.h macro file to types.h (#83190) 2024-02-29 10:28:53 +01:00
Nick Desaulniers
27352e600a
[libc] fix typo introduced in inline_bcmp_byte_per_byte (#83356)
My global find+replace was overzealous and broke post submit unit tests.

Link: #83345
2024-02-28 19:13:05 -06:00
Nick Desaulniers
6f8d826b74
[libc] fix readability-identifier-naming.ConstexprFunctionCase (#83345)
Codify that we use lower_case for
readability-identifier-naming.ConstexprFunctionCase and then fix the 11
violations (rather than codify UPPER_CASE and have to fix the 170 violations).
2024-02-28 14:52:02 -08:00
Petr Hosek
68f0edfa35
[libc] Include assert.h on baremetal targets (#83324)
Many baremetal applications use asserts.
2024-02-28 13:53:51 -08:00
Nick Desaulniers
4df364bc93
[libc] remove header guard for assert.h (#83334)
It's meant to be included multiple times! Maybe use a NOLINT rule to
suppress
clang-tidy's llvm-header-guard lint warning.
2024-02-28 13:19:40 -08:00
Nick Desaulniers
330793c91d
[libc] fix clang-tidy llvm-header-guard warnings (#82679)
Towards the goal of getting `ninja libc-lint` back to green, fix the numerous
instances of:

    warning: header guard does not follow preferred style [llvm-header-guard]

This is because many of our header guards start with `__LLVM` rather than
`LLVM`.

To filter just these warnings:

    $ ninja -k2000 libc-lint 2>&1 | grep llvm-header-guard

To automatically apply fixits:

    $ find libc/src libc/include libc/test -name \*.h | \
        xargs -n1 -I {} clang-tidy {} -p build/compile_commands.json \
        -checks='-*,llvm-header-guard' --fix --quiet

Some manual cleanup is still necessary as headers that were missing header
guards outright will have them inserted before the license block (we prefer
them after).
2024-02-28 12:53:56 -08:00
Michael Jones
9da9b5f867
[libc][docs] Document policy for non-standard func (#83212)
As encountered with <sys/queue.h>, we need a policy for how to handle
implementing functions that users need, but has no specific standard. In
that case, we should treat existing implementations as the standard and
try to match their behavior as best as possible.
2024-02-28 09:43:44 -08:00
Joseph Huber
04e8653f18
[libc] Add "include/" to the LLVM include directories (#83199)
Summary:
Recent changes added an include path in the float128 type that used the
internal `libc` path to find the macro. This doesn't work once it's
installed because we need to search from the root of the install dir.
This patch adds "include/" to the include path so that our inclusion
of installed headers always match the internal use.
2024-02-27 17:45:15 -06:00
Nick Desaulniers
06bcd9da16
[libc][stdbit] implement stdc_has_single_bit (C23) (#83168) 2024-02-27 13:45:37 -08:00
Joseph Huber
c6fa71cdd0
[libc][NFC] Add -Wno-multi-gpu everywhere for the GPU build (#83173)
Summary:
This warning is intended to indicate if `-march=native` returns
different values in a single compilation sense. As it stands we don't
care and it absolutely spams the test output if you run it on a machine
with more than one GPU like any cluster machine. Disable these warnings
everywhere we compile.
2024-02-27 15:14:01 -06:00
Joseph Huber
fd42044649
[libc] Re-Enable GPU tests and fix math exception handling (#83172)
Summary:
A lot of these tests failed previously and were disabled. However we
have fixed some things since then and many of these seem to pass.
Additionally, the last remaining math tests that failed seemed to be due
to the exception handling. For now we just set it to be 'errno'.

These pass locally when tested on a gfx1030, gfx90a, and sm_89
architecture. Hopefully these pass correctly on the sm_60 bot as I've
had things fail on that one only before.
2024-02-27 13:51:01 -06:00
Michael Jones
8e3b60540c
[libc] Add fixed point support to printf (#82707)
This patch adds the r, R, k, and K conversion specifiers to printf, with
accompanying tests. They are guarded behind the
LIBC_COPT_PRINTF_DISABLE_FIXED_POINT flag as well as automatic fixed
point support detection.
2024-02-27 11:03:20 -08:00
Joseph Huber
770694539b
[libc] Work around incorrect fmin/fmax results for +/-x (#83158)
Summary:
The IEEE 754 standard as of the 2019 revision states that for fmin -0.0
is always less than 0.0 and for fmax 0.0 is always greater than 0.0.
These are currently not respected by the builtin value and thus cause
the tests to fail. This patch works around it in the implementation for
now by explicitly modifying the sign bit.
2024-02-27 11:57:47 -06:00
Joseph Huber
d29261074c
[libc] Clean up GPU math implementations (#83133)
Summary:
The math directory likes to do architecture specific implementations of
these math functions. For the GPU case it was complicated by the fact
that both NVPTX and AMDGPU had to go through the same code paths. Since
reworking the GPU target this is no longer the case and we can simply
use the same scheme. This patch moves all the old code into two separate
directories. This likely results in a net increase in code, but it's
easier to reason with.
2024-02-27 11:39:13 -06:00
lntue
aa95aa69b9
[libc][math][c23] Add C23 math functions ilogbf128, logbf128, and llogb(f|l|f128). (#82144) 2024-02-27 12:23:19 -05:00
Joseph Huber
a6b4e29c77
[libc] Re-enable several GPU math smoke tests (#83147)
Summary:
These were originally disabled after some changes caused them to
regress. It seems that whatever broke them the first time a few months
ago has been fixed elsewhere and they now work again. Re-enable all the
ones that work. There are still a few that we need to look into, but
this is a good start.
2024-02-27 10:59:45 -06:00
lntue
ded4ea9752
[libc][stdfix] Add sqrt for fixed point types. (#83042) 2024-02-26 19:36:30 -05:00
Joseph Huber
7789fb6604
[libc][NFC] Move 'sleep_briefly' function to common header (#83074)
Summary:
The https://github.com/llvm/llvm-project/pull/83026 patch has another
use for this function. Additionally add support for the Arm instruction
barrier if this is ever used by other targets.
2024-02-26 16:42:25 -06:00
Schrodinger ZHU Yifan
3aec947b67
[libc][__support/memory_size] fix missing branch and add related tests (#83016)
fix #82644.
2024-02-26 13:21:27 -05:00
Nick Desaulniers
d8406d48a8
[libc][stdbit] implement stdc_count_ones (C23) (#82444) 2024-02-26 09:25:24 -08:00
Nick Desaulniers
f70d5c0bc8
[libc][stdbit] implement stdc_count_zeros (C23) (#82437) 2024-02-26 09:23:15 -08:00
Joseph Huber
69c0b2febe
[libc][NFC] Remove all trailing spaces from libc (#82831)
Summary:
There are a lot of random training spaces on various lines. This patch
just got rid of all of them with `sed 's/\ \+$//g'.
2024-02-23 16:34:00 -06:00
Joseph Huber
b43dd08aa3
[libc] Install a single LLVM-IR version of the GPU library (#82791)
Summary:
Recent patches have allowed us to treat these libraries as direct
builds. This makes it easier to simply build them to a single LLVM-IR
file. This matches the way these files are presented by the ROCm and
CUDA toolchains and makes it easier to work with.
2024-02-23 14:11:43 -06:00
Joseph Huber
1a2ecbb398
[libc] Remove 'llvm-gpu-none' directory from build (#82816)
Summary:
This directory is leftover from when we handled both AMDGPU and NVPTX in
the same build and merged them into a pseudo triple. Now the only thing
it contains is the RPC server header. This gets rid of it, but now that
it's in the base install directory we should make it clear that it's an
LLVM libc header.
2024-02-23 14:11:31 -06:00
Joseph Huber
a3a316e287
[libc] Remove use of BlockStore for GPU atexit (#82823)
Summary:
The GPU backends have restrictions on the kinds of initializers they can
produce. The use of BlockStore here currently breaks the backends
through the use of recursive initializers. This prevents it from
actually being included in any builds. This patchs changes it to just
use a fixed size of 64 slots .The chances of someone exceeding the 64
slots in practice is very, very low.

However, this is primarily a bandaid solution as a real solution will
need to use a lock free data structure to push work in parallel.
Currently the mutexes on the GPU build do nothing, so they only work if
the user guards the use themselves.
2024-02-23 14:10:53 -06:00
Joseph Huber
640ba3f8d1
[libc] Fix standard cross build targeting the GPU (#82724)
Summary:
The GPU target has recently been changed to support standard `libc`
build rules. This means we should be able to build for it both in
`LLVM_ENABLE_PROJECTS` mode, or targeting the runtimes directory
directly as in the LLVM `libc` documentation. Previously this failed
because the version check on the compiler was too strict and the
`--target=` options were not being set on the link jobs unless in CMake
cross compiliation mode. This patch fixes those so the following config
should work now to build the GPU target directly if using NVPTX.

```
cmake ../runtimes -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang \
  -DLLVM_ENABLE_RUNTIMES=libc -DLLVM_RUNTIMES_TARGET=nvptx64-nvidia-cuda \
  -DLLVM_DEFAULT_TARGET_TRIPLE=nvptx64-nvidia-cuda \
  -DLIBC_HDRGEN_EXE=/path/to/hdrgen/libc-hdrgen \
  -DLLVM_LIBC_FULL_BUILD=ON -GNinja
```
2024-02-23 12:00:01 -06:00
Joseph Huber
0352d5eee0
[libc][NFC] Remove redundant external clock symbol for AMDGPU (#82794)
Summary:
The AMDGPU target needs an external clock symbol so the driver can set
the frequency with the correct value. This was left over from the
previous implementation and I forgot to remove it when actually
implementing the timing utilities.
2024-02-23 11:59:46 -06:00
Joseph Huber
7a5c01dbca
[libc] Search the compiler's path for GPU utility tools (#82712)
Summary:
We need some extra tools for the GPU build. Normally we search for these
from the build itself, but in the case of a `LLVM_PROJECTS_BUILD` or
some other kind of external build, this directory will not be populated.
However, the GPU build already requires that the compiler is an
up-to-date clang, which should always have these present next to the
binary. Simply add this as a fallback search path. Generally we want it
to be the second, because it would pick up someone install and then
become stale.
2024-02-22 18:55:46 -06:00
Joseph Huber
9e84a22e69
[libc] Silence warnings when building GPU tests (#82701)
Summary:
This patch silences two warnings that may occur during the building of
GPU tests. These are not informative or helpful and just make the test
output longer.
2024-02-22 18:22:16 -06:00
Petr Hosek
5bd0c44bd0
[libc] Match the names of BSD sys/queue.h member names (#82696)
While these names are technically internal implemenetation detail,
there's an existing code which relies on these details and using
different names makes LLVM libc implementation incompatible. Since our
goal is for LLVM libc to be a drop in replacement, use the same name as
BSD sys/queue.h version.
2024-02-22 15:22:49 -08:00
Joseph Huber
47b7c91abe
[libc] Rework the GPU build to be a regular target (#81921)
Summary:
This is a massive patch because it reworks the entire build and
everything that depends on it. This is not split up because various bots
would fail otherwise. I will attempt to describe the necessary changes
here.

This patch completely reworks how the GPU build is built and targeted.
Previously, we used a standard runtimes build and handled both NVPTX and
AMDGPU in a single build via multi-targeting. This added a lot of
divergence in the build system and prevented us from doing various
things like building for the CPU / GPU at the same time, or exporting
the startup libraries or running tests without a full rebuild.

The new appraoch is to handle the GPU builds as strict cross-compiling
runtimes. The first step required
https://github.com/llvm/llvm-project/pull/81557 to allow the `LIBC`
target to build for the GPU without touching the other targets. This
means that the GPU uses all the same handling as the other builds in
`libc`.

The new expected way to build the GPU libc is with
`LLVM_LIBC_RUNTIME_TARGETS=amdgcn-amd-amdhsa;nvptx64-nvidia-cuda`.

The second step was reworking how we generated the embedded GPU library
by moving it into the library install step. Where we previously had one
`libcgpu.a` we now have `libcgpu-amdgpu.a` and `libcgpu-nvptx.a`. This
patch includes the necessary clang / OpenMP changes to make that not
break the bots when this lands.

We unfortunately still require that the NVPTX target has an `internal`
target for tests. This is because the NVPTX target needs to do LTO for
the provided version (The offloading toolchain can handle it) but cannot
use it for the native toolchain which is used for making tests.

This approach is vastly superior in every way, allowing us to treat the
GPU as a standard cross-compiling target. We can now install the GPU
utilities to do things like use the offload tests and other fun things.

Some certain utilities need to be built with 
`--target=${LLVM_HOST_TRIPLE}` as well. I think this is a fine
workaround as we
will always assume that the GPU `libc` is a cross-build with a
functioning host.

Depends on https://github.com/llvm/llvm-project/pull/81557
2024-02-22 15:29:29 -06:00
Michael Jones
5b079af169
[libc] add FXBits class (#82065)
The FXBits class is what will be used to modify fixed point numbers on a
bit level. This patch adds a basic implementation as well as basic
tests.
2024-02-22 09:52:16 -08:00
Petr Hosek
9dbedcac12
[build] Check RUNTIMES_${target}_LLVM_ENABLE_RUNTIMES for libc also (#82561)
When checking whether we need to build libc-hdrgen, we need to check
LLVM_ENABLE_RUNTIMES and RUNTIMES_${target}_LLVM_ENABLE_RUNTIMES, just
the former is not sufficient since libc may be enabled only for certain
targets.
2024-02-22 08:28:12 -06:00
Joseph Huber
049e142bad
[libc] Fix startup utilities failing to install in full build mode (#82522)
Summary:
Currently, doing `ninja install` will fail in fullbuild mode due to the
startup utilities not being built by default. This was hidden previously
by the fact that if tests were run, it would build the startup utilities
and thus they would be present.

This patch solves this issue by making the `libc-startup` target a
dependncy on the final library. Furthermore we simply factor out the
library install directory into the base CMake directory next to the
include directory handling. This change makes the `crt` files get
installed in `lib/x86_64-unknown-linu-gnu` instead of just `lib`.

This fixes an error I had where doing a runtimes failed to install its
libraries because the install step always errored.
2024-02-21 17:04:31 -06:00
Nick Desaulniers
646c7e5283
[libc] add more stdbit.h entrypoints to additional targets (#82440)
stdbit.h isn't complete yet, but looking to turn these on on more
targets for
earlier feedback.
2024-02-20 16:29:17 -08:00
Moshe
be8b2d1ea5
Add explicit conversion to fix arm64 builds. (#82429)
Fixes issue preventing builds on ARM-based Macs.

https://github.com/llvm/llvm-project/issues/82205.

Co-authored-by: Moshe Berman <mosheberman@users.noreply.github.com>
2024-02-20 16:52:07 -06:00
Nick Desaulniers
ed4bdb86b0
[libc][__support][bit] add count_zeros (#82076)
Will be useful for implementing C23 stdbit.h's stdc_count_zeros and
stdc_count_ones.
2024-02-20 12:38:23 -08:00
Joseph Huber
5454991c29
[libc] Cleanup of hermetic test flag handling (#82384)
Summary:
This cleans up the handling of hermetic test flags. Primarily done to
simplify the GPU rework patch.
2024-02-20 12:23:48 -06:00
Schrodinger ZHU Yifan
a73e924462
[libc] use LIBC_HAS_BUILTIN instead __has_builtin (#82377)
fix the issue that `__has_builtin` is undefined on some non-clang
targets.
2024-02-20 11:35:27 -05:00
Schrodinger ZHU Yifan
96c5b8cbd1
[libc][c23] add definitions for stdckdint.h (#82059)
See docs at
- https://gustedt.gitlabpages.inria.fr/c23-library/#stdckdint
- https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3047.pdf (Ch7.10)

Compiler header:
-
450462cbac/clang/lib/Headers/stdckdint.h
- New version of GCC
(cd503b0616/gcc/ginclude/stdckdint.h)
also provides this.
2024-02-20 11:20:15 -05:00
Schrodinger ZHU Yifan
8f7ae64ea1
[libc][cpp] add atomic_signal_fence (#82138)
Add `atomic_signal_fence`. This will be useful in
https://gustedt.gitlabpages.inria.fr/c23-library/#memset_explicit.
2024-02-20 10:59:50 -05:00
lntue
f01ed3bc88
[libc][stdfix] Add round functions for fixed point types. (#81994) 2024-02-16 12:45:26 -05:00