(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.

