89 lines
3.2 KiB
ReStructuredText
89 lines
3.2 KiB
ReStructuredText
***********************
|
|
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() <http://docs.python.org/lib/built-in-funcs.html>`_ and
|
|
`property
|
|
decorators <http://wiki.python.org/moin/PythonDecoratorLibrary>`_ 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 <llvm.core.Module.html>`_ -- represents an LLVM Module
|
|
- `Type <types.html>`_ -- represents an LLVM Type
|
|
- `Value <values.html>`_ -- represents an LLVM Value, including:
|
|
globals, constants, variables, arguments, functions, instructions,
|
|
etc..
|
|
- `BasicBlock <llvm.core.BasicBlock.html>`_ -- another derived of
|
|
Value, represents an LLVM basic block
|
|
- `Builder <llvm.core.Builder.html>`_ -- 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 <llvm.ee.ExecutionEngine.html>`_ -- represents an
|
|
execution engine (which can be an either an interpreter or a JIT)
|
|
- `TargetData <llvm.ee.TargetData.html>`_ -- represents the ABI of the
|
|
target platform (details like sizes and alignment of primitive types,
|
|
endinanness etc)
|
|
|
|
llvm.passes
|
|
-----------
|
|
|
|
- `PassManager <llvm.passes.PassManager.html>`_ -- represents an LLVM
|
|
pass manager
|
|
- `FunctionPassManager <llvm.passes.FunctionPassManager.html>`_ --
|
|
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:
|
|
|
|
|
|
.. code-block:: python
|
|
|
|
from llvm import *
|
|
from llvm.core import *
|
|
from llvm.ee import *
|
|
from llvm.passes import *
|