[pypy-svn] r65482 - in pypy/branch/pyjitpl5-experiments/pypy/jit/backend: . x86

antocuni at codespeak.net antocuni at codespeak.net
Thu May 28 22:28:27 CEST 2009


Author: antocuni
Date: Thu May 28 22:28:22 2009
New Revision: 65482

Added:
   pypy/branch/pyjitpl5-experiments/pypy/jit/backend/loopparser.py
      - copied unchanged from r65473, pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/loopparser.py
   pypy/branch/pyjitpl5-experiments/pypy/jit/backend/support.py   (contents, props changed)
Removed:
   pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/loopparser.py
Modified:
   pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/assembler.py
   pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/runner.py
Log:
factor the loop logger out of the x86 backend and put it in support.py, so
that it can be used by other backends as well



Added: pypy/branch/pyjitpl5-experiments/pypy/jit/backend/support.py
==============================================================================
--- (empty file)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/backend/support.py	Thu May 28 22:28:22 2009
@@ -0,0 +1,107 @@
+import os
+from pypy.rlib.objectmodel import compute_unique_id
+from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.metainterp.history import Const, ConstInt, Box, ConstPtr, BoxPtr,\
+     BoxInt, ConstAddr
+
+def repr_of_arg(memo, arg):
+    try:
+        mv = memo[arg]
+    except KeyError:
+        mv = len(memo)
+        memo[arg] = mv
+    if isinstance(arg, ConstInt):
+        return "ci(%d,%d)" % (mv, arg.value)
+    elif isinstance(arg, ConstPtr):
+        return "cp(%d,%d)" % (mv, arg.get_())
+    elif isinstance(arg, BoxInt):
+        return "bi(%d,%d)" % (mv, arg.value)
+    elif isinstance(arg, BoxPtr):
+        return "bp(%d,%d)" % (mv, arg.get_())
+    elif isinstance(arg, ConstAddr):
+        return "ca(%d,%d)" % (mv, arg.get_())
+    else:
+        #raise NotImplementedError
+        return "?%r" % (arg,)
+
+class Logger(object):
+
+    def __init__(self):
+        self._log_fd = -1
+
+    def create_log(self):
+        s = os.environ.get('PYPYJITLOG')
+        if not s:
+            return -1
+        s += '.ops'
+        try:
+            flags = os.O_WRONLY|os.O_CREAT|os.O_TRUNC
+            self._log_fd = os.open(s, flags, 0666)
+        except OSError:
+            os.write(2, "could not create log file\n")
+            return -1
+        return self._log_fd
+
+    def repr_for_descr(self, descr):
+        return ''
+
+    def eventually_log_operations(self, inputargs, operations, memo=None,
+                                  myid=0):
+        if self._log_fd == -1:
+            return
+        if memo is None:
+            memo = {}
+        if inputargs is None:
+            os.write(self._log_fd, "BEGIN(%s)\n" % myid)
+        else:
+            args = ",".join([repr_of_arg(memo, arg) for arg in inputargs])
+            os.write(self._log_fd, "LOOP %s\n" % args)
+        for i in range(len(operations)):
+            op = operations[i]
+            args = ",".join([repr_of_arg(memo, arg) for arg in op.args])
+            if op.descr is not None:
+                descr = self.repr_for_descr(op.descr)
+                os.write(self._log_fd, "%d:%s %s[%s]\n" % (i, op.getopname(),
+                                                           args, descr))
+            else:
+                os.write(self._log_fd, "%d:%s %s\n" % (i, op.getopname(), args))
+            if op.result is not None:
+                os.write(self._log_fd, "  => %s\n" % repr_of_arg(memo,
+                                                                 op.result))
+            if op.is_guard():
+                self.eventually_log_operations(None, op.suboperations, memo)
+        if operations[-1].opnum == rop.JUMP:
+            if operations[-1].jump_target is not None:
+                jump_target = compute_unique_id(operations[-1].jump_target)
+            else:
+                # XXX hack for the annotator
+                jump_target = 13
+            os.write(self._log_fd, 'JUMPTO:%s\n' % jump_target)
+        if inputargs is None:
+            os.write(self._log_fd, "END\n")
+        else:
+            os.write(self._log_fd, "LOOP END\n")
+
+    def log_failure_recovery(self, gf, guard_index):
+        if self._log_fd == -1:
+            return
+        return # XXX
+        os.write(self._log_fd, 'xxxxxxxxxx\n')
+        memo = {}
+        reprs = []
+        for j in range(len(gf.guard_op.liveboxes)):
+            valuebox = gf.cpu.getvaluebox(gf.frame, gf.guard_op, j)
+            reprs.append(repr_of_arg(memo, valuebox))
+        jmp = gf.guard_op._jmp_from
+        os.write(self._log_fd, "%d %d %s\n" % (guard_index, jmp,
+                                               ",".join(reprs)))
+        os.write(self._log_fd, 'xxxxxxxxxx\n')
+
+    def log_call(self, valueboxes):
+        if self._log_fd == -1:
+            return
+        return # XXX
+        memo = {}
+        args_s = ','.join([repr_of_arg(memo, box) for box in valueboxes])
+        os.write(self._log_fd, "CALL\n")
+        os.write(self._log_fd, "%s %s\n" % (name, args_s))

Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/assembler.py	Thu May 28 22:28:22 2009
@@ -1,8 +1,7 @@
 import sys, os
 import ctypes
 from pypy.jit.backend.x86 import symbolic
-from pypy.jit.metainterp.history import Const, ConstInt, Box, ConstPtr, BoxPtr,\
-     BoxInt, ConstAddr
+from pypy.jit.metainterp.history import Const, Box, BoxPtr
 from pypy.rpython.lltypesystem import lltype, rffi, ll2ctypes, rstr, llmemory
 from pypy.rpython.lltypesystem.rclass import OBJECT
 from pypy.rpython.lltypesystem.lloperation import llop
@@ -14,31 +13,22 @@
 from pypy.jit.backend.x86 import codebuf
 from pypy.jit.backend.x86.ri386 import *
 from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.backend.support import Logger
 
 # our calling convention - we pass three first args as edx, ecx and eax
 # and the rest stays on the stack
 
 MAX_FAIL_BOXES = 1000
 
-def repr_of_arg(memo, arg):
-    try:
-        mv = memo[arg]
-    except KeyError:
-        mv = len(memo)
-        memo[arg] = mv
-    if isinstance(arg, ConstInt):
-        return "ci(%d,%d)" % (mv, arg.value)
-    elif isinstance(arg, ConstPtr):
-        return "cp(%d,%d)" % (mv, arg.get_())
-    elif isinstance(arg, BoxInt):
-        return "bi(%d,%d)" % (mv, arg.value)
-    elif isinstance(arg, BoxPtr):
-        return "bp(%d,%d)" % (mv, arg.get_())
-    elif isinstance(arg, ConstAddr):
-        return "ca(%d,%d)" % (mv, arg.get_())
-    else:
-        #raise NotImplementedError
-        return "?%r" % (arg,)
+class x86Logger(Logger):
+
+    def repr_for_descr(self, descr):
+        from pypy.jit.backend.x86.runner import ConstDescr3
+        if isinstance(descr, ConstDescr3):
+            return (str(op.descr.v0) + "," + str(op.descr.v1) +
+                    "," + str(op.descr.flag2))
+        return Logger.repr_for_descr(descr)
+
 
 class MachineCodeBlockWrapper(object):
     MC_SIZE = 1024*1024
@@ -91,7 +81,6 @@
         self.counter -= 1
 
 class Assembler386(object):
-    log_fd = -1
     mc = None
     mc2 = None
     debug_markers = True
@@ -104,19 +93,7 @@
         self._exception_data = lltype.nullptr(rffi.CArray(lltype.Signed))
         self._exception_addr = 0
         self.mcstack = MachineCodeStack()
-
-    def _get_log(self):
-        s = os.environ.get('PYPYJITLOG')
-        if not s:
-            return -1
-        s += '.ops'
-        try:
-            flags = os.O_WRONLY|os.O_CREAT|os.O_TRUNC
-            log_fd = os.open(s, flags, 0666)
-        except OSError:
-            os.write(2, "could not create log file\n")
-            return -1
-        return log_fd
+        self.logger = Logger()
 
     def make_sure_mc_exists(self):
         if self.mc is None:
@@ -126,7 +103,7 @@
                                             MAX_FAIL_BOXES, flavor='raw')
             self.fail_box_addr = self.cpu.cast_ptr_to_int(self.fail_boxes)
 
-            self._log_fd = self._get_log()
+            self.logger.create_log()
             # we generate the loop body in 'mc'
             # 'mc2' is for guard recovery code
             if we_are_translated():
@@ -159,69 +136,6 @@
             if self.gcrootmap:
                 self.gcrootmap.initialize()
 
-    def eventually_log_operations(self, inputargs, operations, memo=None,
-                                  myid=0):
-        from pypy.jit.backend.x86.runner import ConstDescr3
-        
-        if self._log_fd == -1:
-            return
-        if memo is None:
-            memo = {}
-        if inputargs is None:
-            os.write(self._log_fd, "BEGIN(%s)\n" % myid)
-        else:
-            args = ",".join([repr_of_arg(memo, arg) for arg in inputargs])
-            os.write(self._log_fd, "LOOP %s\n" % args)
-        for i in range(len(operations)):
-            op = operations[i]
-            args = ",".join([repr_of_arg(memo, arg) for arg in op.args])
-            if op.descr is not None and isinstance(op.descr, ConstDescr3):
-                descr = (str(op.descr.v0) + "," + str(op.descr.v1) +
-                         "," + str(op.descr.flag2))
-                os.write(self._log_fd, "%d:%s %s[%s]\n" % (i, op.getopname(),
-                                                           args, descr))
-            else:
-                os.write(self._log_fd, "%d:%s %s\n" % (i, op.getopname(), args))
-            if op.result is not None:
-                os.write(self._log_fd, "  => %s\n" % repr_of_arg(memo,
-                                                                 op.result))
-            if op.is_guard():
-                self.eventually_log_operations(None, op.suboperations, memo)
-        if operations[-1].opnum == rop.JUMP:
-            if operations[-1].jump_target is not None:
-                jump_target = compute_unique_id(operations[-1].jump_target)
-            else:
-                # XXX hack for the annotator
-                jump_target = 13
-            os.write(self._log_fd, 'JUMPTO:%s\n' % jump_target)
-        if inputargs is None:
-            os.write(self._log_fd, "END\n")
-        else:
-            os.write(self._log_fd, "LOOP END\n")
-
-    def log_failure_recovery(self, gf, guard_index):
-        if self._log_fd == -1:
-            return
-        return # XXX
-        os.write(self._log_fd, 'xxxxxxxxxx\n')
-        memo = {}
-        reprs = []
-        for j in range(len(gf.guard_op.liveboxes)):
-            valuebox = gf.cpu.getvaluebox(gf.frame, gf.guard_op, j)
-            reprs.append(repr_of_arg(memo, valuebox))
-        jmp = gf.guard_op._jmp_from
-        os.write(self._log_fd, "%d %d %s\n" % (guard_index, jmp,
-                                               ",".join(reprs)))
-        os.write(self._log_fd, 'xxxxxxxxxx\n')
-
-    def log_call(self, valueboxes):
-        if self._log_fd == -1:
-            return
-        return # XXX
-        memo = {}
-        args_s = ','.join([repr_of_arg(memo, box) for box in valueboxes])
-        os.write(self._log_fd, "CALL\n")
-        os.write(self._log_fd, "%s %s\n" % (name, args_s))
 
     def _compute_longest_fail_op(self, ops):
         max_so_far = 0
@@ -244,8 +158,8 @@
         self.tree = tree
         self.make_sure_mc_exists()
         inputargs = tree.inputargs
-        self.eventually_log_operations(tree.inputargs, tree.operations, None,
-                                       compute_unique_id(tree))
+        self.logger.eventually_log_operations(tree.inputargs, tree.operations, None,
+                                              compute_unique_id(tree))
         regalloc = RegAlloc(self, tree, self.cpu.translate_support_code)
         self._regalloc = regalloc
         regalloc.walk_operations(tree)

Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/backend/x86/runner.py	Thu May 28 22:28:22 2009
@@ -168,7 +168,7 @@
 #             #    llop.debug_print(lltype.Void, '.. calling back from',
 #             #                     guard_op, 'to the jit')
 #             gf = GuardFailed(self, frame_addr, guard_op)
-#             self.assembler.log_failure_recovery(gf, guard_index)
+#             self.assembler.logger.log_failure_recovery(gf, guard_index)
 #             self.metainterp.handle_guard_failure(gf)
 #             self.return_value_type = gf.return_value_type
 #             #if self.debug:
@@ -279,7 +279,7 @@
         #    values_repr = ", ".join([str(values_as_int[i]) for i in
         #                             range(len(valueboxes))])
         #    llop.debug_print(lltype.Void, 'exec:', name, values_repr)
-        #self.assembler.log_call(valueboxes) --- XXX
+        #self.assembler.logger.log_call(valueboxes) --- XXX
         guard_index = self.execute_call(loop, func, verbose)
         self._guard_index = guard_index # for tests
         op = self._guard_list[guard_index]



More information about the Pypy-commit mailing list