(implementing_a_function)=

# Implementing a New Function

This guide provides a step-by-step walkthrough for adding a new function to LLVM-libc.

## Overview

Adding a new function involves several steps, from updating the public specification to implementing and testing the code. Below is the standard checklist for contributors.

## Step-by-Step Checklist

### 1. Header Entry

Update the standard YAML file that describes the public header to ensure the function is included in the generated public header.

- **File**: `libc/include/<header>.yaml` (or `libc/include/sys/<header>.yaml` for system headers)
- Add the new function to the `functions` list.
- Specify its name, return type, and arguments.
- List the standards it complies with (e.g., `stdc`, `POSIX`).

### 2. Header Declaration

Declare the function in the internal implementation header file. This file is used by other internal code.

- **File**: `libc/src/<header>/<func>.h`
- Follow the structure defined in {ref}`implementation_standard`.
- Ensure the declaration is inside the `LIBC_NAMESPACE_DECL` namespace.

### 3. Implementation

Write the actual code for the function.

- **File**: `libc/src/<header>/<func>.cpp` (or `libc/src/<header>/<os>/<func>.cpp` for platform-specific implementations)
- Use the `LLVM_LIBC_FUNCTION` macro.
- Refer to {ref}`code_style` for naming and layout conventions.

### 4. CMake Rule

Add a CMake target for the new function so it can be compiled.

- **File**: `libc/src/<header>/CMakeLists.txt`
- Add an `add_entrypoint_object` rule for the new file.
- List all internal dependencies correctly to ensure proper build order.

### 5. Platform Registration

Register the new entrypoint for the target platforms to include it in the build.

- **File**: `libc/config/<os>/<arch>/entrypoints.txt`
- Add the new function to the list of active entrypoints.

### 6. Testing

Create tests to verify the implementation.

- **File**: `libc/test/src/<header>/<func>_test.cpp`
- Add corresponding tests using the internal testing framework.
- Update the `CMakeLists.txt` in the test directory (`libc/test/src/<header>/CMakeLists.txt`) to include the new test target.
