Documentation update
git-svn-id: http://llvm-py.googlecode.com/svn/trunk@85 8d1e9007-1d4e-0410-b67e-1979fd6579aa
This commit is contained in:
parent
33dc04e33c
commit
43998cc2df
15 changed files with 1343 additions and 2192 deletions
19
tools/intrs_for_doc.py
Executable file
19
tools/intrs_for_doc.py
Executable file
|
|
@ -0,0 +1,19 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
|
||||
intrs = []
|
||||
for line in file('../llvm/_intrinsic_ids.py'):
|
||||
if line.startswith('INTR_'):
|
||||
if 'INTR_ARM_' not in line and \
|
||||
'INTR_BFIN_' not in line and \
|
||||
'INTR_PPC_' not in line and \
|
||||
'INTR_SPU_' not in line and \
|
||||
'INTR_X86_' not in line and \
|
||||
'INTR_XCORE_' not in line:
|
||||
intrs.append(line.split()[0])
|
||||
|
||||
i = 0
|
||||
while i < len(intrs):
|
||||
print "`" + "`,`".join(intrs[i:min(i+3,len(intrs)+1)]) + "`"
|
||||
i += 3
|
||||
|
|
@ -1,9 +1,10 @@
|
|||
About
|
||||
=====
|
||||
|
||||
llvm-py is developed by Mahadevan R, in his spare time. He can be
|
||||
reached at mdevan.foobar@gmail.com, on the llvm-dev mailing list and
|
||||
irc.oftc.net#llvm (mdevan).
|
||||
llvm-py is developed and maintained by Mahadevan R, with contributions from
|
||||
many users all over the world. He can be reached at mdevan.foobar@gmail.com,
|
||||
on the llvm-dev mailing list and (sometimes) as mdevan on irc.oftc.net#llvm.
|
||||
|
||||
Many thanks to the guys over at LLVM for all the nifty software.
|
||||
Many thanks to the guys over at LLVM for all the nifty software, for all
|
||||
the llvm-py contributors.
|
||||
|
||||
|
|
|
|||
|
|
@ -1,23 +1,14 @@
|
|||
Download
|
||||
========
|
||||
|
||||
The latest release is 0.5, released 22-Nov-2008 (link:#changelog[Changelog]
|
||||
below). 0.5 works only with LLVM 2.4, use 0.4 if you have LLVM 2.3.
|
||||
The latest release is 0.6, released 28-Oct-2009 (link:#changelog[Changelog]
|
||||
below). 0.6 works only with LLVM 2.6.
|
||||
|
||||
Download it here:
|
||||
- http://llvm-py.googlecode.com/files/llvm-py-0.6.tar.bz2[llvm-py-0.6.tar.bz2] (primary)
|
||||
- link:llvm-py-0.6.tar.bz2[llvm-py-0.6.tar.bz2] (mirror)
|
||||
|
||||
[frame="all",grid="all"]
|
||||
````~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Release,Date,Package,Mirror
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
0.5,22-Nov-2008,http://llvm-py.googlecode.com/files/llvm-py-0.5.tar.bz2[llvm-py-0.5.tar.bz2],link:llvm-py-0.5.tar.bz2[llvm-py-0.5.tar.bz2]
|
||||
0.4,21-Nov-2008,http://llvm-py.googlecode.com/files/llvm-py-0.4.tar.bz2[llvm-py-0.4.tar.bz2],link:llvm-py-0.4.tar.bz2[llvm-py-0.4.tar.bz2]
|
||||
0.3,8-Sep-2008,http://llvm-py.googlecode.com/files/llvm-py-0.3.tar.bz2[llvm-py-0.3.tar.bz2],link:llvm-py-0.3.tar.bz2[llvm-py-0.3.tar.bz2]
|
||||
0.2.1,18-Jun-2008,http://llvm-py.googlecode.com/files/llvm-py-0.2.1.tar.bz2[llvm-py-0.2.1.tar.bz2],link:llvm-py-0.2.1.tar.bz2[llvm-py-0.2.1.tar.bz2]
|
||||
0.2,15-Jun-2008,http://llvm-py.googlecode.com/files/llvm-py-0.2.tar.bz2[llvm-py-0.2.tar.bz2],link:llvm-py-0.2.tar.bz2[llvm-py-0.2.tar.bz2]
|
||||
0.1,20-May-2008,http://llvm-py.googlecode.com/files/llvm-py-0.1.tar.bz2[llvm-py-0.1.tar.bz2],link:llvm-py-0.1.tar.bz2[llvm-py-0.1.tar.bz2]
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Older versions are available http://llvm-py.googlecode.com/files/[here].
|
||||
|
||||
The latest code can be checked out from SVN like so:
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ ported to llvm-py. Below are the links to the original LLVM tutorial and
|
|||
the corresponding Python code using llvm-py:
|
||||
|
||||
.Simple JIT Tutorials
|
||||
(These were contributed by Sebastien Binet; thanks!)
|
||||
(contributed by Sebastien Binet)
|
||||
|
||||
1. A First Function
|
||||
http://www.llvm.org/docs/tutorial/JITTutorial1.html[LLVM]
|
||||
|
|
|
|||
|
|
@ -8,32 +8,16 @@ Python and C modules that wrap over the native C++/C bindings of LLVM,
|
|||
and does not use / have dependencies on "glue utilities" like
|
||||
Boost.Python, swig etc.
|
||||
|
||||
llvm-py is just hatching. It should be stable enough to start hacking
|
||||
away, though. Be sure to send in a patch if you miss any specific LLVM
|
||||
API.
|
||||
|
||||
_Availability_: llvm-py is available (as a source package) for LLVM 2.4
|
||||
and Python 2.5. It has been built and tested on Linux and FreeBSD
|
||||
(x86 and amd64).
|
||||
llvm-py is available as a source package (only). It works / should work
|
||||
with GNU/Linux, *BSD and Mac OS X platforms, on both 32-bit and 64-bit
|
||||
architectures. Python 2.4 or better (but 3.x is untested) is required.
|
||||
The SVN HEAD usually works with the latest released LLVM. In case you
|
||||
discover that any of these claims are wrong, feel free to send across
|
||||
a patch.
|
||||
|
||||
News
|
||||
----
|
||||
|
||||
22-Nov-2008::
|
||||
0.5 released. For LLVM 2.4.
|
||||
|
||||
21-Nov-2008::
|
||||
0.4 released. Bug fixes, few additional APIs, code cleanup.
|
||||
|
||||
8-Sep-2008::
|
||||
0.3 released. Passes, intrinsics, bitcode, assembly!
|
||||
|
||||
18-Jun-2008::
|
||||
0.2.1 released. Builds cleanly with LLVM 2.3 and 2.3+svn.
|
||||
|
||||
15-Jun-2008::
|
||||
0.2 released. Lots of cleanup, new website, more documentation.
|
||||
|
||||
20-May-2008::
|
||||
0.1 released.
|
||||
28-Oct-2009::
|
||||
SVN r83 works with LLVM 2.6. Website updated.
|
||||
|
||||
|
|
|
|||
|
|
@ -19,6 +19,13 @@ Python bindings for LLVM provides a gentler learning curve for working
|
|||
with the LLVM APIs. It should also be easier to create working
|
||||
prototypes and experimental languages using this medium.
|
||||
|
||||
Together with http://clang.llvm.org/[clang] or
|
||||
http://llvm.org/cmds/llvmgcc.html[llvm-gcc] it also a provides a means
|
||||
to quickly instrument C and C++ sources. For e.g., llvm-gcc can be used to
|
||||
generate the LLVM assembly for a given C source file, which can then be
|
||||
loaded and manipulated (adding profiling code to every function, say) using
|
||||
a llvm-py based Python script.
|
||||
|
||||
.License
|
||||
Both LLVM and llvm-py are distributed under (different) permissive
|
||||
open source licenses. llvm-py uses the
|
||||
|
|
@ -26,16 +33,16 @@ http://opensource.org/licenses/bsd-license.php[new BSD license]. More
|
|||
information is available link:license.html[here].
|
||||
|
||||
.Platforms
|
||||
Currently, llvm-py has been built and tested only on Linux (i386, amd64)
|
||||
and OpenBSD (i386, amd64). However, it should be trivial to build it on
|
||||
other unices. Windows is not supported, for a variety of reasons.
|
||||
llvm-py has been built/tested/reported to work on various GNU/Linux
|
||||
flavours, *BSD, Mac OS X; on i386 and amd64 architectures. Windows is not
|
||||
supported, for a variety of reasons.
|
||||
|
||||
.Versions
|
||||
llvm-py 0.5 requires verion 2.4 of LLVM. It will not work with previous
|
||||
llvm-py 0.6 requires verion 2.6 of LLVM. It will not work with previous
|
||||
versions.
|
||||
|
||||
llvm-py has been built and tested with Python 2.5. It should work with
|
||||
Python 2.4, with minimal changes, if any.
|
||||
llvm-py has been built and tested with Python 2.6. It should work with
|
||||
Python 2.4 and 2.5. It has not been tried with Python 3.x (patches welcome).
|
||||
|
||||
|
||||
[[install]]
|
||||
|
|
@ -46,19 +53,18 @@ llvm-py is distributed as a source tarball. You'll need to build and
|
|||
install it before it can be used. At least the following will be
|
||||
required for this:
|
||||
|
||||
- C and C\+\+ compilers (gcc/g\+\+)
|
||||
- C and C++ compilers (gcc/g++)
|
||||
- Python itself
|
||||
- Python development files (headers and libraries)
|
||||
- LLVM, either installed or built
|
||||
|
||||
On debian-based systems, the first three can be installed with the
|
||||
command `sudo apt-get install gcc g\+\+ python python-dev`. Note that
|
||||
ubuntu repository has an old version of llvm (1.8) which will not work
|
||||
with llvm-py.
|
||||
command `sudo apt-get install gcc g++ python python-dev`. Ensure that your
|
||||
distro's respository has the appropriate version of LLVM!
|
||||
|
||||
It does not matter which compiler LLVM itself was built with (g\+\+,
|
||||
llvm-g\+\+ or any other); llvm-py can be built with any compiler. It has
|
||||
been tried only with gcc/g\+\+ though.
|
||||
It does not matter which compiler LLVM itself was built with (g++,
|
||||
llvm-g++ or any other); llvm-py can be built with any compiler. It has
|
||||
been tried only with gcc/g++ though.
|
||||
|
||||
|
||||
LLVM and `--enable-pic`
|
||||
|
|
@ -73,7 +79,7 @@ independent code). Be sure to use the `--enable-pic` option while
|
|||
configuring LLVM (default is no PIC), like this:
|
||||
|
||||
----
|
||||
~/llvm-2.4$ ./configure --enable-pic --enable-optimized
|
||||
~/llvm$ ./configure --enable-pic --enable-optimized
|
||||
----
|
||||
|
||||
|
||||
|
|
@ -104,8 +110,8 @@ If you have +llvm-config+ in your path, you can build and install
|
|||
llvm-py this way:
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
$ tar jxvf llvm-py-0.5.tar.bz2
|
||||
$ cd llvm-py-0.5
|
||||
$ tar jxvf llvm-py-0.6.tar.bz2
|
||||
$ cd llvm-py-0.6
|
||||
$ sudo python setup.py install
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
|
|
@ -113,8 +119,8 @@ If you need to tell the build script where +llvm-config+ is, do it this
|
|||
way:
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
$ tar jxvf llvm-py-0.5.tar.bz2
|
||||
$ cd llvm-py-0.5
|
||||
$ tar jxvf llvm-py-0.6.tar.bz2
|
||||
$ cd llvm-py-0.6
|
||||
$ sudo python setup.py install --llvm-config=/home/mdevan/llvm/Release/bin/llvm-config
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
|
|
@ -122,8 +128,8 @@ To build a debug version of llvm-py, that links against the debug
|
|||
libraries of LLVM, use this:
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
$ tar jxvf llvm-py-0.5.tar.bz2
|
||||
$ cd llvm-py-0.5
|
||||
$ tar jxvf llvm-py-0.6.tar.bz2
|
||||
$ cd llvm-py-0.6
|
||||
$ python setup.py build -g --llvm-config=/home/mdevan/llvm/Debug/bin/llvm-config
|
||||
$ sudo python setup.py install --llvm-config=/home/mdevan/llvm/Debug/bin/llvm-config
|
||||
-----------------------------------------------------------------------
|
||||
|
|
@ -144,12 +150,12 @@ Uninstall
|
|||
To get rid of llvm-py completely, if you wish to do so:
|
||||
|
||||
----
|
||||
# rm -rf /usr/lib/python2.5/site-packages/llvm
|
||||
# rm -f /usr/lib/python2.5/site-packages/llvm_py-0.1.egg-info
|
||||
# rm -rf /usr/lib/python2.6/site-packages/llvm
|
||||
# rm -f /usr/lib/python2.6/site-packages/llvm_py-0.6-py2.6.egg-info
|
||||
----
|
||||
|
||||
- You need to be root to do this.
|
||||
- Paths are for debian-based systems, in other distros it might be different.
|
||||
- Python site package path might be different on your system.
|
||||
- Note that there are version numbers (both Python's and llvm-py's)
|
||||
which you might need to change to suit your system.
|
||||
|
||||
|
|
@ -263,43 +269,42 @@ source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
The corresponding LLVM assembly:
|
||||
|
||||
-----------------------------------------------------------------------
|
||||
; ModuleID = '/tmp/webcompile/_4940_0.bc'
|
||||
; ModuleID = '/tmp/webcompile/_22154_0.bc'
|
||||
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
|
||||
target triple = "i386-pc-linux-gnu"
|
||||
|
||||
define i32 @sum(i32 %n) nounwind {
|
||||
define i32 @sum(i32 %n) nounwind readnone {
|
||||
entry:
|
||||
%tmp215 = icmp eq i32 %n, 0 ; <i1> [#uses=1]
|
||||
br i1 %tmp215, label %bb10, label %tailrecurse.bb10_crit_edge
|
||||
%0 = icmp eq i32 %n, 0 ; <i1> [#uses=1]
|
||||
br i1 %0, label %bb2, label %bb1
|
||||
|
||||
tailrecurse.bb10_crit_edge: ; preds = %entry
|
||||
%tmp = add i32 %n, -1 ; <i32> [#uses=3]
|
||||
%tmp17 = mul i32 %tmp, %tmp ; <i32> [#uses=1]
|
||||
%tmp18 = add i32 %tmp17, %n ; <i32> [#uses=1]
|
||||
%tmp. = zext i32 %tmp to i64 ; <i64> [#uses=2]
|
||||
%tmp19 = add i64 %tmp., -1 ; <i64> [#uses=1]
|
||||
%tmp20 = mul i64 %tmp19, %tmp. ; <i64> [#uses=1]
|
||||
%tmp21 = lshr i64 %tmp20, 1 ; <i64> [#uses=1]
|
||||
%tmp.22 = trunc i64 %tmp21 to i32 ; <i32> [#uses=1]
|
||||
%tmp24 = sub i32 %tmp18, %tmp.22 ; <i32> [#uses=1]
|
||||
ret i32 %tmp24
|
||||
bb1: ; preds = %entry
|
||||
%1 = add i32 %n, -1 ; <i32> [#uses=2]
|
||||
%2 = icmp eq i32 %1, 0 ; <i1> [#uses=1]
|
||||
br i1 %2, label %sum.exit, label %bb1.i
|
||||
|
||||
bb10: ; preds = %entry
|
||||
ret i32 0
|
||||
bb1.i: ; preds = %bb1
|
||||
%3 = add i32 %n, -2 ; <i32> [#uses=1]
|
||||
%4 = tail call i32 @sum(i32 %3) nounwind ; <i32> [#uses=1]
|
||||
%5 = add i32 %4, %1 ; <i32> [#uses=1]
|
||||
br label %sum.exit
|
||||
|
||||
sum.exit: ; preds = %bb1.i, %bb1
|
||||
%6 = phi i32 [ %5, %bb1.i ], [ 0, %bb1 ] ; <i32> [#uses=1]
|
||||
%7 = add i32 %6, %n ; <i32> [#uses=1]
|
||||
ret i32 %7
|
||||
|
||||
bb2: ; preds = %entry
|
||||
ret i32 0
|
||||
}
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
Note the usage of SSA form and the total absence of any loop or
|
||||
recursion at all! The long string called `target datalayout` is a
|
||||
Note the usage of SSA form. The long string called `target datalayout` is a
|
||||
specification of the platform ABI (like endianness, sizes of types,
|
||||
alignment etc.).
|
||||
|
||||
The http://www.llvm.org/docs/LangRef.html[LLVM Language Reference]
|
||||
defines the LLVM assembly language including the entire instruction set.
|
||||
The table below lists all the LLVM instructions. Each instruction links
|
||||
to it's documentation.
|
||||
|
||||
include::instrset.inc[]
|
||||
|
||||
|
||||
Modules
|
||||
|
|
@ -341,7 +346,7 @@ loaded and executed by +opt+. (Although llvm-py does not allow you to
|
|||
write your own passes, it does allow you to navigate the entire IR at
|
||||
any stage, and perform any transforms on it as you like.)
|
||||
|
||||
[TODO: pass manager, execution engine, bit code]
|
||||
TODO: pass manager, execution engine, bit code
|
||||
|
||||
|
||||
The llvm-py Package
|
||||
|
|
@ -427,7 +432,7 @@ source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
||||
This avoids quite some typing. Both conventions work, however.
|
||||
|
||||
TIP: Python-style documentation strings (`\_\_doc\_\_`) are present in
|
||||
TIP: Python-style documentation strings (`__doc__`) are present in
|
||||
llvm-py. You can use the +help()+ of the interactive Python
|
||||
interpreter or the +object?+ of http://ipython.scipy.org/moin/[IPython]
|
||||
to get online help. (Note: not complete yet!)
|
||||
|
|
@ -552,10 +557,10 @@ stringifying them (see below).
|
|||
object `fileobj`.
|
||||
|
||||
.Special Methods
|
||||
`\_\_str\_\_`::
|
||||
`__str__`::
|
||||
`Module` objects can be stringified into it's LLVM assembly language
|
||||
representation.
|
||||
`\_\_eq\_\_`::
|
||||
`__eq__`::
|
||||
`Module` objects can be compared for equality. Internally, this
|
||||
converts both arguments into their LLVM assembly representations and
|
||||
compares the resultant strings.
|
||||
|
|
@ -589,10 +594,9 @@ The following table lists all the available types along with the static
|
|||
method which has to be used to construct it and the name of the class whose
|
||||
object is actually returned by the static method.
|
||||
|
||||
[frame="all",grid="all"]
|
||||
`50`30`20~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[frame="all",grid="all",format="csv",cols="3",options="header"]
|
||||
|======================================================================
|
||||
Name,Constructor Method,Class
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
integer of bitwidth `n`, +Type.int(n)+, +IntegerType+
|
||||
32-bit float, +Type.float()+, +Type+
|
||||
64-bit double, +Type.double()+, +Type+
|
||||
|
|
@ -608,7 +612,7 @@ vector, "+Type.vector(elty, count)+", +VectorType+
|
|||
void, +Type.void()+, +Type+
|
||||
label, +Type.label()+, +Type+
|
||||
opaque, +Type.opaque()+, +Type+
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|======================================================================
|
||||
|
||||
The class hierarchy is:
|
||||
-----------------------------------------------------------------------
|
||||
|
|
@ -666,7 +670,7 @@ The class-level documentation follows:
|
|||
|
||||
.Properties
|
||||
`kind` [read-only]::
|
||||
A value (enum) representing the ``type'' of the object. It will be
|
||||
A value (enum) representing the "type" of the object. It will be
|
||||
one of the following constants defined in `llvm.core`:
|
||||
+
|
||||
[python]
|
||||
|
|
@ -678,13 +682,14 @@ TYPE_X86_FP80 = 3
|
|||
TYPE_FP128 = 4
|
||||
TYPE_PPC_FP128 = 5
|
||||
TYPE_LABEL = 6
|
||||
TYPE_INTEGER = 7
|
||||
TYPE_FUNCTION = 8
|
||||
TYPE_STRUCT = 9
|
||||
TYPE_ARRAY = 10
|
||||
TYPE_POINTER = 11
|
||||
TYPE_OPAQUE = 12
|
||||
TYPE_VECTOR = 13
|
||||
TYPE_METADATA = 7
|
||||
TYPE_INTEGER = 8
|
||||
TYPE_FUNCTION = 9
|
||||
TYPE_STRUCT = 10
|
||||
TYPE_ARRAY = 11
|
||||
TYPE_POINTER = 12
|
||||
TYPE_OPAQUE = 13
|
||||
TYPE_VECTOR = 14
|
||||
source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+
|
||||
Example:
|
||||
|
|
@ -701,10 +706,10 @@ source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
of `TypeHandle` objects.
|
||||
|
||||
.Special Methods
|
||||
`\_\_str\_\_`::
|
||||
`__str__`::
|
||||
`Type` objects can be stringified into it's LLVM assembly language
|
||||
representation.
|
||||
`\_\_eq\_\_`::
|
||||
`__eq__`::
|
||||
`Type` objects can be compared for equality. Internally, this
|
||||
converts both arguments into their LLVM assembly representations and
|
||||
compares the resultant strings.
|
||||
|
|
@ -899,7 +904,7 @@ Programmer's Manual section
|
|||
http://llvm.org/docs/ProgrammersManual.html#TypeResolve["LLVM Type
|
||||
Resolution"]. The TypeHandle class of llvm-py corresponds to
|
||||
http://www.llvm.org/doxygen/classllvm_1_1PATypeHolder.html[`llvm::PATypeHolder`]
|
||||
in C\+\+. The above example is available as
|
||||
in C++. The above example is available as
|
||||
http://code.google.com/p/llvm-py/source/browse/trunk/test/typehandle.py[test/typehandle.py]
|
||||
in the source distribution.
|
||||
|
||||
|
|
@ -964,10 +969,10 @@ the `Builder` class. These are also covered separately.
|
|||
An `llvm.core.Type` object representing the type of the value.
|
||||
|
||||
.Special Methods
|
||||
`\_\_str\_\_`::
|
||||
`__str__`::
|
||||
`Value` objects can be stringified into it's LLVM assembly language
|
||||
representation.
|
||||
`\_\_eq\_\_`::
|
||||
`__eq__`::
|
||||
`Value` objects can be compared for equality. Internally, this
|
||||
converts both arguments into their LLVM assembly representations and
|
||||
compares the resultant strings.
|
||||
|
|
@ -1003,13 +1008,12 @@ The following constructors (static methods) can be used to create
|
|||
constants:
|
||||
|
||||
[[constctors]]
|
||||
[frame="all",grid="all"]
|
||||
`25`75~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[frame="all",grid="all",format="csv",cols="2",options="header"]
|
||||
|======================================================================
|
||||
Constructor Method, What It Creates
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
`null(ty)`, A null value (all zeros) of type `ty`
|
||||
`all_ones(ty)`, All 1's value of type `ty`
|
||||
`undef(ty)`, An ``undefined'' value of type `ty`
|
||||
`undef(ty)`, An "undefined" value of type `ty`
|
||||
"`int(ty, value)`", "Integer of type `ty`, with value `value` (a Python int or long)"
|
||||
"`int_signextend(ty, value)`", Integer of signed type `ty` (use for signed types)
|
||||
"`real(ty, value)`", "Floating point value of type `ty`, with value `value` (a Python float)"
|
||||
|
|
@ -1020,7 +1024,7 @@ Constructor Method, What It Creates
|
|||
"`packed_struct(ty, consts)`", "As `struct(ty, consts)` but packed"
|
||||
"`vector(consts)`", "Vector, initialized with `consts` (an iterable yielding `Constant` objects of the appropriate type)"
|
||||
"`sizeof(ty)`", "Constant value representing the sizeof the type `ty`"
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|======================================================================
|
||||
|
||||
The following operations on constants are supported. For more details on
|
||||
any operation, consult the
|
||||
|
|
@ -1028,10 +1032,9 @@ http://www.llvm.org/docs/LangRef.html#constantexprs[Constant Expressions]
|
|||
section of the LLVM Language Reference.
|
||||
|
||||
[[constops]]
|
||||
[frame="all",grid="all"]
|
||||
`25`75~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[frame="all",grid="all",format="csv",cols="2",options="header"]
|
||||
|======================================================================
|
||||
Method, Operation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
`k.neg()`, "negation, same as `0 - k`"
|
||||
`k.not_()`, "1's complement of `k`. Note trailing underscore."
|
||||
`k.add(k2)`, "`k + k2`"
|
||||
|
|
@ -1068,16 +1071,15 @@ Method, Operation
|
|||
`k.extract_element(idx)`, "Extract value at `idx` (integer constant) from a vector constant `k`."
|
||||
"`k.insert_element(k2,idx)`", "Insert value `k2` (scalar constant) at index `idx` (integer constant) of vector constant `k`."
|
||||
"`k.shuffle_vector(k2,mask)`", "Shuffle vector constant `k` based on vector constants `k2` and `mask`."
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|======================================================================
|
||||
|
||||
[[ipred]]
|
||||
Predicates for use with `icmp` instruction are listed below. All
|
||||
of these are integer constants defined in the `llvm.core` module.
|
||||
|
||||
[frame="all",grid="all"]
|
||||
`25`75~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[frame="all",grid="all",format="csv",cols="2",options="header"]
|
||||
|======================================================================
|
||||
Value, Meaning
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
`IPRED_EQ`, Equality
|
||||
`IPRED_NE`, Inequality
|
||||
`IPRED_UGT`, Unsigned greater than
|
||||
|
|
@ -1088,16 +1090,15 @@ Value, Meaning
|
|||
`IPRED_SGE`, Signed greater than or equal
|
||||
`IPRED_SLT`, Signed less than
|
||||
`IPRED_SLE`, Signed less than or equal
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|======================================================================
|
||||
|
||||
[[rpred]]
|
||||
Predicates for use with `fcmp` instruction are listed below. All
|
||||
of these are integer constants defined in the `llvm.core` module.
|
||||
|
||||
[frame="all",grid="all"]
|
||||
`25`75~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[frame="all",grid="all",format="csv",cols="2",options="header"]
|
||||
|======================================================================
|
||||
Value, Meaning
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
`RPRED_FALSE`, Always false
|
||||
`RPRED_OEQ`, True if ordered and equal
|
||||
`RPRED_OGT`, True if ordered and greater than
|
||||
|
|
@ -1114,7 +1115,7 @@ Value, Meaning
|
|||
`RPRED_ULE`, "True if unordered, less than or equal"
|
||||
`RPRED_UNE`, True if unordered or not equal
|
||||
`RPRED_TRUE `, Always true
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|======================================================================
|
||||
|
||||
.llvm.core.Constant
|
||||
[caption=""]
|
||||
|
|
@ -1144,34 +1145,38 @@ llvm.core) as values for `linkage` (see
|
|||
http://www.llvm.org/docs/LangRef.html#linkage[LLVM documentaion] for
|
||||
details on each):
|
||||
|
||||
[frame="all",grid="all"]
|
||||
`25`75~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[frame="all",grid="all",format="csv",cols="2",options="header"]
|
||||
|======================================================================
|
||||
Value, Equivalent LLVM Assembly Keyword
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
`LINKAGE_LINKONCE`, `linkonce`
|
||||
`LINKAGE_WEAK`, `weak`
|
||||
`LINKAGE_EXTERNAL`, `externally_visible`
|
||||
`LINKAGE_AVAILABLE_EXTERNALLY`, `available_externally`
|
||||
`LINKAGE_LINKONCE_ANY`, `linkonce`
|
||||
`LINKAGE_LINKONCE_ODR`, `linkonce_odr`
|
||||
`LINKAGE_WEAK_ANY`, `weak`
|
||||
`LINKAGE_WEAK_ODR`, `weak_odr`
|
||||
`LINKAGE_APPENDING`, `appending`
|
||||
`LINKAGE_INTERNAL`, `internal`
|
||||
`LINKAGE_PRIVATE`, `private`
|
||||
`LINKAGE_LINKER_PRIVATE`, `linker_private`
|
||||
`LINKAGE_DLLIMPORT`, `dllimport`
|
||||
`LINKAGE_DLLEXPORT`, `dllexport`
|
||||
`LINKAGE_EXTERNAL`, `externally visible`
|
||||
`LINKAGE_EXTERNAL_WEAK`, `extern_weak`
|
||||
`LINKAGE_COMMON`, `common`
|
||||
`LINKAGE_GHOST`, Stand-in functions
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|======================================================================
|
||||
|
||||
The `section` property can be assigned strings (like ".rodata"), which
|
||||
will be used if the target supports it. Visibility property can be set
|
||||
to one of thse constants (from llvm.core, see also
|
||||
http://www.llvm.org/docs/LangRef.html#visibility[LLVM docs]):
|
||||
|
||||
[frame="all",grid="all"]
|
||||
`25`75~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[frame="all",grid="all",format="csv",cols="2",options="header"]
|
||||
|======================================================================
|
||||
Value, Equivalent LLVM Assembly Keyword
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
`VISIBILITY_DEFAULT`, `default`
|
||||
`VISIBILITY_HIDDEN`, `hidden`
|
||||
`VISIBILITY_PROTECTED`, `protected`
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|======================================================================
|
||||
|
||||
The `alignment` property can be 0 (default), or can be set to a power of
|
||||
2. The read-only property `is_declaration` can be used to check if the
|
||||
|
|
@ -1345,38 +1350,43 @@ http://www.llvm.org/docs/LangRef.html#int_bswap[llvm.bswap]. The
|
|||
integer argument. The list of intrinsic IDs defined as integer constants
|
||||
in `llvm.core`. These are:
|
||||
|
||||
[frame="all",grid="all"]
|
||||
`33`33`33~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
INTR_ANNOTATION,INTR_ATOMIC_CMP_SWAP,INTR_ATOMIC_LOAD_ADD
|
||||
INTR_ATOMIC_LOAD_AND,INTR_ATOMIC_LOAD_MAX,INTR_ATOMIC_LOAD_MIN
|
||||
INTR_ATOMIC_LOAD_NAND,INTR_ATOMIC_LOAD_OR,INTR_ATOMIC_LOAD_SUB
|
||||
INTR_ATOMIC_LOAD_UMAX,INTR_ATOMIC_LOAD_UMIN,INTR_ATOMIC_LOAD_XOR
|
||||
INTR_ATOMIC_SWAP,INTR_BSWAP,INTR_COS
|
||||
INTR_CTLZ,INTR_CTPOP,INTR_CTTZ
|
||||
INTR_DBG_DECLARE,INTR_DBG_FUNC_START,INTR_DBG_REGION_END
|
||||
INTR_DBG_REGION_START,INTR_DBG_STOPPOINT,INTR_EH_DWARF_CFA
|
||||
INTR_EH_EXCEPTION,INTR_EH_RETURN_I32,INTR_EH_RETURN_I64
|
||||
INTR_EH_SELECTOR_I32,INTR_EH_SELECTOR_I64,INTR_EH_TYPEID_FOR_I32
|
||||
INTR_EH_TYPEID_FOR_I64,INTR_EH_UNWIND_INIT,INTR_EXP
|
||||
INTR_EXP2,INTR_FLT_ROUNDS,INTR_FRAMEADDRESS
|
||||
INTR_GCREAD,INTR_GCROOT,INTR_GCWRITE
|
||||
INTR_INIT_TRAMPOLINE,INTR_LOG,INTR_LOG10
|
||||
INTR_LOG2,INTR_LONGJMP,INTR_MEMCPY_I32
|
||||
INTR_MEMCPY_I64,INTR_MEMMOVE_I32,INTR_MEMMOVE_I64
|
||||
INTR_MEMORY_BARRIER,INTR_MEMSET_I32,INTR_MEMSET_I64
|
||||
INTR_PART_SELECT,INTR_PART_SET,INTR_PCMARKER
|
||||
INTR_POW,INTR_POWI,INTR_PREFETCH
|
||||
INTR_READCYCLECOUNTER,INTR_RETURNADDRESS,INTR_SETJMP
|
||||
INTR_SIGLONGJMP,INTR_SIGSETJMP,INTR_SIN
|
||||
INTR_SQRT,INTR_STACKRESTORE,INTR_STACKSAVE
|
||||
INTR_TRAP,INTR_VACOPY,INTR_VAEND
|
||||
INTR_VAR_ANNOTATION,INTR_VASTART,
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
[format="csv",cols="3"]
|
||||
|======================================================================
|
||||
`INTR_ALPHA_UMULH`,`INTR_ANNOTATION`,`INTR_ATOMIC_CMP_SWAP`
|
||||
`INTR_ATOMIC_LOAD_ADD`,`INTR_ATOMIC_LOAD_AND`,`INTR_ATOMIC_LOAD_MAX`
|
||||
`INTR_ATOMIC_LOAD_MIN`,`INTR_ATOMIC_LOAD_NAND`,`INTR_ATOMIC_LOAD_OR`
|
||||
`INTR_ATOMIC_LOAD_SUB`,`INTR_ATOMIC_LOAD_UMAX`,`INTR_ATOMIC_LOAD_UMIN`
|
||||
`INTR_ATOMIC_LOAD_XOR`,`INTR_ATOMIC_SWAP`,`INTR_BSWAP`
|
||||
`INTR_CONVERTFF`,`INTR_CONVERTFSI`,`INTR_CONVERTFUI`
|
||||
`INTR_CONVERTSIF`,`INTR_CONVERTSS`,`INTR_CONVERTSU`
|
||||
`INTR_CONVERTUIF`,`INTR_CONVERTUS`,`INTR_CONVERTUU`
|
||||
`INTR_COS`,`INTR_CTLZ`,`INTR_CTPOP`
|
||||
`INTR_CTTZ`,`INTR_DBG_DECLARE`,`INTR_DBG_FUNC_START`
|
||||
`INTR_DBG_REGION_END`,`INTR_DBG_REGION_START`,`INTR_DBG_STOPPOINT`
|
||||
`INTR_EH_DWARF_CFA`,`INTR_EH_EXCEPTION`,`INTR_EH_RETURN_I32`
|
||||
`INTR_EH_RETURN_I64`,`INTR_EH_SELECTOR_I32`,`INTR_EH_SELECTOR_I64`
|
||||
`INTR_EH_SJLJ_LONGJMP`,`INTR_EH_SJLJ_LSDA`,`INTR_EH_SJLJ_SETJMP`
|
||||
`INTR_EH_TYPEID_FOR_I32`,`INTR_EH_TYPEID_FOR_I64`,`INTR_EH_UNWIND_INIT`
|
||||
`INTR_EXP`,`INTR_EXP2`,`INTR_FLT_ROUNDS`
|
||||
`INTR_FRAMEADDRESS`,`INTR_GCREAD`,`INTR_GCROOT`
|
||||
`INTR_GCWRITE`,`INTR_INIT_TRAMPOLINE`,`INTR_LOG`
|
||||
`INTR_LOG10`,`INTR_LOG2`,`INTR_LONGJMP`
|
||||
`INTR_MEMCPY`,`INTR_MEMMOVE`,`INTR_MEMORY_BARRIER`
|
||||
`INTR_MEMSET`,`INTR_PCMARKER`,`INTR_POW`
|
||||
`INTR_POWI`,`INTR_PREFETCH`,`INTR_PTR_ANNOTATION`
|
||||
`INTR_READCYCLECOUNTER`,`INTR_RETURNADDRESS`,`INTR_SADD_WITH_OVERFLOW`
|
||||
`INTR_SETJMP`,`INTR_SIGLONGJMP`,`INTR_SIGSETJMP`
|
||||
`INTR_SIN`,`INTR_SMUL_WITH_OVERFLOW`,`INTR_SQRT`
|
||||
`INTR_SSUB_WITH_OVERFLOW`,`INTR_STACKPROTECTOR`,`INTR_STACKRESTORE`
|
||||
`INTR_STACKSAVE`,`INTR_TRAP`,`INTR_UADD_WITH_OVERFLOW`
|
||||
`INTR_UMUL_WITH_OVERFLOW`,`INTR_USUB_WITH_OVERFLOW`,`INTR_VACOPY`
|
||||
`INTR_VAEND`,`INTR_VAR_ANNOTATION`,`INTR_VASTART`
|
||||
|======================================================================
|
||||
|
||||
There are also target-specific intrinsics (which correspond to that
|
||||
target's CPU instructions) available, but are omitted here for brevity.
|
||||
Full list can be seen from
|
||||
http://code.google.com/p/llvm-py/source/browse/trunk/llvm/core.py[`core.py`].
|
||||
http://code.google.com/p/llvm-py/source/browse/trunk/llvm/_intrinsic_ids.py[`_intrinsic_ids.py`].
|
||||
See the http://www.llvm.org/docs/LangRef.html[LLVM Language Reference]
|
||||
for more information on the intrinsics, and the
|
||||
http://code.google.com/p/llvm-py/source/browse#svn/trunk/test[test]
|
||||
|
|
@ -1401,7 +1411,7 @@ Value, Equivalent LLVM Assembly Keyword
|
|||
|
||||
See the http://www.llvm.org/docs/LangRef.html#callingconv[LLVM docs] for
|
||||
more information on each. Backend-specific numbered conventions can be
|
||||
directly set as numbers.
|
||||
directly passed as integers.
|
||||
|
||||
An arbitrary string identifying which garbage collector to use can be
|
||||
set or got with the property `collector`.
|
||||
|
|
@ -1456,6 +1466,7 @@ should be dropped after `delete` has been called.
|
|||
Functions can be verified with the `verify` method. This does not work
|
||||
properly yet (aborts on errors), investigation pending.
|
||||
|
||||
TODO function attributes
|
||||
|
||||
Argument (llvm.core)
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
@ -1547,6 +1558,9 @@ the file named
|
|||
http://code.google.com/p/llvm-py/source/browse/trunk/LICENSE[LICENSE]
|
||||
available in the source distribution.
|
||||
|
||||
There is an llvm-py mailing list / users group:
|
||||
http://groups.google.com/group/llvm-py.
|
||||
|
||||
The entire llvm-py website is generated from marked up text files
|
||||
using the tool http://www.methods.co.nz/asciidoc/[AsciiDoc]. These text
|
||||
files and the (pre-)generated HTML pages are available in the source
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.2.2" />
|
||||
<meta name="generator" content="AsciiDoc 8.5.0" />
|
||||
<meta name="description" content="Python bindings for LLVM" />
|
||||
<meta name="keywords" content="llvm python compiler backend bindings" />
|
||||
<link rel="stylesheet" href="style/xhtml11.css" type="text/css" />
|
||||
|
|
@ -33,16 +33,17 @@
|
|||
</div>
|
||||
<div id="preamble">
|
||||
<div class="sectionbody">
|
||||
<p>llvm-py is developed by Mahadevan R, in his spare time. He can be
|
||||
reached at mdevan.foobar@gmail.com, on the llvm-dev mailing list and
|
||||
irc.oftc.net#llvm (mdevan).</p>
|
||||
<p>Many thanks to the guys over at LLVM for all the nifty software.</p>
|
||||
<div class="paragraph"><p>llvm-py is developed and maintained by Mahadevan R, with contributions from
|
||||
many users all over the world. He can be reached at <a href="mailto:mdevan.foobar@gmail.com">mdevan.foobar@gmail.com</a>,
|
||||
on the llvm-dev mailing list and (sometimes) as mdevan on irc.oftc.net#llvm.</p></div>
|
||||
<div class="paragraph"><p>Many thanks to the guys over at LLVM for all the nifty software, for all
|
||||
the llvm-py contributors.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Web pages © Mahadevan R. Generated with <a href="http://www.methods.co.nz/asciidoc/">asciidoc</a>.
|
||||
Last updated 08-Sep-2008.
|
||||
Last updated 2009-10-28.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.2.2" />
|
||||
<meta name="generator" content="AsciiDoc 8.5.0" />
|
||||
<meta name="description" content="Python bindings for LLVM" />
|
||||
<meta name="keywords" content="llvm python compiler backend bindings" />
|
||||
<link rel="stylesheet" href="style/xhtml11.css" type="text/css" />
|
||||
|
|
@ -33,8 +33,8 @@
|
|||
</div>
|
||||
<div id="preamble">
|
||||
<div class="sectionbody">
|
||||
<p>You can make a difference, just by:</p>
|
||||
<ul>
|
||||
<div class="paragraph"><p>You can make a difference, just by:</p></div>
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
getting llvm-py to work on an as-yet-untested platform
|
||||
|
|
@ -60,9 +60,9 @@ improving the test scripts and documentation
|
|||
spreading the word
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>Useful links:</p>
|
||||
<ul>
|
||||
</ul></div>
|
||||
<div class="paragraph"><p>Useful links:</p></div>
|
||||
<div class="ulist"><ul>
|
||||
<li>
|
||||
<p>
|
||||
Google code hosting: <a href="http://code.google.com/p/llvm-py/">http://code.google.com/p/llvm-py/</a>
|
||||
|
|
@ -78,20 +78,20 @@ Browse SVN: <a href="http://code.google.com/p/llvm-py/source/browse/">http://cod
|
|||
Issues tracker: <a href="http://code.google.com/p/llvm-py/issues/list">http://code.google.com/p/llvm-py/issues/list</a>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>SVN HEAD can be checked out like so:</p>
|
||||
</ul></div>
|
||||
<div class="paragraph"><p>SVN HEAD can be checked out like so:</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>$ svn co http://llvm-py.googlecode.com/svn/trunk/ llvm-py</tt></pre>
|
||||
</div></div>
|
||||
<p>Usual caveats apply: cutting edge, may be broken (but usually not),
|
||||
update and merge before sending patches etc.</p>
|
||||
<div class="paragraph"><p>Usual caveats apply: cutting edge, may be broken (but usually not),
|
||||
update and merge before sending patches etc.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Web pages © Mahadevan R. Generated with <a href="http://www.methods.co.nz/asciidoc/">asciidoc</a>.
|
||||
Last updated 08-Sep-2008.
|
||||
Last updated 2009-10-28.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.2.6" />
|
||||
<meta name="generator" content="AsciiDoc 8.5.0" />
|
||||
<meta name="description" content="Python bindings for LLVM" />
|
||||
<meta name="keywords" content="llvm python compiler backend bindings" />
|
||||
<link rel="stylesheet" href="style/xhtml11.css" type="text/css" />
|
||||
|
|
@ -33,127 +33,18 @@
|
|||
</div>
|
||||
<div id="preamble">
|
||||
<div class="sectionbody">
|
||||
<div class="para"><p>The latest release is 0.5, released 22-Nov-2008 (<a href="#changelog">Changelog</a>
|
||||
below). 0.5 works only with LLVM 2.4, use 0.4 if you have LLVM 2.3.</p></div>
|
||||
<div class="para"><p>Download it here:</p></div>
|
||||
<div class="tableblock">
|
||||
<table rules="all"
|
||||
frame="border"
|
||||
cellspacing="0" cellpadding="4">
|
||||
<col width="200" />
|
||||
<col width="200" />
|
||||
<col width="200" />
|
||||
<col width="200" />
|
||||
<thead>
|
||||
<tr>
|
||||
<th align="left">
|
||||
Release
|
||||
</th>
|
||||
<th align="left">
|
||||
Date
|
||||
</th>
|
||||
<th align="left">
|
||||
Package
|
||||
</th>
|
||||
<th align="left">
|
||||
Mirror
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody valign="top">
|
||||
<tr>
|
||||
<td align="left">
|
||||
0.5
|
||||
</td>
|
||||
<td align="left">
|
||||
22-Nov-2008
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="http://llvm-py.googlecode.com/files/llvm-py-0.5.tar.bz2">llvm-py-0.5.tar.bz2</a>
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="llvm-py-0.5.tar.bz2">llvm-py-0.5.tar.bz2</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left">
|
||||
0.4
|
||||
</td>
|
||||
<td align="left">
|
||||
21-Nov-2008
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="http://llvm-py.googlecode.com/files/llvm-py-0.4.tar.bz2">llvm-py-0.4.tar.bz2</a>
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="llvm-py-0.4.tar.bz2">llvm-py-0.4.tar.bz2</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left">
|
||||
0.3
|
||||
</td>
|
||||
<td align="left">
|
||||
8-Sep-2008
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="http://llvm-py.googlecode.com/files/llvm-py-0.3.tar.bz2">llvm-py-0.3.tar.bz2</a>
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="llvm-py-0.3.tar.bz2">llvm-py-0.3.tar.bz2</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left">
|
||||
0.2.1
|
||||
</td>
|
||||
<td align="left">
|
||||
18-Jun-2008
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="http://llvm-py.googlecode.com/files/llvm-py-0.2.1.tar.bz2">llvm-py-0.2.1.tar.bz2</a>
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="llvm-py-0.2.1.tar.bz2">llvm-py-0.2.1.tar.bz2</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left">
|
||||
0.2
|
||||
</td>
|
||||
<td align="left">
|
||||
15-Jun-2008
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="http://llvm-py.googlecode.com/files/llvm-py-0.2.tar.bz2">llvm-py-0.2.tar.bz2</a>
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="llvm-py-0.2.tar.bz2">llvm-py-0.2.tar.bz2</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="left">
|
||||
0.1
|
||||
</td>
|
||||
<td align="left">
|
||||
20-May-2008
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="http://llvm-py.googlecode.com/files/llvm-py-0.1.tar.bz2">llvm-py-0.1.tar.bz2</a>
|
||||
</td>
|
||||
<td align="left">
|
||||
<a href="llvm-py-0.1.tar.bz2">llvm-py-0.1.tar.bz2</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="para"><p>The latest code can be checked out from SVN like so:</p></div>
|
||||
<div class="paragraph"><p>The latest release is 0.6, released 28-Oct-2009 (<a href="#changelog">Changelog</a>
|
||||
below). 0.6 works only with LLVM 2.6.</p></div>
|
||||
<div class="paragraph"><p>Download it here:
|
||||
- <a href="http://llvm-py.googlecode.com/files/llvm-py-0.6.tar.bz2">llvm-py-0.6.tar.bz2</a> (primary)
|
||||
- <a href="llvm-py-0.6.tar.bz2">llvm-py-0.6.tar.bz2</a> (mirror)</p></div>
|
||||
<div class="paragraph"><p>Older versions are available <a href="http://llvm-py.googlecode.com/files/">here</a>.</p></div>
|
||||
<div class="paragraph"><p>The latest code can be checked out from SVN like so:</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>$ svn checkout http://llvm-py.googlecode.com/svn/trunk/ llvm-py</tt></pre>
|
||||
</div></div>
|
||||
<div class="para"><p>Follow the steps <a href="userguide.html#install">described here</a> to install the
|
||||
<div class="paragraph"><p>Follow the steps <a href="userguide.html#install">described here</a> to install the
|
||||
package.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -161,7 +52,24 @@ package.</p></div>
|
|||
<div class="sectionbody">
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>0.5, 22-Nov-2008:
|
||||
<pre><tt>0.6, in progress:
|
||||
|
||||
* Migrate to LLVM 2.6 (KS Sreeram) (Issue #25).
|
||||
* Inline function (Corrado Zoccolo).
|
||||
* Get pointer to function (Corrado Zoccolo).
|
||||
* More properties/methods for TargetData (Florian Noding) (Issue #16).
|
||||
* Value.uses API.
|
||||
* Fetch operands of instructions (Seth Warn).
|
||||
* Unaliased objects (with Seth Warn).
|
||||
* Value factory, more Constant subclasses.
|
||||
* Module.link_in and Instruction.is_volatile (Seth Warn).
|
||||
* Fix Builder.position_at_beginning crash (Issue #10).
|
||||
* Builds on gentoo.
|
||||
* Code cleanup.
|
||||
* Migrate to LLVM 2.5.
|
||||
|
||||
|
||||
0.5, 22-Nov-2008:
|
||||
|
||||
* Added vicmp, vfcmp instructions and constant expressions.
|
||||
* Builds on FreeBSD.
|
||||
|
|
@ -221,7 +129,7 @@ package.</p></div>
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Web pages © Mahadevan R. Generated with <a href="http://www.methods.co.nz/asciidoc/">asciidoc</a>.
|
||||
Last updated 2008-11-22.
|
||||
Last updated 2009-10-28.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.2.2" />
|
||||
<meta name="generator" content="AsciiDoc 8.5.0" />
|
||||
<meta name="description" content="Python bindings for LLVM" />
|
||||
<meta name="keywords" content="llvm python compiler backend bindings" />
|
||||
<link rel="stylesheet" href="style/xhtml11.css" type="text/css" />
|
||||
|
|
@ -31,24 +31,23 @@
|
|||
<div id="header">
|
||||
<h1>Examples and LLVM Tutorials</h1>
|
||||
</div>
|
||||
<h2>Examples</h2>
|
||||
<h2 id="_examples">Examples</h2>
|
||||
<div class="sectionbody">
|
||||
<h3>A Simple Function</h3>
|
||||
<p>Let's create a (LLVM) module containing a single function, corresponding
|
||||
to the <tt>C</tt> function:</p>
|
||||
<h3 id="_a_simple_function">A Simple Function</h3><div style="clear:left"></div>
|
||||
<div class="paragraph"><p>Let’s create a (LLVM) module containing a single function, corresponding
|
||||
to the <tt>C</tt> function:</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content"><!-- Generator: GNU source-highlight 2.4
|
||||
<div class="content"><!-- Generator: GNU source-highlight 3.1
|
||||
by Lorenzo Bettini
|
||||
http://www.lorenzobettini.it
|
||||
http://www.gnu.org/software/src-highlite -->
|
||||
<pre><tt><span style="color: #009900">int</span> <span style="font-weight: bold"><span style="color: #000000">sum</span></span><span style="color: #990000">(</span><span style="color: #009900">int</span> a<span style="color: #990000">,</span> <span style="color: #009900">int</span> b<span style="color: #990000">)</span>
|
||||
<span style="color: #FF0000">{</span>
|
||||
<span style="font-weight: bold"><span style="color: #0000FF">return</span></span> a <span style="color: #990000">+</span> b<span style="color: #990000">;</span>
|
||||
<span style="color: #FF0000">}</span>
|
||||
</tt></pre></div></div>
|
||||
<p>Here's how it looks like:</p>
|
||||
<span style="color: #FF0000">}</span></tt></pre></div></div>
|
||||
<div class="paragraph"><p>Here’s how it looks like:</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content"><!-- Generator: GNU source-highlight 2.4
|
||||
<div class="content"><!-- Generator: GNU source-highlight 3.1
|
||||
by Lorenzo Bettini
|
||||
http://www.lorenzobettini.it
|
||||
http://www.gnu.org/software/src-highlite -->
|
||||
|
|
@ -59,45 +58,44 @@ http://www.gnu.org/software/src-highlite -->
|
|||
<span style="font-weight: bold"><span style="color: #000080">from</span></span> llvm<span style="color: #990000">.</span>core <span style="font-weight: bold"><span style="color: #000080">import</span></span> <span style="color: #990000">*</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Create an (empty) module.</span></span>
|
||||
my<span style="color: #009900">_</span>module <span style="color: #990000">=</span> <span style="color: #009900">Module</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span><span style="color: #FF0000">'my_module'</span><span style="color: #990000">)</span>
|
||||
my_module <span style="color: #990000">=</span> Module<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span><span style="color: #FF0000">'my_module'</span><span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># All the types involved here are "int"s. This type is represented</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># by an object of the llvm.core.Type class:</span></span>
|
||||
ty<span style="color: #009900">_</span>int <span style="color: #990000">=</span> <span style="color: #009900">Type</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">int</span></span><span style="color: #990000">()</span> <span style="font-style: italic"><span style="color: #9A1900"># by default 32 bits</span></span>
|
||||
ty_int <span style="color: #990000">=</span> Type<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">int</span></span><span style="color: #990000">()</span> <span style="font-style: italic"><span style="color: #9A1900"># by default 32 bits</span></span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># We need to represent the class of functions that accept two integers</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># and return an integer. This is represented by an object of the</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># function type (llvm.core.FunctionType):</span></span>
|
||||
ty<span style="color: #009900">_</span>func <span style="color: #990000">=</span> <span style="color: #009900">Type</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">function</span></span><span style="color: #990000">(</span>ty<span style="color: #009900">_</span>int<span style="color: #990000">,</span> <span style="color: #990000">[</span>ty<span style="color: #009900">_</span>int<span style="color: #990000">,</span> ty<span style="color: #009900">_</span>int<span style="color: #990000">])</span>
|
||||
ty_func <span style="color: #990000">=</span> Type<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">function</span></span><span style="color: #990000">(</span>ty_int<span style="color: #990000">,</span> <span style="color: #990000">[</span>ty_int<span style="color: #990000">,</span> ty_int<span style="color: #990000">])</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Now we need a function named 'sum' of this type. Functions are not</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># free-standing (in llvm-py); it needs to be contained in a module.</span></span>
|
||||
f<span style="color: #009900">_</span>sum <span style="color: #990000">=</span> my<span style="color: #009900">_</span>module<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">add_function</span></span><span style="color: #990000">(</span>ty<span style="color: #009900">_</span>func<span style="color: #990000">,</span> <span style="color: #FF0000">"sum"</span><span style="color: #990000">)</span>
|
||||
f_sum <span style="color: #990000">=</span> my_module<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">add_function</span></span><span style="color: #990000">(</span>ty_func<span style="color: #990000">,</span> <span style="color: #FF0000">"sum"</span><span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Let's name the function arguments as 'a' and 'b'.</span></span>
|
||||
f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">].</span>name <span style="color: #990000">=</span> <span style="color: #FF0000">"a"</span>
|
||||
f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">].</span>name <span style="color: #990000">=</span> <span style="color: #FF0000">"b"</span>
|
||||
f_sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">].</span>name <span style="color: #990000">=</span> <span style="color: #FF0000">"a"</span>
|
||||
f_sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">].</span>name <span style="color: #990000">=</span> <span style="color: #FF0000">"b"</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Our function needs a "basic block" -- a set of instructions that</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># end with a terminator (like return, branch etc.). By convention</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># the first block is called "entry".</span></span>
|
||||
bb <span style="color: #990000">=</span> f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">append_basic_block</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"entry"</span><span style="color: #990000">)</span>
|
||||
bb <span style="color: #990000">=</span> f_sum<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">append_basic_block</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"entry"</span><span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Let's add instructions into the block. For this, we need an</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># instruction builder:</span></span>
|
||||
builder <span style="color: #990000">=</span> <span style="color: #009900">Builder</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span>bb<span style="color: #990000">)</span>
|
||||
builder <span style="color: #990000">=</span> Builder<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span>bb<span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># OK, now for the instructions themselves. We'll create an add</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># instruction that returns the sum as a value, which we'll use</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># a ret instruction to return.</span></span>
|
||||
tmp <span style="color: #990000">=</span> builder<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">add</span></span><span style="color: #990000">(</span>f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">],</span> f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">],</span> <span style="color: #FF0000">"tmp"</span><span style="color: #990000">)</span>
|
||||
tmp <span style="color: #990000">=</span> builder<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">add</span></span><span style="color: #990000">(</span>f_sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">],</span> f_sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">],</span> <span style="color: #FF0000">"tmp"</span><span style="color: #990000">)</span>
|
||||
builder<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">ret</span></span><span style="color: #990000">(</span>tmp<span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># We've completed the definition now! Let's see the LLVM assembly</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># language representation of what we've created:</span></span>
|
||||
<span style="font-weight: bold"><span style="color: #0000FF">print</span></span> my<span style="color: #009900">_</span>module
|
||||
</tt></pre></div></div>
|
||||
<p>Here is the output:</p>
|
||||
<span style="font-weight: bold"><span style="color: #0000FF">print</span></span> my_module</tt></pre></div></div>
|
||||
<div class="paragraph"><p>Here is the output:</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>; ModuleID = 'my_module'
|
||||
|
|
@ -108,10 +106,10 @@ entry:
|
|||
ret i32 %tmp
|
||||
}</tt></pre>
|
||||
</div></div>
|
||||
<h3>Adding JIT Compilation</h3>
|
||||
<p>Let's compile this function in-memory and run it.</p>
|
||||
<h3 id="_adding_jit_compilation">Adding JIT Compilation</h3><div style="clear:left"></div>
|
||||
<div class="paragraph"><p>Let’s compile this function in-memory and run it.</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content"><!-- Generator: GNU source-highlight 2.4
|
||||
<div class="content"><!-- Generator: GNU source-highlight 3.1
|
||||
by Lorenzo Bettini
|
||||
http://www.lorenzobettini.it
|
||||
http://www.gnu.org/software/src-highlite -->
|
||||
|
|
@ -123,50 +121,48 @@ http://www.gnu.org/software/src-highlite -->
|
|||
<span style="font-weight: bold"><span style="color: #000080">from</span></span> llvm<span style="color: #990000">.</span>ee <span style="font-weight: bold"><span style="color: #000080">import</span></span> <span style="color: #990000">*</span> <span style="font-style: italic"><span style="color: #9A1900"># new import: ee = Execution Engine</span></span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Create a module, as in the previous example.</span></span>
|
||||
my<span style="color: #009900">_</span>module <span style="color: #990000">=</span> <span style="color: #009900">Module</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span><span style="color: #FF0000">'my_module'</span><span style="color: #990000">)</span>
|
||||
ty<span style="color: #009900">_</span>int <span style="color: #990000">=</span> <span style="color: #009900">Type</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">int</span></span><span style="color: #990000">()</span> <span style="font-style: italic"><span style="color: #9A1900"># by default 32 bits</span></span>
|
||||
ty<span style="color: #009900">_</span>func <span style="color: #990000">=</span> <span style="color: #009900">Type</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">function</span></span><span style="color: #990000">(</span>ty<span style="color: #009900">_</span>int<span style="color: #990000">,</span> <span style="color: #990000">[</span>ty<span style="color: #009900">_</span>int<span style="color: #990000">,</span> ty<span style="color: #009900">_</span>int<span style="color: #990000">])</span>
|
||||
f<span style="color: #009900">_</span>sum <span style="color: #990000">=</span> my<span style="color: #009900">_</span>module<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">add_function</span></span><span style="color: #990000">(</span>ty<span style="color: #009900">_</span>func<span style="color: #990000">,</span> <span style="color: #FF0000">"sum"</span><span style="color: #990000">)</span>
|
||||
f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">].</span>name <span style="color: #990000">=</span> <span style="color: #FF0000">"a"</span>
|
||||
f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">].</span>name <span style="color: #990000">=</span> <span style="color: #FF0000">"b"</span>
|
||||
bb <span style="color: #990000">=</span> f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">append_basic_block</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"entry"</span><span style="color: #990000">)</span>
|
||||
builder <span style="color: #990000">=</span> <span style="color: #009900">Builder</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span>bb<span style="color: #990000">)</span>
|
||||
tmp <span style="color: #990000">=</span> builder<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">add</span></span><span style="color: #990000">(</span>f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">],</span> f<span style="color: #009900">_</span>sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">],</span> <span style="color: #FF0000">"tmp"</span><span style="color: #990000">)</span>
|
||||
my_module <span style="color: #990000">=</span> Module<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span><span style="color: #FF0000">'my_module'</span><span style="color: #990000">)</span>
|
||||
ty_int <span style="color: #990000">=</span> Type<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">int</span></span><span style="color: #990000">()</span> <span style="font-style: italic"><span style="color: #9A1900"># by default 32 bits</span></span>
|
||||
ty_func <span style="color: #990000">=</span> Type<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">function</span></span><span style="color: #990000">(</span>ty_int<span style="color: #990000">,</span> <span style="color: #990000">[</span>ty_int<span style="color: #990000">,</span> ty_int<span style="color: #990000">])</span>
|
||||
f_sum <span style="color: #990000">=</span> my_module<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">add_function</span></span><span style="color: #990000">(</span>ty_func<span style="color: #990000">,</span> <span style="color: #FF0000">"sum"</span><span style="color: #990000">)</span>
|
||||
f_sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">].</span>name <span style="color: #990000">=</span> <span style="color: #FF0000">"a"</span>
|
||||
f_sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">].</span>name <span style="color: #990000">=</span> <span style="color: #FF0000">"b"</span>
|
||||
bb <span style="color: #990000">=</span> f_sum<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">append_basic_block</span></span><span style="color: #990000">(</span><span style="color: #FF0000">"entry"</span><span style="color: #990000">)</span>
|
||||
builder <span style="color: #990000">=</span> Builder<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span>bb<span style="color: #990000">)</span>
|
||||
tmp <span style="color: #990000">=</span> builder<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">add</span></span><span style="color: #990000">(</span>f_sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">0</span><span style="color: #990000">],</span> f_sum<span style="color: #990000">.</span>args<span style="color: #990000">[</span><span style="color: #993399">1</span><span style="color: #990000">],</span> <span style="color: #FF0000">"tmp"</span><span style="color: #990000">)</span>
|
||||
builder<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">ret</span></span><span style="color: #990000">(</span>tmp<span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Create a module provider object first. Modules can come from</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># in-memory IRs like what we created now, or from bitcode (.bc)</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># files. The module provider abstracts this detail.</span></span>
|
||||
mp <span style="color: #990000">=</span> <span style="color: #009900">ModuleProvider</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span>my<span style="color: #009900">_</span>module<span style="color: #990000">)</span>
|
||||
mp <span style="color: #990000">=</span> ModuleProvider<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span>my_module<span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Create an execution engine object. This will create a JIT compiler</span></span>
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># on platforms that support it, or an interpreter otherwise.</span></span>
|
||||
ee <span style="color: #990000">=</span> <span style="color: #009900">ExecutionEngine</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span>mp<span style="color: #990000">)</span>
|
||||
ee <span style="color: #990000">=</span> ExecutionEngine<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">new</span></span><span style="color: #990000">(</span>mp<span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># The arguments needs to be passed as "GenericValue" objects.</span></span>
|
||||
arg1 <span style="color: #990000">=</span> <span style="color: #009900">GenericValue</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">int</span></span><span style="color: #990000">(</span>ty<span style="color: #009900">_</span>int<span style="color: #990000">,</span> <span style="color: #993399">100</span><span style="color: #990000">)</span>
|
||||
arg2 <span style="color: #990000">=</span> <span style="color: #009900">GenericValue</span><span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">int</span></span><span style="color: #990000">(</span>ty<span style="color: #009900">_</span>int<span style="color: #990000">,</span> <span style="color: #993399">42</span><span style="color: #990000">)</span>
|
||||
arg1 <span style="color: #990000">=</span> GenericValue<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">int</span></span><span style="color: #990000">(</span>ty_int<span style="color: #990000">,</span> <span style="color: #993399">100</span><span style="color: #990000">)</span>
|
||||
arg2 <span style="color: #990000">=</span> GenericValue<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">int</span></span><span style="color: #990000">(</span>ty_int<span style="color: #990000">,</span> <span style="color: #993399">42</span><span style="color: #990000">)</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># Now let's compile and run!</span></span>
|
||||
retval <span style="color: #990000">=</span> ee<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">run_function</span></span><span style="color: #990000">(</span>f<span style="color: #009900">_</span>sum<span style="color: #990000">,</span> <span style="color: #990000">[</span>arg1<span style="color: #990000">,</span> arg2<span style="color: #990000">])</span>
|
||||
retval <span style="color: #990000">=</span> ee<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">run_function</span></span><span style="color: #990000">(</span>f_sum<span style="color: #990000">,</span> <span style="color: #990000">[</span>arg1<span style="color: #990000">,</span> arg2<span style="color: #990000">])</span>
|
||||
|
||||
<span style="font-style: italic"><span style="color: #9A1900"># The return value is also GenericValue. Let's print it.</span></span>
|
||||
<span style="font-weight: bold"><span style="color: #0000FF">print</span></span> <span style="color: #FF0000">"returned"</span><span style="color: #990000">,</span> retval<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">as_int</span></span><span style="color: #990000">()</span>
|
||||
</tt></pre></div></div>
|
||||
<p>And here's the output:</p>
|
||||
<span style="font-weight: bold"><span style="color: #0000FF">print</span></span> <span style="color: #FF0000">"returned"</span><span style="color: #990000">,</span> retval<span style="color: #990000">.</span><span style="font-weight: bold"><span style="color: #000000">as_int</span></span><span style="color: #990000">()</span></tt></pre></div></div>
|
||||
<div class="paragraph"><p>And here’s the output:</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>returned 142</tt></pre>
|
||||
</div></div>
|
||||
</div>
|
||||
<h2>LLVM Tutorials</h2>
|
||||
<h2 id="_llvm_tutorials">LLVM Tutorials</h2>
|
||||
<div class="sectionbody">
|
||||
<p>The <a href="http://www.llvm.org/docs/tutorial/">LLVM tutorials</a> have been
|
||||
<div class="paragraph"><p>The <a href="http://www.llvm.org/docs/tutorial/">LLVM tutorials</a> have been
|
||||
ported to llvm-py. Below are the links to the original LLVM tutorial and
|
||||
the corresponding Python code using llvm-py:</p>
|
||||
<div class="title">Simple JIT Tutorials</div>
|
||||
<p>(These were contributed by Sebastien Binet; thanks!)</p>
|
||||
<ol>
|
||||
the corresponding Python code using llvm-py:</p></div>
|
||||
<div class="paragraph"><div class="title">Simple JIT Tutorials</div><p>(contributed by Sebastien Binet)</p></div>
|
||||
<div class="olist arabic"><ol class="arabic">
|
||||
<li>
|
||||
<p>
|
||||
A First Function
|
||||
|
|
@ -181,8 +177,8 @@ A More Complicated Function
|
|||
<a href="examples/JITTutorial2.html">llvm-py</a>
|
||||
</p>
|
||||
</li>
|
||||
</ol>
|
||||
<div class="title">Kaleidoscope: Implementing a Language with LLVM</div><ol>
|
||||
</ol></div>
|
||||
<div class="olist arabic"><div class="title">Kaleidoscope: Implementing a Language with LLVM</div><ol class="arabic">
|
||||
<li>
|
||||
<p>
|
||||
Tutorial Introduction and the Lexer (TODO)
|
||||
|
|
@ -223,12 +219,12 @@ Extending the language: mutable variables / SSA construction (TODO)
|
|||
Conclusion and other useful LLVM tidbits (TODO)
|
||||
</p>
|
||||
</li>
|
||||
</ol>
|
||||
</ol></div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Web pages © Mahadevan R. Generated with <a href="http://www.methods.co.nz/asciidoc/">asciidoc</a>.
|
||||
Last updated 08-Sep-2008.
|
||||
Last updated 2009-10-28.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Generator: GNU source-highlight 2.4
|
||||
<!-- Generator: GNU source-highlight 3.1
|
||||
by Lorenzo Bettini
|
||||
http://www.lorenzobettini.it
|
||||
http://www.gnu.org/software/src-highlite -->
|
||||
|
|
@ -7,30 +7,30 @@ http://www.gnu.org/software/src-highlite -->
|
|||
<b><font color="#000080">from</font></b> llvm<font color="#990000">.</font>core <b><font color="#000080">import</font></b> <font color="#990000">*</font>
|
||||
|
||||
<i><font color="#9A1900"># create a module</font></i>
|
||||
module <font color="#990000">=</font> <font color="#009900">Module</font><font color="#990000">.</font><b><font color="#000000">new </font></b><font color="#990000">(</font><font color="#FF0000">"tut1"</font><font color="#990000">)</font>
|
||||
module <font color="#990000">=</font> Module<font color="#990000">.</font><b><font color="#000000">new</font></b> <font color="#990000">(</font><font color="#FF0000">"tut1"</font><font color="#990000">)</font>
|
||||
|
||||
<i><font color="#9A1900"># create a function type taking 3 32-bit integers, return a 32-bit integer</font></i>
|
||||
ty<font color="#009900">_</font>int <font color="#990000">=</font> <font color="#009900">Type</font><font color="#990000">.</font><b><font color="#000000">int </font></b><font color="#990000">(</font><font color="#993399">32</font><font color="#990000">)</font>
|
||||
func<font color="#009900">_</font>type <font color="#990000">=</font> <font color="#009900">Type</font><font color="#990000">.</font><b><font color="#000000">function </font></b><font color="#990000">(</font>ty<font color="#009900">_</font>int<font color="#990000">,</font> <font color="#990000">(</font>ty<font color="#009900">_</font>int<font color="#990000">,)*</font><font color="#993399">3</font><font color="#990000">)</font>
|
||||
ty_int <font color="#990000">=</font> Type<font color="#990000">.</font><b><font color="#000000">int</font></b> <font color="#990000">(</font><font color="#993399">32</font><font color="#990000">)</font>
|
||||
func_type <font color="#990000">=</font> Type<font color="#990000">.</font><b><font color="#000000">function</font></b> <font color="#990000">(</font>ty_int<font color="#990000">,</font> <font color="#990000">(</font>ty_int<font color="#990000">,)*</font><font color="#993399">3</font><font color="#990000">)</font>
|
||||
|
||||
<i><font color="#9A1900"># create a function of that type</font></i>
|
||||
mul<font color="#009900">_</font>add <font color="#990000">=</font> <font color="#009900">Function</font><font color="#990000">.</font><b><font color="#000000">new </font></b><font color="#990000">(</font>module<font color="#990000">,</font> func<font color="#009900">_</font>type<font color="#990000">,</font> <font color="#FF0000">"mul_add"</font><font color="#990000">)</font>
|
||||
mul<font color="#009900">_</font>add<font color="#990000">.</font>calling<font color="#009900">_</font>convention <font color="#990000">=</font> <font color="#009900">CC_C</font>
|
||||
x <font color="#990000">=</font> mul<font color="#009900">_</font>add<font color="#990000">.</font>args<font color="#990000">[</font><font color="#993399">0</font><font color="#990000">];</font> x<font color="#990000">.</font>name <font color="#990000">=</font> <font color="#FF0000">"x"</font>
|
||||
y <font color="#990000">=</font> mul<font color="#009900">_</font>add<font color="#990000">.</font>args<font color="#990000">[</font><font color="#993399">1</font><font color="#990000">];</font> y<font color="#990000">.</font>name <font color="#990000">=</font> <font color="#FF0000">"y"</font>
|
||||
z <font color="#990000">=</font> mul<font color="#009900">_</font>add<font color="#990000">.</font>args<font color="#990000">[</font><font color="#993399">2</font><font color="#990000">];</font> z<font color="#990000">.</font>name <font color="#990000">=</font> <font color="#FF0000">"z"</font>
|
||||
mul_add <font color="#990000">=</font> Function<font color="#990000">.</font><b><font color="#000000">new</font></b> <font color="#990000">(</font>module<font color="#990000">,</font> func_type<font color="#990000">,</font> <font color="#FF0000">"mul_add"</font><font color="#990000">)</font>
|
||||
mul_add<font color="#990000">.</font>calling_convention <font color="#990000">=</font> CC_C
|
||||
x <font color="#990000">=</font> mul_add<font color="#990000">.</font>args<font color="#990000">[</font><font color="#993399">0</font><font color="#990000">];</font> x<font color="#990000">.</font>name <font color="#990000">=</font> <font color="#FF0000">"x"</font>
|
||||
y <font color="#990000">=</font> mul_add<font color="#990000">.</font>args<font color="#990000">[</font><font color="#993399">1</font><font color="#990000">];</font> y<font color="#990000">.</font>name <font color="#990000">=</font> <font color="#FF0000">"y"</font>
|
||||
z <font color="#990000">=</font> mul_add<font color="#990000">.</font>args<font color="#990000">[</font><font color="#993399">2</font><font color="#990000">];</font> z<font color="#990000">.</font>name <font color="#990000">=</font> <font color="#FF0000">"z"</font>
|
||||
|
||||
<i><font color="#9A1900"># implement the function</font></i>
|
||||
|
||||
<i><font color="#9A1900"># new block</font></i>
|
||||
blk <font color="#990000">=</font> mul<font color="#009900">_</font>add<font color="#990000">.</font><b><font color="#000000">append_basic_block </font></b><font color="#990000">(</font><font color="#FF0000">"entry"</font><font color="#990000">)</font>
|
||||
blk <font color="#990000">=</font> mul_add<font color="#990000">.</font><b><font color="#000000">append_basic_block</font></b> <font color="#990000">(</font><font color="#FF0000">"entry"</font><font color="#990000">)</font>
|
||||
|
||||
<i><font color="#9A1900"># IR builder</font></i>
|
||||
bldr <font color="#990000">=</font> <font color="#009900">Builder</font><font color="#990000">.</font><b><font color="#000000">new </font></b><font color="#990000">(</font>blk<font color="#990000">)</font>
|
||||
tmp<font color="#009900">_</font><font color="#993399">1</font> <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">mul </font></b><font color="#990000">(</font>x<font color="#990000">,</font> y<font color="#990000">,</font> <font color="#FF0000">"tmp_1"</font><font color="#990000">)</font>
|
||||
tmp<font color="#009900">_</font><font color="#993399">2</font> <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">add </font></b><font color="#990000">(</font>tmp<font color="#009900">_</font><font color="#993399">1</font><font color="#990000">,</font> z<font color="#990000">,</font> <font color="#FF0000">"tmp_2"</font><font color="#990000">)</font>
|
||||
bldr <font color="#990000">=</font> Builder<font color="#990000">.</font><b><font color="#000000">new</font></b> <font color="#990000">(</font>blk<font color="#990000">)</font>
|
||||
tmp_1 <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">mul</font></b> <font color="#990000">(</font>x<font color="#990000">,</font> y<font color="#990000">,</font> <font color="#FF0000">"tmp_1"</font><font color="#990000">)</font>
|
||||
tmp_2 <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">add</font></b> <font color="#990000">(</font>tmp_1<font color="#990000">,</font> z<font color="#990000">,</font> <font color="#FF0000">"tmp_2"</font><font color="#990000">)</font>
|
||||
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">ret </font></b><font color="#990000">(</font>tmp<font color="#009900">_</font><font color="#993399">2</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">ret</font></b> <font color="#990000">(</font>tmp_2<font color="#990000">)</font>
|
||||
|
||||
<b><font color="#0000FF">print</font></b> module
|
||||
</tt></pre>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Generator: GNU source-highlight 2.4
|
||||
<!-- Generator: GNU source-highlight 3.1
|
||||
by Lorenzo Bettini
|
||||
http://www.lorenzobettini.it
|
||||
http://www.gnu.org/software/src-highlite -->
|
||||
|
|
@ -7,14 +7,14 @@ http://www.gnu.org/software/src-highlite -->
|
|||
<b><font color="#000080">from</font></b> llvm<font color="#990000">.</font>core <b><font color="#000080">import</font></b> <font color="#990000">*</font>
|
||||
|
||||
<i><font color="#9A1900"># create a module</font></i>
|
||||
module <font color="#990000">=</font> <font color="#009900">Module</font><font color="#990000">.</font><b><font color="#000000">new </font></b><font color="#990000">(</font><font color="#FF0000">"tut2"</font><font color="#990000">)</font>
|
||||
module <font color="#990000">=</font> Module<font color="#990000">.</font><b><font color="#000000">new</font></b> <font color="#990000">(</font><font color="#FF0000">"tut2"</font><font color="#990000">)</font>
|
||||
|
||||
<i><font color="#9A1900"># create a function type taking 2 integers, return a 32-bit integer</font></i>
|
||||
ty<font color="#009900">_</font>int <font color="#990000">=</font> <font color="#009900">Type</font><font color="#990000">.</font><b><font color="#000000">int </font></b><font color="#990000">(</font><font color="#993399">32</font><font color="#990000">)</font>
|
||||
func<font color="#009900">_</font>type <font color="#990000">=</font> <font color="#009900">Type</font><font color="#990000">.</font><b><font color="#000000">function </font></b><font color="#990000">(</font>ty<font color="#009900">_</font>int<font color="#990000">,</font> <font color="#990000">(</font>ty<font color="#009900">_</font>int<font color="#990000">,</font> ty<font color="#009900">_</font>int<font color="#990000">))</font>
|
||||
ty_int <font color="#990000">=</font> Type<font color="#990000">.</font><b><font color="#000000">int</font></b> <font color="#990000">(</font><font color="#993399">32</font><font color="#990000">)</font>
|
||||
func_type <font color="#990000">=</font> Type<font color="#990000">.</font><b><font color="#000000">function</font></b> <font color="#990000">(</font>ty_int<font color="#990000">,</font> <font color="#990000">(</font>ty_int<font color="#990000">,</font> ty_int<font color="#990000">))</font>
|
||||
|
||||
<i><font color="#9A1900"># create a function of that type</font></i>
|
||||
gcd <font color="#990000">=</font> <font color="#009900">Function</font><font color="#990000">.</font><b><font color="#000000">new </font></b><font color="#990000">(</font>module<font color="#990000">,</font> func<font color="#009900">_</font>type<font color="#990000">,</font> <font color="#FF0000">"gcd"</font><font color="#990000">)</font>
|
||||
gcd <font color="#990000">=</font> Function<font color="#990000">.</font><b><font color="#000000">new</font></b> <font color="#990000">(</font>module<font color="#990000">,</font> func_type<font color="#990000">,</font> <font color="#FF0000">"gcd"</font><font color="#990000">)</font>
|
||||
|
||||
<i><font color="#9A1900"># name function args</font></i>
|
||||
x <font color="#990000">=</font> gcd<font color="#990000">.</font>args<font color="#990000">[</font><font color="#993399">0</font><font color="#990000">];</font> x<font color="#990000">.</font>name <font color="#990000">=</font> <font color="#FF0000">"x"</font>
|
||||
|
|
@ -23,33 +23,33 @@ y <font color="#990000">=</font> gcd<font color="#990000">.</font>args<font colo
|
|||
<i><font color="#9A1900"># implement the function</font></i>
|
||||
|
||||
<i><font color="#9A1900"># blocks...</font></i>
|
||||
entry <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block </font></b><font color="#990000">(</font><font color="#FF0000">"entry"</font><font color="#990000">)</font>
|
||||
ret <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block </font></b><font color="#990000">(</font><font color="#FF0000">"return"</font><font color="#990000">)</font>
|
||||
cond<font color="#009900">_</font>false <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block </font></b><font color="#990000">(</font><font color="#FF0000">"cond_false"</font><font color="#990000">)</font>
|
||||
cond<font color="#009900">_</font>true <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block </font></b><font color="#990000">(</font><font color="#FF0000">"cond_true"</font><font color="#990000">)</font>
|
||||
cond<font color="#009900">_</font>false<font color="#009900">_</font><font color="#993399">2</font> <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block </font></b><font color="#990000">(</font><font color="#FF0000">"cond_false_2"</font><font color="#990000">)</font>
|
||||
entry <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block</font></b> <font color="#990000">(</font><font color="#FF0000">"entry"</font><font color="#990000">)</font>
|
||||
ret <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block</font></b> <font color="#990000">(</font><font color="#FF0000">"return"</font><font color="#990000">)</font>
|
||||
cond_false <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block</font></b> <font color="#990000">(</font><font color="#FF0000">"cond_false"</font><font color="#990000">)</font>
|
||||
cond_true <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block</font></b> <font color="#990000">(</font><font color="#FF0000">"cond_true"</font><font color="#990000">)</font>
|
||||
cond_false_2 <font color="#990000">=</font> gcd<font color="#990000">.</font><b><font color="#000000">append_basic_block</font></b> <font color="#990000">(</font><font color="#FF0000">"cond_false_2"</font><font color="#990000">)</font>
|
||||
|
||||
<i><font color="#9A1900"># create a llvm::IRBuilder</font></i>
|
||||
bldr <font color="#990000">=</font> <font color="#009900">Builder</font><font color="#990000">.</font><b><font color="#000000">new </font></b><font color="#990000">(</font>entry<font color="#990000">)</font>
|
||||
x<font color="#009900">_</font>eq<font color="#009900">_</font>y <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">icmp </font></b><font color="#990000">(</font><font color="#009900">IPRED_EQ</font><font color="#990000">,</font> x<font color="#990000">,</font> y<font color="#990000">,</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">cbranch </font></b><font color="#990000">(</font>x<font color="#009900">_</font>eq<font color="#009900">_</font>y<font color="#990000">,</font> ret<font color="#990000">,</font> cond<font color="#009900">_</font>false<font color="#990000">)</font>
|
||||
bldr <font color="#990000">=</font> Builder<font color="#990000">.</font><b><font color="#000000">new</font></b> <font color="#990000">(</font>entry<font color="#990000">)</font>
|
||||
x_eq_y <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">icmp</font></b> <font color="#990000">(</font>IPRED_EQ<font color="#990000">,</font> x<font color="#990000">,</font> y<font color="#990000">,</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">cbranch</font></b> <font color="#990000">(</font>x_eq_y<font color="#990000">,</font> ret<font color="#990000">,</font> cond_false<font color="#990000">)</font>
|
||||
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">position_at_end </font></b><font color="#990000">(</font>ret<font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">position_at_end</font></b> <font color="#990000">(</font>ret<font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">ret</font></b><font color="#990000">(</font>x<font color="#990000">)</font>
|
||||
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">position_at_end </font></b><font color="#990000">(</font>cond<font color="#009900">_</font>false<font color="#990000">)</font>
|
||||
x<font color="#009900">_</font>lt<font color="#009900">_</font>y <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">icmp </font></b><font color="#990000">(</font><font color="#009900">IPRED_ULT</font><font color="#990000">,</font> x<font color="#990000">,</font> y<font color="#990000">,</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">cbranch </font></b><font color="#990000">(</font>x<font color="#009900">_</font>lt<font color="#009900">_</font>y<font color="#990000">,</font> cond<font color="#009900">_</font>true<font color="#990000">,</font> cond<font color="#009900">_</font>false<font color="#009900">_</font><font color="#993399">2</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">position_at_end</font></b> <font color="#990000">(</font>cond_false<font color="#990000">)</font>
|
||||
x_lt_y <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">icmp</font></b> <font color="#990000">(</font>IPRED_ULT<font color="#990000">,</font> x<font color="#990000">,</font> y<font color="#990000">,</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">cbranch</font></b> <font color="#990000">(</font>x_lt_y<font color="#990000">,</font> cond_true<font color="#990000">,</font> cond_false_2<font color="#990000">)</font>
|
||||
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">position_at_end </font></b><font color="#990000">(</font>cond<font color="#009900">_</font>true<font color="#990000">)</font>
|
||||
y<font color="#009900">_</font>sub<font color="#009900">_</font>x <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">sub </font></b><font color="#990000">(</font>y<font color="#990000">,</font> x<font color="#990000">,</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
recur<font color="#009900">_</font><font color="#993399">1</font> <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">call </font></b><font color="#990000">(</font>gcd<font color="#990000">,</font> <font color="#990000">(</font>x<font color="#990000">,</font> y<font color="#009900">_</font>sub<font color="#009900">_</font>x<font color="#990000">,),</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">ret </font></b><font color="#990000">(</font>recur<font color="#009900">_</font><font color="#993399">1</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">position_at_end</font></b> <font color="#990000">(</font>cond_true<font color="#990000">)</font>
|
||||
y_sub_x <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">sub</font></b> <font color="#990000">(</font>y<font color="#990000">,</font> x<font color="#990000">,</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
recur_1 <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">call</font></b> <font color="#990000">(</font>gcd<font color="#990000">,</font> <font color="#990000">(</font>x<font color="#990000">,</font> y_sub_x<font color="#990000">,),</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">ret</font></b> <font color="#990000">(</font>recur_1<font color="#990000">)</font>
|
||||
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">position_at_end </font></b><font color="#990000">(</font>cond<font color="#009900">_</font>false<font color="#009900">_</font><font color="#993399">2</font><font color="#990000">)</font>
|
||||
x<font color="#009900">_</font>sub<font color="#009900">_</font>y <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">sub </font></b><font color="#990000">(</font>x<font color="#990000">,</font> y<font color="#990000">,</font> <font color="#FF0000">"x_sub_y"</font><font color="#990000">)</font>
|
||||
recur<font color="#009900">_</font><font color="#993399">2</font> <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">call </font></b><font color="#990000">(</font>gcd<font color="#990000">,</font> <font color="#990000">(</font>x<font color="#009900">_</font>sub<font color="#009900">_</font>y<font color="#990000">,</font> y<font color="#990000">,),</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">ret </font></b><font color="#990000">(</font>recur<font color="#009900">_</font><font color="#993399">2</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">position_at_end</font></b> <font color="#990000">(</font>cond_false_2<font color="#990000">)</font>
|
||||
x_sub_y <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">sub</font></b> <font color="#990000">(</font>x<font color="#990000">,</font> y<font color="#990000">,</font> <font color="#FF0000">"x_sub_y"</font><font color="#990000">)</font>
|
||||
recur_2 <font color="#990000">=</font> bldr<font color="#990000">.</font><b><font color="#000000">call</font></b> <font color="#990000">(</font>gcd<font color="#990000">,</font> <font color="#990000">(</font>x_sub_y<font color="#990000">,</font> y<font color="#990000">,),</font> <font color="#FF0000">"tmp"</font><font color="#990000">)</font>
|
||||
bldr<font color="#990000">.</font><b><font color="#000000">ret</font></b> <font color="#990000">(</font>recur_2<font color="#990000">)</font>
|
||||
|
||||
<b><font color="#0000FF">print</font></b> module
|
||||
</tt></pre>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.2.6" />
|
||||
<meta name="generator" content="AsciiDoc 8.5.0" />
|
||||
<meta name="description" content="Python bindings for LLVM" />
|
||||
<meta name="keywords" content="llvm python compiler backend bindings" />
|
||||
<link rel="stylesheet" href="style/xhtml11.css" type="text/css" />
|
||||
|
|
@ -33,69 +33,29 @@
|
|||
</div>
|
||||
<div id="preamble">
|
||||
<div class="sectionbody">
|
||||
<div class="para"><p>llvm-py provides <a href="http://www.python.org/">Python</a> bindings for
|
||||
<a href="http://llvm.org/">LLVM</a>. It's goal is to expose enough of LLVM APIs to
|
||||
<div class="paragraph"><p>llvm-py provides <a href="http://www.python.org/">Python</a> bindings for
|
||||
<a href="http://llvm.org/">LLVM</a>. It’s goal is to expose enough of LLVM APIs to
|
||||
implement a compiler backend or a VM in pure Python. llvm-py consists of
|
||||
Python and C modules that wrap over the native C++/C bindings of LLVM,
|
||||
and does not use / have dependencies on "glue utilities" like
|
||||
Boost.Python, swig etc.</p></div>
|
||||
<div class="para"><p>llvm-py is just hatching. It should be stable enough to start hacking
|
||||
away, though. Be sure to send in a patch if you miss any specific LLVM
|
||||
API.</p></div>
|
||||
<div class="para"><p><em>Availability</em>: llvm-py is available (as a source package) for LLVM 2.4
|
||||
and Python 2.5. It has been built and tested on Linux and FreeBSD
|
||||
(x86 and amd64).</p></div>
|
||||
<div class="paragraph"><p>llvm-py is available as a source package (only). It works / should work
|
||||
with GNU/Linux, *BSD and Mac OS X platforms, on both 32-bit and 64-bit
|
||||
architectures. Python 2.4 or better (but 3.x is untested) is required.
|
||||
The SVN HEAD usually works with the latest released LLVM. In case you
|
||||
discover that any of these claims are wrong, feel free to send across
|
||||
a patch.</p></div>
|
||||
</div>
|
||||
</div>
|
||||
<h2 id="_news">News</h2>
|
||||
<div class="sectionbody">
|
||||
<div class="vlist"><dl>
|
||||
<dt>
|
||||
22-Nov-2008
|
||||
<div class="dlist"><dl>
|
||||
<dt class="hdlist1">
|
||||
28-Oct-2009
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
0.5 released. For LLVM 2.4.
|
||||
</p>
|
||||
</dd>
|
||||
<dt>
|
||||
21-Nov-2008
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
0.4 released. Bug fixes, few additional APIs, code cleanup.
|
||||
</p>
|
||||
</dd>
|
||||
<dt>
|
||||
8-Sep-2008
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
0.3 released. Passes, intrinsics, bitcode, assembly!
|
||||
</p>
|
||||
</dd>
|
||||
<dt>
|
||||
18-Jun-2008
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
0.2.1 released. Builds cleanly with LLVM 2.3 and 2.3+svn.
|
||||
</p>
|
||||
</dd>
|
||||
<dt>
|
||||
15-Jun-2008
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
0.2 released. Lots of cleanup, new website, more documentation.
|
||||
</p>
|
||||
</dd>
|
||||
<dt>
|
||||
20-May-2008
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
0.1 released.
|
||||
SVN r83 works with LLVM 2.6. Website updated.
|
||||
</p>
|
||||
</dd>
|
||||
</dl></div>
|
||||
|
|
@ -103,7 +63,7 @@ and Python 2.5. It has been built and tested on Linux and FreeBSD
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Web pages © Mahadevan R. Generated with <a href="http://www.methods.co.nz/asciidoc/">asciidoc</a>.
|
||||
Last updated 2008-11-22.
|
||||
Last updated 2009-10-28.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<meta name="generator" content="AsciiDoc 8.2.2" />
|
||||
<meta name="generator" content="AsciiDoc 8.5.0" />
|
||||
<meta name="description" content="Python bindings for LLVM" />
|
||||
<meta name="keywords" content="llvm python compiler backend bindings" />
|
||||
<link rel="stylesheet" href="style/xhtml11.css" type="text/css" />
|
||||
|
|
@ -33,13 +33,13 @@
|
|||
</div>
|
||||
<div id="preamble">
|
||||
<div class="sectionbody">
|
||||
<p>llvm-py is distributed under the
|
||||
<div class="paragraph"><p>llvm-py is distributed under the
|
||||
<a href="http://www.opensource.org/licenses/bsd-license.php">new BSD license</a>.
|
||||
This is similar to LLVM's license. You should be able to use llvm-py
|
||||
where-ever and how-ever you're able to use LLVM itself.</p>
|
||||
<p>The license text is present in the
|
||||
This is similar to LLVM’s license. You should be able to use llvm-py
|
||||
where-ever and how-ever you’re able to use LLVM itself.</p></div>
|
||||
<div class="paragraph"><p>The license text is present in the
|
||||
<a href="http://code.google.com/p/llvm-py/source/browse/trunk/LICENSE">LICENSE</a>
|
||||
file in the distribution, and is reproduced here:</p>
|
||||
file in the distribution, and is reproduced here:</p></div>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>Copyright (c) 2008, Mahadevan R All rights reserved.
|
||||
|
|
@ -74,7 +74,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</tt></pre>
|
|||
<div id="footer">
|
||||
<div id="footer-text">
|
||||
Web pages © Mahadevan R. Generated with <a href="http://www.methods.co.nz/asciidoc/">asciidoc</a>.
|
||||
Last updated 08-Sep-2008.
|
||||
Last updated 2009-10-28.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue