• Andres Freund's avatar
    Add inlining support to LLVM JIT provider. · 9370462e
    Andres Freund authored
    This provides infrastructure to allow JITed code to inline code
    implemented in C. This e.g. can be postgres internal functions or
    extension code.
    
    This already speeds up long running queries, by allowing the LLVM
    optimizer to optimize across function boundaries. The optimization
    potential currently doesn't reach its full potential because LLVM
    cannot optimize the FunctionCallInfoData argument fully away, because
    it's allocated on the heap rather than the stack. Fixing that is
    beyond what's realistic for v11.
    
    To be able to do that, use CLANG to convert C code to LLVM bitcode,
    and have LLVM build a summary for it. That bitcode can then be used to
    to inline functions at runtime. For that the bitcode needs to be
    installed. Postgres bitcode goes into $pkglibdir/bitcode/postgres,
    extensions go into equivalent directories.  PGXS has been modified so
    that happens automatically if postgres has been compiled with LLVM
    support.
    
    Currently this isn't the fastest inline implementation, modules are
    reloaded from disk during inlining. That's to work around an apparent
    LLVM bug, triggering an apparently spurious error in LLVM assertion
    enabled builds.  Once that is resolved we can remove the superfluous
    read from disk.
    
    Docs will follow in a later commit containing docs for the whole JIT
    feature.
    
    Author: Andres Freund
    Discussion: https://postgr.es/m/20170901064131.tazjxwus3k2w3ybh@alap3.anarazel.de
    9370462e
jit.h 2.25 KB