From 6ee3298bd22f9cb5754719fbba3288b57b109920 Mon Sep 17 00:00:00 2001 From: "mdevan.foobar" Date: Tue, 3 Jun 2008 17:24:46 +0000 Subject: [PATCH] Added web pages, and some ee/passes stuff. *Broken*. git-svn-id: http://llvm-py.googlecode.com/svn/trunk@3 8d1e9007-1d4e-0410-b67e-1979fd6579aa --- llvm/__init__.py | 14 ++ llvm/_core.c | 26 +++ llvm/_util.py | 39 ++++ llvm/core.py | 8 +- llvm/ee.py | 51 +++++ llvm/passes.py | 78 ++++++++ llvm/wrap.h | 4 +- setup.py | 21 +- www/makeweb.py | 131 +++++++++++++ www/src/about.txt | 15 ++ www/src/contribute.txt | 16 ++ www/src/download.txt | 82 ++++++++ www/src/examples.txt | 67 +++++++ www/src/images/icons/callouts/1.png | Bin 0 -> 329 bytes www/src/images/icons/callouts/10.png | Bin 0 -> 361 bytes www/src/images/icons/callouts/11.png | Bin 0 -> 565 bytes www/src/images/icons/callouts/12.png | Bin 0 -> 617 bytes www/src/images/icons/callouts/13.png | Bin 0 -> 623 bytes www/src/images/icons/callouts/14.png | Bin 0 -> 411 bytes www/src/images/icons/callouts/15.png | Bin 0 -> 640 bytes www/src/images/icons/callouts/2.png | Bin 0 -> 353 bytes www/src/images/icons/callouts/3.png | Bin 0 -> 350 bytes www/src/images/icons/callouts/4.png | Bin 0 -> 345 bytes www/src/images/icons/callouts/5.png | Bin 0 -> 348 bytes www/src/images/icons/callouts/6.png | Bin 0 -> 355 bytes www/src/images/icons/callouts/7.png | Bin 0 -> 344 bytes www/src/images/icons/callouts/8.png | Bin 0 -> 357 bytes www/src/images/icons/callouts/9.png | Bin 0 -> 357 bytes www/src/images/icons/caution.png | Bin 0 -> 2554 bytes www/src/images/icons/example.png | Bin 0 -> 2354 bytes www/src/images/icons/home.png | Bin 0 -> 1340 bytes www/src/images/icons/important.png | Bin 0 -> 2657 bytes www/src/images/icons/next.png | Bin 0 -> 1302 bytes www/src/images/icons/note.png | Bin 0 -> 2730 bytes www/src/images/icons/prev.png | Bin 0 -> 1348 bytes www/src/images/icons/tip.png | Bin 0 -> 2602 bytes www/src/images/icons/up.png | Bin 0 -> 1320 bytes www/src/images/icons/warning.png | Bin 0 -> 2828 bytes www/src/index.txt | 27 +++ www/src/layout.conf | 82 ++++++++ www/src/license.txt | 40 ++++ www/src/style/layout.css | 71 +++++++ www/src/style/xhtml11-manpage.css | 18 ++ www/src/style/xhtml11-quirks.css | 40 ++++ www/src/style/xhtml11.css | 276 +++++++++++++++++++++++++++ www/src/userguide.txt | 22 +++ 46 files changed, 1120 insertions(+), 8 deletions(-) create mode 100644 llvm/_util.py create mode 100644 llvm/ee.py create mode 100644 llvm/passes.py create mode 100755 www/makeweb.py create mode 100644 www/src/about.txt create mode 100644 www/src/contribute.txt create mode 100644 www/src/download.txt create mode 100644 www/src/examples.txt create mode 100644 www/src/images/icons/callouts/1.png create mode 100644 www/src/images/icons/callouts/10.png create mode 100644 www/src/images/icons/callouts/11.png create mode 100644 www/src/images/icons/callouts/12.png create mode 100644 www/src/images/icons/callouts/13.png create mode 100644 www/src/images/icons/callouts/14.png create mode 100644 www/src/images/icons/callouts/15.png create mode 100644 www/src/images/icons/callouts/2.png create mode 100644 www/src/images/icons/callouts/3.png create mode 100644 www/src/images/icons/callouts/4.png create mode 100644 www/src/images/icons/callouts/5.png create mode 100644 www/src/images/icons/callouts/6.png create mode 100644 www/src/images/icons/callouts/7.png create mode 100644 www/src/images/icons/callouts/8.png create mode 100644 www/src/images/icons/callouts/9.png create mode 100644 www/src/images/icons/caution.png create mode 100644 www/src/images/icons/example.png create mode 100644 www/src/images/icons/home.png create mode 100644 www/src/images/icons/important.png create mode 100644 www/src/images/icons/next.png create mode 100644 www/src/images/icons/note.png create mode 100644 www/src/images/icons/prev.png create mode 100644 www/src/images/icons/tip.png create mode 100644 www/src/images/icons/up.png create mode 100644 www/src/images/icons/warning.png create mode 100644 www/src/index.txt create mode 100644 www/src/layout.conf create mode 100644 www/src/license.txt create mode 100644 www/src/style/layout.css create mode 100644 www/src/style/xhtml11-manpage.css create mode 100644 www/src/style/xhtml11-quirks.css create mode 100644 www/src/style/xhtml11.css create mode 100644 www/src/userguide.txt diff --git a/llvm/__init__.py b/llvm/__init__.py index e69de29..ac0afac 100644 --- a/llvm/__init__.py +++ b/llvm/__init__.py @@ -0,0 +1,14 @@ +"""Common classes related to LLVM. + +""" + +#===----------------------------------------------------------------------=== +# Exceptions +#===----------------------------------------------------------------------=== + +class LLVMException(Exception): + + def __init__(self, msg=""): + Exception.__init__(self, msg) + + diff --git a/llvm/_core.c b/llvm/_core.c index aedcd88..c3f897a 100644 --- a/llvm/_core.c +++ b/llvm/_core.c @@ -3,6 +3,10 @@ #include "wrap.h" #include "extra.h" +/* LLVM includes */ +#include "llvm-c/Analysis.h" +#include "llvm-c/Transforms/Scalar.h" + /* libc includes */ #include /* for malloc(), free() */ @@ -600,6 +604,19 @@ _wrap_obj2obj(LLVMFinalizeFunctionPassManager, LLVMPassManagerRef, int) _wrap_obj2none(LLVMDisposePassManager, LLVMPassManagerRef) +/*===----------------------------------------------------------------------===*/ +/* Passes */ +/*===----------------------------------------------------------------------===*/ + +_wrap_obj2none(LLVMAddConstantPropagationPass, LLVMPassManagerRef) +_wrap_obj2none(LLVMAddInstructionCombiningPass, LLVMPassManagerRef) +_wrap_obj2none(LLVMAddPromoteMemoryToRegisterPass, LLVMPassManagerRef) +_wrap_obj2none(LLVMAddDemoteMemoryToRegisterPass, LLVMPassManagerRef) +_wrap_obj2none(LLVMAddReassociatePass, LLVMPassManagerRef) +_wrap_obj2none(LLVMAddGVNPass, LLVMPassManagerRef) +_wrap_obj2none(LLVMAddCFGSimplificationPass, LLVMPassManagerRef) + + /*===----------------------------------------------------------------------===*/ /* Python member method table */ /*===----------------------------------------------------------------------===*/ @@ -922,6 +939,15 @@ static PyMethodDef core_methods[] = { _method( LLVMFinalizeFunctionPassManager ) _method( LLVMDisposePassManager ) + /* Passes */ + _method( LLVMAddConstantPropagationPass ) + _method( LLVMAddInstructionCombiningPass ) + _method( LLVMAddPromoteMemoryToRegisterPass ) + _method( LLVMAddDemoteMemoryToRegisterPass ) + _method( LLVMAddReassociatePass ) + _method( LLVMAddGVNPass ) + _method( LLVMAddCFGSimplificationPass ) + { NULL } }; diff --git a/llvm/_util.py b/llvm/_util.py new file mode 100644 index 0000000..1d8704b --- /dev/null +++ b/llvm/_util.py @@ -0,0 +1,39 @@ +"""Utility functions and classes. + +Not for public use!""" + +import core + +def _check_gen(obj, type): + if not isinstance(obj, type): + msg = "argument must be an instance of llvm.core.%s (or of a class derived from it)" % type_str + raise TypeError, msg + +def check_is_type(obj): _check_gen(obj, core.Type) +def check_is_value(obj): _check_gen(obj, core.Value) +def check_is_pointer(obj): _check_gen(obj, core.Pointer) +def check_is_constant(obj): _check_gen(obj, core.Constant) +def check_is_function(obj): _check_gen(obj, core.Function) +def check_is_basic_block(obj): _check_gen(obj, core.BasicBlock) +def check_is_module_provider(obj): _check_gen(obj, core.ModuleProvider) + +def unpack_gen(objlist, check_fn): + for obj in objlist: check_fn(obj) + return [ obj.ptr for obj in objlist ] + +def unpack_types(objlist): return unpack_gen(objlist, check_is_type) +def unpack_values(objlist): return unpack_gen(objlist, check_is_value) +def unpack_constants(objlist): return unpack_gen(objlist, check_is_constant) + +def wrapiter(first, next, container, wrapper): + ptr = first(container) + while ptr: + yield wrapper(ptr) + ptr = next(ptr) + +class dummy_owner(object): + + def __init__(self, ownee): + ownee._own(self) + + diff --git a/llvm/core.py b/llvm/core.py index 149a227..ebfc722 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -4,7 +4,8 @@ The llvm.core module contains classes and constants required to build the in-memory intermediate representation (IR) data structures.""" -import _core +import llvm # top-level, for common stuff +import _core # C wrappers #===----------------------------------------------------------------------=== @@ -102,6 +103,7 @@ ATTR_READONLY = 1024 def _check_gen(obj, type, type_str): if not isinstance(obj, type): + type_str = type.__module__ + "." + type.__name__ msg = "argument must be an instance of llvm.core.%s (or of a class derived from it)" % type_str raise TypeError, msg @@ -278,7 +280,9 @@ class Module(object): _core.LLVMGetNextFunction, self.ptr, Function) def verify(self): - return _core.LLVMVerifyModule(self.ptr) + ret = _core.LLVMVerifyModule(self.ptr) + if ret != "": + raise llvm.LLVMException, ret #===----------------------------------------------------------------------=== diff --git a/llvm/ee.py b/llvm/ee.py new file mode 100644 index 0000000..918fe3a --- /dev/null +++ b/llvm/ee.py @@ -0,0 +1,51 @@ +"""Execution Engine and related classes. + +""" + +import llvm, core +from _util import * +import _core + +class ExecutionEngine(object): + + @staticmethod + def new(mp, force_interpreter=False): + check_is_module_provider(mp) + ret = _core.LLVMCreateExecutionEngine(mp.ptr, int(create_interpreter)) + if isinstance(ret, str): + raise llvm.LLVMException, str + return ExecutionEngine(ret) + + def __init__(self, ptr): + self.ptr = ptr + + def __del__(self): + _core.LLVMDisposeExecutionEngine(self.ptr) + + def run_static_constructors(self): + _core.LLVMRunStaticConstructors(self.ptr) + + def run_static_destructors(self): + _core.LLVMRunStaticDestructors(self.ptr) + + def run_function_as_main(self, fn, argv, envp): + check_is_function(fn) + _core.LLVMRunFunctionAsMain(self.ptr, fn.ptr, argv, envp) + + def run_function(self, fn, args): + check_is_function(fn) + return _core.LLVMRunFunction(self.ptr, fn.ptr, args) + + def free_machine_code_for_function(self, fn): + check_is_function(fn) + _core.LLVMFreeMachineCodeForFunction(self.ptr, fn.ptr) + + def add_module_provider(self, mp): + pass + + def remove_module_provider(self): + pass + + @property + def target_data(self): + return TargetData(_core.LLVMGetExecutionEngineTargetData(self.ptr)) diff --git a/llvm/passes.py b/llvm/passes.py new file mode 100644 index 0000000..208a788 --- /dev/null +++ b/llvm/passes.py @@ -0,0 +1,78 @@ + +from _util import * +import _core + +# passes +PASS_CONSTANT_PROPAGATION = 1 +PASS_INSTRUCTION_COMBINING = 2 +PASS_PROMOTE_MEMORY_TO_REGISTER = 3 +PASS_DEMOTE_MEMORY_TO_REGISTER = 4 +PASS_REASSOCIATE = 5 +PASS_GVN = 6 +PASS_CFG_SIMPLIFICATION = 7 + + +#===----------------------------------------------------------------------=== +# Helper functions +#===----------------------------------------------------------------------=== + +_pass_creator = { + PASS_CONSTANT_PROPAGATION : _core.LLVMAddConstantPropagationPass, + PASS_INSTRUCTION_COMBINING : _core.LLVMAddInstructionCombiningPass, + PASS_PROMOTE_MEMORY_TO_REGISTER : _core.LLVMAddPromoteMemoryToRegisterPass, + PASS_DEMOTE_MEMORY_TO_REGISTER : _core.LLVMAddDemoteMemoryToRegisterPass, + PASS_REASSOCIATE : _core.LLVMAddReassociatePass, + PASS_GVN : _core.LLVMAddGVNPass, + PASS_CFG_SIMPLIFICATION : _core.LLVMAddCFGSimplificationPass, +} + + +#===----------------------------------------------------------------------=== +# Pass manager +#===----------------------------------------------------------------------=== + +class PassManager(object): + + @staticmethod + def new(): + return PassManager(_core.LLVMCreatePassManager()) + + def __init__(self, ptr): + self.ptr = ptr + + def __del__(self): + _core.LLVMDisposePassManager(self.ptr) + + def add(self, pass_id): + assert pass_id in _pass_creator, 'Invalid pass_id ("' + str(pass_id) + '")' + cfn = _pass_creator[pass_id] # KeyError => pass_id is invalid + cfn(self.ptr) + + def run(self, module): + check_is_module(module) + return _core.LLVMRunPassManager(self.ptr, module.ptr) + + +class FunctionPassManager(PassManager): + + @staticmethod + def new(mp): + check_is_module_provider(mp) + return FunctionPassManager(_core.LLVMCreateFunctionPassManager(mp.ptr)) + + def __init__(self, ptr): + PassManager.__init__(self, ptr) + + def __del__(self): + PassManager.__del__(self) + + def initialize(self): + _core.LLVMInitializeFunctionPassManager(self.ptr) + + def run(self, fn): + _check_is_function(fn) + return _core.LLVMRunFunctionPassManager(fn.ptr) + + def finalize(self): + _core.LLVMFinalizeFunctionPassManager(self.ptr) + diff --git a/llvm/wrap.h b/llvm/wrap.h index d15bdc5..e231ef0 100644 --- a/llvm/wrap.h +++ b/llvm/wrap.h @@ -11,8 +11,8 @@ #include /* llvm includes */ -#include -#include +#include "llvm-c/Core.h" +#include "llvm-c/Analysis.h" /*===----------------------------------------------------------------------===*/ diff --git a/setup.py b/setup.py index 2706fdc..95f7d37 100644 --- a/setup.py +++ b/setup.py @@ -8,8 +8,17 @@ def _run(cmd): return os.popen(cmd).read().rstrip() -def get_libs(llvm_config, components): - return _run(llvm_config + ' --libs ' + ' '.join(components)) +def get_libs_and_objs(llvm_config, components): + parts = _run(llvm_config + ' --libs ' + ' '.join(components)).split() + libs = [] + objs = [] + for part in parts: + if part.startswith('-l'): + libs.append(part[2:]) + else: + assert part.endswith('.o') + objs.append(part[:-2]) + return (libs, objs) def get_llvm_config(): @@ -34,7 +43,9 @@ def call_setup(llvm_config): incdir = _run(llvm_config + ' --includedir') ldflags = _run(llvm_config + ' --ldflags') - libs_core = get_libs(llvm_config, ['core', 'analysis']) + libs_core, objs_core = get_libs_and_objs(llvm_config, ['core', 'analysis', 'scalaropts']) + + std_libs = [ 'pthread', 'dl', 'm' ] ext_core = Extension( 'llvm._core', @@ -43,7 +54,9 @@ def call_setup(llvm_config): ('__STDC_LIMIT_MACROS', None), ('_GNU_SOURCE', None)], include_dirs = [incdir], - extra_link_args = [ldflags + ' ' + libs_core]) + library_dirs = [ '/home/mdevan/llvm/Release/lib' ], + libraries = std_libs + libs_core, + extra_objects = objs_core) setup( name='llvm-py', diff --git a/www/makeweb.py b/www/makeweb.py new file mode 100755 index 0000000..6164edd --- /dev/null +++ b/www/makeweb.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python + +import os, sys, shutil +from stat import * +from string import Template +from optparse import OptionParser + +# files in src dir that should not be copied to web dir +SKIP_FILES = [ 'layout.conf' ] + +# asciidoc command line +ASCIIDOC = 'asciidoc --unsafe --conf-file=${srcdir}/layout.conf -a icons -o ${outfile} ${infile}' + + +def _is_older(inp, outp): + older = True + if os.path.exists(outp): + modin = os.stat(inp)[ST_MTIME] + modout = os.stat(outp)[ST_MTIME] + older = (modin > modout) + return older + + +def _rmtree_warn(fn, path, excinfo): + print "** WARNING **: error while doing %s on %s" % (fn, path) + + +def asciidoc(opts, srcdir, inp, outp): + if _is_older(inp, outp) or opts.force: + if opts.verbose: + print "asciidoc %s -> %s" % (inp, outp) + cmd = Template(ASCIIDOC).substitute(srcdir=srcdir, infile=inp, outfile=outp) + if opts.verbose >= 3: + print "asciidoc command is [%s]" % cmd + if not opts.dryrun: + os.system(cmd) + else: + if opts.verbose >= 2: + print "up to date %s -> %s" % (inp, outp) + + +def copy(opts, inp, outp): + if os.path.isdir(inp): + if os.path.exists(outp) and not os.path.isdir(outp): + print "** ERROR **: cannot copy directory ('%s') to file ('%s')" % (inp, outp) + sys.exit(1) + if not os.path.exists(outp): + if opts.verbose: + print "creating %s" % (outp) + if not opts.dryrun: + os.mkdir(outp) + for file in os.listdir(inp): + copy(opts, os.path.join(inp, file), os.path.join(outp, file)) + else: + if _is_older(inp, outp) or opts.force: + if opts.verbose: + print "copying %s -> %s" % (inp, outp) + if not opts.dryrun: + shutil.copy(inp, outp) + else: + if opts.verbose >= 2: + print "up to date %s -> %s" % (inp, outp) + + +def make(opts, indir, outdir): + # make output dir if it does not exist + if not os.path.exists(outdir): + if opts.verbose: + print "creating %s" % outdir + if not opts.dryrun: + os.mkdir(outdir) + # process all files/dirs under input directory + for elem in os.listdir(indir): + inp = os.path.join(indir, elem) + if elem.endswith('.txt'): + outp = os.path.join(outdir, elem[:-4] + '.html') + asciidoc(opts, indir, inp, outp) + elif elem not in SKIP_FILES: + outp = os.path.join(outdir, elem) + copy(opts, inp, outp) + + +def get_opts(): + usage = "usage: %prog [options] srcdir destdir" + + p = OptionParser(usage=usage) + p.add_option("-f", "--force", action="store_true", dest="force", default=False, + help="ignore timestamps and force build of all files") + p.add_option("-v", "--verbose", action="count", dest="verbose", default=0, + help="be chatty (use more v's to be more friendly)") + p.add_option("-c", "--clean-first", action="store_true", dest="clean", default=False, + help="remove outdir and everything under it before building") + p.add_option("-n", "--dry-run", action="store_true", dest="dryrun", default=False, + help="just print what will happen rather than doing it") + + (opts, args) = p.parse_args() + if len(args) != 2: + p.error("incorrect number of arguments") + srcdir, destdir = args + + if not os.path.exists(srcdir): + p.error("srcdir (%s) does not exist" % srcdir) + if not os.path.isdir(args[0]): + p.error("srcdir (%s) is not a directory" % srcdir) + if os.path.exists(destdir) and not os.path.isdir(destdir): + p.error("destdir (%s) is not a directory" % destdir) + + if opts.verbose == None: + opts.verbose = 0 + + return (opts, srcdir, destdir) + + +def main(): + opts, src, dest = get_opts() + if opts.verbose >= 3: + print ("running with options:\nsrc = [%s]\ndest = [%s]\nverbose = [%d]\n" +\ + "dry-run = [%d]\nclean-first = [%d]\nforce = [%d]") %\ + (src, dest, opts.verbose, opts.dryrun, opts.clean, opts.force) + if opts.dryrun and opts.verbose == 0: + opts.verbose = 1 + if opts.clean: + if opts.dryrun or opts.verbose: + print "removing tree %s" % dest + if not opts.dryrun: + os.rmtree(dest, True, _rmtree_warn) + make(opts, src, dest) + + +main() + diff --git a/www/src/about.txt b/www/src/about.txt new file mode 100644 index 0000000..3d073b8 --- /dev/null +++ b/www/src/about.txt @@ -0,0 +1,15 @@ +About +===== + +[NOTE] +._llvm-py_ Mission Statement +======================================================================= +Provide a simple, consistent and well-documented suite of APIs +that exposes just enough of LLVM to write a compiler/interpreter/VM +in Python. +======================================================================= + +_llvm-py_ is developed by Mahadevan R, in his spare time, without being +paid for it. He can be reached at _mdevan.foobar .at. gmail.com_, on the +llvm-dev mailing list and irc.oftc.net#llvm (mdevan). + diff --git a/www/src/contribute.txt b/www/src/contribute.txt new file mode 100644 index 0000000..93d7226 --- /dev/null +++ b/www/src/contribute.txt @@ -0,0 +1,16 @@ +Contribute +========== + +_llvm-py_ is just hatching. It needs your patches and suggestions to +grow up. Please contribute! All patches are welcome. + +The _llvm-py_ code is hosted on a google code project by the same name, +http://code.google.com/p/llvm-py/[here]. It provides the SVN repository +and a http://code.google.com/p/llvm-py/issues/list[bug tracker]. + +The latest code can be checked out from SVN like so: + +---- +$ svn checkout http://llvm-py.googlecode.com/svn/trunk/ llvm-py +---- + diff --git a/www/src/download.txt b/www/src/download.txt new file mode 100644 index 0000000..aa7c2e3 --- /dev/null +++ b/www/src/download.txt @@ -0,0 +1,82 @@ +Download and Setup +================== + +The latest release is 0.2, released xx-Jun-2008 (full link:changelog[Changelog] +below). + +Download it here: + +[frame="all",grid="all"] +````~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Release,Date,Package,Mirror +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +0.2,xx-xxx-2008,http://link1/[llvm-py-0.2.tar.bz2],http://link1/[llvm-py-0.2.tar.bz2] +0.1,xx-xxx-2008,http://link1/[llvm-py-0.1.tar.bz2],http://link1/[llvm-py-0.1.tar.bz2] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +Bleeding Edge +------------- + +The latest code can be checked out from SVN thusly: + +---- +$ svn checkout http://llvm-py.googlecode.com/svn/trunk/ llvm-py +---- + +Happy hacking, and please send in your patches. + + +Setting Up +---------- + +Follow these steps to get _llvm-py_ up and running: + +* Get and build LLVM. +* Optionally, install it. +* Get the latest release (see above) of _llvm-py_ and untar it: +---- +$ wget http://link/llvm-py-0.2.tar.bz2 +$ tar jxvf llvm-py-0.2.tar.bz2 +---- +* If you've installed LLVM, setup _llvm-py_ like this: +---- +$ cd llvm-py-0.2 +$ sudo python setup.py install +---- +* If you haven't installed LLVM, locate the executable +llvm-config+ + under your LLVM build directory (should be something like + +/home/mdevan/llvm/Release/bin/llvm-config+) and pass this to setup.py: +---- +$ cd llvm-py-0.2 +$ sudo python setup.py install --llvm-config=/path/to/llvm-config +---- + +That's it! + +NOTE: _setup.py_ is a standard Python distutils script. See the Python +documentation regarding http://docs.python.org/inst/inst.html[Installing +Python Modules] and http://docs.python.org/dist/dist.html[Distributing +Python Modules] for more information on such scripts. + +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 +---- + +You'll need to be root to do this. Paths are for debian-based systems, +in other distros it might be different. + + +[[changelog]] +Changelog +---------- + +---- +include::changelog[] +---- diff --git a/www/src/examples.txt b/www/src/examples.txt new file mode 100644 index 0000000..b95013d --- /dev/null +++ b/www/src/examples.txt @@ -0,0 +1,67 @@ +Examples +======== + +Here's an example: + +[python] +source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#!/usr/bin/env python + +from llvm.core import * + +## create a module +module = Module.new("my_module") + +## create a function type taking two doubles and returning a (32-bit) integer +ty_double = Type.double() +ty_int = Type.int() +ty_func = Type.function( ty_int, [ ty_double, ty_double ] ) + +## create a function of this type +func = Function.new( module, ty_func, "foobar" ) + +# name function args +func.args[0].name = "arg1" +func.args[1].name = "arg2" + +## implement the function + +# add a basic block +entry = func.append_basic_block("entry") + +# create an llvm::IRBuilder +builder = Builder.new() +builder.position_at_end(entry) + +# add two args into temp1 +temp1 = builder.add(func.args[0], func.args[1], "temp1") + +# sub `1' from that +one = Constant.real( ty_double, 1.0 ) +temp2 = builder.sub(temp1, one, "temp2") + +# convert to integer +temp3 = builder.fptoui(temp2, ty_int, "temp3") + +# return it +builder.ret(temp3) + +# dump the module to see the bc +module.dump() +source~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +which gives this output: + +----------------------------------------------------------------------- +; ModuleID = 'my_module' + +define i32 @foobar(double %arg1, double %arg2) { +entry: + %temp1 = add double %arg1, %arg2 ; [#uses=1] + %temp2 = sub double %temp1, 1.000000e+00 ; [#uses=1] + %temp3 = fptoui double %temp2 to i32 ; [#uses=1] + ret i32 %temp3 +} +----------------------------------------------------------------------- + + diff --git a/www/src/images/icons/callouts/1.png b/www/src/images/icons/callouts/1.png new file mode 100644 index 0000000000000000000000000000000000000000..7d473430b7bec514f7de12f5769fe7c5859e8c5d GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^JRr;gBp8b2n5}^nQC}X^4DKU-G|w_t}fLBA)Suv#nrW z!^h2QnY_`l!BOq-UXEX{m2up>JTQkX)2m zTvF+fTUlI^nXH#utd~++ke^qgmzgTe~DWM4ffP81J literal 0 HcmV?d00001 diff --git a/www/src/images/icons/callouts/10.png b/www/src/images/icons/callouts/10.png new file mode 100644 index 0000000000000000000000000000000000000000..997bbc8246a316e040e0804174ba260e219d7d33 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^JRr;gBp8b2n5}^nQWtZ~+OvdJMW|Y+^UT?O-M{rKJsmzxdayJ{ zDCQA!%%@7Jj$q%-wf8e0_jRx8Dqi$}^?K=?6FriQFLv>>oc^CE+aVHhW3=nZ+fQ4!M=ZC7H>3sl|FJr3LwU zC3?yExf6FO?f@F61vV}-Juk7O6lk8Yg;}bFaZ-|HQc7Azopr01?u8M*si- literal 0 HcmV?d00001 diff --git a/www/src/images/icons/callouts/11.png b/www/src/images/icons/callouts/11.png new file mode 100644 index 0000000000000000000000000000000000000000..ce47dac3f52ac49017749a3fea53db57d006993c GIT binary patch literal 565 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZI14-?iy0V%N{XE z)7O>#600DeuDZ?5tOl@ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#JBmT^vIy=9KoYUDZ+`aP)jU z&ny=ErrK^#Gw!AcR}pdfMERuV^@&0$@(#^6b8c@rn^6RWX3pUb z4*6@PZ+H0#u=rjsXzS?6n6*sBGbHqGTU%mCsH?n#%j;eD^2}qe=iX*J@VQ3BRpz+u z{PX#N(^9X${`$90+;!pWs>o@z_n8G)7Uo7PJz`jrS+)QE@=PWHmc~UIw=WmUe73o7 z>^bR(M752aYoNg~ozu7U7&{(U>{s!;bn#f?ItjL^o`e{*EOQHqO;ccnz9hLK5@2cAyw@AaPFL~Cp#02|E|4xeQteNtB7waMs QVCXP-y85}Sb4q9e0GRUFb^rhX literal 0 HcmV?d00001 diff --git a/www/src/images/icons/callouts/12.png b/www/src/images/icons/callouts/12.png new file mode 100644 index 0000000000000000000000000000000000000000..31daf4e2f25b6712499ee32de9c2e3b050b691ca GIT binary patch literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1SD^YpWXnZI14-?iy0V%N{XE z)7O>#600De9$%>2LVd81Yeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#JBmT^vIy=Cn>wTzx1(qV@bS z0hYvspf(--lM>otrqbK$7p{3DzJ|+KN8%5ows)AI?zWk_n>jwEHXrTJecpEW_0xL= z?}N`*R`T~d2{AN${y8T#GEn4hUb&52^}Op@TW4{oc)A6)%$5=G}h# z?O{QLj@aRcAIf&y&OiUN=H2gq=_}V|pWfuReDV|{jwXw~>#w)I|9${XE z)7O>#600Dep5bGK9wD%hYeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#JBmT^vIy=Cn>w>~AWNX^a2R zbkveVY|45D7UnZ&JtjPwvdCCscZp0EA*0()#GOw)UH4-^&)y^E*4%UC)*|J}q_Ss;tN`nd8$>x9$_Xb^O2EpX&@C ZI46EzbLxq-voTO7gQu&X%Q~loCIF_C`w;*D literal 0 HcmV?d00001 diff --git a/www/src/images/icons/callouts/14.png b/www/src/images/icons/callouts/14.png new file mode 100644 index 0000000000000000000000000000000000000000..64014b75fe2e84d45ed861974c72462727979360 GIT binary patch literal 411 zcmV;M0c8G(P)!ax*-PXaQ9e~6^e1gu=a6a&KSz}bR`+prYG9ayB$BDjWGfIE;t#wl!+ zR3S(jA%y#i_@eOOedXoc%RQe%L;wH~k+s%ZI~)!<=dD%?4MaplaU9QPGski2q3`>r z(}{j@0a$CLl+)={2vLWml*i-oa5#J}DW$gCZB~Z!(!M#)2St|1_V^0qpmCrBof=Y&NUas@LmfSw=)4B4f;8Fu)(eFsv24 zJzXxBrayquXcR?J{XE z)7O>#600De0j~t#c`vY#Yeb1-X-P(Y5yQ%LXFPyHJS9LOm(=3qqRfJl%=|nCVNOM5 zpg0#u+&RCXvM4h>ql94%{~0TwC?8m~C^ZqJRG}m@H-L1 z5L@scq?{XUcxG{OP9jig5ySQaTl#^*93bKF#G<^+ymW>G($Cs~V(bw8rA5i93}62@ zzlJGu&d<$F%`0K}c4pdspcorSSx9C{PAbEScbC)|7#JBmT^vIy=9Eq_Jl&Ka(%QdX zh{H8O%#_7)Tc@t$mM`p4(Ne7omR*~(>gd8_8AZH{=3ms$Fmzm^yL@_+(#aQQ5>7QW z>3g2fIsH(ugM)!V$x4Rr_+!J_XU%4xbz0aE;^N{m@42Z|@0S@TQ=WbP`TMV5Ok;<| z^Ihv+@6tQ{sciRF9dD7Nr=KobwJJ68zJK$<1Pd9rz%4O)*;}Jzj&~nTGMecz>B%lV zK|`fmIc8mp-h8iSXiGFW=C(L+XH4DRxZQX87^-dLuD>odo6YLT@Sw)dfBEIG)v2@6 zR)%mL7GRj1x-&v&+2q@A%a&h0`Lw7|#(w_!tgT!PoJ|+re`lxaY7e*=hH)_rZeB4|imU1$R#1`!P>&$poQl;nzm}mD5ZFopaX|GsS%q*{P~< z;WtmO%lhToBL0i}yfkaOt?EN=nkLNGuU`ywhI5H)L`iUdT1k0gQ7VIjhO(w-Zen_> zZ(@38a<+nro{^q~f~BRtfrY+-p+a&|W^qZSLvCepNoKNMYO!8QX+eHoiC%Jk?!;Y+ zJAlS%fsM;d&r2*R1)67JkeZlkYGj#gX_9E3W@4U_nw*@Ln38B@k(iuhnUeN2eF0kK0(Y1u|9Rc(19XFPiEBhjaDG}zd16s2gM)^$re|(qda7?? zdS-IAf{C7yo`r&?rM`iMzJZ}aa#3b+Nu@(>WpPPnvR-PjUP@^}eqM=Qa(?c_U5Yz^ z#%Y0#%S_KpEGY$=XJL?(l#*ybuErX#^g`ttQfwn3r>K)tuC)r#2`iJ>Prt42#Ndx#Uc~1)>aw z3jE@Q4|!9Z%lVv}- zc=48cF7H)t`(Ck`^+mtha~Np7bBSw2NpOBzNqJ&XDuaWDvZiNlVtT4?VtQtBwt|VC zk)DNurKP@sg}#BILUK`NaY>~^Ze?*vX0l#tv0h4PL4IC|UUGi!#9fLzfW~Qojmu2W zODrh`nrE42VU(7fm~5G9U~HM3l#*m_WNcxOXkuzEX4g z+-vfUhb0A>b04=Im{6XiQd1v%r%>h0$G8U7E1If8OQ!N~xOYY5h0NDT$p9(iZ?Q&e z18-(+l~J8O`)kc}e&uL$eW&>P-#`~Qm$*ih1m~xflqVLYGB{``YkKA;rl!p+yCFkc(+@-h!Xq*<< zxXkpt#FA2=d1VEBsYynrsitN|Y01eJ$;p;U#>wWX2KP5v&I9V=1L+C? fTFYQ)RAFeOZJ=$?lDoSWD8u0C>gTe~DWM4f^}upZ literal 0 HcmV?d00001 diff --git a/www/src/images/icons/callouts/6.png b/www/src/images/icons/callouts/6.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba694af6c07d947d219b45a629bd32c60a0f5fe GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^JRr;gBp8b2n5}^nQ*)Bra@SU# zmiz#bR~{$s2si{S(aY|Z}Vd7tb ouUmn-_&~Y>fYve?8dVq?X&Y!8wB+ut1u%w%U~xZhnMEEs6JbBSw2NpOBzNqJ&XDuaWDvZiNlVtT4?VtQtBwt|VC zk)DNurKP@sg}#BILUK`NaY>~^Ze?*vX0l#tv0h4PL4IC|UUGi!#9fLzfW~Qojmu2W zODrh`nrCEbVQgk$XkwI@Y+{_8nv`N>YGIaQkz#0QY@Te9lBQ<)awbq0A4pdK&{_sV bqY6VKZ3AtCmfYR7Kp6&4S3j3^P6u&S`V$cAh@R~F=4@V4jxkzlaQrcFYWK{)(`o5XZnut z=nE4SU2g1ZW%;@@I$>_e3F8a=8WK~|CVXt1DqisQxtIX|`YW_n&?Nh#1gQ}d)$LrYTw(_{nVG)tp2V+#}WG*e^KRLdkoLz7g? qn(IA84Qgo42`r6v<+Hvch>@C7(8A5T-G@yGywn*$#_oy literal 0 HcmV?d00001 diff --git a/www/src/images/icons/callouts/9.png b/www/src/images/icons/callouts/9.png new file mode 100644 index 0000000000000000000000000000000000000000..a0676d26cc2ff1de12c4ecdeefb44a0d71bc6bde GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^JRr;gBp8b2n5}^nQNRqa;^5&H%t0&v*|C|wdb9$wI zR@+N9#RIowg@Uqn&z-__Tzhhz!sG|vTxA7?=O|Y?u(d4T{!RM9c7chr6d%1?R=i16 z?@Ic{f32YJFJnVhX)qGzOMplv!L->5yAlT#}irms+fsQd*FoSE84k zpF44v;trs3T43Wc)AJHbN`dAXo0u6Hr<$gkq?lM38ycjV7+5A5Sr{ayr5c%-n;95g pF*H#D>f!_G3IJNmU}#ifXryhRZP1dtyA~+J;OXk;vd$@?2>@J{cB%jX literal 0 HcmV?d00001 diff --git a/www/src/images/icons/caution.png b/www/src/images/icons/caution.png new file mode 100644 index 0000000000000000000000000000000000000000..cb9d5ea0df3fb7abe744d6ef885847c13b786d4d GIT binary patch literal 2554 zcmVPx#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU*cu7P-R9Hvtm}yW|M;eAj!AUtmOHnh%%)~HLR9PcMG?rWGpb{ZL z1dJ<)aY5WLh(<8#m>6XjB8vnG6Gtt^g$P(~C1Elw7eQq4vUp{aMG-;Va6jFLao%$q z`?iK}j1`E{ZCeEszMz2Dc}$LQtDmwn!<2S9Jt)90@E=k+Oa z-Ep}&d+X{MB2!36NH3Ur1{5D3->+XkKI>fDkEL5Fv@(KL?4xC&a?K$h_rHlud-v|` zDN_%C4j(=&(#-#SoYe3ut%#uI`{c4vdM%i00_gR)uUAYFnZm-tdc@RSAo!+l-@bgN zg%0BhXeuM+a;-L68u{uTTDpr?#cW<2GbE0HNOGO{~NT>wQ#N54+<2{I*DMky{X52ZCR zxvGDN*@+LDL)Ba8l})tpE20V7uvpg%5NH4X{arG31{4tyA=0c|I8~ux+LVXMWx=#6 zO7&Z`2$UVagsQzsp%*DwPx9B0Qor>JM~gaPg`G2X2!z#$GkLg7qqkFOWt3bI4i{@{ zDv(x&p?`=pYnNDqrcE2r zl!YiX8b5l?PjlrUA8G!oJiR_e;79K z+|M4Mk)h31Kdm;P(P~q)g{n7GZG{*7x`mCupSFbLx{*uFH(y9upn*2_QU+)~C27-B z!p4{lY%?63T3A@vb;>XzFffoWV${gNmlHQAE{1PP;Tvf44K4DaYV_ibpdm`X@mOSQ zZtd=I=Snu2=>X%W>5j-0v>~swxfE;lrQL8&gR22L%k$^YB}oDkfb^IQ z05N2YyK&>j=+U~Zalkvq{|fqy7HYLo`i(ouT@K$grMnG$SGfu^ZjKd1*>+7wobjOv7z~^NuE2o z3>x%eS5)|=pKX5HKDObU9Wupg3cjiRWulLZF7G%v;Mk9V&CSgZ9z5VodOCFogmEuk zym&~I&Xm^I3MH1T?RE}B~bDBy19v||z@MF`aO{Jx!Z~~a% zXfQo`^a#0wNTQiu1LE>v1oVWekoVrbd)3v|)22=1(Qzk>**2-}>|Bz)h-A-~F0u-r zEoFQrrOzU1GwObs80Bp)9Krjzy1J@Vs)B+7lnbKWx^?UB-Ma|>$p60M~S&>&NjQh%@%X)G-*j~qF2;=~Dj3pjiB?1c*#GBPsq^76{d%Mlaq<_Z~3 z8M-(tc%+PZsHLR^>p<_Wsi{E}h=dKu#l=Nr@^Jj1I$;VbJlTKr2s7RH5OZ_$*w|QH zy>X}GK)o;D9Q45wEij#FNG3;fIhe zZmwJ>FkwL~eTazW1XltJlffD2F%ScFgl!xTI3NiO2isv7S`Nme!NN3bBhzcp;*qH9 zyS-?0D9ofnTxNFGHnDol4XZ*4P~uPg6JoG!3#E!zuox_f?epTE+Vugg{jpLneTay- zhz>Z^E!$q0YuM`p*66M1w=;4e(;I; z#wi{%^iGLAOBow2GKohN%*P)#C9mQ3uXMuET~q4`W^j(q|JmjD7rg=h19t5(ulxW^ Q2LJ#707*qoM6N<$f-6kHbN~PV literal 0 HcmV?d00001 diff --git a/www/src/images/icons/example.png b/www/src/images/icons/example.png new file mode 100644 index 0000000000000000000000000000000000000000..bba1c0010ddbb148a93e8a442047ca6a68b5ef1f GIT binary patch literal 2354 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 M07*qoM6N<$g4<+Y4gdfE literal 0 HcmV?d00001 diff --git a/www/src/images/icons/note.png b/www/src/images/icons/note.png new file mode 100644 index 0000000000000000000000000000000000000000..841820f7c4fb274fc45fae0a0a526a68eb31d85e GIT binary patch literal 2730 zcmV;b3RU%qP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU+C`m*?R9Hvtmk#&%BZ`u?MxrG)hCW_<|J*tEp2N96{^vXA+>;sKefQlHKdAtqpHw{YlcI4A*Uvzc zI50JbxLmHUukW*C0R_07c7vw?6doSFd-;OF!@JcVyr%q}cl#@za0?Hom+6NBff?}n zk^R1^cYZ6|ym)BSv&t=tG%qcMha3)P8kv455Dbv)^PSo~Zwz@qtNitI>KB%1UizhO zn@8{O)Fe_QII{mhv&pL#6j&YcU~ zi^l>A^XAR_K07A|g5I5W`5W6_kiNMNeRCz|yNY;s3}u%WdGIBDZ`B5auaC&{P{K=PbW?4u4o4H4%%_kM&D5NjZB2RS;X9CBB7{hheSnf1cJ54ok-MV$F`#|f~tz&Tkp(@bz zUmO&twN{_5xfWQQ{b^SGuG7K44-4|iO!%-g_cJ~>ct8-T?mBDeO)?Fp5<~w9#B*Xb zPOKJ~HgDd1_wHRc9on#A15318HN}YRilQ^Kr#Vi*3#}^(sw(&k_fkMf&cV{$fa+^O z;+n92L6kxgKhm9o%g+&t3y&N!6fS{AEkv0BI>_kq^0U(ezqtEL237HRu( zWRjHbrZbWoVJ(#*0$xZ9?+a1&$p^$1JvMOD*bR^!8;<&pDYmaj+$}j~~^?kM0-7_6y_W;zaeWRAe9% z88~m0WkbT*HHDPEghHyvMI$@_VlW|#H8ZA0nD*`iEnBwijzvQ1xfXR9p(;cMvUSpQ zZFlN$SBj=PRVV$MwmV%b&CvH}p|`UM#YIJD2EQ_jG*pl4mhi$&Ub0nJN1Fr;-pb$t z25W-6bRP&Dx@+qq4LrNP!m2JQy>wjLlTmdwq@EK?3>TZ#rDa#bj|c9oE(*gG`BGu( z#dF6)kL;F;@+kCX>e;}GYjK_YoTQk;49=$kh-hU@g0*Ycx(~EzH z_k7CdsWJPCE}kg4bdpmL-Y?G1N(m&?ob-evQqkqs`mDm-h>D^F61@ouJNA(Ssi%yM z*YYB1Ldf7^hG+vUSW2b`$fn_N3&KA8*w?Bl1D%c7mz)0AK}oJz!$pQl&PE(?=&O1} zm#a#XfyRM0Cq^F*Ir>RXMmRE5M-!s|2~b;oVo1=gai9ySL0=sGK-Q55Kn8hn%&Gk@ zpw?VYVKe|;%Zq5NOta~0#f{n8LEiKL!H)CzkU8|V>fWnI|NQoeU$w4R4Oq&`g zw8o(;Hw@<6b-ahF#8un@$t6rx?l9DlNG-0eyunF^ys_#UuU(AJ{4z8n>6oA{hsGd* z+8MJ13hw7nUtix|f4@;m?j%~Bkd+uPRl)a~U0Y<+T(@ej+q5NieT`jLZP(u*(K-^X zCsAnAL>c*yWD-(XD~(HNqJzde0LatR)6KmMjyNYn4vx}Fr&;18+8C^vLT`|U3Wttk z)0SD(uv(T`G#rbDYa6M6@gfZ_EDD$a$kZ|+8j~=9LUg#UxCB1X+yqKUNJvWxxz7wc zEgh^`%wT+YpF>w^*OdbYK3rx}f}l`t(N=<04g;734uL(wM>4g!P>5TMx!ZNcJ78gS z6DT0yP1H0Iv7hgYnHOsey61mOmY*bsHiCXM8GIL%o1IU zxt+pA6e=K*Mu(vu%rI+eOsYy`r~(89xV7o(90)kXr_fgLh9RVn3%mgu*4)eBU9j8V zxpQX<-$UbvrV}Slv+8S|fWXz&ASl4CU0**2)a)8B zlb9kpCj`U9ntQ+}nz%(_?J&!nPUqBsfNAN{rS~YHam@==U*%ADS?QJ7%#>q?_P=*< z?>om1e;9r0!1cV-1CoNl_5wfzP{179^xZV8H2<#}g9b65?a8T)ueW{JF%$*!Z(CAMN?0-&-&5 z*}3D;r|-p{4k#;#Q}mR%(&(Y&-R1nc+?;daCqq8<|KP3dufLd|pFiaxgOep3fZ)u# zXwf1+Kfj!uoT{oSKA$fT2t*=Lb8|Bk+S=M6@f#W%nwpxRHZ(LeDk{p~-+#`WIdHt( zu)%9wkitGbK1Yup&CJXc3WYM6Orz1f<4f`J3!F8)oLZi0t(RA z_*>zXPzC)$z?TgyD)1lw4zN}O#(F4Jyqw_mKoxsZ-I`F8^(@$jCw?lX&Z*cU6RDktP#MR}H zlhq+#oL?sxw7*T*#_N0K!;^R6&X1hFlgZ`&eE8s)di4)Ja|MTlarpRjgN5sT7OwZ1 znM&el#YE0!-%i8S7Q?lgOtgpU@w&`b50(9;YPBkx;KCEH9mmVQ^vrMb>bbJPGnyb0 zKC3o)?sr@H{r)lLrjvYhs?N48hEXJl2-8~)*_2Tim*VkZAZD6#pO(wz(AjW%_MmbS z#~<63OCBm2w1yzGeEq);PnGi&#yzxBBs@(N3!_j7Ld!4|f=Jk!(ewhB#no_THQq5l z#kbeo(raf7A}?mr$y{ldM{F&vo^WGj$dh|>%uFRWXHaW~w0idifY=JV3o-w_lE^md zndfWa%vUZj2^`4f#&kXz(e7!Q-H6g$hPmzj#=u0lRS!6Oxl0hq|ADcv)QCC1oToiV z(IKNP%{^^ZEV@7erHd0;#UQW@0?Xdn6y>?hJ&xey*Xs|=`={X zDt>8Yl8T*^pwyj^0}87($N)R)uk?JbwQ~IH8;5pZeld8Z1z%j+04oII;ZR95auK@> z+-&vjY^;3FF2djcA-wqlY|C#r9|UmheOO$(9~=vWF&GWq!3ZR-Y1>=Y#yKwF851%bhFn^Tcx=|i_Y_;w@TcEczP#9FOEO?A8IbitvR+8qgapGL zo%PkOAKo~z-C3A-0G=)BrSI53t0XEHCtY%hh_n|Gg&~Wzkhy6OKcPt&#p#76X)h$> zZD`Ua!c`$RZ`T?1)<4;&K7J3VIRMpaRen`^y6f#@%X}ty!!3}(Aiu<&y-BPF2ysgfxD;Ok7lwd z!`7_3xs1+T8BlLWc&@^86~=+JR>=9QEtXf?XC|X_$BVl9A7HIgsl=P$YPBkd%BegzoguJ`Sw#ZI@`Y=1HyUpR3GTB}ql;R7$o zkt0VmkUq~}{}}1a^A@v5YgNeljt|fo#6ug~n#=HVGG6&~xBl!jumUt6dO_}iE5NJ8 zGx@eE7ID0yf~>-7CDBOR-f~`U+#Yk*8bAjaR4NsFFXMY?uTl@~Xu}==0000Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBU*s7XXYR9HvtSZz>KR~qh47x<|&`pbXLv@*jeqHDWVBFZ<3K;%0K z`ThVBAR&YhLPEkf2tkog#h^~tS-P`M*;%c%0@~HK4(zsy*0Qd%b&=Vn77HRe3SHNI zZVp_+B@#e)#vgmf$y_hzp7Y%2ectDN&-ulR7cbs=qb>k?qpr8!C^S^K{tw6t1FK}{ zKd$Tf^XLC|T|duVJl?{)%VcX=fCwv?dT3}!tJSVwzy94IR*XO^F&xM)Yctez7S^3G9yqS8 zI3hPWVkLV2?IG*dty8H~{r&x8V`Jb9?=F)q?||@eARkdM8jWBgG*OXhZ7!(o%qVH$ z<<-Szlt)NQ_6Upjq?hn3m030d4(*#X}6##B;5=^dqtK|u{BI=4VRQeNNtfa zd%U_zVmcJe<^==&(v0)O2#OG0}WeM!O5uHms!PCT7T)|*Vx#I@GXtW zGa#rK@kXS;jaXl!uRg|B*cYI2g=vq_yq%NjAHv_n;%$kLhVTk$Vq#Pk?2JlIW);xH zW>v?jYdBI9cmm(x39-Zc9v#6mAY=qI2;C&A%+N1KVW-37E}AV-@_@bRttUVJVeF^r z>6vf7{aa4i5qDw$C01P%r>TwC)N->Agr#Ww{rzv=ya_#Feyp?4wZnj6u7k}axUk`ailc;qh=^7$Mly{sxdlq6s z;II}Wa7;ji9=Kmvk`i7QCboFUZRppP+dGrAPoGUQF#Yggf(p|@ZU~y>yn_kZwZDo; z;qiF4Zry@sE+&Zy2yunq!;96nW}(4BavNcqcN+I>l9zUTbe;j|4}Ak9Ox&D05-A!@ zivCb)eq%Uazjp0fnE1VW_pla2Necjx0Woy%tCQ-L(rrd4s+zzcLI0T)zv{ssCSHXTL1|0diwM!swP{gQ`_5K zX2I~ror$^~ahh%HjKFBcmPq;L2-%i!>DFi^WjS*aW)PE>-^eo@<`p!dwtT=5rKF?` z4i2IQV?}pqF91Zc9W`8LtP>a<9>U~uVOUNSKfk`ctNZ+w{%haey*K*P#3aOoMreF; zN@QwY93~J0D12kHz}TFoKNy;<2@DKG)Zj^s{AU7!^3g@0ZgbU@#Dc>XS#VIa@*g9k z9@`0EQdrxW+|XzWThdLf>86&j)EvkZ#(VefU99LXqXmGFgy^u~&JYmlwtJ-{7EBcc zRmBI1y6^4`(}0Hm`D4?Gk8ce99Z!0%-XPgTDMo(?VVdX0g+^G^CNj5&rDXf~_*}Yl z>CT-ys3cgIo{b3zjURl%-0&L|CaN~M>NZ^v=-TxA^IwgPPhR+P(A041eQu6WSMBPV zo~z59?)s&|RM3PlrMsaKncKorv$0BFUmtXh6}!5GbZrQBj-N+%73TA}nkUPs;&AJv}`%Ale>1Fa!@-DP*4e=)~?Uyi79NM!$fg2hemF5#>&kh`;}ZS z*L#)`AHtp?U`MFJ(&|w(?$uxq-(;#eMkh$a$xoQXxI}|6$*djnl4A;+Q*3UH;%her z1>0;k?>ay(F{;wz8D%H<`Hq-${d?g_xO#hgm)j4KjuE+rjt={&1Xb}%E2YbV(Xh_U89&}t z+MOh~DPn9+8jaZ0#7@^o3$z`Qq%NB;Pm61lsTIjJ zIyNyq^K;MDoAYSq!US$8G{XFS;sUs{!{NAm`SJ>SYN7^`|JWN~cjx2l7q7G~$AanH z1~Ei58RaJhh6c7!4>WK4_+jIKV6Ax90YD_(5IFQJ*xiArD1k0nTfejg6Q`lWB)1+- zR+j?}G7H=Q&4mjWu3fvfntd4w9QM5E4G?VX?y#TQ5w@Qrx1{DZ5DWI4+aRX&IMO>c zrwXEpl^EX-Plj#~DR2WctK7Mgz|olSP2d^(DP-)gWB4&*BR8WoO;?Y)Ewvm0F|v{l zNpV}cu`wmLCSGYlHtmxXgv3+hkyB7Hbb}dQX>ae239*BophWDau!F&#;oYsltaw=@ zPm3~1{qk|6V~Y$i!u-&r4FB!B;l*%2_zj3bPT}3xaQZ=GBIiTMI}i^4fTv;4fG!<< zF*;G`15Dr-1qU@8RTFgzl>x;ZBQgGUo(~aB^a&cMf@fksg)hdQ0iTYFjfK(KfC>EK z9#4P+f5jM#eElbAbY-B=7*ShL?@$+^33Tb`i?KGjaE~W={=YqAq%qM)!3ZMy0{Rpd zeKEP{Q&{|!oWhbLVtNLzH{Q<}Jx=ikol|@L#8(`!N`_u>)g@m4FBL7XS}!q~Jpcdz M07*qoM6N<$f^MzYD*ylh literal 0 HcmV?d00001 diff --git a/www/src/images/icons/up.png b/www/src/images/icons/up.png new file mode 100644 index 0000000000000000000000000000000000000000..2db1ce62fa575fd990108b15b0de18a64cae19ca GIT binary patch literal 1320 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 eo-;8G{`xB0N0000 + + + + + + + + + +{doctitle} - llvm-py + + +
+
llvm-py
+
Python Bindings for LLVM
+
+ + + + + +
+ + + + + + + + + + +
+ + +[footer] + +
+
+ + diff --git a/www/src/license.txt b/www/src/license.txt new file mode 100644 index 0000000..531cee2 --- /dev/null +++ b/www/src/license.txt @@ -0,0 +1,40 @@ +License +======= + +_llvm-py_ is distributed under the +http://www.opensource.org/licenses/bsd-license.php[new BSD license]. +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. + +The license text is present in the +http://code.google.com/p/llvm-py/source/browse/trunk/LICENSE[LICENSE] +file in the distribution, and is reproduced here: + +---- +Copyright (c) 2008, Mahadevan R All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of the Mahadevan R, llvm-py nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +---- diff --git a/www/src/style/layout.css b/www/src/style/layout.css new file mode 100644 index 0000000..5d60b2d --- /dev/null +++ b/www/src/style/layout.css @@ -0,0 +1,71 @@ + +body { + background-color: white; + margin: 1%; +} + +h1 { + margin-top: 0.5em; +} + +#layout-banner { + background-color: #73a0c5; + color: white; + font-family: sans-serif; + text-align: left; + padding: 0.8em 20px; +} + +#layout-title { + font-family: monospace; + font-size: 3.5em; + font-weight: bold; + letter-spacing: 0.2em; + margin: 0; +} + +#layout-description { + font-size: 1.2em; + letter-spacing: 0.1em; +} + +#layout-menu { + background-color: #f4f4f4; + border-right: 3px solid #eeeeee; + padding-top: 0.8em; + padding-left: 20px; + padding-right: 0.8em; + font-size: 1.1em; + font-family: sans-serif; + font-weight: bold; +} +#layout-menu a { + line-height: 2em; + margin-left: 0.5em; +} +#layout-menu a:link, #layout-menu a:visited, #layout-menu a:hover { + color: #527bbd; + text-decoration: none; +} +#layout-menu a:hover { + color: navy; + text-decoration: none; +} +#layout-menu #page-source { + border-top: 2px solid silver; + margin-top: 0.2em; +} + +#layout-content { + margin-left: 1.0em; +} + +.para { + line-height: 1.5em; + margin-top: 1.2em; +} + +@media print { + #layout-banner { display: none; } + #layout-menu { display: none; } +} diff --git a/www/src/style/xhtml11-manpage.css b/www/src/style/xhtml11-manpage.css new file mode 100644 index 0000000..3ea378a --- /dev/null +++ b/www/src/style/xhtml11-manpage.css @@ -0,0 +1,18 @@ +/* Overrides for manpage documents */ +h1 { + padding-top: 0.5em; + padding-bottom: 0.5em; + border-top: 2px solid silver; + border-bottom: 2px solid silver; +} +h2 { + border-style: none; +} +div.sectionbody { + margin-left: 5%; +} + +@media print { + div#toc { display: none; } +} + diff --git a/www/src/style/xhtml11-quirks.css b/www/src/style/xhtml11-quirks.css new file mode 100644 index 0000000..dbb7775 --- /dev/null +++ b/www/src/style/xhtml11-quirks.css @@ -0,0 +1,40 @@ +/* Workarounds for IE6's broken and incomplete CSS2. */ + +div.sidebar-content { + background: #ffffee; + border: 1px solid silver; + padding: 0.5em; +} +div.sidebar-title, div.image-title { + color: #527bbd; + font-family: sans-serif; + font-weight: bold; + margin-top: 0.0em; + margin-bottom: 0.5em; +} + +div.listingblock div.content { + border: 1px solid silver; + background: #f4f4f4; + padding: 0.5em; +} + +div.quoteblock-content { + padding-left: 2.0em; +} + +div.exampleblock-content { + border-left: 2px solid silver; + padding-left: 0.5em; +} + +/* IE6 sets dynamically generated links as visited. */ +div#toc a:visited { color: blue; } + +/* Because IE6 child selector is broken. */ +div.olist2 ol { + list-style-type: lower-alpha; +} +div.olist2 div.olist ol { + list-style-type: decimal; +} diff --git a/www/src/style/xhtml11.css b/www/src/style/xhtml11.css new file mode 100644 index 0000000..fd931dd --- /dev/null +++ b/www/src/style/xhtml11.css @@ -0,0 +1,276 @@ +/* Debug borders */ +p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 { +/* + border: 1px solid red; +*/ +} + +body { + margin: 1em 5% 1em 5%; +} + +a { + color: blue; + text-decoration: underline; +} +a:visited { + color: fuchsia; +} + +em { + font-style: italic; + color: navy; +} + +strong { + font-weight: bold; + color: #083194; +} + +tt { + color: navy; +} + +h1, h2, h3, h4, h5, h6 { + color: #527bbd; + font-family: sans-serif; + margin-top: 1.2em; + margin-bottom: 0.5em; + line-height: 1.3; +} + +h1, h2, h3 { + border-bottom: 2px solid silver; +} +h2 { + padding-top: 0.5em; +} +h3 { + float: left; +} +h3 + * { + clear: left; +} + +div.sectionbody { + font-family: serif; + margin-left: 0; +} + +hr { + border: 1px solid silver; +} + +p { + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +ul, ol, li > p { + margin-top: 0; +} + +pre { + padding: 0; + margin: 0; +} + +span#author { + color: #527bbd; + font-family: sans-serif; + font-weight: bold; + font-size: 1.1em; +} +span#email { +} +span#revision { + font-family: sans-serif; +} + +div#footer { + font-family: sans-serif; + font-size: small; + border-top: 2px solid silver; + padding-top: 0.5em; + margin-top: 4.0em; +} +div#footer-text { + float: left; + padding-bottom: 0.5em; +} +div#footer-badges { + float: right; + padding-bottom: 0.5em; +} + +div#preamble, +div.tableblock, div.imageblock, div.exampleblock, div.verseblock, +div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, +div.admonitionblock { + margin-right: 10%; + margin-top: 1.5em; + margin-bottom: 1.5em; +} +div.admonitionblock { + margin-top: 2.5em; + margin-bottom: 2.5em; +} + +div.content { /* Block element content. */ + padding: 0; +} + +/* Block element titles. */ +div.title, caption.title { + color: #527bbd; + font-family: sans-serif; + font-weight: bold; + text-align: left; + margin-top: 1.0em; + margin-bottom: 0.5em; +} +div.title + * { + margin-top: 0; +} + +td div.title:first-child { + margin-top: 0.0em; +} +div.content div.title:first-child { + margin-top: 0.0em; +} +div.content + div.title { + margin-top: 0.0em; +} + +div.sidebarblock > div.content { + background: #ffffee; + border: 1px solid silver; + padding: 0.5em; +} + +div.listingblock { + margin-right: 0%; +} +div.listingblock > div.content { + border: 1px solid silver; + background: #f4f4f4; + padding: 0.5em; +} + +div.quoteblock > div.content { + padding-left: 2.0em; +} + +div.attribution { + text-align: right; +} +div.verseblock + div.attribution { + text-align: left; +} + +div.admonitionblock .icon { + vertical-align: top; + font-size: 1.1em; + font-weight: bold; + text-decoration: underline; + color: #527bbd; + padding-right: 0.5em; +} +div.admonitionblock td.content { + padding-left: 0.5em; + border-left: 2px solid silver; +} + +div.exampleblock > div.content { + border-left: 2px solid silver; + padding: 0.5em; +} + +div.verseblock div.content { + white-space: pre; +} + +div.imageblock div.content { padding-left: 0; } +div.imageblock img { border: 1px solid silver; } +span.image img { border-style: none; } + +dl { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +dt { + margin-top: 0.5em; + margin-bottom: 0; + font-style: normal; +} +dd > *:first-child { + margin-top: 0.1em; +} + +ul, ol { + list-style-position: outside; +} +div.olist > ol { + list-style-type: decimal; +} +div.olist2 > ol { + list-style-type: lower-alpha; +} + +div.tableblock > table { + border: 3px solid #527bbd; +} +thead { + font-family: sans-serif; + font-weight: bold; +} +tfoot { + font-weight: bold; +} + +div.hlist { + margin-top: 0.8em; + margin-bottom: 0.8em; +} +div.hlist td { + padding-bottom: 15px; +} +td.hlist1 { + vertical-align: top; + font-style: normal; + padding-right: 0.8em; +} +td.hlist2 { + vertical-align: top; +} + +@media print { + div#footer-badges { display: none; } +} + +div#toctitle { + color: #527bbd; + font-family: sans-serif; + font-size: 1.1em; + font-weight: bold; + margin-top: 1.0em; + margin-bottom: 0.1em; +} + +div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { + margin-top: 0; + margin-bottom: 0; +} +div.toclevel2 { + margin-left: 2em; + font-size: 0.9em; +} +div.toclevel3 { + margin-left: 4em; + font-size: 0.9em; +} +div.toclevel4 { + margin-left: 6em; + font-size: 0.9em; +} diff --git a/www/src/userguide.txt b/www/src/userguide.txt new file mode 100644 index 0000000..224a402 --- /dev/null +++ b/www/src/userguide.txt @@ -0,0 +1,22 @@ +AsciiDoc User Guide +=================== +Stuart Rackham +:Author Initials: SJR + +AsciiDoc is a text document format for writing short documents, +articles, books and UNIX man pages. AsciiDoc files can be translated +to HTML and DocBook markups using the asciidoc(1) command. AsciiDoc +is highly configurable: both the AsciiDoc source file syntax and the +backend output markups (which can be almost any type of SGML/XML +markup) can be customized and extended by the user. + + +Introduction +------------ + +TIP: Sometimes incorrect highlighting is caused by preceding lines +that appear blank but contain white space characters -- setting your +editor options so that white space characters are visible is a good +idea. + +// vim: set syntax=asciidoc: