[pypy-svn] r47175 - in pypy/dist/pypy/translator/llvm: . test
rxe at codespeak.net
rxe at codespeak.net
Fri Oct 5 01:16:07 CEST 2007
Author: rxe
Date: Fri Oct 5 01:16:05 2007
New Revision: 47175
Modified:
pypy/dist/pypy/translator/llvm/externs2ll.py
pypy/dist/pypy/translator/llvm/extfuncnode.py
pypy/dist/pypy/translator/llvm/genllvm.py
pypy/dist/pypy/translator/llvm/node.py
pypy/dist/pypy/translator/llvm/test/test_rffi.py
Log:
some exploration into rffi - test_basic() seems to work.
Modified: pypy/dist/pypy/translator/llvm/externs2ll.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/externs2ll.py (original)
+++ pypy/dist/pypy/translator/llvm/externs2ll.py Fri Oct 5 01:16:05 2007
@@ -167,7 +167,7 @@
includestr += "-I %s " % ii
return includestr
-def generate_llfile(db, extern_decls, entrynode, standalone):
+def generate_llfile(db, extern_decls, entrynode, c_include, c_sources, standalone):
ccode = []
function_names = []
@@ -211,6 +211,10 @@
# ask gcpolicy for any code needed
ccode.append('%s\n' % db.gcpolicy.genextern_code())
+ for c_source in c_sources:
+ for l in c_source:
+ ccode.append(l)
+
# append our source file
ccode.append(open(get_module_file('genexterns.c')).read())
Modified: pypy/dist/pypy/translator/llvm/extfuncnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/extfuncnode.py (original)
+++ pypy/dist/pypy/translator/llvm/extfuncnode.py Fri Oct 5 01:16:05 2007
@@ -33,6 +33,19 @@
self.value = value
self.ref = "%" + value._name
+ def external_c_source(self):
+ # return a list of unique includes and sources in C
+ c_includes = []
+ c_sources = []
+
+ if hasattr(self.value, 'includes'):
+ c_includes = list(self.value.includes)
+
+ if hasattr(self.value, 'sources'):
+ c_sources = list(self.value.sources)
+
+ return c_includes, c_sources
+
def writeglobalconstants(self, codewriter):
pass
Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py Fri Oct 5 01:16:05 2007
@@ -175,10 +175,22 @@
return c.value._obj
def generate_ll_externs(self):
+ c_includes = {}
+ c_sources = {}
+
+ for node in self.db.getnodes():
+ includes, sources = node.external_c_source()
+ for include in includes:
+ c_includes[include] = True
+ for source in sources:
+ c_sources[source] = True
+
self.llexterns_header, self.llexterns_functions = \
generate_llfile(self.db,
self.extern_decls,
self.entrynode,
+ c_includes,
+ c_sources,
self.standalone)
def create_codewriter(self):
Modified: pypy/dist/pypy/translator/llvm/node.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/node.py (original)
+++ pypy/dist/pypy/translator/llvm/node.py Fri Oct 5 01:16:05 2007
@@ -25,6 +25,12 @@
def setup(self):
pass
+ # ______________________________________________________________________
+
+ def external_c_source(self):
+ # return a list of unique includes and sources in C
+ return [], []
+
# __________________ before "implementation" ____________________
Modified: pypy/dist/pypy/translator/llvm/test/test_rffi.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_rffi.py (original)
+++ pypy/dist/pypy/translator/llvm/test/test_rffi.py Fri Oct 5 01:16:05 2007
@@ -5,10 +5,29 @@
from pypy.tool.udir import udir
from pypy.rlib.rarithmetic import r_uint
-py.test.skip("Extfunc support in llvm needs refactoring (!!??!)")
+from pypy.rpython.lltypesystem.rffi import *
+from pypy.rpython.lltypesystem.lltype import Signed, Ptr, Char, malloc
+from pypy.rpython.lltypesystem import lltype
from pypy.translator.llvm.test.runtest import *
+def test_basic():
+ c_source = py.code.Source("""
+ int z(int x)
+ {
+ return (x + 3);
+ }
+ """)
+ z = llexternal('z', [Signed], Signed, sources=[c_source])
+
+ def f():
+ return z(8)
+
+ xf = compile_function(f, [])
+ assert xf() == 8+3
+
+#py.test.skip("Extfunc support in llvm needs refactoring (!!??!)"
+
def test_external_function_ll_os_dup():
def fn():
return os.dup(0)
More information about the Pypy-commit
mailing list