| ============================== |
| "llvm-libc" C Standard Library |
| ============================== |
| |
| .. contents:: Table of Contents |
| :depth: 4 |
| :local: |
| |
| Introduction |
| ============ |
| |
| This is a proposal to start *llvm-libc*, an implementation of the |
| C standard library targeting C17 and above, as part of the LLVM project. |
| llvm-libc will also provide platform specific extensions as relevant. |
| For example, on Linux it also provides pthreads, librt and other POSIX |
| extension libraries. |
| |
| Features |
| ======== |
| |
| llvm-libc will be developed to have a certain minimum set of features: |
| |
| - C17 and upwards conformant. |
| - A modular libc with individual pieces implemented in the "as a |
| library" philosophy of the LLVM project. |
| - Ability to layer this libc over the system libc if possible and desired |
| for a platform. |
| - Provide C symbols as specified by the standards, but take advantage |
| and use C++ language facilities for the core implementation. |
| - Provides POSIX extensions on POSIX compliant platforms. |
| - Provides system-specific extensions as appropriate. For example, |
| provides the Linux API on Linux. |
| - Vendor extensions if and only if necessary. |
| - Designed and developed from the start to work with LLVM tooling and |
| testing like fuzz testing and sanitizer-supported testing. |
| - ABI independent implementation as far as possible. |
| - Use source based implementations as far possible rather than |
| assembly. Will try to *fix* the compiler rather than use assembly |
| language workarounds. |
| - Extensive unit testing and standards conformance testing. If relevant |
| and possible, differential testing: We want to be able |
| to test llvm-libc against another battle-tested libc. This is |
| essentially to understand how we differ from other libcs. Also if |
| relevant and possible, test against the testsuite of an another |
| battle-tested libc implementation. |
| |
| Why a new C Standard Library? |
| ============================= |
| |
| Implementing a libc is no small task and is not be taken lightly. A |
| natural question to ask is, "why a new implementation of the C |
| standard library?" There is no single answer to this question, but |
| some of the major reasons are as follows: |
| |
| - Most libc implementations are monolithic. It is a non-trivial |
| porting task to pick and choose only the pieces relevant to one's |
| platform. The llvm-libc will be developed with sufficient modularity to |
| make picking and choosing a straightforward task. |
| - Most libc implementations break when built with sanitizer specific |
| compiler options. The llvm-libc will be developed from the start to |
| work with those specialized compiler options. |
| - The llvm-libc will be developed to support and employ fuzz testing |
| from the start. |
| - Most libc implementations use a good amount of assembly language, |
| and assume specific ABIs (may be platform dependent). With the llvm-libc |
| implementation, we want to use normal source code as much as possible so |
| that compiler-based changes to the ABI are easy. Moreover, as part of the |
| LLVM project, we want to use this opportunity to fix performance related |
| compiler bugs rather than using assembly workarounds. |
| - A large hole in the LLVM toolchain will be plugged with llvm-libc. |
| With the broad platform expertise in the LLVM community, and the |
| strong license and project structure, we think that llvm-libc will |
| be more tunable and robust, without sacrificing the simplicity and |
| accessibility typical of the LLVM project. |
| |
| Platform Support |
| ================ |
| |
| We envision that llvm-libc will support a variety of platforms in the coming |
| years. Interested parties are encouraged to participate in the design and |
| implementation, and add support for their favorite platforms. |
| |
| ABI Compatibility |
| ================= |
| |
| As llvm-libc is new, it will not offer ABI stability in the initial stages. |
| However, as we've heard from other LLVM contributors that they are interested |
| in having ABI stability, llvm-libc code will be written in a manner which is |
| amenable to ABI stability. We are looking for contributors interested in |
| driving the design in this space to help us define what exactly does ABI |
| stability mean for llvm-libc. |
| |
| Layering Over Another libc |
| ========================== |
| |
| When meaningful and practically possible on a platform, llvm-libc will be |
| developed in a fashion that it will be possible to layer it over the system |
| libc. This does not mean that one can mix llvm-libc with the system-libc. Also, |
| it does not mean that layering is the only way to use llvm-libc. What it |
| means is that, llvm-libc can optionally be packaged in a way that it can |
| delegate parts of the functionality to the system-libc. The delegation happens |
| internal to llvm-libc and is invisible to the users. From the user's point of |
| view, they only call into llvm-libc. |
| |
| There are a few problems one needs to be mindful of when implementing such a |
| delegation scheme in llvm-libc. Examples of such problems are: |
| |
| 1. One cannot mix data structures from llvm-libc with those from the |
| system-libc. A translation from one set of data structures to the other should |
| happen internal to llvm-libc. |
| 2. The delegation mechanism has to be implemented over a related set of |
| functions. For example, one cannot delegate just the `fopen` function to the |
| system-libc. One will have to delegate all `FILE` related functions to the |
| system-libc. |
| |
| Current Status |
| ============== |
| |
| llvm-libc development is still in the planning phase. |
| |
| Build Bots |
| ========== |
| |
| Once the development starts, there will be llvm-libc focused builders added to |
| the LLVM BuildBot. |