| (entrypoints)= |
| |
| # Entrypoints in LLVM libc |
| |
| A public function or a global variable provided by LLVM-libc is called an |
| *entrypoint*. The notion of entrypoints is central to LLVM-libc's source layout, |
| build system, and configuration management. This document provides a technical |
| reference for how entrypoints are defined, implemented, and integrated into |
| the final library. |
| |
| ## What is an Entrypoint? |
| |
| In a typical C library, all functions are part of a monolithic archive. In |
| LLVM-libc, each function (e.g., `malloc`, `printf`, `isalpha`) is treated |
| as a discrete "entrypoint" unit. This allows for: |
| |
| - **Granular build targets**: You can build just the objects you need. |
| - **Configuration-driven selection**: Different operating systems and |
| architectures can pick specific implementations for the same function. |
| - **Support for multiple build modes**: Selectively replacing parts of a host's |
| libc in {ref}`overlay_mode` or building a complete library in {ref}`full_host_build`. |
| |
| ## The Lifecycle of an Entrypoint |
| |
| 1. **Implementation**: The function is implemented in a `.cpp` file using |
| LLVM-libc's coding and implementation standards. |
| 2. **Registration**: The entrypoint is defined as a CMake target using the |
| `add_entrypoint_object` rule. |
| 3. **Configuration**: The target name is added to an `entrypoints.txt` file |
| to include it in a specific OS/Architecture configuration. |
| |
| ## Implementation Standards |
| |
| Implementations live in the `src/` directory, organized by the public header |
| they belong to (e.g., `src/ctype/isalpha.cpp` for `ctype.h`). |
| |
| ### Header File Structure |
| |
| Every entrypoint has an internal implementation header file (e.g., |
| `src/ctype/isalpha.h`). This header declares the function within the |
| `LIBC_NAMESPACE_DECL` namespace: |
| |
| ``` |
| namespace LIBC_NAMESPACE_DECL { |
| int isalpha(int c); |
| } // namespace LIBC_NAMESPACE_DECL |
| ``` |
| |
| ### Source File Structure |
| |
| The implementation file (e.g., `src/ctype/isalpha.cpp`) defines the function |
| using the `LLVM_LIBC_FUNCTION` macro. This macro handles C-linkage and |
| aliasing: |
| |
| ``` |
| namespace LIBC_NAMESPACE_DECL { |
| LLVM_LIBC_FUNCTION(int, isalpha, (int c)) { |
| // ... implementation ... |
| } |
| } // namespace LIBC_NAMESPACE_DECL |
| ``` |
| |
| For more details on implementation conventions, see the |
| {ref}`implementation_standard` page. |
| |
| ## Registration: CMake Rules |
| |
| Entrypoints are registered as CMake targets to make them available to the |
| build system. These rules are usually defined in the `CMakeLists.txt` file |
| within the function's source directory. |
| |
| ### `add_entrypoint_object` |
| |
| This rule generates a single object file containing the implementation of the |
| entrypoint. |
| |
| ```cmake |
| add_entrypoint_object( |
| isalpha |
| SRCS isalpha.cpp |
| HDRS isalpha.h |
| DEPENDS |
| .some_internal_dependency |
| ) |
| ``` |
| |
| For redirecting entrypoints (e.g., when one function is a simple alias for |
| another), the `REDIRECTED` option can be specified to the rule. |
| |
| ### `add_entrypoint_library` |
| |
| Standard library files like `libc.a` and `libm.a` are produced by |
| aggregating multiple entrypoint objects. The `add_entrypoint_library` target |
| takes a list of `add_entrypoint_object` targets and produces a static library. |
| |
| ## Configuration: `entrypoints.txt` |
| |
| The final selection of which entrypoints are included in a specific build is |
| determined by `entrypoints.txt` files located in the `libc/config` tree. |
| |
| - **Location**: Typically found in `libc/config/<os>/entrypoints.txt` or |
| `libc/config/<os>/<arch>/entrypoints.txt`. |
| - **Role**: This file acts as the "source of truth" for what is supported on a |
| given platform. A typical bring-up procedure involves progressively adding |
| targets to this file as they are implemented and tested. |
| |
| If you are implementing a new entrypoint, you must add its target name to the |
| relevant `entrypoints.txt` files for it to be included in the library build. |
| For more details on platform configuration, see the {ref}`porting` guide. |
| |