[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