The llvmpy Package

The llvmpy is a Python package, consisting of 6 modules, that wrap over enough LLVM APIs to allow the implementation of your own compiler/VM backend in pure Python. If you’re come this far, you probably know why this is a good idea.

Out of the 6 modules, one is an “extension” module (i.e., it is written in C), and another one is a small private utility module, which leaves 4 public modules. These are:

  • llvm – top-level package, common classes (like exceptions)
  • llvm.core – IR-related APIs
  • llvm.ee – execution engine related APIs
  • llvm.passes – pass manager and passes related APIs

The modules contain only classes and (integer) constants. Mostly simple Python constructs are used (deliberately) – property() and property decorators are probably the most exotic animals around. All classes are “new style” classes. The APIs are designed to be navigable (and guessable!) once you know a few conventions. These conventions are highlighted in the sections below.

Here is a quick overview of the contents of each package:

llvm

  • LLVMException – exception class (currently the only one)

llvm.core

  • Module – represents an LLVM Module
  • Type – represents an LLVM Type
  • Value – represents an LLVM Value, including: globals, constants, variables, arguments, functions, instructions, etc..
  • BasicBlock – another derived of Value, represents an LLVM basic block
  • Builder – used for creating instructions, wraps LLVM IRBuilder helper class
  • constants TYPE_* that represents various types
  • constants CC_* that represent calling conventions
  • constants ICMP_* and FCMP_* that represent integer and real comparison predicates (like less than, greater than etc.)
  • constants LINKAGE_* that represent linkage of symbols (external, internal etc.)
  • constants VISIBILITY_* that represents visibility of symbols (default, hidden, protected)
  • constants ATTR_* that represent function parameter attributes

llvm.ee

  • ExecutionEngine – represents an execution engine (which can be an either an interpreter or a JIT)
  • TargetData – represents the ABI of the target platform (details like sizes and alignment of primitive types, endinanness etc)

llvm.passes

  • PassManager – represents an LLVM pass manager
  • FunctionPassManager – represents an LLVM function pass manager
  • constants PASS_* that represent various passes

A note on the importing of these modules

Pythonically, modules are imported with the statement import llvm.core. However, you might find it more convenient to import llvmpy modules thus:

from llvm import *
from llvm.core import *
from llvm.ee import *
from llvm.passes import *

Table Of Contents

Previous topic

LLVM Concepts

Next topic

llvm_cbuilder