30.4. Extensibility#
30.4.1. Inlining Support for Extensions#
PostgreSQL'sJIT implementation can inline the bodies of functions of typesC
andinternal
, as well as operators based on such functions. To do so for functions in extensions, the definitions of those functions need to be made available. When usingPGXS to build an extension against a server that has been compiled with LLVM JIT support, the relevant files will be built and installed automatically.
The relevant files have to be installed into$pkglibdir/bitcode/$extension/
and a summary of them into$pkglibdir/bitcode/$extension.index.bc
, where$pkglibdir
is the directory returned bypg_config --pkglibdir
and$extension
is the base name of the extension's shared library.
Note
For functions built intoPostgreSQL itself, the bitcode is installed into$pkglibdir/bitcode/postgres
.
30.4.2. PluggableJIT Providers#
PostgreSQL provides aJIT implementation based onLLVM. The interface to theJIT provider is pluggable and the provider can be changed without recompiling (although currently, the build process only provides inlining support data forLLVM). The active provider is chosen via the settingjit_provider.
30.4.2.1. JIT Provider Interface#
AJIT provider is loaded by dynamically loading the named shared library. The normal library search path is used to locate the library. To provide the requiredJIT provider callbacks and to indicate that the library is actually aJIT provider, it needs to provide a C function named_PG_jit_provider_init
. This function is passed a struct that needs to be filled with the callback function pointers for individual actions:struct JitProviderCallbacks{ JitProviderResetAfterErrorCB reset_after_error; JitProviderReleaseContextCB release_context; JitProviderCompileExprCB compile_expr;};extern void _PG_jit_provider_init(JitProviderCallbacks *cb);