Author: Maciej Fijalkowski <fij...@gmail.com> Branch: dtrace-support Changeset: r75919:1c6e04d35be2 Date: 2015-02-16 16:09 +0200 http://bitbucket.org/pypy/pypy/changeset/1c6e04d35be2/
Log: start writing dtrace support for basic events diff --git a/rpython/config/translationoption.py b/rpython/config/translationoption.py --- a/rpython/config/translationoption.py +++ b/rpython/config/translationoption.py @@ -189,6 +189,9 @@ BoolOption("lldebug0", "If true, makes an lldebug0 build", default=False, cmdline="--lldebug0"), + BoolOption("dtrace", + "If true, enable emitting dtrace debug probes", default=False, + cmdline='--enable-dtrace'), OptionDescription("backendopt", "Backend Optimization Options", [ # control inlining diff --git a/rpython/translator/c/database.py b/rpython/translator/c/database.py --- a/rpython/translator/c/database.py +++ b/rpython/translator/c/database.py @@ -16,6 +16,7 @@ from rpython.translator.c.extfunc import do_the_getting from rpython.translator.c import gc from rpython.tool.identity_dict import identity_dict +from rpython.flowspace.model import Constant class NoCorrespondingNode(Exception): @@ -47,6 +48,7 @@ self.containerstats = {} self.externalfuncs = {} self.helper2ptr = {} + self.debug_nodes = set() # late_initializations is for when the value you want to # assign to a constant object is something C doesn't think is @@ -232,6 +234,13 @@ else: raise Exception("don't know about %r" % (obj,)) + def seen_debug_start(self, op): + arg = op.args[0] + if not isinstance(arg, Constant): + return + name = ''.join(arg.value.chars) + self.debug_nodes.add(name) + def complete(self, show_progress=True): assert not self.completed if self.translator and self.translator.rtyper: diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py --- a/rpython/translator/c/funcgen.py +++ b/rpython/translator/c/funcgen.py @@ -792,6 +792,7 @@ return x def OP_DEBUG_START(self, op): + self.db.seen_debug_start(op) return self._op_debug('PYPY_DEBUG_START', op.args[0]) def OP_DEBUG_STOP(self, op): diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py --- a/rpython/translator/c/genc.py +++ b/rpython/translator/c/genc.py @@ -246,8 +246,22 @@ self.extrafiles = self.eventually_copy(extra) self.gen_makefile(targetdir, exe_name=exe_name, headers_to_precompile=headers_to_precompile) + if self.config.translation.dtrace: + self._generate_dtrace_probe_file(db.debug_nodes) return cfile + def _generate_dtrace_probe_file(self, debug_nodes): + name = self.targetdir.join('pypy.p') + f = name.open('w') + f.write('provider pypy_probes {\n') + for debug_node in debug_nodes: + debug_node = debug_node.replace('-', '_') + f.write(' probe %s__start(void);' % debug_node) + f.write(' probe %s__done(void);' % debug_node) + f.write('};') + f.close() + # XXX run dtrace + def eventually_copy(self, cfiles): extrafiles = [] for fn in cfiles: diff --git a/rpython/translator/c/test/test_dtrace.py b/rpython/translator/c/test/test_dtrace.py new file mode 100644 --- /dev/null +++ b/rpython/translator/c/test/test_dtrace.py @@ -0,0 +1,19 @@ + +from rpython.translator.c.test.test_standalone import StandaloneTests +from rpython.rlib.debug import debug_start, debug_stop +from rpython.config.translationoption import get_combined_translation_config + +class TestDTrace(StandaloneTests): + config = get_combined_translation_config(translating=True) + config.translation.dtrace = True + + def test_dtrace_probes(self): + def f(argv): + debug_start("x") + for i in range(10000000): + pass + debug_stop("x") + return 0 + + _, cbuilder = self.compile(f) + cbuilder.cmdexec('') diff --git a/rpython/translator/c/test/test_standalone.py b/rpython/translator/c/test/test_standalone.py --- a/rpython/translator/c/test/test_standalone.py +++ b/rpython/translator/c/test/test_standalone.py @@ -1390,7 +1390,6 @@ and result.count('a') == 1 and result.count('d') == 6) - class TestShared(StandaloneTests): def test_entrypoint(self): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit