PageRenderTime 38ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/rpython/jit/metainterp/test/test_compile.py

https://bitbucket.org/pypy/pypy/
Python | 171 lines | 167 code | 4 blank | 0 comment | 0 complexity | 31af00b0614e5bd0c94aaea3b0aedc78 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from rpython.config.translationoption import get_combined_translation_config
  2. from rpython.jit.metainterp.history import ConstInt, History, Stats
  3. from rpython.jit.metainterp.history import INT
  4. from rpython.jit.metainterp.compile import compile_loop
  5. from rpython.jit.metainterp.compile import compile_tmp_callback
  6. from rpython.jit.metainterp import jitexc
  7. from rpython.rlib.rjitlog import rjitlog as jl
  8. from rpython.jit.metainterp import jitprof, typesystem, compile
  9. from rpython.jit.metainterp.optimizeopt.test.test_util import LLtypeMixin
  10. from rpython.jit.tool.oparser import parse, convert_loop_to_trace
  11. from rpython.jit.metainterp.optimizeopt import ALL_OPTS_DICT
  12. class FakeCPU(object):
  13. supports_guard_gc_type = True
  14. class Storage:
  15. pass
  16. class tracker:
  17. pass
  18. ts = typesystem.llhelper
  19. def __init__(self):
  20. self.seen = []
  21. def compile_loop(self, inputargs, operations, token, jd_id=0,
  22. unique_id=0, log=True, name='',
  23. logger=None):
  24. token.compiled_loop_token = self.Storage()
  25. self.seen.append((inputargs, operations, token))
  26. class FakeLogger(object):
  27. def log_loop(self, inputargs, operations, number=0, type=None, ops_offset=None, name='', memo=None):
  28. pass
  29. def log_loop_from_trace(self, *args, **kwds):
  30. pass
  31. def repr_of_resop(self, op):
  32. return repr(op)
  33. class FakeState(object):
  34. enable_opts = ALL_OPTS_DICT.copy()
  35. enable_opts.pop('unroll')
  36. def attach_unoptimized_bridge_from_interp(*args):
  37. pass
  38. def get_unique_id(*args):
  39. return 0
  40. def get_location_str(self, args):
  41. return 'location'
  42. class FakeGlobalData(object):
  43. pass
  44. class FakeMetaInterpStaticData(object):
  45. all_descrs = []
  46. logger_noopt = FakeLogger()
  47. logger_ops = FakeLogger()
  48. config = get_combined_translation_config(translating=True)
  49. jitlog = jl.JitLogger()
  50. stats = Stats(None)
  51. profiler = jitprof.EmptyProfiler()
  52. warmrunnerdesc = None
  53. def log(self, msg, event_kind=None):
  54. pass
  55. class FakeMetaInterp:
  56. call_pure_results = {}
  57. box_names_memo = {}
  58. class jitdriver_sd:
  59. index = 0
  60. warmstate = FakeState()
  61. virtualizable_info = None
  62. vec = False
  63. def test_compile_loop():
  64. cpu = FakeCPU()
  65. staticdata = FakeMetaInterpStaticData()
  66. staticdata.cpu = cpu
  67. staticdata.jitlog = jl.JitLogger(cpu)
  68. staticdata.jitlog.trace_id = 1
  69. #
  70. loop = parse('''
  71. [p1]
  72. i1 = getfield_gc_i(p1, descr=valuedescr)
  73. i2 = int_add(i1, 1)
  74. p2 = new_with_vtable(descr=nodesize)
  75. setfield_gc(p2, i2, descr=valuedescr)
  76. jump(p2)
  77. ''', namespace=LLtypeMixin.__dict__.copy())
  78. #
  79. metainterp = FakeMetaInterp()
  80. metainterp.staticdata = staticdata
  81. metainterp.cpu = cpu
  82. metainterp.history = History()
  83. t = convert_loop_to_trace(loop, staticdata)
  84. metainterp.history.inputargs = t.inputargs
  85. metainterp.history.trace = t
  86. #
  87. greenkey = 'faked'
  88. target_token = compile_loop(metainterp, greenkey, (0, 0, 0),
  89. t.inputargs,
  90. [t._mapping[x] for x in loop.operations[-1].getarglist()],
  91. None)
  92. jitcell_token = target_token.targeting_jitcell_token
  93. assert jitcell_token == target_token.original_jitcell_token
  94. assert jitcell_token.target_tokens == [target_token]
  95. assert jitcell_token.number == 2
  96. #
  97. assert len(cpu.seen) == 1
  98. assert cpu.seen[0][2] == jitcell_token
  99. #
  100. del cpu.seen[:]
  101. def test_compile_tmp_callback():
  102. from rpython.jit.backend.llgraph import runner
  103. from rpython.rtyper.lltypesystem import lltype, llmemory
  104. from rpython.rtyper.annlowlevel import llhelper
  105. from rpython.rtyper.llinterp import LLException
  106. #
  107. cpu = runner.LLGraphCPU(None)
  108. FUNC = lltype.FuncType([lltype.Signed]*4, lltype.Signed)
  109. def ll_portal_runner(g1, g2, r3, r4):
  110. assert (g1, g2, r3, r4) == (12, 34, -156, -178)
  111. if raiseme:
  112. raise raiseme
  113. else:
  114. return 54321
  115. #
  116. class FakeJitDriverSD:
  117. portal_runner_ptr = llhelper(lltype.Ptr(FUNC), ll_portal_runner)
  118. portal_runner_adr = llmemory.cast_ptr_to_adr(portal_runner_ptr)
  119. portal_calldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, None)
  120. portal_finishtoken = compile.DoneWithThisFrameDescrInt()
  121. propagate_exc_descr = compile.PropagateExceptionDescr()
  122. num_red_args = 2
  123. result_type = INT
  124. #
  125. loop_token = compile_tmp_callback(cpu, FakeJitDriverSD(),
  126. [ConstInt(12), ConstInt(34)], "ii")
  127. #
  128. raiseme = None
  129. # only two arguments must be passed in
  130. deadframe = cpu.execute_token(loop_token, -156, -178)
  131. fail_descr = cpu.get_latest_descr(deadframe)
  132. assert fail_descr is FakeJitDriverSD().portal_finishtoken
  133. #
  134. EXC = lltype.GcStruct('EXC')
  135. llexc = lltype.malloc(EXC)
  136. raiseme = LLException("exception class", llexc)
  137. deadframe = cpu.execute_token(loop_token, -156, -178)
  138. fail_descr = cpu.get_latest_descr(deadframe)
  139. assert isinstance(fail_descr, compile.PropagateExceptionDescr)
  140. got = cpu.grab_exc_value(deadframe)
  141. assert lltype.cast_opaque_ptr(lltype.Ptr(EXC), got) == llexc
  142. #
  143. class FakeMetaInterpSD:
  144. pass
  145. FakeMetaInterpSD.cpu = cpu
  146. deadframe = cpu.execute_token(loop_token, -156, -178)
  147. fail_descr = cpu.get_latest_descr(deadframe)
  148. try:
  149. fail_descr.handle_fail(deadframe, FakeMetaInterpSD(), None)
  150. except jitexc.ExitFrameWithExceptionRef as e:
  151. assert lltype.cast_opaque_ptr(lltype.Ptr(EXC), e.value) == llexc
  152. else:
  153. assert 0, "should have raised"