| (overlay_mode)= | |
| # Overlay Mode | |
| One can choose to use LLVM's libc in the overlay mode. In this mode, the link | |
| order semantics are exploited to pick symbols from `libllvmlibc.a` (if they | |
| are available in `libllvmlibc.a`) and the rest are picked from the system | |
| libc. The user programs also have to use header files from the system libc. | |
| Naturally, only functions which do not depend on implementation specific ABI | |
| are included in `libllvmlibc.a`. Examples of such functions are `strlen` | |
| and `round`. Functions like `fopen` and friends are not included as they | |
| depend on the implementation specific definition of the `FILE` data structure. | |
| ## Building the libc in the overlay mode | |
| There are two different ways in which the libc can be built for use in the | |
| overlay mode. In both the ways, we build a static archive named | |
| `libllvmlibc.a`. We use a rather verbose name with a repeated `lib` to make | |
| it clear that it is not the system libc, which is typically named `libc.a`. | |
| Also, if users choose to mix more than one libc with the system libc, then | |
| the name `libllvmlibc.a` makes it absolutely clear that it is the static | |
| archive of LLVM's libc. | |
| ### Building LLVM-libc as a standalone runtime | |
| We can treat the `libc` project like any other normal LLVM runtime library by | |
| building it with the following cmake command: | |
| ```sh | |
| $> cd llvm-project # The llvm-project checkout | |
| $> mkdir build | |
| $> cd build | |
| $> cmake ../runtimes -G Ninja -DLLVM_ENABLE_RUNTIMES="libc" \ | |
| -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \ | |
| -DCMAKE_BUILD_TYPE=<Debug|Release> \ # Select build type | |
| -DCMAKE_INSTALL_PREFIX=<Your prefix of choice> # Optional | |
| ``` | |
| Next, build the libc: | |
| ```sh | |
| $> ninja libc | |
| ``` | |
| Then, run the tests: | |
| ```sh | |
| $> ninja check-libc | |
| ``` | |
| The build step will build the static archive the in the directory | |
| `build/projects/libc/lib`. Notice that the above CMake configure step also | |
| specified an install prefix. This is optional, but it's used, then the following | |
| command will install the static archive to the install path: | |
| ```sh | |
| $> ninja install-libc | |
| ``` | |
| ### Building the static archive as part of the bootstrap build | |
| The bootstrap build is a build mode in which runtime components like libc++, | |
| libcxx-abi, libc etc. are built using the ToT clang. The idea is that this build | |
| produces an in-sync toolchain of compiler + runtime libraries. This ensures that | |
| LLVM-libc has access to the latest clang features, which should provide the best | |
| performance possible. | |
| ```sh | |
| $> cmake ../llvm -G Ninja -DLLVM_ENABLE_PROJECTS="clang" \ | |
| -DLLVM_ENABLE_RUNTIMES="libc" \ # libc is listed as runtime and not as a project | |
| -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \ | |
| -DCMAKE_BUILD_TYPE=<Debug|Release> \ # Select build type | |
| -DCMAKE_INSTALL_PREFIX=<Your prefix of choice> # Optional | |
| ``` | |
| The build and install steps are the same as above, but the build step will take | |
| much longer since `clang` will be built before building `libllvmlibc.a`. | |
| ```sh | |
| $> ninja libc | |
| $> ninja check-libc | |
| ``` | |
| ## Using the overlay static archive | |
| Once built (and optionally installed), the overlay static archive can be linked | |
| to your binaries like any other static archive. For example, when building with | |
| `clang` on Linux, one should follow a recipe like: | |
| ```sh | |
| $> clang <other compiler and/or linker options> <file.o|c(pp)> \ | |
| -L <path to the directory in which libllvmlibc.a is installed> \ # Optional | |
| -lllvmlibc | |
| ``` | |
| If you installed `libllvmlibc.a` in a standard linker lookup path, for example | |
| `/usr/local/lib` on Linux like systems, then specifying the path to the | |
| static archive using the `-L` option is not necessary. | |
| ### Linking the static archive to other LLVM binaries | |
| Since the libc and other LLVM binaries are developed in the same source tree, | |
| linking `libllvmlibc.a` to those LLVM binaries does not require any special | |
| install step or explicitly passing any special linker flags/options. One can | |
| simply add `llvmlibc` as a link library to that binary's target. For example, | |
| if you want to link `libllvmlibc.a` to `llvm-objcopy`, all you have to do | |
| is to add a CMake command as follows: | |
| ```cmake | |
| target_link_libraries(llvm-objcopy PRIVATE llvmlibc) | |
| ``` |