98 Commits

Author SHA1 Message Date
Victor Campos
6c2b155f4f
[libc] Fix build failures in fuzzing tests (#185017)
The tests:
 - __support/freelist_heap_fuzz.cpp
 - fuzzing/string/strlen_fuzz.cpp

had build failures for different reasons. This patch fixes these
failures.

freelist_heap_fuzz.cpp had this error:

```
llvm-project/libc/fuzzing/__support/freelist_heap_fuzz.cpp:150:26: error: use of undeclared identifier 'Block'; did you mean '__llvm_libc_23_0_0_git::Block'?
  150 |       size_t alignment = Block::MIN_ALIGN;
      |                          ^~~~~
      |                          __llvm_libc_23_0_0_git::Block
```

The issue stems from the fact that Block was not available in scope. It
needs to be referenced via LIBC_NAMESPACE.

strlen_fuzz.cpp had this error:

```
In file included from Workspace/llvm-project/libc/fuzzing/string/strlen_fuzz.cpp:14:
In file included from /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/c++/13/cstdint:38:
In file included from /usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/x86_64-linux-gnu/c++/13/bits/c++config.h:679:
/usr/lib/gcc/x86_64-linux-gnu/13/../../../../include/x86_64-linux-gnu/c++/13/bits/os_defines.h:44:5: error: function-like macro '__GLIBC_PREREQ' is not defined
   44 | #if __GLIBC_PREREQ(2,15) && defined(_GNU_SOURCE)

```

This issue is more cryptic to me, but I managed to fix it by changing
the includes from cstdint and cstring to stdint.h and string.h.
2026-03-16 11:14:57 +00:00
Schrodinger ZHU Yifan
db713325d5
[libc][tsearch] add weak AVL tree for tsearch implementation (#172411)
Related to #114695.

This PR adds a Weak AVL Tree for tsearch APIs. The symbol
implementations are coming in a
following up PR to avoid creating a huge patch. The work is based on
@MaskRay's recent post (see below).

A general self-balancing binary search tree where the node pointer can
be used as stable handles to the stored values.

The self-balancing strategy is the Weak AVL (WAVL) tree, based on the
following foundational references:
1. https://maskray.me/blog/2025-12-14-weak-avl-tree
2. https://reviews.freebsd.org/D25480
3. https://ics.uci.edu/~goodrich/teach/cs165/notes/WeakAVLTrees.pdf
4. https://dl.acm.org/doi/10.1145/2689412 (Rank-Balanced Trees)

WAVL trees belong to the rank-balanced binary search tree framework
(reference 4), alongside AVL and Red-Black trees.

Key Properties of WAVL Trees:
1. Relationship to Red-Black Trees: A WAVL tree can always be colored as
a
   Red-Black tree.
2. Relationship to AVL Trees: An AVL tree meets all the requirements of
a
WAVL tree. Insertion-only WAVL trees maintain the same structure as AVL
   trees.

Rank-Based Balancing:
In rank-balanced trees, each node is assigned a rank (conceptually
similar
to height). In AVL/WAVL, the rank difference between a parent and its
child is
strictly enforced to be either **1** or **2**.

- **AVL Trees:** Rank is equivalent to height. The strict condition is
that
there are no 2-2 nodes (a parent with rank difference 2 to both
children).
- **WAVL Trees:** The no 2-2 node rule is relaxed for internal nodes
during
the deletion fixup process, making WAVL trees less strictly balanced
than
  AVL trees but easier to maintain than Red-Black trees.

Balancing Mechanics (Promotion/Demotion):
- **Null nodes** are considered to have rank -1.
- **External/leaf nodes** have rank 0.
- **Insertion:** Inserting a node may create a situation where a parent
and
child
have the same rank (difference 0). This is fixed by **promoting** the
rank
of the parent and propagating the fix upwards using at most two
rotations
  (trinode fixup).
- **Deletion:** Deleting a node may result in a parent being 3 ranks
higher
than a child (difference 3). This is fixed by **demoting** the parent's
  rank and propagating the fix upwards.

Implementation Detail:
The rank is **implicitly** maintained. We never store the full rank.
Instead,
a 2-bit tag is used on each node to record the rank difference to each
child:
- Bit cleared (0) -> Rank difference is **1**.
- Bit set (1)     -> Rank difference is **2**.

---------

Co-authored-by: Michael Jones <michaelrj@google.com>
2026-01-21 12:19:34 -05:00
Kyungtak Woo
82ef720c6b
[libc][fuzzing] Delete test buffs for asan checks (#174018)
I'm currently getting "Detected memory leaks" errors due to this. This
change should always delete the buffers after use.
2025-12-30 16:11:46 -05:00
Michael Jones
cb43ae446f
[libc][fuzzing] Improve printf long double fuzzing (#172113)
Previously we only checked the long double value of the provided double.
This meant we didn't check any values near the edge of the long double
range, which meant we were missing several bugs. This patch adds a
second long double value to check which is generated separately from the
double value and can be anywhere in the range.
2025-12-16 18:31:55 +00:00
Daniel Thornburgh
b76300acc5
[libc][malloc] Ensure a minimum block alignment of 4 (#169447)
Most platforms inherently have a size_t alignment of 4, but this isn't
true on every platform LLVM has some degree of backend support for.
Accordingly, it's simple enough to just set the min alignment of Block
to 4 and lose the static_assert.
2025-12-01 14:41:20 -08:00
Schrodinger ZHU Yifan
8751f26a1b
[libc] add an SVE implementation of strlen (#167259)
This PR creates an SVE-based implementation for strlen by translating
from the AOR code in tree. Microbenchmark shows improvements against
NEON when N>=64. Although both implementations fall behind glibc by a
large margin,
this may be a good start point to explore SVE implementations.

Together with the PR:

1. Added two more tests of strlen with special nul symbols.
2. Added strlen's fuzzer and fix a typo in previous heap fuzzer.

```
=== strlen(16 bytes) ===
libc: 1.56115 ns/call, 9.54499 GiB/s
neon: 1.59393 ns/call, 9.34867 GiB/s
sve: 1.66097 ns/call, 8.97134 GiB/s

=== strlen(64 bytes) ===
libc: 2.06967 ns/call, 28.7991 GiB/s
neon: 2.59914 ns/call, 22.9325 GiB/s
sve: 2.58628 ns/call, 23.0465 GiB/s

=== strlen(256 bytes) ===
libc: 3.74165 ns/call, 63.7202 GiB/s
neon: 8.98243 ns/call, 26.5428 GiB/s
sve: 7.36426 ns/call, 32.3751 GiB/s

=== strlen(1024 bytes) ===
libc: 10.5327 ns/call, 90.5438 GiB/s
neon: 34.363 ns/call, 27.7529 GiB/s
sve: 26.9329 ns/call, 35.4092 GiB/s

=== strlen(4096 bytes) ===
libc: 37.7304 ns/call, 101.104 GiB/s
neon: 145.911 ns/call, 26.144 GiB/s
sve: 103.208 ns/call, 36.9612 GiB/s

=== strlen(1048576 bytes) ===
libc: 9623.4 ns/call, 101.478 GiB/s
neon: 36138.2 ns/call, 27.023 GiB/s
sve: 26605.6 ns/call, 36.7051 GiB/s
```
2025-11-10 19:15:34 -05:00
Michael Jones
c4709823bb
[libc] Fix issue with fuzz input too short for atoi diff fuzz (#161705)
The string to integer differential fuzzer assumes at least one byte of
meaningful input, but wasn't explicitly checking that. Now it does.
2025-10-02 10:43:57 -07:00
sribee8
da30197f1c
[libc] Fuzz tests for fsqrt, f16sqrt, and hypot (#150489)
Added fuzz tests for f16sqrt, fsqrt, and hypot

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-25 17:15:26 +00:00
sribee8
16b4fb50dd
[libc] cbrt fuzz test (#150063)
Implemented fuzz test for cbrt

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-22 21:31:12 +00:00
sribee8
82451d0b13
[libc] Updated exp fuzz tests (#148912)
Fuzz tests were previously in the wrong format, updated them to correct
format.

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-16 11:36:17 -07:00
sribee8
037d34815e
[libc] Updated fuzz tests for trig functions (#148891)
Fuzz tests were set up incorrectly so updated trig functions to match
the correct format.

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-16 17:57:47 +00:00
sribee8
ba95df17ec
[libc] sqrt and log functions fuzz tests (#148006)
added fuzz tests for sqrt and log functions

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-15 20:04:06 +00:00
sribee8
1f97c9432d
[libc] exp fuzz tests (#148086)
Created fuzz tests for exp functions

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-14 16:36:24 +00:00
sribee8
425ed22b2e
[libc] asin fuzz testing (#147786)
Added fuzz test for asin

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-10 16:28:57 +00:00
sribee8
a9d8843d71
[libc] Fuzz tests for acos and atan (#147843)
created fuzz tests for acos and atan

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-10 16:28:29 +00:00
sribee8
81614e5b90
[libc] sincos fuzz test (#147855)
Created fuzz test for sincos

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-07-10 16:26:26 +00:00
Michael Jones
452276ecc0
[libc] Fix missing errno include in fuzzer (#144132)
The printf parser uses errno for setting up the %m conversion. It was
presumably getting this include indirectly until a recent change. This
patch adds a direct dependency to fix it.
2025-06-13 11:00:08 -07:00
lntue
e581f1cc9a
[libc] Add proxy header for ENTRY type. (#139746)
https://github.com/llvm/llvm-project/issues/139561
2025-05-13 14:07:21 -04:00
Daniel Thornburgh
710ffb69bf
[libc] Fix warnings for freelist_heap_test/fuzz (#136634)
Fixes #122367
2025-04-22 11:11:31 -07:00
Joseph Huber
db6b7a84e6
[libc][NFC] Strip all training whitespace and missing newlines (#124163) 2025-01-23 12:02:54 -06:00
Lukas Bergdoll
a738d81cd2
[libc] Improve qsort (with build fix) (#121482) 2025-01-05 06:10:41 +08:00
Petr Hosek
51a0919412
[libc] Exclude FreeListHeap test and fuzzer on GPU (#120137)
FreeListHeap uses the _end symbol which conflicts with the _end symbol
defined by GPU start.cpp files so for now we exclude the test and the
fuzzer on GPU.
2024-12-16 13:28:42 -08:00
Petr Hosek
7bf3137c39
[libc] Breakup freelist_malloc into separate files (#119806)
This better matches the structure we use for the rest of libc.
2024-12-16 10:30:27 -08:00
Nick Desaulniers
431ea2d076
[libc] move bcmp, bzero, bcopy, index, rindex, strcasecmp, strncasecmp to strings.h (#118899)
docgen relies on the convention that we have a file foo.cpp in
libc/src/\<header\>/. Because the above functions weren't in libc/src/strings/
but rather libc/src/string/, docgen could not find that we had implemented
these.

Rather than add special carve outs to docgen, let's fix up our sources for
these 7 functions to stick with the existing conventions the rest of the
codebase follows.

Link: #118860
Fixes: #118875
2024-12-10 08:58:45 -08:00
Chuvak
3709c2d15a
[libc] Fix wrong name in Compare.h (#117223)
Fix for some mistakes in source code found using PVS Studio.

Inspired by: https://pvs-studio.com/en/blog/posts/cpp/1188/

Fixed:
- [Bug 5](https://pvs-studio.com/en/blog/posts/cpp/1188/#IDF23EA2CEAB)
2024-11-21 18:29:08 -05:00
Daniel Thornburgh
385961d7b2 Reapply "[libc] Use best-fit binary trie to make malloc logarithmic (#117065)"
This reverts commit 93b83642ee34d0092b94776728dad0117c2b72a1.

 - Correct riscv32 assumption about alignment (bit of a hack).
 - Fix test case where the largest_small and smallest sizes are the
   same.
2024-11-21 15:26:24 -08:00
Daniel Thornburgh
93b83642ee Revert "[libc] Use best-fit binary trie to make malloc logarithmic (#117065)"
This reverts commit b05600d96f46697e21f6b1b7ad901391326243a8.
riscv32 unit test still broken
2024-11-21 11:56:05 -08:00
Daniel Thornburgh
b05600d96f Reapply "[libc] Use best-fit binary trie to make malloc logarithmic" (#117065)
- Fix assertion expressions.
 - Fix incorrect small size in freestore_test.
 - There may only be one small size for high alignment and small
   pointers (riscv32).
 - Don't rely on stack alignment in FreeList test.
2024-11-21 11:30:51 -08:00
Daniel Thornburgh
9be475af81
Revert "[libc] Use best-fit binary trie to make malloc logarithmic" (#117065)
Reverts llvm/llvm-project#106259

Unit tests break on AArch64.
2024-11-20 14:00:07 -08:00
Daniel Thornburgh
c3207c31fc
[libc] Use best-fit binary trie to make malloc logarithmic (#106259)
This reworks the free store implementation in libc's malloc to use a
dlmalloc-style binary trie of circularly linked FIFO free lists. This
data structure can be maintained in logarithmic time, but it still
permits a relatively small implementation compared to other
logarithmic-time ordered maps.

The implementation doesn't do the various bitwise tricks or
optimizations used in actual dlmalloc; it instead optimizes for
(relative) readability and minimum code size. Specific optimization can
be added as necessary given future profiling.
2024-11-20 13:54:00 -08:00
Schrodinger ZHU Yifan
e59582b6f8
[libc] avoid type-punning with inactive union member (#116685) 2024-11-18 16:04:41 -05:00
RoseZhang03
2d95dee0c0
[libc] math fuzzing MPFR include statement (#102358)
Updated the include statement for MPFR
2024-08-07 21:12:40 +00:00
RoseZhang03
0142bd6b15
[libc] created tan function fuzzer (#101570)
Also edited file header formatting on sin_fuz and cos_fuzz
2024-08-01 23:19:47 +00:00
RoseZhang03
b45d36299e
[libc] added cos function fuzzing test (#101556) 2024-08-01 21:59:55 +00:00
RoseZhang03
83e6d872cf
[libc] heap_sort_fuzz deleted unnecessary includes (#101535)
Including src/__suppot/macros/config.h is unnecessary
2024-08-01 17:56:31 +00:00
Michael Jones
3497211d80
[libc] Fix math fuzzers (#101529)
Fix minor typos that accumulated while the math fuzzers were disabled.
2024-08-01 10:40:11 -07:00
RoseZhang03
90065da6d5
[libc] created fuzz test for sin function (#101411)
Verifies that sin function output is correct by comparing with MPFR
output. NaN and inf are not tested (as our output will vary compared to
MPFR), and signed zeroes are already tested in unit tests.
2024-08-01 17:31:04 +00:00
RoseZhang03
4ad2628ec9
[libc] fuzz test for heap_sort (#100826)
Made a fuzz test for heap_sort based off of qsort_fuzz implementation
2024-07-30 20:09:15 +00:00
lntue
dfdef2cbf7
[libc] Fix the remaining isnan and isinf in tests. (#100969)
Fixes https://github.com/llvm/llvm-project/issues/100964
2024-07-28 21:37:01 -07:00
Petr Hosek
5ff3ff33ff
[libc] Migrate to using LIBC_NAMESPACE_DECL for namespace declaration (#98597)
This is a part of #97655.
2024-07-12 09:28:41 -07:00
Mehdi Amini
ce9035f5bd
Revert "[libc] Migrate to using LIBC_NAMESPACE_DECL for namespace declaration" (#98593)
Reverts llvm/llvm-project#98075

bots are broken
2024-07-12 09:12:13 +02:00
Petr Hosek
3f30effe1b
[libc] Migrate to using LIBC_NAMESPACE_DECL for namespace declaration (#98075)
This is a part of #97655.
2024-07-11 12:35:22 -07:00
Schrodinger ZHU Yifan
0e5ff6251f
[libc] add hashtable fuzzing (#87949) 2024-05-02 15:36:10 -04:00
Guillaume Chatelet
09efe848cf
[libc][NFC] Rename UInt.h to big_int.h and UInt128.h to uint128.h for consistency (#87808) 2024-04-06 10:39:55 +02:00
lntue
5748ad84e5
[libc] Add proxy header math_macros.h. (#87598)
Context: https://github.com/llvm/llvm-project/pull/87017

- Add proxy header `libc/hdr/math_macros.h` that will:
  - include `<math.h>` in overlay mode,
- include `"include/llvm-libc-macros/math-macros.h"` in full build mode.
- Its corresponding CMake target `libc.hdr.math_macros` will only depend
on `libc.include.math` and `libc.include.llvm-libc-macros.math_macros`
in full build mode.
- Replace all `#include "include/llvm-libc-macros/math-macros.h"` with
`#include "hdr/math_macros.h"`.
- Add dependency to `libc.hdr.math_macros` CMake target when using
`add_fp_unittest`.
- Update the remaining dependency.
- Update bazel overlay: add `libc:hdr_math_macros` target, and replacing
all dependency on `libc:llvm_libc_macros_math_macros` with
`libc:hdr_math_macros`.
2024-04-05 18:21:16 -04:00
Guillaume Chatelet
71c3f5d617
[reland][libc] Refactor BigInt (#87613)
This is a reland of #86137 with a fix for platforms / compiler that do
not support trivially constructible int128 types.
2024-04-04 11:41:27 +02:00
Guillaume Chatelet
12735916bd
Revert "[libc] Refactor BigInt" (#87612)
Reverts llvm/llvm-project#86137

Some aarch64 compilers seem to consider that `uint128_t` is not
`is_trivially_constructible` which prevents `bit_cast`-ing.
2024-04-04 11:10:30 +02:00
Guillaume Chatelet
a2306b65d2
[libc] Refactor BigInt (#86137)
This patch moves most of the multiprecision logic to the `multiword`
namespace and simplifies some logic in `BigInt`. It also fully
implements the mask and count functions and increases test coverage.

`math_extras.h` is also reworked to make it more concise.
2024-04-04 10:27:08 +02:00
Michael Jones
5d56b34807
[libc] Remove direct math.h includes (#85324)
Reland of #84991

A downstream overlay mode user ran into issues with the isnan macro not
working in our sources with a specific libc configuration. This patch
replaces the last direct includes of math.h with our internal
math_macros.h, along with the necessary build system changes.
2024-03-18 14:19:33 -07: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