summaryrefslogtreecommitdiff
path: root/libcxx/src/include
AgeCommit message (Collapse)Author
2025-05-16[libc++][NFC] Update the documentation for _LIBCPP_OVERRIDABLE_FUNCTION ↵Louis Dionne
(#140121)
2025-05-12[libc++] Fix missing #includes (#130536)Matt
Adds missing includes that were detected when I tried to build libc++ as a module. Working towards #127012
2025-05-09[libcxx][NFC] Use macros for functions that support overriding detection ↵Petr Hosek
(#133876) We plan to replace the existing mechanism for overriding detection with one that doesn't require the use of a special section as an alternative to llvm/llvm-project#120805 which had other downsides. This change is a pure refactoring that lays the foundation for a subsequent change that will introduce the new detection mechanism.
2025-01-27Revert "[libcxx] Use alias for detecting overriden function" (#124431)Petr Hosek
Reverts llvm/llvm-project#120805 This change while desirable has two issues we discovered: - It is incompatible with `-funique-internal-linkage-names`, see https://github.com/llvm/llvm-project/pull/120805#discussion_r1913709817 - It is incompatible with `-fvisibility-global-new-delete=force-hidden`, see https://github.com/llvm/llvm-project/issues/123224#issuecomment-2607963878 We were hoping to address both of these issues with https://github.com/llvm/llvm-project/pull/122983, but that change has other issues we haven't yet managed to resolve. For now, we have decided to revert the change to avoid shipping a broken feature in LLVM 20, and we plan to follow up with a new approach post branch.
2025-01-07[libcxx] Use alias for detecting overriden function (#120805)Petr Hosek
This mechanism is preferable in environments like embedded since it doesn't require special handling of the custom section. This is a reland of https://github.com/llvm/llvm-project/pull/114961 which addresses the issue reported by downstream users. Specifically, the two differences from the previous version are: * The internal `symbol##_impl__` symbol in the Mach-O implementation is annotated with `__attribute__((used))` to prevent LTO from deleting it which we've seen in the previous version. * `__is_function_overridden` is marked as `inline` so these symbols are placed in a COMDAT (or fully inlined) to avoid duplicate symbol errors which we've seen in the previous version.
2024-12-19Revert "[libcxx] Use alias for detecting overriden function (#114961)"Nico Weber
This reverts commit 62bd10f7d18ca6f544286767cae2c9026d493888. Breaks building with -flto=thin, see https://github.com/llvm/llvm-project/pull/114961#issuecomment-2555754056
2024-12-17[libcxx] Use alias for detecting overriden function (#114961)Petr Hosek
This mechanism is preferable in environments like embedded since it doesn't require special handling of the custom section.
2024-11-06[libc++] Refactor the configuration macros to being always defined (#112094)Nikolas Klauser
This is a follow-up to #89178. This updates the `<__config_site>` macros.
2024-10-21[libcxx][libc] Hand in Hand PoC with from_chars (#91651)Michael Jones
Implements std::from_chars for float and double. The implementation uses LLVM-libc to do the real parsing. Since this is the first time libc++ uses LLVM-libc there is a bit of additional infrastructure code. The patch is based on the [RFC] Project Hand In Hand (LLVM-libc/libc++ code sharing) https://discourse.llvm.org/t/rfc-project-hand-in-hand-llvm-libc-libc-code-sharing/77701
2024-09-19[libcxx] No _LIBCPP_ELAST needed for LLVM libc (#108739)Petr Hosek
LLVM libc can handle out-of-range errno values.
2024-09-09[PAC] Make __is_function_overridden pauth-aware on ELF platforms (#107498)Anton Korobeynikov
Apparently, there are two almost identical implementations: one for MachO and another one for ELF. The ELF bits somehow slipped while https://github.com/llvm/llvm-project/pull/84573 was reviewed. The particular implementation is identical to MachO case.
2024-09-05[libc++][NFC] Increase consistency for namespace closing commentsLouis Dionne
2024-08-30[libc++][NFC] Run clang-format on libcxx/includeLouis Dionne
This re-formats a few headers that had become out-of-sync with respect to formatting since we ran clang-format on the whole codebase. There's surprisingly few instances of it.
2024-08-14[libcxx] Disable invalid `__start/__stop` reference on NVPTX (#99381)Joseph Huber
Summary: The logic for this `__is_function_overridden` check requires accessing a runtime array normally created by the linker. The NVPTX target is an `__ELF__` target, however it does not support emitting the `__start/__stop` symbols for C-identifier named sections. This needs to be disabled explicitly so that the user can compile this with anything.
2024-07-23[libc++][libc++abi] Minor follow-up changes after ptrauth upstreaming (#87481)Louis Dionne
This patch applies the comments provided on #84573. This is done as a separate PR to avoid merge conflicts with downstreams that already had ptrauth support.
2024-07-12[libc++][NFC] Remove outdated comment about overridable_function being in ↵Louis Dionne
libcxx/include
2024-07-07[libc++][TZDB] Makes implementation experimental. (#95657)Mark de Wever
This moves the files to libcxx/src/experimental/ as discussed in #90394. Fixes: https://github.com/llvm/llvm-project/issues/94902
2024-04-13[tzdb] Replace shared_mutex with mutex. (#87929)Eric
The overhead of taking a std::mutex is much lower than taking a reader lock on a shared mutex, even under heavy contention. The benefit of shared_mutex only occurs as the amount of time spent in the critical sections grows large enough. In our case all we do is read a pointer and return the lock. As a result, using a shared lock can be ~50%-100% slower Here are the results for the provided benchmark on my machine: ``` 2024-04-07T12:48:51-04:00 Running ./libcxx/benchmarks/shared_mutex_vs_mutex.libcxx.out Run on (12 X 400 MHz CPU s) CPU Caches: L1 Data 32 KiB (x6) L1 Instruction 32 KiB (x6) L2 Unified 1024 KiB (x6) L3 Unified 32768 KiB (x1) Load Average: 2.70, 2.70, 1.63 --------------------------------------------------------------------- Benchmark Time CPU Iterations --------------------------------------------------------------------- BM_shared_mutex/threads:1 13.9 ns 13.9 ns 50533700 BM_shared_mutex/threads:2 34.5 ns 68.9 ns 9957784 BM_shared_mutex/threads:4 38.4 ns 137 ns 4987772 BM_shared_mutex/threads:8 51.1 ns 358 ns 1974160 BM_shared_mutex/threads:32 57.1 ns 682 ns 1043648 BM_mutex/threads:1 5.54 ns 5.53 ns 125867422 BM_mutex/threads:2 15.5 ns 30.9 ns 21830116 BM_mutex/threads:4 15.4 ns 57.2 ns 12136920 BM_mutex/threads:8 19.3 ns 140 ns 4997080 BM_mutex/threads:32 20.8 ns 252 ns 2859808 ```
2024-04-10[libc++] Adds a global private constructor tag. (#87920)Mark de Wever
This removes the similar tags used in the chrono tzdb implementation. Fixes: https://github.com/llvm/llvm-project/issues/85432
2024-04-10[libc++][chrono] Adds the sys_info class. (#85619)Mark de Wever
Adds the sys_info class and time_zone::get_info(). The code still has a few quirks and has not been optimized for performance yet. The returned sys_info is compared against the output of the zdump tool in the test giving confidence the implementation is correct. Implements parts of: - P0355 Extending <chrono> to Calendars and Time Zones Implements: - LWGXXXX The sys_info range should be affected by save
2024-04-03[libc++][chrono] Loads leap-seconds.list in tzdb. (#82113)Mark de Wever
This implements the loading of the leap-seconds.list file and store its contents in the tzdb struct. This adds the required `leap_seconds` member. The class leap_seconds is fully implemented including its non-member functions. Implements parts of: - P0355 Extending <chrono> to Calendars and Time Zones - P1614 The Mothership has Landed Implements: - P1981 Rename leap to leap_second - LWG3359 <chrono> leap second support should allow for negative leap seconds - LWG3383 §[time.zone.leap.nonmembers] sys_seconds should be replaced with seconds
2024-04-03[libc++] Upstream ptrauth support in libc++ and libc++abi (#84573)Louis Dionne
This is an exact upstreaming of the downstream diff. Minor simplifications can be made in the future but upstreaming as-is will make it easier for us to deal with downstream merge conflicts. Partially fixes #83805
2024-03-27[NFC][libc++][TZDB] Improves some internals. (#84800)Mark de Wever
Removes some unneeded overloads in the pimpl class; they implementation could be in the caller. The pimpl member functions are __uglified.
2024-02-17[libc++][chrono] Loads tzdata.zi in tzdb. (#74928)Mark de Wever
This implements the loading of the tzdata.zi file and store its contents in the tzdb struct. This adds all required members except: - the leap seconds, - the locate_zone, and - current_zone. The class time_zone is incomplete and only contains the parts needed for storing the parsed data. The class time_zone_link is fully implemented including its non-member functions. Implements parts of: - P0355 Extending <chrono> to Calendars and Time Zones - P1614 The Mothership has Landed Implements: - P1982 Rename link to time_zone_link
2024-01-22[libc++] Fix the behavior of throwing `operator new` under -fno-exceptions ↵Louis Dionne
(#69498) In D144319, Clang tried to land a change that would cause some functions that are not supposed to return nullptr to optimize better. As reported in https://reviews.llvm.org/D144319#4203982, libc++ started seeing failures in its CI shortly after this change was landed. As explained in D146379, the reason for these failures is that libc++'s throwing `operator new` can in fact return nullptr when compiled with exceptions disabled. However, this contradicts the Standard, which clearly says that the throwing version of `operator new(size_t)` should never return nullptr. This is actually a long standing issue. I've previously seen a case where LTO would optimize incorrectly based on the assumption that `operator new` doesn't return nullptr, an assumption that was violated in that case because libc++.dylib was compiled with -fno-exceptions. Unfortunately, fixing this is kind of tricky. The Standard has a few requirements for the allocation functions, some of which are impossible to satisfy under -fno-exceptions: 1. `operator new(size_t)` must never return nullptr 2. `operator new(size_t, nothrow_t)` must call the throwing version and return nullptr on failure to allocate 3. We can't throw exceptions when compiled with -fno-exceptions In the case where exceptions are enabled, things work nicely. `new(size_t)` throws and `new(size_t, nothrow_t)` uses a try-catch to return nullptr. However, when compiling the library with -fno-exceptions, we can't throw an exception from `new(size_t)`, and we can't catch anything from `new(size_t, nothrow_t)`. The only thing we can do from `new(size_t)` is actually abort the program, which does not make it possible for `new(size_t, nothrow_t)` to catch something and return nullptr. This patch makes the following changes: 1. When compiled with -fno-exceptions, the throwing version of `operator new` will now abort on failure instead of returning nullptr on failure. This resolves the issue that the compiler could mis-compile based on the assumption that nullptr is never returned. This constitutes an API and ABI breaking change for folks compiling the library with -fno-exceptions (which is not the general public, who merely uses libc++ headers but use a shared library that has already been compiled). This should mostly impact vendors and other folks who compile libc++.dylib themselves. 2. When the library is compiled with -fexceptions, the nothrow version of `operator new` has no change. When the library is compiled with -fno-exceptions, the nothrow version of `operator new` will now check whether the throwing version of `operator new` has been overridden. If it has not been overridden, then it will use an implementation equivalent to that of the throwing `operator new`, except it will return nullptr on failure to allocate (instead of terminating). However, if the throwing `operator new` has been overridden, it is now an error NOT to also override the nothrow `operator new`. Indeed, there is no way for us to implement a valid nothrow `operator new` without knowing the exact implementation of the throwing version. In summary, this change will impact people who fall into the following intersection of conditions: - They use the libc++ shared/static library built with `-fno-exceptions` - They do not override `operator new(..., std::nothrow_t)` - They override `operator new(...)` (the throwing version) - They use `operator new(..., std::nothrow_t)` We believe this represents a small number of people. Fixes #60129 rdar://103958777 Differential Revision: https://reviews.llvm.org/D150610
2024-01-20[libc++][hardening] Categorize assertions that produce incorrect results ↵Konstantin Varlamov
(#77183) Introduce a new `argument-within-domain` category that covers cases where the given arguments make it impossible to produce a correct result (or create a valid object in case of constructors). While the incorrect result doesn't create an immediate problem within the library (like e.g. a null pointer dereference would), it always indicates a logic error in user code and is highly likely to lead to a bug in the program once the value is used.
2024-01-05[libc++][hardening] Categorize more assertions. (#75918)Konstantin Varlamov
Also introduce `_LIBCPP_ASSERT_PEDANTIC` for assertions violating which results in a no-op or other benign behavior, but which may nevertheless indicate a bug in the invoking code.
2023-12-18[libc++] Format the code base (#74334)Louis Dionne
This patch runs clang-format on all of libcxx/include and libcxx/src, in accordance with the RFC discussed at [1]. Follow-up patches will format the benchmarks, the test suite and remaining parts of the code. I'm splitting this one into its own patch so the diff is a bit easier to review. This patch was generated with: find libcxx/include libcxx/src -type f \ | grep -v 'module.modulemap.in' \ | grep -v 'CMakeLists.txt' \ | grep -v 'README.txt' \ | grep -v 'libcxx.imp' \ | grep -v '__config_site.in' \ | xargs clang-format -i A Git merge driver is available in libcxx/utils/clang-format-merge-driver.sh to help resolve merge and rebase issues across these formatting changes. [1]: https://discourse.llvm.org/t/rfc-clang-formatting-all-of-libc-once-and-for-all
2023-12-05[libc++] Replace uses of _VSTD:: by std:: (#74331)Louis Dionne
As part of the upcoming clang-formatting of libc++, this patch performs the long desired removal of the _VSTD macro. See https://discourse.llvm.org/t/rfc-clang-formatting-all-of-libc-once-and-for-all for the clang-format proposal.
2023-12-04[libc++] Rename _LIBCPP_INLINE_VISIBILITY to _LIBCPP_HIDE_FROM_ABI (#74095)Louis Dionne
In preparation for running clang-format on the whole code base, we are also removing mentions of the legacy _LIBCPP_INLINE_VISIBILITY macro in favor of the newer _LIBCPP_HIDE_FROM_ABI. We're still leaving the definition of _LIBCPP_INLINE_VISIBILITY to avoid creating needless breakage in case some older patches are checked-in with mentions of the old macro. After we branch for LLVM 18, we can do another pass to clean up remaining uses of the macro that might have gotten introduced by mistake (if any) and remove the macro itself at the same time. This is just a minor convenience to smooth out the transition as much as possible. See https://discourse.llvm.org/t/rfc-clang-formatting-all-of-libc-once-and-for-all for the clang-format proposal.
2023-11-21[libc++][hardening] Categorize all `ryu` assertions as internal (#71853)Konstantin Varlamov
These assertions can only be triggered by bugs in the algorithm's implementation; all user inputs should be handled gracefully.
2023-11-05[libc++] Bump the C++ Standard used to compile the dylib to C++23 (#66824)Louis Dionne
This is necessary in order to implement some papers like P2467R1, which require using C++23 declarations in the dylib. It is a good habit to keep building the dylib with a recent standard version regardless. With this patch, we also stop strictly enforcing that the targets are built with C++23. Concretely, C++23 will soon be required in order to build the dylib, but not enforcing it strictly works around some issues like the documentation bots using an old and unsupported compiler. Since these bots do not actually build the library, not strictly enforcing the C++ Standard makes our CMake build more resilient to these kinds of situation. This is just a workaround though, the better way of going about would be to update the compiler on the documentation bot but we don't seem to have control over that.
2023-06-29[libc++] Remove the legacy debug mode.varconst
See https://discourse.llvm.org/t/rfc-removing-the-legacy-debug-mode-from-libc/71026 Reviewed By: #libc, Mordante, ldionne Differential Revision: https://reviews.llvm.org/D153672
2023-06-28[libc++][hardening][NFC] Introduce `_LIBCPP_ASSERT_UNCATEGORIZED`.varconst
Replace most uses of `_LIBCPP_ASSERT` with `_LIBCPP_ASSERT_UNCATEGORIZED`. This is done as a prerequisite to introducing hardened mode to libc++. The idea is to make enabling assertions an opt-in with (somewhat) fine-grained controls over which categories of assertions are enabled. The vast majority of assertions are currently uncategorized; the new macro will allow turning on `_LIBCPP_ASSERT` (the underlying mechanism for all kinds of assertions) without enabling all the uncategorized assertions (in the future; this patch preserves the current behavior). Differential Revision: https://reviews.llvm.org/D153816
2023-05-05[libc++] Remove Solaris related codeLouis Dionne
This was contributed ~10 years ago, but we don't officially support it and I am not aware of any bot testing it, so this has likely rotten to the point where it is unusable. Differential Revision: https://reviews.llvm.org/D138680
2023-04-10[libc++] Move __errc to __system_error/errc.hNikolas Klauser
This file was added before we started granularizing the headers, but is essentially just a granularized header. This moves the header to the correct place. Reviewed By: #libc, EricWF Spies: libcxx-commits, arichardson, mikhail.ramalho Differential Revision: https://reviews.llvm.org/D146395
2023-03-10[libc++] Clean up old macOS back-deployment workaroundsLouis Dionne
This patch bumps the minimum macOS version for building the dylib or back-deploying a statically-linked libc++ from macOS 10.11 to macOS 10.13. AFAICT, Chrome was the last one to require macOS 10.11, but since then they have bumped their minimal supported version to macOS 10.13. Differential Revision: https://reviews.llvm.org/D145012
2023-02-21[libc++] Move constexpr <cstring> functions into their own headers and ↵Nikolas Klauser
remove unused <cstring> includes Reviewed By: ldionne, Mordante, #libc, #libc_abi Spies: libcxx-commits Differential Revision: https://reviews.llvm.org/D143329
2023-02-06[libc++][NFC] _VSTD -> std in ryuLouis Dionne
Those ones are extremely mechanical and since that's not libc++ code in the first place, there's even more of an incentive to do the rename.
2022-11-25[libc++][NFC] Consistently use newline between license and include guardLouis Dionne
2022-10-12[libc++] Implements constexpr <charconv>.Mark de Wever
Implements: - P2291R3 Add Constexpr Modifiers to Functions to_chars and from_chars for Integral Types in <charconv> Header Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D131317
2022-07-27[libc++] Implement P1004R2 (constexpr std::vector)Nikolas Klauser
Reviewed By: #libc, ldionne Spies: mgorny, var-const, ormris, philnik, miscco, hiraditya, steven_wu, jkorous, ldionne, christof, libcxx-commits Differential Revision: https://reviews.llvm.org/D68365
2022-06-10[libc++] Granularize <iterator> includesNikolas Klauser
Reviewed By: ldionne, #libc Spies: libcxx-commits, wenlei Differential Revision: https://reviews.llvm.org/D127445
2022-06-07[libc++] Don't use static constexpr in headers.Mark de Wever
This was noticed in the review of D125704. In that commit only the new table has been adapted. This adapts the existing tables. Note since libc++'s charconv is backported to C++11 it's not possible to use inline constexpr variables. The were introduced in C++17. Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D126887
2022-06-02[libc++] Lets to_chars use header implementation.Mark de Wever
This removes the duplicated code from the dylib. Instead the dylib will call the new functions in the header. Since this code is unneeded it's removed from the unstable ABI. Depends on D125704 Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D125761
2022-05-28[libc++] Minor emscripten changes from downstreamSam Clegg
Differential Revision: https://reviews.llvm.org/D126583
2022-02-16[libc++] Move everything related solely to _LIBCPP_ASSERT to its own fileLouis Dionne
This is the first step towards disentangling the debug mode and assertions in libc++. This patch doesn't make any functional change: it simply moves _LIBCPP_ASSERT-related stuff to its own file so as to make it clear that libc++ assertions and the debug mode are different things. Future patches will make it possible to enable assertions without enabling the debug mode. Differential Revision: https://reviews.llvm.org/D119769
2022-02-15[libc++] Replace `#include ""` with `<>` in libcxx/src/. NFCI.Arthur O'Dwyer
Our best guess is that the two syntaxes should have exactly equivalent effects, so, let's be consistent with what we do in libcxx/include/. I've left `#include "include/x.h"` and `#include "../y.h"` alone because I'm less sure that they're interchangeable, and they aren't inconsistent with libcxx/include/ because libcxx/include/ never does that kind of thing. Also, use the `_LIBCPP_PUSH_MACROS/POP_MACROS` dance for `<__undef_macros>`, even though it's technically unnecessary in a standalone .cpp file, just so we have consistently one way to do it. Differential Revision: https://reviews.llvm.org/D119561
2022-02-14[libcxx] Fix setup of MSVC specific intrinsics in Ryu codeMartin Storsjö
This fixes warnings about implicitly declared `_umul128` and `__shiftright128` when building for x86_64 with clang-cl. Use `_MSC_VER` instead of `_LIBCPP_COMPILER_MSVC` for enabling MSVC specific code; `_MSC_VER` is defined both in clang-cl and MSVC, while `_LIBCPP_COMPILER_MSVC` only is defined if building with the actual MSVC compiler. Include `ryu.h` at the head of `d2s_intrinsics.h`, as it uses the `_LIBCPP_64_BIT` define, which is defined in `ryu.h`. Now the Ryu files build without warnings with clang-cl for i386, x86_64, arm and aarch64. Differential Revision: https://reviews.llvm.org/D119647
2021-12-12Microsoft's floating-point to_chars powered by Ryu and Ryu PrintfMark de Wever
Microsoft would like to contribute its implementation of floating-point to_chars to libc++. This uses the impossibly fast Ryu and Ryu Printf algorithms invented by Ulf Adams at Google. Upstream repos: https://github.com/microsoft/STL and https://github.com/ulfjack/ryu . Licensing notes: MSVC's STL is available under the Apache License v2.0 with LLVM Exception, intentionally chosen to match libc++. We've used Ryu under the Boost Software License. This patch contains minor changes from Jorg Brown at Google, to adapt the code to libc++. He verified that it works in Google's Linux-based environment, but then I applied more changes on top of his, so any compiler errors are my fault. (I haven't tried to build and test libc++ yet.) Please tell me if we need to do anything else in order to follow https://llvm.org/docs/DeveloperPolicy.html#attribution-of-changes . Notes: * libc++'s integer charconv is unchanged (except for a small refactoring). MSVC's integer charconv hasn't been tuned for performance yet, so you're not missing anything. * Floating-point from_chars isn't part of this patch because Jorg found that MSVC's implementation (derived from our CRT's strtod) was slower than Abseil's. If you're unable to use Abseil or another implementation due to licensing or technical considerations, Microsoft would be delighted if you used MSVC's from_chars (and you can just take it, or ask us to provide a patch like this). Ulf is also working on a novel algorithm for from_chars. * This assumes that float is IEEE 32-bit, double is IEEE 64-bit, and long double is also IEEE 64-bit. * I have added MSVC's charconv tests (the whole thing: integer/floating from_chars/to_chars), but haven't adapted them to libcxx's harness at all. (These tests will be available in the microsoft/STL repo soon.) * Jorg added int128 codepaths. These were originally present in upstream Ryu, and I removed them from microsoft/STL purely for performance reasons (MSVC doesn't support int128; Clang on Windows does, but I found that x64 intrinsics were slightly faster). * The implementation is split into 3 headers. In MSVC's STL, charconv contains only Microsoft-written code. xcharconv_ryu.h contains code derived from Ryu (with significant modifications and additions). xcharconv_ryu_tables.h contains Ryu's large lookup tables (they were sufficiently large to make editing inconvenient, hence the separate file). The xmeow.h convention is MSVC's for internal headers; you may wish to rename them. * You should consider separately compiling the lookup tables (see https://github.com/microsoft/STL/issues/172 ) for compiler throughput and reduced object file size. * See https://github.com/StephanTLavavej/llvm-project/commits/charconv for fine-grained history. (If necessary, I can perform some rebase surgery to show you what Jorg changed relative to the microsoft/STL repo; currently that's all fused into the first commit.) Differential Revision: https://reviews.llvm.org/D70631