[pypy-svn] r37527 - in pypy/dist/pypy/jit/codegen: demo i386/test ppc test

mwh at codespeak.net mwh at codespeak.net
Mon Jan 29 13:27:53 CET 2007


Author: mwh
Date: Mon Jan 29 13:27:48 2007
New Revision: 37527

Added:
   pypy/dist/pypy/jit/codegen/i386/test/test_genc_ts.py
      - copied unchanged from r37090, pypy/dist/pypy/jit/codegen/ppc/test/test_genc_ts.py
   pypy/dist/pypy/jit/codegen/test/genc_ts_tests.py
      - copied, changed from r37090, pypy/dist/pypy/jit/codegen/i386/test/test_genc_ts.py
Modified:
   pypy/dist/pypy/jit/codegen/demo/support.py
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
Log:
a little unix yoga to run the generated machine code in a subprocess and use
signal.alarm() for hang-protection (unless --trap is provided, on the
assumption that you're using gdb with --trap)


Modified: pypy/dist/pypy/jit/codegen/demo/support.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/demo/support.py	(original)
+++ pypy/dist/pypy/jit/codegen/demo/support.py	Mon Jan 29 13:27:48 2007
@@ -8,8 +8,11 @@
 from pypy import conftest
 from pypy.jit import conftest as bench_conftest
 from pypy.jit.codegen.demo import conftest as demo_conftest
+from pypy.jit.codegen import conftest as codegen_conftest
 
 machine_code_dumper = None
+run_in_subprocess = False
+
 if demo_conftest.option.backend == 'llgraph':
     from pypy.jit.codegen.llgraph.rgenop import RGenOp
 elif demo_conftest.option.backend == 'dump':
@@ -17,15 +20,21 @@
 elif demo_conftest.option.backend == 'i386':
     from pypy.jit.codegen.i386.rgenop import RI386GenOp as RGenOp
     from pypy.jit.codegen.i386.codebuf import machine_code_dumper
+    run_in_subprocess = True
 elif demo_conftest.option.backend == 'ppc':
     from pypy.jit.codegen.ppc.rgenop import RPPCGenOp as RGenOp
+    run_in_subprocess = True
 elif demo_conftest.option.backend == 'ppcfew':
     from pypy.jit.codegen.ppc.test.test_rgenop import FewRegisters as RGenOp
+    run_in_subprocess = True
 elif demo_conftest.option.backend == 'llvm':
     from pypy.jit.codegen.llvm.rgenop import RLLVMGenOp as RGenOp
 else:
     assert 0, "unknown backend %r"%demo_conftest.option.backend
 
+if codegen_conftest.option.trap:
+    run_in_subprocess = False
+
 def Random():
     import random
     seed = demo_conftest.option.randomseed
@@ -34,6 +43,33 @@
     print
     return random.Random(seed)
 
+if run_in_subprocess:
+    def runfp(fp, *args):
+        import signal, os
+        p2cread, p2cwrite = os.pipe()
+        pid = os.fork()
+        if not pid:
+            signal.alarm(3)
+            res = fp(*args)
+            os.write(p2cwrite, str(res) + "\n")
+            os.close(p2cwrite)
+            os._exit(0)
+        else:
+            _, status = os.waitpid(pid, 0)
+            if status == 0:
+                res = os.read(p2cread, 10000)
+                return int(res)
+            else:
+                signalled = os.WIFSIGNALED(status)
+                if signalled:
+                    sig = os.WTERMSIG(status)
+                    if sig == signal.SIGALRM:
+                        return "HUNG?"
+                    else:
+                        return "CRASHED (signal %s)"%(sig,)
+else:
+    def runfp(fp, *args):
+        return fp(*args)
 
 def rundemo(entrypoint, *args):
     view = conftest.option.view
@@ -82,7 +118,7 @@
     print 'Python ===>', expected
     F1 = lltype.FuncType([lltype.Signed] * nb_args, lltype.Signed)
     fp = RGenOp.get_python_callable(lltype.Ptr(F1), gv_entrypoint)
-    res = fp(*args)
+    res = runfp(fp, *args)
     print '%-6s ===>'%demo_conftest.option.backend, res
     print
     if res != expected:

Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py	Mon Jan 29 13:27:48 2007
@@ -947,6 +947,91 @@
 
     # ... address operations ...
 
+dummy_var = GenVar()
+
+class ReplayFlexSwitch(CodeGenSwitch):
+
+    def __init__(self, replay_builder):
+        self.replay_builder = replay_builder
+
+    def add_case(self, gv_case):
+        return self.replay_builder
+
+class ReplayBuilder(GenBuilder):
+
+    def __init__(self, rgenop):
+        self.rgenop = rgenop
+
+    def end(self):
+        pass
+
+    @specialize.arg(1)
+    def genop1(self, opname, gv_arg):
+        return dummy_var
+
+    @specialize.arg(1)
+    def genop2(self, opname, gv_arg1, gv_arg2):
+        return dummy_var
+
+    def genop_getfield(self, fieldtoken, gv_ptr):
+        return dummy_var
+
+    def genop_setfield(self, fieldtoken, gv_ptr, gv_value):
+        return dummy_var
+
+    def genop_getsubstruct(self, fieldtoken, gv_ptr):
+        return dummy_var
+
+    def genop_getarrayitem(self, arraytoken, gv_ptr, gv_index):
+        return dummy_var
+
+    def genop_getarraysubstruct(self, arraytoken, gv_ptr, gv_index):
+        return dummy_var
+
+    def genop_getarraysize(self, arraytoken, gv_ptr):
+        return dummy_var
+
+    def genop_setarrayitem(self, arraytoken, gv_ptr, gv_index, gv_value):
+        return dummy_var
+
+    def genop_malloc_fixedsize(self, size):
+        return dummy_var
+
+    def genop_malloc_varsize(self, varsizealloctoken, gv_size):
+        return dummy_var
+
+    def genop_call(self, sigtoken, gv_fnptr, args_gv):
+        return dummy_var
+
+    def genop_same_as(self, kind, gv_x):
+        return dummy_var
+
+    def genop_debug_pdb(self):    # may take an args_gv later
+        pass
+
+    def enter_next_block(self, kinds, args_gv):
+        return None
+
+    def jump_if_false(self, gv_condition, args_gv):
+        return self
+
+    def jump_if_true(self, gv_condition, args_gv):
+        return self
+
+    def finish_and_return(self, sigtoken, gv_returnvar):
+        pass
+
+    def finish_and_goto(self, outputargs_gv, target):
+        pass
+
+    def flexswitch(self, gv_exitswitch, args_gv):
+        flexswitch = ReplayFlexSwitch(self)
+        return flexswitch, self
+
+    def show_incremental_progress(self):
+        pass
+
+
 
 class RPPCGenOp(AbstractRGenOp):
 
@@ -992,7 +1077,8 @@
 ##     @specialize.genconst(0)
 ##     def constPrebuiltGlobal(llvalue):
 
-##     def replay(self, label, kinds):
+    def replay(self, label, kinds):
+        return ReplayBuilder(self), [dummy_var] * len(kinds)
 
     @staticmethod
     def erasedType(T):



More information about the Pypy-commit mailing list