[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