def assemble(self, ssarepr, jitcode=None): """Take the 'ssarepr' representation of the code and assemble it inside the 'jitcode'. If jitcode is None, make a new one. """ self.setup(ssarepr.name) ssarepr._insns_pos = [] for insn in ssarepr.insns: ssarepr._insns_pos.append(len(self.code)) self.write_insn(insn) self.fix_labels() self.check_result() if jitcode is None: jitcode = JitCode(ssarepr.name) jitcode._ssarepr = ssarepr self.make_jitcode(jitcode) if self._count_jitcodes < 20: # stop if we have a lot of them jitcode._dump = format_assembler(ssarepr) self._count_jitcodes += 1 return jitcode
def get_jitcode(self, graph, called_from=None): # 'called_from' is only one of the callers, used for debugging. try: return self.jitcodes[graph] except KeyError: fnaddr, calldescr = self.get_jitcode_calldescr(graph) jitcode = JitCode(graph.name, fnaddr, calldescr, called_from=called_from) self.jitcodes[graph] = jitcode self.unfinished_graphs.append(graph) return jitcode
def test_portal_trace_positions(): jitcode = JitCode("f") jitcode.setup(None) portal = JitCode("portal") portal.setup(None) class FakeStaticData: cpu = None warmrunnerdesc = None mainjitcode = portal metainterp = pyjitpl.MetaInterp(FakeStaticData(), FakeStaticData()) metainterp.framestack = [] class FakeHistory: operations = [] history = metainterp.history = FakeHistory() metainterp.newframe(portal, "green1") history.operations.append(1) metainterp.newframe(jitcode) history.operations.append(2) metainterp.newframe(portal, "green2") history.operations.append(3) metainterp.popframe() history.operations.append(4) metainterp.popframe() history.operations.append(5) metainterp.popframe() history.operations.append(6) assert metainterp.portal_trace_positions == [("green1", 0), ("green2", 2), (None, 3), (None, 5)] assert metainterp.find_biggest_function() == "green1" metainterp.newframe(portal, "green3") history.operations.append(7) metainterp.newframe(jitcode) history.operations.append(8) assert metainterp.portal_trace_positions == [("green1", 0), ("green2", 2), (None, 3), (None, 5), ("green3", 6)] assert metainterp.find_biggest_function() == "green1" history.operations.extend([9, 10, 11, 12]) assert metainterp.find_biggest_function() == "green3"
def test_num_regs(): j = JitCode("test") j.setup(num_regs_i=12, num_regs_r=34, num_regs_f=56) assert j.num_regs_i() == 12 assert j.num_regs_r() == 34 assert j.num_regs_f() == 56 j.setup(num_regs_i=0, num_regs_r=0, num_regs_f=0) assert j.num_regs_i() == 0 assert j.num_regs_r() == 0 assert j.num_regs_f() == 0 j.setup(num_regs_i=255, num_regs_r=255, num_regs_f=255) assert j.num_regs_i() == 255 assert j.num_regs_r() == 255 assert j.num_regs_f() == 255
def test_liveness(): j = JitCode("test") j.setup(liveness={5: (" A", "b", "CD")}) assert j.has_liveness_info(5) assert not j.has_liveness_info(4) assert j._live_vars(5) == "%i32 %i65 %r98 %f67 %f68"