Patch for OpenBSD, x86_64 support (Laurence Tratt)
Added JIT tutorial ports (Sebastien Binet) Updated documentation git-svn-id: http://llvm-py.googlecode.com/svn/trunk@23 8d1e9007-1d4e-0410-b67e-1979fd6579aa
This commit is contained in:
parent
fe03572bba
commit
df4365921d
20 changed files with 501 additions and 74 deletions
|
|
@ -42,7 +42,7 @@ llvm-dev mailing list and irc.oftc.net#llvm (mdevan).</p>
|
|||
<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 25-Jun-2008.
|
||||
Last updated 05-Jul-2008.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ Improve tests.
|
|||
<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 25-Jun-2008.
|
||||
Last updated 05-Jul-2008.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -119,25 +119,32 @@ package.</p>
|
|||
<div class="sectionbody">
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>0.2.1, 18-Jun-2008:
|
||||
<pre><tt>0.3, in progress:
|
||||
|
||||
* GenericValue added. Used by ExecutionEngine.run().
|
||||
* Build cleanly on OpenBSD, x86-64/amd64 (Laurence Tratt).
|
||||
* Updated documentation.
|
||||
|
||||
|
||||
0.2.1, 18-Jun-2008:
|
||||
|
||||
* Build cleanly with LLVM 2.3 and 2.3svn.
|
||||
|
||||
|
||||
0.2, 15-Jun-2008:
|
||||
|
||||
* Independent package, need not be unpacked into llvm/bindings
|
||||
* Fixed ownership issues with Module/ModuleProvider
|
||||
* Independent package, need not be unpacked into llvm/bindings.
|
||||
* Fixed ownership issues with Module/ModuleProvider.
|
||||
* Modules, values and types can be stringified, to get their LLVM
|
||||
assembly representation
|
||||
* Modules and functions can be verified
|
||||
* MemoryBuffer and TypeHandle are available
|
||||
* ExecutionEngine, TargetData and passes are available
|
||||
* Unit tester added (but doesn't test much for now)
|
||||
* Python doc string documentation added (still incomplete)
|
||||
* Many minor style/cosmetic changes and bug fixes
|
||||
* Added documentation as on website into SVN
|
||||
* Lots of cleanup
|
||||
assembly representation.
|
||||
* Modules and functions can be verified.
|
||||
* MemoryBuffer and TypeHandle are available.
|
||||
* ExecutionEngine, TargetData and passes are available.
|
||||
* Unit tester added (but doesn't test much for now).
|
||||
* Python doc string documentation added (still incomplete).
|
||||
* Many minor style/cosmetic changes and bug fixes.
|
||||
* Added documentation as on website into SVN.
|
||||
* Lots of cleanup.
|
||||
|
||||
|
||||
0.1, 10-May-2008:
|
||||
|
|
@ -149,7 +156,7 @@ package.</p>
|
|||
<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 25-Jun-2008.
|
||||
Last updated 05-Jul-2008.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
<link rel="stylesheet" href="style/xhtml11.css" type="text/css" />
|
||||
<link rel="stylesheet" href="style/xhtml11-quirks.css" type="text/css" />
|
||||
<link rel="stylesheet" href="style/layout.css" type="text/css" />
|
||||
<title>Examples - llvm-py</title>
|
||||
<title>Examples and LLVM Tutorials - llvm-py</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="layout-banner">
|
||||
|
|
@ -29,11 +29,13 @@
|
|||
<td>
|
||||
<div id="layout-content">
|
||||
<div id="header">
|
||||
<h1>Examples</h1>
|
||||
<h1>Examples and LLVM Tutorials</h1>
|
||||
</div>
|
||||
<h2>Examples</h2>
|
||||
<div class="sectionbody">
|
||||
<h3>A Simple Function</h3>
|
||||
<p>Let's create a module containing a single function, corresponding to the
|
||||
<tt>C</tt> function:</p>
|
||||
<p>Let's create a (LLVM) module containing a single function, corresponding
|
||||
to the <tt>C</tt> function:</p>
|
||||
<div class="listingblock">
|
||||
<div class="content"><!-- Generator: GNU source-highlight 2.4
|
||||
by Lorenzo Bettini
|
||||
|
|
@ -56,7 +58,7 @@ http://www.gnu.org/software/src-highlite -->
|
|||
<span style="font-weight: bold"><span style="color: #000080">from</span></span> llvm <span style="font-weight: bold"><span style="color: #000080">import</span></span> <span style="color: #990000">*</span>
|
||||
<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 a module.</span></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="color: #000000">new</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>
|
||||
|
|
@ -156,11 +158,77 @@ retval <span style="color: #990000">=</span> ee<span style="color: #990000">.</s
|
|||
<div class="content">
|
||||
<pre><tt>returned 142</tt></pre>
|
||||
</div></div>
|
||||
<p>That was easy, right?!</p>
|
||||
</div>
|
||||
<h2>LLVM Tutorials</h2>
|
||||
<div class="sectionbody">
|
||||
<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>
|
||||
<li>
|
||||
<p>
|
||||
A First Function
|
||||
<a href="http://www.llvm.org/docs/tutorial/JITTutorial1.html">LLVM</a>
|
||||
<a href="examples/JITTutorial1.py">llvm-py</a>
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
A More Complicated Function
|
||||
<a href="http://www.llvm.org/docs/tutorial/JITTutorial2.html">LLVM</a>
|
||||
<a href="examples/JITTutorial2.py">llvm-py</a>
|
||||
</p>
|
||||
</li>
|
||||
</ol>
|
||||
<div class="title">Kaleidoscope: Implementing a Language with LLVM</div><ol>
|
||||
<li>
|
||||
<p>
|
||||
Tutorial Introduction and the Lexer (TODO)
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Implementing a Parser and AST (TODO)
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Implementing Code Generation to LLVM IR (TODO)
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Adding JIT and Optimizer Support (TODO)
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Extending the language: control flow (TODO)
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Extending the language: user-defined operators (TODO)
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Extending the language: mutable variables / SSA construction (TODO)
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>
|
||||
Conclusion and other useful LLVM tidbits (TODO)
|
||||
</p>
|
||||
</li>
|
||||
</ol>
|
||||
</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 25-Jun-2008.
|
||||
Last updated 05-Jul-2008.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
31
www/web/examples/JITTutorial1.py
Normal file
31
www/web/examples/JITTutorial1.py
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from llvm.core import *
|
||||
|
||||
# create a module
|
||||
module = Module.new ("tut1")
|
||||
|
||||
# create a function type taking 3 32-bit integers, return a 32-bit integer
|
||||
ty_int = Type.int (32)
|
||||
func_type = Type.function (ty_int, (ty_int,)*3)
|
||||
|
||||
# create a function of that type
|
||||
mul_add = Function.new (module, func_type, "mul_add")
|
||||
mul_add.calling_convention = CC_C
|
||||
x = mul_add.args[0]; x.name = "x"
|
||||
y = mul_add.args[1]; y.name = "y"
|
||||
z = mul_add.args[2]; z.name = "z"
|
||||
|
||||
# implement the function
|
||||
|
||||
# new block
|
||||
blk = mul_add.append_basic_block ("entry")
|
||||
|
||||
# IR builder
|
||||
bldr = Builder.new (blk)
|
||||
tmp_1 = bldr.mul (x, y, "tmp_1")
|
||||
tmp_2 = bldr.add (tmp_1, z, "tmp_2")
|
||||
|
||||
bldr.ret (tmp_2)
|
||||
|
||||
print module
|
||||
50
www/web/examples/JITTutorial2.py
Normal file
50
www/web/examples/JITTutorial2.py
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
from llvm.core import *
|
||||
|
||||
# create a module
|
||||
module = Module.new ("tut2")
|
||||
|
||||
# create a function type taking 2 integers, return a 32-bit integer
|
||||
ty_int = Type.int (32)
|
||||
func_type = Type.function (ty_int, (ty_int, ty_int))
|
||||
|
||||
# create a function of that type
|
||||
gcd = Function.new (module, func_type, "gcd")
|
||||
|
||||
# name function args
|
||||
x = gcd.args[0]; x.name = "x"
|
||||
y = gcd.args[1]; y.name = "y"
|
||||
|
||||
# implement the function
|
||||
|
||||
# blocks...
|
||||
entry = gcd.append_basic_block ("entry")
|
||||
ret = gcd.append_basic_block ("return")
|
||||
cond_false = gcd.append_basic_block ("cond_false")
|
||||
cond_true = gcd.append_basic_block ("cond_true")
|
||||
cond_false_2 = gcd.append_basic_block ("cond_false_2")
|
||||
|
||||
# create a llvm::IRBuilder
|
||||
bldr = Builder.new (entry)
|
||||
x_eq_y = bldr.icmp (IPRED_EQ, x, y, "tmp")
|
||||
bldr.cbranch (x_eq_y, ret, cond_false)
|
||||
|
||||
bldr.position_at_end (ret)
|
||||
bldr.ret(x)
|
||||
|
||||
bldr.position_at_end (cond_false)
|
||||
x_lt_y = bldr.icmp (IPRED_ULT, x, y, "tmp")
|
||||
bldr.cbranch (x_lt_y, cond_true, cond_false_2)
|
||||
|
||||
bldr.position_at_end (cond_true)
|
||||
y_sub_x = bldr.sub (y, x, "tmp")
|
||||
recur_1 = bldr.call (gcd, (x, y_sub_x,), "tmp")
|
||||
bldr.ret (recur_1)
|
||||
|
||||
bldr.position_at_end (cond_false_2)
|
||||
x_sub_y = bldr.sub (x, y, "x_sub_y")
|
||||
recur_2 = bldr.call (gcd, (x_sub_y, y,), "tmp")
|
||||
bldr.ret (recur_2)
|
||||
|
||||
print module
|
||||
|
|
@ -35,13 +35,17 @@
|
|||
<div class="sectionbody">
|
||||
<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. Currently, llvm-py is
|
||||
available for LLVM 2.3 and Python 2.5, on Linux/x86. It is expected to
|
||||
be usable on various unices, as well as with Python 2.4, with minimal
|
||||
changes, if any.</p>
|
||||
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>
|
||||
<p>llvm-py is just hatching. It should be stable enough to start hacking
|
||||
away, though. Be sure to send in a patch (or shout at the author) if you
|
||||
miss any specific LLVM API.</p>
|
||||
<p><em>Availability</em>: llvm-py is available (as a source package) for LLVM 2.3
|
||||
and Python 2.5. It builds on Linux, OpenBSD on i386 and x86-64/amd64.
|
||||
It is expected to be usable on various unices, as well as with Python
|
||||
2.4 and LLVM 2.3+svn, with minimal changes, if any.</p>
|
||||
</div>
|
||||
</div>
|
||||
<h2>News</h2>
|
||||
|
|
@ -76,7 +80,7 @@ miss any specific LLVM API.</p>
|
|||
<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 25-Jun-2008.
|
||||
Last updated 05-Jul-2008.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -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 25-Jun-2008.
|
||||
Last updated 05-Jul-2008.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -49,9 +49,8 @@ window.onload = function(){generateToc(2)}
|
|||
<img src="./images/icons/note.png" alt="Note" />
|
||||
</td>
|
||||
<td class="content">
|
||||
<p>This document is updated frequently (last updated on 25-Jun-2008).
|
||||
<p>This document is updated frequently (last updated on 05-Jul-2008).
|
||||
Check back often.</p>
|
||||
<p>You might wish to look over the <a href="#examples">examples</a> first.</p>
|
||||
</td>
|
||||
</tr></table>
|
||||
</div>
|
||||
|
|
@ -2390,7 +2389,83 @@ cellspacing="0" cellpadding="4">
|
|||
methods.</p>
|
||||
</div></div>
|
||||
<h3>TypeHandle (llvm.core)</h3>
|
||||
<p>TODO</p>
|
||||
<p>TypeHandle objects are used to create recursive types, like this linked
|
||||
list node structure in C:</p>
|
||||
<div class="listingblock">
|
||||
<div class="content"><!-- Generator: GNU source-highlight 2.4
|
||||
by Lorenzo Bettini
|
||||
http://www.lorenzobettini.it
|
||||
http://www.gnu.org/software/src-highlite -->
|
||||
<pre><tt><span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> node
|
||||
<span style="color: #FF0000">{</span>
|
||||
<span style="color: #009900">int</span> data<span style="color: #990000">;</span>
|
||||
<span style="font-weight: bold"><span style="color: #0000FF">struct</span></span> node <span style="color: #990000">*</span>next<span style="color: #990000">;</span>
|
||||
<span style="color: #FF0000">}</span><span style="color: #990000">;</span>
|
||||
</tt></pre></div></div>
|
||||
<p>This can be realized in llvm-py like this:</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>#!/usr/bin/env python
|
||||
|
||||
from llvm.core import *
|
||||
|
||||
# create a type handle object
|
||||
th = TypeHandle.new(Type.opaque())
|
||||
|
||||
# create the struct with an opaque* instead of self*
|
||||
ts = Type.struct([ Type.int(), Type.pointer(th.type) ])
|
||||
|
||||
# unify the types
|
||||
th.type.refine(ts)
|
||||
|
||||
# create a module, and add a "typedef"
|
||||
m = Module.new('mod1')
|
||||
m.add_type_name("struct.node", th.type)
|
||||
|
||||
# show what we created
|
||||
print m</tt></pre>
|
||||
</div></div>
|
||||
<p>which gives the output:</p>
|
||||
<div class="listingblock">
|
||||
<div class="content">
|
||||
<pre><tt>; ModuleID = 'mod1'
|
||||
%struct.node = type { i32, %struct.node* }</tt></pre>
|
||||
</div></div>
|
||||
<p>For more details on what is going on here, please refer the LLVM
|
||||
Programmer's Manual section
|
||||
<a href="http://llvm.org/docs/ProgrammersManual.html#TypeResolve">"LLVM Type
|
||||
Resolution"</a>. The TypeHandle class of llvm-py corresponds to
|
||||
<a href="http://www.llvm.org/doxygen/classllvm_1_1PATypeHolder.html"><tt>llvm::PATypeHolder</tt></a>
|
||||
in C++. The above example is available as
|
||||
<a href="http://code.google.com/p/llvm-py/source/browse/trunk/test/typehandle.py">test/typehandle.py</a>
|
||||
in the source distribution.</p>
|
||||
<div class="exampleblock">
|
||||
<div class="title">llvm.core.TypeHandle</div>
|
||||
<div class="exampleblock-content">
|
||||
<div class="title">Static Constructors</div><dl>
|
||||
<dt>
|
||||
<tt>new(abstract_ty)</tt>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
create a new <tt>TypeHandle</tt> instance, which holds a reference to the
|
||||
given abstract type <tt>abstract_ty</tt>. Typically, the abstract type used
|
||||
is <tt>Type.opaque()</tt>.
|
||||
</p>
|
||||
</dd>
|
||||
</dl>
|
||||
<div class="title">Properties</div><dl>
|
||||
<dt>
|
||||
<tt>type</tt>
|
||||
</dt>
|
||||
<dd>
|
||||
<p>
|
||||
returns the contained type. Typically the <tt>refine</tt> method is called
|
||||
on the returned type.
|
||||
</p>
|
||||
</dd>
|
||||
</dl>
|
||||
</div></div>
|
||||
<h3>Instructions (llvm.core)</h3>
|
||||
<p>TODO</p>
|
||||
<h3>Basic Block (llvm.core)</h3>
|
||||
|
|
@ -2409,8 +2484,8 @@ methods.</p>
|
|||
<h2><a id="examples"></a>Annotated Examples</h2>
|
||||
<div class="sectionbody">
|
||||
<h3>A Simple Function</h3>
|
||||
<p>Let's create a module containing a single function, corresponding to the
|
||||
<tt>C</tt> function:</p>
|
||||
<p>Let's create a (LLVM) module containing a single function, corresponding
|
||||
to the <tt>C</tt> function:</p>
|
||||
<div class="listingblock">
|
||||
<div class="content"><!-- Generator: GNU source-highlight 2.4
|
||||
by Lorenzo Bettini
|
||||
|
|
@ -2433,7 +2508,7 @@ http://www.gnu.org/software/src-highlite -->
|
|||
<span style="font-weight: bold"><span style="color: #000080">from</span></span> llvm <span style="font-weight: bold"><span style="color: #000080">import</span></span> <span style="color: #990000">*</span>
|
||||
<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 a module.</span></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="color: #000000">new</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>
|
||||
|
|
@ -2533,22 +2608,21 @@ retval <span style="color: #990000">=</span> ee<span style="color: #990000">.</s
|
|||
<div class="content">
|
||||
<pre><tt>returned 142</tt></pre>
|
||||
</div></div>
|
||||
<p>That was easy, right?!</p>
|
||||
</div>
|
||||
<h2>About the llvm-py Project</h2>
|
||||
<div class="sectionbody">
|
||||
<p>llvm-py lives at
|
||||
<a href="http://mdevan.nfshost.com/llvm-py/">http://mdevan.nfshost.com/llvm-py/</a>.
|
||||
The code (subversion repository) and the issue tracker are hosted on google
|
||||
code, at
|
||||
The code (subversion repository) and the issue tracker are hosted on the
|
||||
Google code hosting service, at
|
||||
<a href="http://code.google.com/p/llvm-py/">http://code.google.com/p/llvm-py/</a>.
|
||||
llvm-py is distributed under the new BSD license, the full license
|
||||
text is in the file named
|
||||
It is distributed under the new BSD license, the full license text is in
|
||||
the file named
|
||||
<a href="http://code.google.com/p/llvm-py/source/browse/trunk/LICENSE">LICENSE</a>
|
||||
available in the source distribution.</p>
|
||||
<p>The entire llvm-py website is generated from marked up text files
|
||||
using the tool <a href="http://www.methods.co.nz/asciidoc/"><em>AsciiDoc</em></a>. These text
|
||||
files and the generated HTML pages are available in the source
|
||||
files and the (pre-)generated HTML pages are available in the source
|
||||
distribution.</p>
|
||||
<p>llvm-py is an ongoing, live project. Your contributions in any form
|
||||
are most welcome. You can checkout the latest SVN HEAD from
|
||||
|
|
@ -2559,7 +2633,7 @@ reached at <em>mdevan.foobar@gmail.com</em>.</p>
|
|||
<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 25-Jun-2008.
|
||||
Last updated 05-Jul-2008.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue