diff --git a/llvm/__init__.py b/llvm/__init__.py index b540270..65aa464 100644 --- a/llvm/__init__.py +++ b/llvm/__init__.py @@ -1,38 +1,9 @@ -# -# Copyright (c) 2008-10, 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 this software, 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. -# - -"""Common classes related to LLVM. - +""" +Common classes related to LLVM. """ -VERSION = '0.7' +__version__ = '0.8.2' + from weakref import WeakValueDictionary @@ -158,3 +129,12 @@ class Cacheable(ObjectCache): def forget(self): ObjectCache.forget(self) + +def test(verbosity=1): + """test(verbosity=1) -> TextTestResult + + Run self-test, and return unittest.runner.TextTestResult object. + """ + from llvm.test_llvmpy import run + + return run(verbosity=verbosity) diff --git a/llvm/test_llvmpy.py b/llvm/test_llvmpy.py new file mode 100644 index 0000000..9876f28 --- /dev/null +++ b/llvm/test_llvmpy.py @@ -0,0 +1,78 @@ +""" +LLVM tests +""" +import os +import sys +import unittest + +is_py3k = bool(sys.version_info[0] == 3) + +if is_py3k: + from io import StringIO +else: + from cStringIO import StringIO + + +from llvm import __version__ +import llvm.core as lc + + +tests = [] + +class TestOperands(unittest.TestCase): + # implement a test function + test_module = """ +define i32 @prod(i32, i32) { +entry: + %2 = mul i32 %0, %1 + ret i32 %2 +} + +define i32 @test_func(i32, i32, i32) { +entry: + %tmp1 = call i32 @prod(i32 %0, i32 %1) + %tmp2 = add i32 %tmp1, %2 + %tmp3 = add i32 %tmp2, 1 + ret i32 %tmp3 +} +""" + def test_operands(self): + m = lc.Module.from_assembly(StringIO(self.test_module)) + + test_func = m.get_function_named("test_func") + prod = m.get_function_named("prod") + + # test operands + i1 = test_func.basic_blocks[0].instructions[0] + i2 = test_func.basic_blocks[0].instructions[1] + + self.assertEqual(i1.operand_count, 3) + self.assertEqual(i2.operand_count, 2) + + self.assert_(i1.operands[-1] is prod) + self.assert_(i1.operands[0] is test_func.args[0]) + self.assert_(i1.operands[1] is test_func.args[1]) + self.assert_(i2.operands[0] is i1) + self.assert_(i2.operands[1] is test_func.args[2]) + self.assertEqual(len(i1.operands), 3) + self.assertEqual(len(i2.operands), 2) + +tests.append(TestOperands) + +# --------------------------------------------------------------------------- + +def run(verbosity=1): + print('llvmpy is installed in: ' + os.path.dirname(__file__)) + print('llvmpy version: ' + __version__) + print(sys.version) + + suite = unittest.TestSuite() + for cls in tests: + suite.addTest(unittest.makeSuite(cls)) + + runner = unittest.TextTestRunner(verbosity=verbosity) + return runner.run(suite) + + +if __name__ == '__main__': + run() diff --git a/setup.py b/setup.py index 3a21137..c38f736 100644 --- a/setup.py +++ b/setup.py @@ -4,7 +4,6 @@ import re from distutils.core import setup, Extension -LLVM_PY_VERSION = '0.8.2' llvm_config = os.environ.get('LLVM_CONFIG_PATH', 'llvm-config') # set LLVMPY_DYNLINK=1, if you want to link _core.so dynamically to libLLVM.so @@ -88,7 +87,7 @@ extra_link_args = ["-fPIC"] if sys.platform == 'darwin': std_libs.append("ffi") -ext_core = Extension( +kwds = dict(ext_modules = Extension( name='llvm._core', sources=['llvm/_core.cpp', 'llvm/wrap.cpp', 'llvm/extra.cpp'], define_macros = [('__STDC_CONSTANT_MACROS', None), @@ -98,17 +97,20 @@ ext_core = Extension( library_dirs = [libdir], libraries = std_libs + libs_core, extra_objects = objs_core, - extra_link_args = extra_link_args, -) + extra_link_args = extra_link_args)) + +# Read version from llvm/__init__.py +pat = re.compile(r'__version__\s*=\s*(\S+)', re.M) +data = open('llvm/__init__.py').read() +kwds['version'] = eval(pat.search(data).group(1)) setup( name = 'llvm-py', - version = LLVM_PY_VERSION, description = 'Python bindings for LLVM', author = 'Mahadevan R', author_email = 'mdevan@mdevan.org', url = 'http://www.llvmpy.org/', packages = ['llvm'], py_modules = ['llvm.core'], - ext_modules = [ ext_core ], + **kwds )