Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
numba
GitHub Repository: numba/llvmlite
Path: blob/main/docs/source/index.rst
1154 views
========
llvmlite
========

:emphasis:`A lightweight LLVM-Python binding for writing JIT compilers`

llvmlite provides a Python binding to LLVM for use in Numba_. Numba
previously relied on llvmpy_.

Llvmpy became hard to maintain because:

* It has a cumbersome architecture.
* The C++11 requirement of recent LLVM versions does not go well
  with the compiler and runtime ABI requirements of some Python
  versions, especially under Windows.

Llvmpy also proved to be responsible for a sizable part of
Numba's compilation times, because of its inefficient layering
and object encapsulation. Fixing this issue inside the llvmpy
codebase seemed a time-consuming and uncertain task.

The Numba developers decided to start a new binding from scratch,
with an entirely different architecture, centered around the
specific requirements of a JIT compiler.

.. _Numba: http://numba.pydata.org/
.. _llvmpy: http://www.llvmpy.org/

Philosophy
==========

While llvmpy_ exposed large parts of the LLVM C++ API for direct
calls into the LLVM library, llvmlite takes an entirely different
approach. Llvmlite starts from the needs of a JIT compiler and
splits them into two decoupled tasks:

* Construction of a :ref:`module`, function by function,
  :ref:`instruction` by instruction.

* Compilation and optimization of the module into machine code.

The construction of an LLVM module does not call the LLVM C++ API.
Rather, it constructs the
LLVM :ref:`intermediate representation <intermediate representation>`
(IR) in pure Python. This is the role of the
:ref:`IR layer <ir-layer>`.

The compilation of an LLVM module takes the IR in textual form
and feeds it into LLVM's parsing API. It then returns a thin
wrapper around LLVM's C++ module object. This is the role of the
:ref:`binding layer <binding-layer>`.

Once parsed, the module's source code cannot be modified, which
loses the flexibility of the direct mapping of C++ APIs into
Python that was provided by llvmpy but saves a great deal of
maintenance.

LLVM compatibility
==================

Despite minimizing the API surface with LLVM, llvmlite is
impacted by changes to LLVM's C++ API, which can occur at every
feature release. Therefore, each llvmlite version is targeted to
a specific LLVM feature version and works across all given bugfix
releases of that version.

EXAMPLE: Llvmlite 0.12.0 works with LLVM 3.8.0 and 3.8.1, but
it does not work with LLVM 3.7.0 or 3.9.0.

Numba's requirements determine which LLVM version is supported.

API stability
=============

At this time, we reserve the possibility of slightly breaking
the llvmlite API at each release, for the following reasons:

* Changes in LLVM behaviour, such as differences in the IR across
  versions.

* As a young library, llvmlite has room for improvement or fixes
  to the existing APIs.


.. toctree::
   :maxdepth: 1
   :hidden:

   admin-guide/install
   user-guide/index
   faqs
   contributing
   release-notes
   glossary

.. |reg| unicode:: U+000AE .. REGISTERED SIGN