LLVM-libc Source Tree Layout

At the top-level, LLVM-libc source tree is organized in to the following directories:

+ libc
     - benchmarks
     - cmake
     - config
     - docs
     - examples
     - fuzzing
     - hdr
     - include
     - lib
     - newhdrgen
     - src
     - startup
     - test
     - utils

Each of these directories is explained breifly below.

The benchmarks directory

The benchmarks directory contains LLVM-libc’s benchmarking utilities. These are mostly used for the memory functions. This also includes the automemcpy subdirectory for automatic generation of optimized memory functions.

The config directory

The config directory contains the default configurations for the targets LLVM-libc supports. These are files in the config/<platform>/<architecture>/ subdirectory called entrypoints.txt, exclude.txt, headers.txt, and config.json. These tell cmake which entrypoints are available, which entrypoints to exclude, which headers to generate, and what options to set for the current target respectively. There are also other platform specific files in the config/<platform>/ subdirectory.

The cmake directory

The cmake directory contains the implementations of LLVM-libc’s CMake build rules.

The docs directory

The docs directory contains design docs and also informative documents like this document on source layout.

The fuzzing directory

This directory contains fuzzing tests for the various components of LLVM-libc. The directory structure within this directory mirrors the directory structure of the top-level libc directory itself. For more details, see Fuzzing for LLVM-libc functions.

The hdr directory

This directory contains proxy headers which are included from the files in the src directory. These proxy headers either include our internal type or macro definitions, or the system’s type or macro definitions, depending on if we are in fullbuild or overlay mode.

The include directory

The include directory contains:

  1. *.h.def files - These files are used to construct the generated public header files.

  2. Self contained public header files - These are header files which are already in the form that get installed when LLVM-libc is installed on a user’s computer. These are mostly in the llvm-libc-macros and llvm-libc-types subdirectories.

The lib directory

This directory contains a CMakeLists.txt file listing the targets for the public libraries libc.a, libm.a etc.

The newhdrgen directory

This directory contains the sources and specifications for the types, macros and entrypoint functions. These definitions are organized in the yaml subdirectory and match the organization of the *.h.def files. This folder also contains the python sources for new headergen, which is what generates the headers.

The src directory

This directory contains the implementations of the llvm-libc entrypoints. It is further organized as follows:

  1. There is a top-level CMakeLists.txt file.

  2. For every public header file provided by llvm-libc, there exists a corresponding directory in the src directory. The name of the directory is same as the base name of the header file. For example, the directory corresponding to the public math.h header file is named math. The implementation standard document explains more about the header directories.

The startup directory

This directory contains the implementations of the application startup objects like crt1.o etc.

The test directory

This directory contains tests for the various components of LLVM-libc. The directory structure within this directory mirrors the directory structure of the toplevel libc directory itself. A test for, say the mmap function, lives in the directory test/src/sys/mman/ as implementation of mmap lives in src/sys/mman.

The utils directory

This directory contains utilities used by other parts of the LLVM-libc system. See the README files in the subdirectories within this directory to learn about the various utilities.