[pypy-svn] r46497 - in pypy/dist/pypy/translator/llvm: . module
rxe at codespeak.net
rxe at codespeak.net
Wed Sep 12 12:41:52 CEST 2007
Author: rxe
Date: Wed Sep 12 12:41:51 2007
New Revision: 46497
Removed:
pypy/dist/pypy/translator/llvm/pyxwrapper.py
Modified:
pypy/dist/pypy/translator/llvm/buildllvm.py
pypy/dist/pypy/translator/llvm/externs2ll.py
pypy/dist/pypy/translator/llvm/gc.py
pypy/dist/pypy/translator/llvm/module/genexterns.c
Log:
kill pyrex dependency
Modified: pypy/dist/pypy/translator/llvm/buildllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/buildllvm.py (original)
+++ pypy/dist/pypy/translator/llvm/buildllvm.py Wed Sep 12 12:41:51 2007
@@ -4,12 +4,66 @@
import py
from pypy.translator.llvm.log import log
-from pypy.translator.llvm.pyxwrapper import write_pyx_wrapper
from pypy.translator.tool import stdoutcapture
-from pypy.translator.tool.cbuild import make_c_from_pyxfile
import distutils.sysconfig
+def write_ctypes_module(genllvm, dllname, targetpath):
+ template = """
+import ctypes
+from os.path import join, dirname, realpath
+_c = ctypes.CDLL(join(dirname(realpath(__file__)), "%(dllname)s"))
+
+_setup = False
+
+class LLVMException(Exception):
+ pass
+
+%(name)s = _c.__entrypoint__%(name)s
+%(name)s.argtypes = %(args)s
+%(name)s.restype = %(returntype)s
+
+%(name)s_raised = _c.__entrypoint__raised_LLVMException
+%(name)s_raised.argtypes = []
+%(name)s_raised.restype = ctypes.c_int
+
+GC_get_heap_size_wrapper = _c.GC_get_heap_size
+GC_get_heap_size_wrapper.argtypes = []
+GC_get_heap_size_wrapper.restype = ctypes.c_int
+
+startup_code = _c.ctypes_RPython_StartupCode
+startup_code.argtypes = []
+startup_code.restype = ctypes.c_int
+
+def %(name)s_wrapper(*args):
+ global _setup
+ if not _setup:
+ if not startup_code():
+ raise LLVMException("Failed to startup")
+ _setup = True
+ result = %(name)s(*args)
+ if %(name)s_raised():
+ raise LLVMException("Exception raised")
+ return result
+"""
+
+ import ctypes
+ from pypy.rpython.lltypesystem import lltype
+
+ TO_CTYPES = {lltype.Bool: "ctypes.c_int",
+ lltype.Float: "ctypes.c_double",
+ lltype.Char: "ctypes.c_char",
+ lltype.Signed: "ctypes.c_int",
+ lltype.Unsigned: "ctypes.c_uint"
+ }
+ name = genllvm.entrynode.ref.strip("%")
+
+ g = genllvm.entrynode.graph
+ returntype = TO_CTYPES[g.returnblock.inputargs[0].concretetype]
+ inputargtypes = [TO_CTYPES[a.concretetype] for a in g.startblock.inputargs]
+ args = '[%s]' % ", ".join(inputargtypes)
+ targetpath.write(template % locals())
+
def llvm_is_on_path():
if py.path.local.sysfind("llvm-as") is None or \
py.path.local.sysfind("llvm-gcc") is None:
@@ -45,22 +99,22 @@
gcc_version = lambda: _exe_version2('gcc')
llvm_gcc_version = lambda: _exe_version2('llvm-gcc')
-def compile_module(module, source_files, object_files, library_files):
+# def compile_module(module, source_files, object_files, library_files):
- open("%s_setup.py" % module, "w").write(str(py.code.Source(
- '''
- from distutils.core import setup
- from distutils.extension import Extension
- setup(name="%(module)s",
- ext_modules = [Extension(
- name = "%(module)s",
- sources = %(source_files)s,
- libraries = %(library_files)s,
- extra_objects = %(object_files)s)])
- ''' % locals())))
- cmd ="python %s_setup.py build_ext --inplace --force" % module
- log.build(cmd)
- py.process.cmdexec(cmd)
+# open("%s_setup.py" % module, "w").write(str(py.code.Source(
+# '''
+# from distutils.core import setup
+# from distutils.extension import Extension
+# setup(name="%(module)s",
+# ext_modules = [Extension(
+# name = "%(module)s",
+# sources = %(source_files)s,
+# libraries = %(library_files)s,
+# extra_objects = %(object_files)s)])
+# ''' % locals())))
+# cmd ="python %s_setup.py build_ext --inplace --force" % module
+# log.build(cmd)
+# py.process.cmdexec(cmd)
class Builder(object):
@@ -131,37 +185,34 @@
library_files = self.genllvm.db.gcpolicy.gc_libraries()
gc_libs = ' '.join(['-l' + lib for lib in library_files])
- object_files = ["-L/sw/lib"]
if sys.platform == 'darwin':
libdir = '/sw/lib'
gc_libs_path = '-L%s -ldl' % libdir
else:
gc_libs_path = '-static'
- use_gcc = True #self.genllvm.config.translation.llvm_via_c
+ dllname = "%s.so" % b
+
+ use_gcc = False #self.genllvm.config.translation.llvm_via_c
if not use_gcc:
self.cmds.append("llc -relocation-model=pic %s.bc -f -o %s.s" % (b, b))
self.cmds.append("as %s.s -o %s.o" % (b, b))
- object_files.append("%s.o" % b)
+
else:
self.cmds.append("llc %s.bc -march=c -f -o %s.c" % (b, b))
self.cmds.append("gcc %s.c -c -O2" % b)
- object_files.append("%s.o" % b)
+
+ self.cmds.append("gcc -O3 %s.o %s %s -lm -bundle -o %s" % (b, gc_libs_path, gc_libs, dllname))
try:
self.execute_cmds()
- # use pyrex to create module for CPython
- basename = self.genllvm.filename.purebasename + '_wrapper.pyx'
- pyxfile = self.genllvm.filename.new(basename = basename)
- write_pyx_wrapper(self.genllvm, pyxfile)
-
- modname = pyxfile.purebasename
- source_files = ["%s.c" % modname]
-
- make_c_from_pyxfile(pyxfile)
+ # use ctypes to create module for CPython
+ basename = self.genllvm.filename.purebasename + '_wrapper.py'
+ modfilename = self.genllvm.filename.new(basename = basename)
+ write_ctypes_module(self.genllvm, dllname, modfilename)
- compile_module(modname, source_files, object_files, library_files)
+ modname = modfilename.purebasename
finally:
lastdir.chdir()
Modified: pypy/dist/pypy/translator/llvm/externs2ll.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/externs2ll.py (original)
+++ pypy/dist/pypy/translator/llvm/externs2ll.py Wed Sep 12 12:41:51 2007
@@ -48,7 +48,9 @@
cmd = "llvm-gcc %s %s %s -S %s.c -o %s.ll 2>&1" % (
include_path, includes, emit_llvm, plain, plain)
- os.system(cmd)
+ if os.system(cmd) != 0:
+ raise Exception("Failed to run '%s'")
+
llcode = open(plain + '.ll').read()
# strip lines
@@ -78,7 +80,7 @@
funcname , s = s.split('(', 1)
funcnames[funcname] = True
if line.find("internal") == -1:
- if funcname not in ["%main", "%Pyrex_RPython_StartupCode"]:
+ if funcname not in ["%main", "%ctypes_RPython_StartupCode"]:
internal = 'internal '
line = '%s%s %s' % (internal, DEFAULT_CCONV, line,)
ll_lines.append(line)
Modified: pypy/dist/pypy/translator/llvm/gc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/gc.py (original)
+++ pypy/dist/pypy/translator/llvm/gc.py Wed Sep 12 12:41:51 2007
@@ -24,9 +24,6 @@
def gc_libraries(self):
return []
- def pyrex_code(self):
- return ''
-
def get_count(self, inc=False):
if inc:
self.n_malloced = self.n_malloced + 1
@@ -113,14 +110,6 @@
def gc_libraries(self):
return ['gc', 'pthread']
- def pyrex_code(self):
- return '''
-cdef extern int GC_get_heap_size()
-
-def GC_get_heap_size_wrapper():
- return GC_get_heap_size()
-'''
-
def _zeromalloc(self, codewriter, targetvar, size=1, atomic=False,
exc_flag=False):
""" assumes malloc of word size """
Modified: pypy/dist/pypy/translator/llvm/module/genexterns.c
==============================================================================
--- pypy/dist/pypy/translator/llvm/module/genexterns.c (original)
+++ pypy/dist/pypy/translator/llvm/module/genexterns.c Wed Sep 12 12:41:51 2007
@@ -97,10 +97,10 @@
#else
-int Pyrex_RPython_StartupCode() {
+int ctypes_RPython_StartupCode() {
- char *error = RPython_StartupCode();
- if (error != NULL) {
+ char *errmsg = RPython_StartupCode();
+ if (errmsg != NULL) {
return 0;
}
More information about the Pypy-commit
mailing list