[pypy-commit] pypy new-jit-log: translation issues

plan_rich pypy.commits at gmail.com
Mon Mar 21 11:56:21 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: new-jit-log
Changeset: r83220:9bd952847a5f
Date: 2016-03-21 09:50 +0100
http://bitbucket.org/pypy/pypy/changeset/9bd952847a5f/

Log:	translation issues

diff --git a/rpython/jit/metainterp/jitlog.py b/rpython/jit/metainterp/jitlog.py
--- a/rpython/jit/metainterp/jitlog.py
+++ b/rpython/jit/metainterp/jitlog.py
@@ -1,6 +1,8 @@
 from rpython.rlib.rvmprof.rvmprof import cintf
 from rpython.jit.metainterp import resoperation as resoperations
-from struct import pack
+from rpython.jit.metainterp.history import ConstInt, ConstFloat
+import sys
+import weakref
 
 MARK_INPUT_ARGS = 0x10
 MARK_RESOP_META = 0x11
@@ -20,10 +22,34 @@
 # the machine code was patched (e.g. guard)
 MARK_ASM_PATCH = 0x19
 
+IS_32_BIT = sys.maxint == 2**31-1
+
+# why is there no rlib/rstruct/pack.py?
+def encode_le_16bit(val):
+    return chr((val >> 0) & 0xff) + chr((val >> 8) & 0xff)
+def encode_le_32bit(val):
+    return ''.join([chr((val >> 0) & 0xff),
+           chr((val >> 8) & 0xff),
+           chr((val >> 16) & 0xff),
+           chr((val >> 24) & 0xff)])
+def encode_le_addr(val):
+    if IS_32_BIT:
+        return encode_be_32bit(val)
+    else:
+        return ''.join([chr((val >> 0) & 0xff),
+                chr((val >> 8) & 0xff),
+                chr((val >> 16) & 0xff),
+                chr((val >> 24) & 0xff),
+                chr((val >> 32) & 0xff),
+                chr((val >> 40) & 0xff),
+                chr((val >> 48) & 0xff),
+                chr((val >> 56)& 0xff)])
+
 class VMProfJitLogger(object):
 
     def __init__(self):
         self.cintf = cintf.setup()
+        self.memo = {}
 
     def setup_once(self):
         self.cintf.jitlog_try_init_using_env()
@@ -32,7 +58,7 @@
         count = len(resoperations.opname)
         mark = MARK_RESOP_META
         for opnum, opname in resoperations.opname.items():
-            line = pack("<h", opnum) + opname.lower()
+            line = encode_le_16bit(opnum) + opname.lower()
             self.write_marked(mark, line)
 
     def teardown(self):
@@ -42,9 +68,10 @@
         self.cintf.jitlog_write_marked(mark, line, len(line))
 
     def encode(self, op):
-        str_args = [arg.repr_short(arg._repr_memo) for arg in op.getarglist()]
+        str_args = [self.var_to_str(arg) for arg in op.getarglist()]
         descr = op.getdescr()
-        line = pack('<i', op.getopnum()) + ','.join(str_args)
+        le_len = encode_le_32bit(op.getopnum())
+        line = le_len + ','.join(str_args)
         if descr:
             line += "|" + str(descr)
             return MARK_RESOP_DESCR, line
@@ -65,7 +92,7 @@
             self.write_marked(tag, 'bridge')
 
         # input args
-        str_args = [arg.repr_short(arg._repr_memo) for arg in args]
+        str_args = [self.var_to_str(arg) for arg in args]
         self.write_marked(MARK_INPUT_ARGS, ','.join(str_args))
 
         # assembler address (to not duplicate it in write_code_dump)
@@ -73,15 +100,18 @@
             absaddr = mc.absolute_addr()
             rel = mc.get_relative_pos()
             # packs <start addr> <end addr> as two unsigend longs
-            lendian_addrs = pack('<LL', absaddr, absaddr + rel)
-            self.write_marked(MARK_ASM_ADDR, lendian_addrs)
-
+            le_addr1 = encode_le_addr(absaddr)
+            le_addr2 = encode_le_addr(absaddr + rel)
+            self.write_marked(MARK_ASM_ADDR, le_addr1 + le_addr2)
         for i,op in enumerate(ops):
             mark, line = self.encode(op)
             self.write_marked(mark, line)
             self.write_core_dump(ops, i, op, ops_offset, mc)
 
+        self.memo = {}
+
     def write_core_dump(self, operations, i, op, ops_offset, mc):
+        return
         if mc is None:
             return
 
@@ -115,4 +145,36 @@
         dump = mc.copy_core_dump(mc.absolute_addr(), start_offset)
         self.write_marked(MARK_ASM, dump)
 
+    def var_to_str(self, arg):
+        try:
+            mv = self.memo[arg]
+        except KeyError:
+            mv = len(self.memo)
+            self.memo[arg] = mv
+        # TODO
+        #if isinstance(arg, ConstInt):
+        #    if int_could_be_an_address(arg.value):
+        #        addr = arg.getaddr()
+        #        name = self.metainterp_sd.get_name_from_address(addr)
+        #        if name:
+        #            return 'ConstClass(' + name + ')'
+        #    return str(arg.value)
+        #elif isinstance(arg, self.ts.ConstRef):
+        #    if arg.value:
+        #        return 'ConstPtr(ptr' + str(mv) + ')'
+        #    return 'ConstPtr(null)'
+        if isinstance(arg, ConstFloat):
+            return str(arg.getfloat())
+        elif arg is None:
+            return 'None'
+        elif arg.is_vector():
+            return 'v' + str(mv)
+        elif arg.type == 'i':
+            return 'i' + str(mv)
+        elif arg.type == 'r':
+            return 'p' + str(mv)
+        elif arg.type == 'f':
+            return 'f' + str(mv)
+        else:
+            return '?'
 


More information about the pypy-commit mailing list