diff options
Diffstat (limited to 'dtrace')
-rwxr-xr-x | dtrace | 79 |
1 files changed, 59 insertions, 20 deletions
@@ -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) |