[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