def compile(self, entry_point, debug=True, shared=False, stackcheck=False, entrypoints=None): t = TranslationContext(self.config) ann = t.buildannotator() ann.build_types(entry_point, [s_list_of_strings]) if entrypoints is not None: anns = {} for func, annotation in secondary_entrypoints['test']: anns[func] = annotation for item in entrypoints: ann.build_types(item, anns[item]) t.buildrtyper().specialize() if stackcheck: from rpython.translator.transform import insert_ll_stackcheck insert_ll_stackcheck(t) t.config.translation.shared = shared if entrypoints is not None: kwds = {'secondary_entrypoints': [(i, None) for i in entrypoints]} else: kwds = {} cbuilder = CStandaloneBuilder(t, entry_point, t.config, **kwds) if debug: cbuilder.generate_source(defines=cbuilder.DEBUG_DEFINES) else: cbuilder.generate_source() cbuilder.compile() if option is not None and option.view: t.view() return t, cbuilder
def test_writes_recursive(self): from rpython.translator.transform import insert_ll_stackcheck def g(x): return f(x) def f(x): if x: return g(x - 1) return 1 t, wa = self.translate(f, [int]) insert_ll_stackcheck(t) ggraph = graphof(t, g) result = wa.analyze(ggraph.startblock.operations[-1]) assert not result
def test_can_raise_recursive(self): from rpython.translator.transform import insert_ll_stackcheck def g(x): return f(x) def f(x): if x: return g(x - 1) return 1 t, ra = self.translate(f, [int]) insert_ll_stackcheck(t) ggraph = graphof(t, g) result = ra.can_raise(ggraph.startblock.operations[-1]) assert result # due to stack check every recursive function can raise
def test_simple(): t = TranslationContext() a = t.buildannotator() a.build_types(g, [int]) a.simplify() t.buildrtyper().specialize() backend_optimizations(t) t.checkgraphs() n = insert_ll_stackcheck(t) t.checkgraphs() assert n == 1 if option.view: t.view() check(graphof(t, f), "f")
def test_simple(): t = TranslationContext() a = t.buildannotator() a.build_types(g, [int]) a.simplify() t.buildrtyper().specialize() backend_optimizations(t) t.checkgraphs() n = insert_ll_stackcheck(t) t.checkgraphs() assert n == 1 if option.view: t.view() check(graphof(t, f), 'f')
def test_gctransformed(): t = TranslationContext() a = t.buildannotator() a.build_types(g, [int]) a.simplify() t.buildrtyper().specialize() backend_optimizations(t) t.checkgraphs() n = insert_ll_stackcheck(t) t.checkgraphs() assert n == 1 exctransf = t.getexceptiontransformer() f_graph = graphof(t, f) exctransf.create_exception_handling(f_graph) if option.view: f_graph.show() check(f_graph, "f") class GCTransform(shadowstack.ShadowStackFrameworkGCTransformer): from rpython.memory.gc.generation import GenerationGC as GCClass GC_PARAMS = {} gctransf = GCTransform(t) gctransf.transform_graph(f_graph) if option.view: f_graph.show() relevant = check(f_graph, "f") for p in relevant: in_between = False reload = 0 for spaceop in p: if spaceop.opname == "direct_call": target = direct_target(spaceop) if target == "f": in_between = False elif target == "stack_check___": in_between = True if in_between and spaceop.opname == "gc_reload_possibly_moved": reload += 1 assert reload == 0
def test_gctransformed(): t = TranslationContext() a = t.buildannotator() a.build_types(g, [int]) a.simplify() t.buildrtyper().specialize() backend_optimizations(t) t.checkgraphs() n = insert_ll_stackcheck(t) t.checkgraphs() assert n == 1 exctransf = t.getexceptiontransformer() f_graph = graphof(t, f) exctransf.create_exception_handling(f_graph) if option.view: f_graph.show() check(f_graph, 'f') class GCTransform(shadowstack.ShadowStackFrameworkGCTransformer): from rpython.memory.gc.generation import GenerationGC as \ GCClass GC_PARAMS = {} gctransf = GCTransform(t) gctransf.transform_graph(f_graph) if option.view: f_graph.show() relevant = check(f_graph, 'f') for p in relevant: in_between = False reload = 0 for spaceop in p: if spaceop.opname == 'direct_call': target = direct_target(spaceop) if target == 'f': in_between = False elif target == 'stack_check___': in_between = True if in_between and spaceop.opname == 'gc_reload_possibly_moved': reload += 1 assert reload == 0
def task_stackcheckinsertion_lltype(self): from rpython.translator.transform import insert_ll_stackcheck count = insert_ll_stackcheck(self.translator) self.log.info("inserted %d stack checks." % (count, ))
def task_stackcheckinsertion_lltype(self): from rpython.translator.transform import insert_ll_stackcheck count = insert_ll_stackcheck(self.translator) self.log.info("inserted %d stack checks." % (count,))