LLVM
LLVM
3.2
Tagged version on git failed, so working from the tarballs:
Install:
cd /path/to
mkdir llvm32
cd llvm32
wget http://llvm.org/releases/3.2/llvm-3.2.src.tar.gz
wget http://llvm.org/releases/3.2/clang-3.2.src.tar.gz
tar xzf llvm-3.2.src.tar.gz
cd llvm-3.2.src/tools/
tar xzf ../../clang-3.2.src.tar.gz
cd /path/to/llvm32
mkdir llvm-build
cd llvm-build
../llvm-3.2.src/configure --enable-optimized --prefix=/path/to/llvm32/llvm-install
REQUIRES_RTTI=1 make -j3
make install
Use:
export PATH=/path/to/llvm32/llvm-install/bin:$PATH
3.3
Tagged version on git failed, so working from the tarballs:
Install:
cd /path/to
mkdir llvm33
cd llvm33
wget http://llvm.org/releases/3.3/llvm-3.3.src.tar.gz
wget http://llvm.org/releases/3.3/cfe-3.3.src.tar.gz
tar xzf llvm-3.3.src.tar.gz
cd llvm-3.3.src/tools/
tar xzf ../../cfe-3.3.src.tar.gz
mv cfe-3.3.src clang
cd /path/to/llvm33
mkdir llvm-build
cd llvm-build
../llvm-3.3.src/configure --enable-optimized --prefix=/path/to/llvm33/llvm-install
REQUIRES_RTTI=1 make -j3
make install
Use:
export PATH=/path/to/llvm33/llvm-install/bin:$PATH
3.4
Install:
cd /path/to
mkdir llvm34
cd llvm34
wget http://llvm.org/releases/3.4/llvm-3.4.src.tar.gz
wget http://llvm.org/releases/3.4/clang-3.4.src.tar.gz
tar xzf llvm-3.4.src.tar.gz
cd llvm-3.4/tools/
tar xzf ../../clang-3.4.src.tar.gz
mv clang-3.4 clang
cd /path/to/llvm34
mkdir llvm-build
cd llvm-build
../llvm-3.4/configure --enable-optimized --prefix=/path/to/llvm34/llvm-install
REQUIRES_RTTI=1 make -j3
make install
Use:
export PATH=/path/to/llvm34/llvm-install/bin:$PATH
LLVM basics
src2ir
clang -Os -S -emit-llvm foo.c -o foo.ll
src2bc
clang -Os -c -emit-llvm foo.c -o foo.bc
ir2bc
clang -Os -c -emit-llvm foo.ll -o foo.bc
bc2ir
llvm-dis -f foo.bc
bc2bin
llc foo.bc
bc analysis
opt -stats -instcount foo.bc
llvm-bcanalyzer [-dump] foo.bc
See also bc.py for another bc parser written in Python
with Python
llvmpy
Install:
export PATH=/path/to/llvm32/llvm-install/bin:$PATH
virtualenv llvmpy_llvm32.env
. llvmpy_llvm32.env/bin/activate
git clone git@github.com:llvmpy/llvmpy.git llvmpy.git
cd llvmpy.git
git checkout 0.12.5
LLVM_CONFIG_PATH=/path/to/llvm32/llvm-install/bin/llvm-config python setup.py install
cd ..
python -c "import llvm; llvm.test()"
deactivate
Usage:
export PATH=/path/to/llvm32/llvm-install/bin:$PATH
. llvmpy_llvm32.env/bin/activate
# Do your stuff... python -c "import llvm; llvm.test()"
deactivate
llvm_cbuilder
set of Python-contexts you can use to write C-like constructs in Python which generates llvmpy code directly.
Similar to llpython it allows you to build llvm IR without using the llvmpy interface directly.
llpython
The primary goal of the llpython package is to provide a Python dialect/subset that maps directly to LLVM code.
LLPython differs from its originating LLVM translator, Numba, in the following aspects:
- LLPython code is not intended to work in Python if not translated and wrapped.
- The LLPython translator only uses LLVM types.
- LLPython is explicitly typed, and does not support type inference. LLPython does not support implicit casts, all casts must be explicit.
- LLPython supports code that directly calls the C API, the Python C API, and the llvm.core.Builder methods.
We developed LLPython with the initial goal of simplifying writing LLVM code.
TODO not clear yet from the doc how to use it...
Numba
Numba is a NumPy aware dynamic compiler for Python. It creates LLVM bit-code from Python syntax and then creates a wrapper around that bitcode to call from Python.
pycc allows users to compile Numba functions into a shared library. The user writes the functions, exports them and the compiler will import the module, collect the exported functions and compile them to a shared library. Below is an example:
from numba import *
def mult(a, b):
return a * b
export('mult f8(f8, f8)'))(mult)
export(['multf f4(f4, f4)', 'multi i4(i4, i4)'])(mult)
export('multc c16(c16, c16)'))(mult)
Pyston
by Dropbox
Not mature yet