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
|
|
@ -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