summaryrefslogtreecommitdiffstats
path: root/dtrace
diff options
context:
space:
mode:
Diffstat (limited to 'dtrace')
-rwxr-xr-xdtrace79
1 files changed, 59 insertions, 20 deletions
diff --git a/dtrace b/dtrace
index a2b495b2..cdc97c57 100755
--- a/dtrace
+++ b/dtrace
@@ -12,54 +12,75 @@
# Public License (GPL); either version 2, or (at your option) any
# later version.
-import os,posix,sys
+import os,posix,string,sys
from subprocess import call
from tempfile import mkstemp
class provider:
- def open(self, provider, header):
+ def typedef_append(self, typedefs,this_probe,arg,c):
+ if (add_typedefs):
+ split_arg = arg.rsplit(None,1)
+ type_name = " %s_arg%d" % (this_probe.replace("__","_"),c)
+ if (len(split_arg) > 1):
+ typedefs += ("typedef " + arg.replace(" " + split_arg[1].split("[")[0].lstrip("*"),type_name).strip() + "; ")
+ typedefs += (type_name + type_name + "_v;\n")
+ else:
+ typedefs += ("typedef " + arg.strip() + type_name + "; ")
+ typedefs += (type_name + type_name + "_v;\n")
+ return typedefs
+ def generate(self, provider, header, add_typedefs):
have_provider = False
self.f = open(provider)
self.h = open(header,mode='w')
self.h.write("/* Generated by the Systemtap dtrace wrapper */\n")
self.h.write("\n#include <sys/sdt.h>\n\n")
in_comment = False
+ typedefs = ""
while (True):
line = self.f.readline()
if (line == ""):
break
- if (line.find("/*") >= 0):
+ if (line.find("/*") != -1):
in_comment = True
- if (line.find("*/") >= 0):
+ if (line.find("*/") != -1):
in_comment = False
continue
if (in_comment):
continue
- if (line.find("provider") >= 0):
+ if (line.find("provider") != -1):
tokens = line.split()
have_provider = True
self.provider = tokens[1]
- elif (have_provider and line.find("probe ") > 0):
+ elif (not have_provider):
+ if (add_typedefs):
+ self.h.write (line)
+ elif (have_provider and line.find("probe ") != -1):
while (line.find(")") < 0):
line += self.f.readline()
this_probe = line[line.find("probe ")+5:line.find("(")].strip()
this_probe_canon = self.provider.upper() + "_" + this_probe.replace("__","_").upper()
args = (line[line.find("(")+1:line.find(")")])
- new_args = ""
+ args_string = ""
+ arg = ""
i = 0
c = 0
while (i < len(args)):
if (args[i:i+1] == ","):
- new_args = ('%s%s' % (new_args, args[i]))
+ args_string = ('%s %s,' % (args_string, arg.strip()))
c += 1
+ typedefs = self.typedef_append (typedefs,this_probe,arg,c)
+ arg = ""
else:
- new_args = new_args + args[i]
+ arg = arg + args[i]
i += 1
- if (len(new_args) == 0):
+ if (i != 0):
+ args_string = ('%s %s' % (args_string, arg.strip()))
+ if (len(args_string) == 0):
c = 0
stap_str = "STAP_PROBE(provider,%s" % (this_probe)
else:
c += 1
+ typedefs = self.typedef_append (typedefs,this_probe,arg,c)
stap_str = "STAP_PROBE%d(provider,%s" % (c,this_probe)
define_str = "#define %s(" % (this_probe_canon)
i = 1
@@ -69,13 +90,28 @@ class provider:
define_str = define_str + "arg%s" % (i);
stap_str = stap_str + ",arg%s" % (i);
i += 1
- self.h.write ('/* %s (%s) */\n' % (this_probe_canon,new_args))
+ self.h.write ('/* %s (%s) */\n' % (this_probe_canon,args_string))
self.h.write ('#define %s_ENABLED() 1\n' % this_probe_canon)
self.h.write (define_str + ") \\\n")
self.h.write (stap_str + ")\n\n")
+ elif (line.find("}") != -1 and have_provider):
+ have_provider = False
+ if (add_typedefs):
+ self.h.write (typedefs)
+ self.h.close()
+
def usage ():
- print "Usage " + sys.argv[0] + " [-h | -G] -s File.d -o File {Files}"
+ print "Usage " + sys.argv[0] + " [--help] [-h | -G] -s File.d [-o File]"
+
+def help ():
+ usage()
+ print "Where -h builds a systemtap header file from the .d file"
+ print " -o specifies an explicit output file name,"
+ print " The default for -G is file.o and -h is file.h"
+ print " -s specifies the name of the .d input file"
+ print " -G builds a stub file.o from file.d,"
+ print " which is required by some packages that use dtrace."
sys.exit(1)
def open_file (arg):
@@ -95,10 +131,12 @@ def open_file (arg):
if (len (sys.argv) < 2):
usage()
+ sys.exit(1)
i = 1
build_header = False
build_source = False
+add_typedefs = False
filename = ""
while (i < len (sys.argv)):
if (sys.argv[i] == "-o"):
@@ -110,7 +148,12 @@ while (i < len (sys.argv)):
elif (sys.argv[i] == "-h"):
build_header = True
elif (sys.argv[i] == "-G"):
+ build_header = True
build_source = True
+ elif (sys.argv[i] == "--types"):
+ add_typedefs = True
+ elif (sys.argv[i] == "--help"):
+ help()
i += 1
if (build_header == False and build_source == False):
usage()
@@ -120,23 +163,19 @@ if (filename == ""):
if (s_filename != ""):
(filename,ext) = os.path.splitext(s_filename)
filename = os.path.basename(filename)
- if (build_header):
- filename = filename + ".h"
- elif (build_source):
- filename = filename + ".o"
else:
usage
sys.exit(1)
if (build_header):
providers = provider()
- providers.open(s_filename, filename)
-elif (build_source):
+ providers.generate(s_filename, filename + ".h", add_typedefs)
+if (build_source):
(basename,ext) = os.path.splitext(s_filename)
basename = os.path.basename(basename)
(d,fn) = mkstemp(suffix=".c",prefix=basename)
f = open(fn,mode='w')
- f.write("static __dtrace () {}\n")
+ f.write("#include \"" + filename + ".h\"\nstatic __dtrace () {}\n")
f.close()
- call(["gcc", "-fPIC", "-c", fn, "-o", filename], shell=False)
+ call(["gcc", "-fPIC", "-I.", "-g", "-c", fn, "-o", filename + ".o"], shell=False)
os.remove(fn)