blob: 80fa728d6a764beef1b803be70094e2c3dbf5db7 [file] [view]
(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.