[pypy-commit] pypy dtrace-support: progress

fijal noreply at buildbot.pypy.org
Mon Mar 16 16:45:36 CET 2015


Author: fijal
Branch: dtrace-support
Changeset: r76408:57942acfb5de
Date: 2015-03-16 17:45 +0200
http://bitbucket.org/pypy/pypy/changeset/57942acfb5de/

Log:	progress

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
@@ -784,8 +784,18 @@
 
     def _op_debug(self, opname, arg):
         if isinstance(arg, Constant):
-            string_literal = c_string_constant(''.join(arg.value.chars))
-            return "%s(%s);" % (opname, string_literal)
+            val = ''.join(arg.value.chars)
+            if self.db.translator.config.translation.dtrace:
+                if opname == 'PYPY_DEBUG_START':
+                    name_for_op = 'START'
+                else:
+                    name_for_op = 'END'
+                prefix = 'PYPY_PROBES_%s_%s();' % (
+                    val.replace('-', '_').upper(), name_for_op)
+            else:
+                prefix = ''
+            string_literal = c_string_constant(val)
+            return prefix + "%s(%s);" % (opname, string_literal)
         else:
             x = "%s(RPyString_AsCharP(%s));\n" % (opname, self.expr(arg))
             x += "RPyString_FreeCache();"
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
@@ -15,6 +15,7 @@
 from rpython.translator.gensupp import uniquemodulename, NameManager
 from rpython.translator.tool.cbuild import ExternalCompilationInfo
 
+
 _CYGWIN = sys.platform == 'cygwin'
 
 _CPYTHON_RE = py.std.re.compile('^Python 2.[567]')
@@ -241,7 +242,8 @@
                 defines['PYPY_MAIN_FUNCTION'] = "pypy_main_startup"
         self.eci, cfile, extra, headers_to_precompile = \
                 gen_source(db, modulename, targetdir,
-                           self.eci, defines=defines, split=self.split)
+                           self.eci, defines=defines, split=self.split,
+                           dtrace=self.config.translation.dtrace)
         self.c_source_filename = py.path.local(cfile)
         self.extrafiles = self.eventually_copy(extra)
         self.gen_makefile(targetdir, exe_name=exe_name,
@@ -251,16 +253,20 @@
         return cfile
 
     def _generate_dtrace_probe_file(self, debug_nodes):
-        name = self.targetdir.join('pypy.p')
+        name = self.targetdir.join('pypy.d')
         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.write('  probe %s__start();\n' % debug_node)
+            f.write('  probe %s__end();\n' % debug_node)
+        f.write('};\n')
         f.close()
-        # XXX run dtrace
+        returncode, stdout, stderr = runsubprocess.run_subprocess(
+            'dtrace', ['-o', str(self.targetdir.join('pypy_probes.h')),
+                '-h', '-s', str(name)])
+        if returncode:
+            raise Exception("Dtrace exploded: %s" % stderr)
 
     def eventually_copy(self, cfiles):
         extrafiles = []
@@ -818,7 +824,7 @@
 
 
 def gen_source(database, modulename, targetdir,
-               eci, defines={}, split=False):
+               eci, defines={}, split=False, dtrace=False):
     if isinstance(targetdir, str):
         targetdir = py.path.local(targetdir)
 
@@ -839,6 +845,8 @@
 
     eci.write_c_header(fi)
     print >> fi, '#include "src/g_prerequisite.h"'
+    if dtrace:
+        print >> fi, '#include "pypy_probes.h"'
     fi.write('#endif /* _PY_COMMON_HEADER_H*/\n')
 
     fi.close()


More information about the pypy-commit mailing list