[pypy-svn] r49899 - pypy/dist/pypy/translator/llvm

arigo at codespeak.net arigo at codespeak.net
Tue Dec 18 19:57:16 CET 2007


Author: arigo
Date: Tue Dec 18 19:57:15 2007
New Revision: 49899

Modified:
   pypy/dist/pypy/translator/llvm/database.py
   pypy/dist/pypy/translator/llvm/funcnode.py
   pypy/dist/pypy/translator/llvm/gc.py
   pypy/dist/pypy/translator/llvm/genllvm.py
   pypy/dist/pypy/translator/llvm/modwrapper.py
   pypy/dist/pypy/translator/llvm/node.py
   pypy/dist/pypy/translator/llvm/opwriter.py
Log:
More progress.


Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py	(original)
+++ pypy/dist/pypy/translator/llvm/database.py	Tue Dec 18 19:57:15 2007
@@ -36,6 +36,7 @@
     def __init__(self, genllvm, translator): 
         self.genllvm = genllvm
         self.translator = translator
+        self.gctransformer = None
         self.obj2node = {}
         self._pendingsetup = []
         self._tmpcount = 1
@@ -180,7 +181,7 @@
         if value not in self.obj2node: 
             self.addpending(value, self.create_constant_node(ct, value))
         
-    def prepare_arg_value(self, const_or_var):
+    def prepare_arg(self, const_or_var):
         """if const_or_var is not already in a dictionary self.obj2node,
         the appropriate node gets constructed and gets added to
         self._pendingsetup and to self.obj2node"""
@@ -189,27 +190,22 @@
                                   const_or_var.value)
         else:
             assert isinstance(const_or_var, Variable)
+            self.prepare_type(const_or_var.concretetype)
 
 
-    def prepare_arg(self, const_or_var):
-        #log.prepare(const_or_var)
-        self.prepare_type(const_or_var.concretetype)
-        self.prepare_arg_value(const_or_var)
-
     def prepare_offset(self, offset):
         if isinstance(offset, llmemory.CompositeOffset):
             for value in offset.offsets:
                 self.prepare_offset(value)
         elif isinstance(offset, llarena.RoundedUpForAllocation):
-            print '<<<<<<<<<<<<<<<', offset.basesize
-            #import pdb; pdb.set_trace()
             self.prepare_offset(offset.basesize)
         elif hasattr(offset, 'TYPE'):
             self.prepare_type(offset.TYPE)
 
     def setup_all(self):
+        self.gcpolicy.setup()
         while self._pendingsetup: 
-            node = self._pendingsetup.pop(0)
+            node = self._pendingsetup.pop()
             #log.settingup(node)
             node.setup()
 
@@ -602,7 +598,10 @@
         if isinstance(value, llarena.RoundedUpForAllocation):
             # XXX not supported when used in a CompositeOffset
             r_basesize = self.repr_offset(value.basesize)
-            return "((%s + 7) & ~ 7)"
+            # XXX XXX XXX we hit an llvm assertion with the following
+            # expression! for now let's not align anything :-(
+            #return "and(i32 add(i32 %s, i32 7), i32 -8)" % r_basesize
+            return r_basesize
 
         from_, indices, to = self.get_offset(value, [])
 

Modified: pypy/dist/pypy/translator/llvm/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/funcnode.py	Tue Dec 18 19:57:15 2007
@@ -1,4 +1,4 @@
-from pypy.objspace.flow.model import Block, Constant, Link
+from pypy.objspace.flow.model import Block, Constant, Link, copygraph, Variable
 from pypy.objspace.flow.model import mkentrymap, c_last_exception
 from pypy.rpython.lltypesystem import lltype
 from pypy.translator.llvm.node import FuncNode
@@ -40,14 +40,45 @@
     # ______________________________________________________________________
     # main entry points from genllvm 
 
-    def post_setup_transform(self):
-        remove_double_links(self.db.translator.annotator, self.graph)
-        no_links_to_startblock(self.graph)
+    def patch_graph(self):
+        graph = self.graph
+        if self.db.gctransformer:
+            # inline the GC helpers (malloc, write_barrier) into
+            # a copy of the graph
+            graph = copygraph(graph, shallow=True)
+            self.db.gctransformer.inline_helpers(graph)
+            # the 'gc_reload_possibly_moved' operations make the graph not
+            # really SSA.  Fix them now.
+            for block in graph.iterblocks():
+                rename = {}
+                for op in list(block.operations):
+                    if rename:
+                        op.args = [rename.get(v, v) for v in op.args]
+                    if op.opname == 'gc_reload_possibly_moved':
+                        v_newaddr, v_targetvar = op.args
+                        assert isinstance(v_targetvar.concretetype, lltype.Ptr)
+                        v_newptr = Variable()
+                        v_newptr.concretetype = v_targetvar.concretetype
+                        op.opname = 'cast_adr_to_ptr'
+                        op.args = [v_newaddr]
+                        op.result = v_newptr
+                        rename[v_targetvar] = v_newptr
+                if rename:
+                    block.exitswitch = rename.get(block.exitswitch,
+                                                  block.exitswitch)
+                    for link in block.exits:
+                        link.args = [rename.get(v, v) for v in link.args]
+        # fix special cases that llvm can't handle
+        remove_double_links(self.db.translator.annotator, graph)
+        no_links_to_startblock(graph)
+        return graph
 
     def writedecl(self, codewriter): 
         codewriter.declare(self.getdecl())
 
     def writeimpl(self, codewriter):
+        self.oldgraph = self.graph
+        self.graph = self.patch_graph()
         graph = self.graph
         log.writeimpl(graph.name)
         codewriter.openfunc(self.getdecl())
@@ -69,6 +100,8 @@
             codewriter._indent('call void @abort()')
             codewriter._indent('unreachable')
         codewriter.closefunc()
+        self.graph = self.oldgraph
+        del self.oldgraph
     
     # ______________________________________________________________________
     # writing helpers for entry points

Modified: pypy/dist/pypy/translator/llvm/gc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/gc.py	(original)
+++ pypy/dist/pypy/translator/llvm/gc.py	Tue Dec 18 19:57:15 2007
@@ -11,6 +11,9 @@
     n_malloced = 0
     def __init__(self, db):
         raise Exception, 'GcPolicy should not be used directly'
+
+    def setup(self):
+        pass
     
     def genextern_code(self):
         return ''
@@ -143,9 +146,15 @@
     def __init__(self, db):
         self.db = db
 
+    def setup(self):
+        c_fnptr = self.db.gctransformer.frameworkgc_setup_ptr
+        self.db.prepare_arg(c_fnptr)
+
     def genextern_code(self):
-        r  = ''
-        r += '#define __GC_STARTUP_CODE__\n'
+        fnptr = self.db.gctransformer.frameworkgc_setup_ptr.value
+        fnnode = self.db.obj2node[fnptr._obj]
+        r = 'void %s(void);  /* forward declaration */\n' % (fnnode.name[1:],)
+        r += '#define __GC_STARTUP_CODE__ %s();\n' % (fnnode.name[1:],)
         r += '#define __GC_SETUP_CODE__\n'
         return r
 

Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py	Tue Dec 18 19:57:15 2007
@@ -121,6 +121,7 @@
 
         self.db = Database(self, self.translator)
         self.db.gcpolicy = GcPolicy.new(self.db, self.config)
+        self.db.gctransformer = c_db.gctransformer
 
         # get entry point
         entry_point = self.get_entry_point(func)
@@ -138,9 +139,6 @@
         self.translator.rtyper.specialize_more_blocks()
         self.db.setup_all()
         self._checkpoint('setup_all externs')
-
-        for node in self.db.getnodes():
-            node.post_setup_transform()
         
         self._print_node_stats()
 
@@ -168,7 +166,7 @@
         bk = self.translator.annotator.bookkeeper
         ptr = getfunctionptr(bk.getdesc(func).getuniquegraph())
         c = inputconst(lltype.typeOf(ptr), ptr)
-        self.db.prepare_arg_value(c)
+        self.db.prepare_arg(c)
         
         # ensure unqiue entry node name for testing
         entry_node = self.db.obj2node[c.value._obj]

Modified: pypy/dist/pypy/translator/llvm/modwrapper.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/modwrapper.py	(original)
+++ pypy/dist/pypy/translator/llvm/modwrapper.py	Tue Dec 18 19:57:15 2007
@@ -22,9 +22,10 @@
 rpyexc_fetch_type.argtypes = []
 rpyexc_fetch_type.restype = ctypes.c_void_p
 
-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
+if hasattr(_c, 'GC_get_heap_size'):
+    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 = []

Modified: pypy/dist/pypy/translator/llvm/node.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/node.py	(original)
+++ pypy/dist/pypy/translator/llvm/node.py	Tue Dec 18 19:57:15 2007
@@ -29,9 +29,6 @@
     def setup(self):
         pass
 
-    def post_setup_transform(self):
-        pass
-
     def writesetupcode(self, codewriter):
         " pre entry-point setup "
         pass

Modified: pypy/dist/pypy/translator/llvm/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/opwriter.py	(original)
+++ pypy/dist/pypy/translator/llvm/opwriter.py	Tue Dec 18 19:57:15 2007
@@ -591,5 +591,5 @@
     def debug_llinterpcall(self, opr):
         self.codewriter.call(None, "void", "@abort", [], [])
         # cheat llvm
-        self.codewriter.cast(opr.retref, opr.rettype, 'null', opr.rettype)
+        self.codewriter.cast(opr.retref, opr.rettype, 'undef', opr.rettype)
 



More information about the Pypy-commit mailing list