1924 Commits

Author SHA1 Message Date
Schrodinger ZHU Yifan
aef9a89c85
[NFC] add newline after stack smashing message (#100958)
<img width="662" alt="smash newline"
src="https://github.com/user-attachments/assets/99625bcb-efd6-4733-aa01-2a2167ee686f">
2024-07-28 19:23:36 -07:00
Eric977
44df89cc30
[libc] add pthread_rwlock_clockrdlock and pthread_rwlock_clockwrlock … (#100543) 2024-07-28 11:58:09 -07:00
Schrodinger ZHU Yifan
3db5c1eeb0
revert all tid changes (#100915) 2024-07-27 22:29:21 -07:00
Schrodinger ZHU Yifan
62e5b6e817
[libc] fix pthread build issue for full-build mode (#100912)
Fix a silly typo that stops pthread from being built
2024-07-27 20:53:50 -07:00
Joseph Huber
dbb8b7a0f4 Reapply "[OpenMP][libc] Remove special handling for OpenMP printf (#98940)"
This reverts commit fea5914c926e2f013a8b5e27eaa74c7047fb2c71.
2024-07-26 17:21:56 -05:00
Joseph Huber
fea5914c92 Revert "[OpenMP][libc] Remove special handling for OpenMP printf (#98940)"
This reverts commit 069e8bcd82c4420239f95c7e6a09e1f756317cfc.

Summary:
Some tests failing, revert this for now.
2024-07-26 16:39:12 -05:00
Joseph Huber
069e8bcd82
[OpenMP][libc] Remove special handling for OpenMP printf (#98940)
Summary:
Currently there are several layers to handle `printf`. Since we now have
varargs and an implementation of `printf` this can be heavily
simplified.

1. The frontend renames `printf` into `omp_vprintf` and gives it an
   argument buffer.

Removing 1. triggered some code in the AMDGPU backend menat for HIP /
OpenCL, so I hadded an exception to it.

2. Forward this to CUDA vprintf or ignore it.

We no longer need special handling for it since we have varargs. So now
we just forward this to CUDA vprintf if we have libc, otherwise just
leave `printf` as an external function and expect that `libc` will be
linked in.
2024-07-26 16:03:36 -05:00
lntue
ca8b14de51
[libc][math] Implement fast pass for double precision atan2 with 1 ULP errors. (#100648) 2024-07-26 09:56:46 -04:00
Daniel Thornburgh
0c10bdc05f
[libc] Lazily initialize freelist malloc using symbols (#99254)
This requires the user to set the upper bounds of the heap by defining
the symbol `__libc_heap_limit`. The heap begins at `_end` and ends
`__libc_heap_limit` bytes afterwards. This prevents a completely unused
heap from requiring any space, and it prevents the heap from being
zeroed at initialization time as part of BSS. It also allows users to
customize the available heap location without recompiling libc.
    
I'd think this should eventually be replaced with an implemenation based
on a morecore() library. This would allow the same implementation to use
sbrk() on POSIX, `_end` and `__libc_heap_limit` on embedded, and a
buffer in tests. It would also provide better "wilderness" behavior that
tends to decrease heap fragementation (see Wilson et al.)

See #98096
2024-07-25 13:38:06 -07:00
Joseph Huber
888ae9066d
[libc] Fix leftoever debug in 'f16fma' function (#100638)
Summary:
This caused issues on NVPTX
2024-07-25 15:25:06 -05:00
OverMighty
81ce796095
[libc][math][c23] Enable C23 _Float16 math functions on GPUs (#99248) 2024-07-25 21:09:49 +02:00
Daniel Thornburgh
3c21074064
[NFC][libc][malloc] Refactor Block (#100445)
This decreases the surface area of the block implementation in
preparation for deeper changes to its implementation.

See #98096 

- Remove dead member functions.
- Remove last() check from next(), as described in its comment.
- Rework object lifetimes such that only block headers are actually
considered live. This simplifies their implementation.
- The allocated storage becomes live at the outer call to malloc-family
functions via a special case in the C++ standard.
- Add asserts for flag properties required by the implementation.
- Remove static from member functions that don't invalidate the block.
2024-07-25 11:23:38 -07:00
Job Henandez Lara
7b51777ed8
[libc][math][c23] add entrypoints and tests for totalordermag{f,l,f128} (#100159)
Fixes https://github.com/llvm/llvm-project/issues/100139
2024-07-24 19:53:23 -04:00
Daniel Thornburgh
f9cf5393dc
[libc][malloc] Align blocks to max_align_t. (#100279)
Since there are two offsets from block start to usable area, this
ensures that the usable area is maximally aligned, so long as the offset
type size is no less than half the max alignment. This is true on at
least typical 32-bit and 64-bit targets.

Previously, there was a roughly 50-50 chance a given block's usable area
would be misaligned for a malloc on a 32-bit system. The half that were
misaligned would require at least one block of additional padding,
costing 12 bytes. With this change, the only cost is 0-4 bytes at the
beginning of the heap to reach an initial 8-byte alignment.

See #98096
2024-07-23 17:16:41 -07:00
Daniel Thornburgh
25f0381ba1
[libc][malloc] Reduce block overhead by 4 bytes plus alignment effects (#99945)
The unused padding and alignment fields were removed. The used and last
bits were stashed into the lower two bits of the next chunk offset.
(This is a very typical trick for Knuth boundary tags.) The chunk
offsets were recast as counting bytes rather than multiples of the
alignment. To ensure that the lowest two bits are not significant, the
minimum alignment was bumped to 4. This shouldn't affect anything in
practice, since alignof(max_align_t) is overwhelmingly likely to be 8.

See #98096
2024-07-23 15:56:24 -07:00
OverMighty
61dcc9fee8
[libc][math] Fix use of float16 not guarded by LIBC_TYPES_HAS_FLOAT16 (#100241) 2024-07-24 00:15:11 +02:00
OverMighty
e7f8d4be5a
[libc][math] Optimize maximum and minimum functions using builtins when available (#100002) 2024-07-23 23:59:55 +02:00
Paul Kirth
8bdc3d9ebb
Revert "[libc][RISCV] Add naked attribute to setjmp/longjmp" (#100193)
Reverts llvm/llvm-project#100036

This caused a failure on bots:
https://lab.llvm.org/buildbot/#/builders/183/builds/1799

We likely need to discuss the particulars here a bit more deeply before
either relanding or choosing an alternate solution.
2024-07-23 13:17:12 -07:00
Joseph Huber
14e20eebd1
[libc] Fix missing default value for errno config (#100175)
Summary:
The configs all need default values which targets then override. This
one was an empty string which made the logic report an error. The only
reason it wasn't a build failure was because of a stray `:`.
2024-07-23 15:05:40 -05:00
Paul Kirth
05b586be3d
[libc][RISCV] Add naked attribute to setjmp/longjmp (#100036)
We want to avoid any possibility that the compiler will insert a
prologue/epilogue violating the calling contracts for these special
functions, potentially clobbering registers that must be preserved. To
do that they should be marked naked, as is already the case on ARM.
See #87837 for further context.
2024-07-23 10:42:55 -07:00
lntue
1e58c9de75
[libc] Fix math tests for macos arm64. (#100060)
Some problem with current build on macos:
- no libatomic.
- death tests do not work yet.
2024-07-23 12:23:00 -04:00
Michael Jones
173514ff12
[libc] Disable epoll_pwait2 for now. (#99967)
This patch reverts #99781 and part of #99771 since `epoll_pwait2` is not
in fact available on all supported systems. It is my opinion that we
shouldn't provide a version of a function that doesn't perform as
expected, which is why this revert needs to happen.

The `epoll_pwait2` function can be reenabled when we have a way to check
if it is available on the target system, tracking bug for that is #80060
2024-07-22 15:34:24 -07:00
Michael Jones
9da087147a
[libc][NFC] clean up some includes (#99719)
While looking through the list of includes for #99693 I found these
includes that also need to be cleaned up. I removed the extra includes
in expm1.cpp, but the include in thread.h needs more attention so I just
marked it with a todo.
2024-07-22 14:54:33 -07:00
Joseph Huber
aac3a2a291
[libc] Fix callback type in exit_handlers.cpp not matching (#97642)
Summary:
This file is an object library, but uses the `LIBC_COPT_PUBLIC_PACKAING`
option. This will always be undefined which leads to a type mismatch
when uses actually try to link against it. This patch simply removes
this and turns it into a header only library. This means that the
implementations of the callback lists and the mutexes need to live in
their respective files. The result is that `atexit` needs to be defined
for `at_quick_exit` to be valid.
2024-07-22 15:28:48 -05:00
Mikhail R. Gadelha
c80b799e90
[libc] No need to use recursion in fcntl (#99893)
This patch removes the recursion in fcntl introduced by PR #99675 as it is not required and may be dangerous in some cases: some toolchains define F_GETLK == F_GETLK64 causing infinite recursion.
2024-07-22 13:40:47 -03:00
OverMighty
70843bf658
[libc][math] Optimize copysign{,f,f16} and fabs{,f,f16} with builtins when available (#99037) 2024-07-22 18:37:44 +02:00
Mikhail R. Gadelha
cda5b2b4b8
[libc] Change fcntl cmd when only fcntl64 is available (#99675)
In some systems like rv32, only fcntl64 is available and it employs a different structure for file locking and the correspoding F_GETLK64, F_SETLK64, and F_SETLKW64 commands.

So if we use fcntl64, the F_GETLK, F_SETLK, and F_SETLKW commands need to be changed to their 64 versions. This patch adds new cases to the swich(cmd) in our implementation of fcntl to do that.

The default case was moved to outside the switch, so we don't need to change anything, the F_GETLK, F_SETLK, and F_SETLKW commands will just go through the old implementation.
2024-07-22 12:18:48 -03:00
Joseph Huber
65825cd543
[libc] Use <assert.h> in overlay mode for LIBC_ASSERT (#99875)
Summary:
This uses `internal::exit` which is not built in overlay mode, leading
to linker errors. Fix this to just use `assert.h`.
2024-07-22 10:12:43 -05:00
lntue
74a1ca504b
[libc][math] Update getpayload and fmul/fadd/fsub/ffma with NaN inputs. (#99812) 2024-07-21 19:27:06 -04:00
Job Henandez Lara
c1562374c8
[libc][math][c23] Add entrypoints and tests for dsqrt{l,f128} (#99815) 2024-07-21 15:55:11 -04:00
Job Henandez Lara
af0f58cf14
[libc][math][c23] Add entrypoints and tests for fsqrt{,l,f128} (#99669) 2024-07-21 11:17:41 -04:00
Mikhail R. Gadelha
569814e862
[libc] Implement pwait2 using pwait (#99781)
This patch implements pwait2 using pwait. The implementation is an
approximation of pwait2, since pwait only only supports timeouts in
milliseconds, not nanoseconds, as required by pwait2.
2024-07-20 17:27:39 -03:00
Mikhail R. Gadelha
2308c7f5c5
[libc] Enable most of the libc entrypoitns for riscv (#99771)
This patch enables most of the libc entrypoints for riscv, except for fstatvfs, statvfs, dmull and fmull which are currently failing compilation. float16 is also not added, as rv32 doesn't seem to support it yet.

This patch also fixes the call to seek, which should take an off_t, and was missed in PR #68269.
2024-07-20 15:47:09 -03:00
Mikhail R. Gadelha
91bf0a0739
[libc] Added static casts to fix implicit conversion warnings in 32-bit systems
This patch fixes:

randomness.h and getauxval.cpp were passing ssize_t as size_t
kernel_statx.h was assigning an uint64_t to uintptr_t
fopencookie.cpp was trying to create a FileIOResult using ssize_t but the constructor expected a size_t
thread.h was trying to call free_stack (which takes a size_t) with an unsigned long long. free_stack does the calculations using uintptr_t, so I changed the passing values to size_t
2024-07-20 15:12:31 -03:00
Schrodinger ZHU Yifan
29be889c2c
reland "[libc] implement cached process/thread identity (#98989)" (#99765) 2024-07-20 10:25:40 -07:00
aaryanshukla
a3ebb669d1
[libc][math]: updated math docs for newhdrgen (#99715) 2024-07-19 18:43:27 -07:00
aaryanshukla
a2f61ba08b
[libc][math]fadd implementation (#99694)
- **[libc] math fadd**
- **[libc][math] implemented fadd**
2024-07-19 14:40:34 -07:00
Mikhail R. Gadelha
ac11430983
[libc] Fix missing sysroot path for kernel headers when crosscompiling (#99588)
When crosscompiling, we need to search for the linux kernel headers in the sysroot but since #97486 the linux kernel headers were always searched in /usr/include.

This patch fixes this behaviour by prepending a '=' to where we search for the kernel headers. As per the gcc/clang's documentation a '=' before the path is replaced by the sysroot.

This patch also includes a fix for rv32, that fails to compile due to a missing definition of CLOCK_REALTIME after this change.
2024-07-19 12:20:16 -03:00
lntue
9da9127fec
[libc][math] Fix signaling nan handling of hypot(f) and improve hypotf performance. (#99432)
The errors were reported by Paul Zimmermann with the CORE-MATH project's
test suites:
```
zimmerma@tartine:/tmp/core-math$ CORE_MATH_CHECK_STD=true LIBM=$L ./check.sh hypot
Running worst cases check in --rndn mode...
FAIL x=snan y=inf ref=qnan z=inf
Running worst cases check in --rndz mode...
FAIL x=snan y=inf ref=qnan z=inf
Running worst cases check in --rndu mode...
FAIL x=snan y=inf ref=qnan z=inf
Running worst cases check in --rndd mode...
Spurious inexact exception for x=0x1.ffffffffffffep+24 y=0x1p+0 (z=0x1.0000000000001p+25)
```
2024-07-19 10:40:44 -04:00
Joseph Huber
7e37d02102 [libc] Fix headers for statvfs implementation
Summry:
@lntue
2024-07-19 09:26:55 -05:00
RoseZhang03
0004ca670a
[libc] Removed __LIBC_CONST_ATTR attribute and updated math.yaml with the new math functions (#99571)
- deleted attribute from fabs function
- added math functions from #98972
- also updated statvfs files so that it can be generated
2024-07-18 22:58:34 +00:00
Schrodinger ZHU Yifan
415ca24f8e
Revert "[libc] implement cached process/thread identity" (#99559)
Reverts llvm/llvm-project#98989
2024-07-18 13:31:04 -07:00
Schrodinger ZHU Yifan
5c9fc3cdd7
[libc] implement cached process/thread identity (#98989)
migrated from https://github.com/llvm/llvm-project/pull/95965 due to
corrupted git history
2024-07-18 13:27:50 -07:00
OverMighty
9fb049c8c6
[libc][math][c23] Add {f,d}mul{l,f128} and f16mul{,f,l,f128} C23 math functions (#98972)
Part of #93566.
                
Fixes #94833.
2024-07-18 19:50:49 +02:00
lntue
ac1d5facf6
[libc][math] Remove constexpr quantifier from cbrt's utility functions. (#99349)
Fix full build failures:
https://lab.llvm.org/buildbot/#/builders/131/builds/2342
2024-07-17 12:33:05 -04:00
lntue
7fc9fb9f3f
[libc][math] Implement double precision cbrt correctly rounded to all rounding modes. (#99262)
Division-less Newton iterations algorithm for cube roots.

1. **Range reduction**

For `x = (-1)^s * 2^e * (1.m)`, we get 2 reduced arguments `x_r` and `a`
as:
```
  x_r = 1.m
  a   = (-1)^s * 2^(e % 3) * (1.m)
```
Then `cbrt(x) = x^(1/3)` can be computed as:
```
  x^(1/3) = 2^(e / 3) * a^(1/3).
```

In order to avoid division, we compute `a^(-2/3)` using Newton method
and then
multiply the results by a:
```
  a^(1/3) = a * a^(-2/3).
```

2. **First approximation to a^(-2/3)**

First, we use a degree-7 minimax polynomial generated by Sollya to
approximate `x_r^(-2/3)` for `1 <= x_r < 2`.
```
  p = P(x_r) ~ x_r^(-2/3),
```
with relative errors bounded by:
```
  | p / x_r^(-2/3) - 1 | < 1.16 * 2^-21.
```

Then we multiply with `2^(e % 3)` from a small lookup table to get:
```
  x_0 = 2^(-2*(e % 3)/3) * p
      ~ 2^(-2*(e % 3)/3) * x_r^(-2/3)
      = a^(-2/3)
```
with relative errors:
```
  | x_0 / a^(-2/3) - 1 | < 1.16 * 2^-21.
```
This step is done in double precision.

3. **First Newton iteration**

We follow the method described in:
Sibidanov, A. and Zimmermann, P., "Correctly rounded cubic root
evaluation
in double precision", https://core-math.gitlabpages.inria.fr/cbrt64.pdf
to derive multiplicative Newton iterations as below:
Let `x_n` be the nth approximation to `a^(-2/3)`. Define the n^th error
as:
```
  h_n = x_n^3 * a^2 - 1
```
Then:
```
  a^(-2/3) = x_n / (1 + h_n)^(1/3)
           = x_n * (1 - (1/3) * h_n + (2/9) * h_n^2 - (14/81) * h_n^3 + ...)
```
using the Taylor series expansion of `(1 + h_n)^(-1/3)`.

Apply to `x_0` above:
```
  h_0 = x_0^3 * a^2 - 1
      = a^2 * (x_0 - a^(-2/3)) * (x_0^2 + x_0 * a^(-2/3) + a^(-4/3)),
```
it's bounded by:
```
  |h_0| < 4 * 3 * 1.16 * 2^-21 * 4 < 2^-17.
```
So in the first iteration step, we use:
```
  x_1 = x_0 * (1 - (1/3) * h_n + (2/9) * h_n^2 - (14/81) * h_n^3)
```
Its relative error is bounded by:
```
  | x_1 / a^(-2/3) - 1 | < 35/242 * |h_0|^4 < 2^-70.
```
Then we perform Ziv's rounding test and check if the answer is exact.
This step is done in double-double precision.

4. **Second Newton iteration**

If the Ziv's rounding test from the previous step fails, we define the
error
term:
```
  h_1 = x_1^3 * a^2 - 1,
```
And perform another iteration:
```
  x_2 = x_1 * (1 - h_1 / 3)
```
with the relative errors exceed the precision of double-double.
We then check the Ziv's accuracy test with relative errors < 2^-102 to
compensate for rounding errors.

5. **Final iteration**
 
If the Ziv's accuracy test from the previous step fails, we perform
another
iteration in 128-bit precision and check for exact outputs.
2024-07-17 12:23:14 -04:00
Mikhail R. Gadelha
5d42d69d93
[libc] Change rand implementation so all tests pass in both 32- and 64-bit systems (#98692)
This patch makes rand select different algorithms depending on the arch.
This is needed to avoid a test failure in 32-bit systems where the LSB
of rand was not uniform enough when the 64-bit constants are used in
32-bit systems.
2024-07-17 12:01:26 -03:00
Joseph Huber
8393ea5d1d
[libc] Implement clock_gettime for the monotonic clock on the GPU (#99067)
Summary:
This patch implements `clock_gettime` using the monotonic clock. This
allows users to get time elapsed at nanosecond resolution. This is
primarily to facilitate compiling the `chrono` library from `libc++`.
For this reason we provide both `CLOCK_MONOTONIC`, which we can
implement
with the GPU's global fixed-frequency clock, and `CLOCK_REALTIME` which
we cannot. The latter is provided just to make people who use this
header happy and it will always return failure.
2024-07-16 16:17:34 -05:00
Joseph Huber
f7cee44ef2
[libc] Add strerror and strerror_k to the GPU (#99083)
Summary:
The GPU ignores `errno` primarily, but targets want these functions to
be defined for certain C standard interfaces. This patch enables them
and makes the test function on non-Linux targets.
2024-07-16 16:17:01 -05:00
lntue
a6d2da8b9d
[libc][stdlib] Implement heap sort. (#98582) 2024-07-16 08:13:25 -04:00