.. _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. .. code-block:: 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//entrypoints.txt`` or ``libc/config///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.