Redirectors
When implementing a new C standard library (referred to as libc henceforth in this document) starting from scratch, it is unrealistic to expect that we will have the entire library available from day one. In such a scenario, a practical approach is to redirect calls to the unimplemented functions to the same functions from another fully functional libc implementation. Such a scheme can also serve users who would like to mix and match implementations from LLVM libc and another libc implementation. On most platforms, this other libc can be the system libc itself. In this document, we present a strategy one can employ to build redirectors to redirect from LLVM libc to the system libc. For now, the scheme presented is limited to ELF platforms.
Highlevel Mechanism
The highlevel scheme is as below:
<img src="./redirectors_schematic.svg">
As shown in the diagram, the mechanism involves a redirector dynamic library which goes in between the llvm-libc static library and the system libc dynamic library. Essentially, LLVM libc provides implementations for all public functions. However, some of the implementations do not actually implement the expected functionality. Instead, they just call the corresponding function in the redirector library, which in turn calls the same function from the system libc.
Implementation of redirecting entrypoints
Let us take the round
function from math.h
as an example to see what
it's implementation looks like when it just redirects to the round
function
from the system libc.
- ::
-
namespace llvm_libc {
double __redirected_round(double);
- double LLVM_LIBC_ENTRYPOINT(round)(double x) {
- return __redirected_round(x);
}
} // namespace llvm_libc
As can be seen, the round
function from LLVM libc does not call the
round
function from the system libc directly. It calls a function
__redirected_round
from the redirector library. The rest of the
code follows the conventions described in the implementation standard
document.
Implementation of the redirector function
The function __redirected_round
calls the round
function from the system
libc. Its implementation is as follows:
#include <math.h> // Header file from the system libc namespace llvm_libc { double __redirected_round(double x) { return ::round(x); // Call to round from the system libc } } // namespace llvm_libc