diff options
Diffstat (limited to 'dtrace')
-rwxr-xr-x | dtrace | 145 |
1 files changed, 145 insertions, 0 deletions
@@ -0,0 +1,145 @@ +#!/usr/bin/python + +# This handles the systemtap equivalent of +# $(DTRACE) $(DTRACEFLAGS) -G -s $^ -o $@ +# $(DTRACE) $(DTRACEFLAGS) -h -s $^ -o $@ +# which is a step that builds DTrace provider and probe definitions + +# Copyright (C) 2009 Red Hat Inc. +# +# This file is part of systemtap, and is free software. You can +# redistribute it and/or modify it under the terms of the GNU General +# Public License (GPL); either version 2, or (at your option) any +# later version. + +import os,posix,sys +from subprocess import * + +class provider: + arglist = dict() + def open(self, provider, header): + have_provider = False + self.f = open(provider) + self.h = open(header,mode='w') + self.h.write("// Generated by /usr/bin/dtrace\n") + self.h.write("\n#include <sys/sdt.h>\n\n") + in_comment = False + while (True): + line = self.f.readline() + if (line == ""): + break + if (line.find("/*") >= 0): + in_comment = True + if (line.find("*/") >= 0): + in_comment = False + continue + if (in_comment): + continue + if (line.find("provider") >= 0): + tokens = line.split() + have_provider = True + self.provider = tokens[1] + elif (have_provider and line.find("probe ") > 0): + 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 = "" + i = 0 + c = 0 + self.arglist[this_probe] = "" + while (i < len(args)): + if (args[i:i+1] == ","): + new_args = ('%s%s' % (new_args, args[i])) + c += 1 + else: + new_args = new_args + args[i] + i += 1 + if (len(new_args) > 0): + self.arglist[this_probe] = ('%s arg%d' % (new_args, c)) + if (len(new_args) == 0): + self.h.write ('#define %s STAP_PROBE(provider,%s)\n' % (this_probe_canon, this_probe)) + elif (c == 0): + self.h.write ('#define %s(arg1) STAP_PROBE%d(provider,%s,arg1)\n' % (this_probe_canon, c+1, this_probe)) + elif (c == 1): + self.h.write ('#define %s(arg1,arg2) STAP_PROBE%d(provider,%s,arg1,arg2)\n' % (this_probe_canon, c+1, this_probe)) + elif (c == 2): + self.h.write ('#define %s(arg1,arg2,arg3) STAP_PROBE%d(provider,%s,arg1,arg2,arg3)\n' % (this_probe_canon, c+1, this_probe)) + elif (c == 3): + self.h.write ('#define %s(arg1,arg2,arg3,arg4) STAP_PROBE%d(provider,%s,arg1,arg2,arg3,arg4)\n' % (this_probe_canon, c+1, this_probe)) + elif (c == 4): + self.h.write ('#define %s(arg1,arg2,arg3,arg4,arg5) STAP_PROBE%d(provider,%s,arg1,arg2,arg3,arg4,arg5)\n' % (this_probe_canon, c+1, this_probe)) + elif (c == 5): + self.h.write ('#define %s(arg1,arg2,arg3,arg4,arg5,arg6) STAP_PROBE%d(provider,%s,arg1,arg2,arg3,arg4,arg5,arg6)\n' % (this_probe_canon, c+1, this_probe)) + self.h.write ('#define %s_ENABLED() 1\n' % this_probe_canon) + + def get(self, arg): + print arg + if (arg in self.arglist): + return self.arglist[arg] + else: + return "" +######################################################################## +# main +######################################################################## + +def usage (): + print "Usage " + sys.argv[0] + "[-h | -G] -s File.d -o File {Files}" + sys.exit(1) + +def open_file (arg): + if (len (sys.argv) <= arg): + return False + try: + file = open(sys.argv[arg], 'r') + except IOError: + print (sys.argv[arg] + " not found") + sys.exit(1) + return file + +if (len (sys.argv) < 2): + usage() + +i = 1 +build_header = False +build_source = False +filename = "" +while (i < len (sys.argv)): + if (sys.argv[i] == "-o"): + i += 1 + filename = sys.argv[i] + elif (sys.argv[i] == "-s"): + i += 1 + s_filename = sys.argv[i] + elif (sys.argv[i] == "-h"): + build_header = True + elif (sys.argv[i] == "-G"): + build_source = True + i += 1 +# print build_header == False and build_source == False +if (build_header == False and build_source == False): + usage() + sys.exit(1) + +if (filename == ""): + if (s_filename != ""): + filename = s_filename.replace(".d","") + else: + usage + sys.exit(1) + +if (build_header): + providers = provider() + providers.open(s_filename, filename + ".h") +elif (build_source): + fn = "/tmp/" + os.path.basename(s_filename).replace(".d", ".c") + f = open(fn,mode='w') + f.write("static __dtrace () {}\n") + f.close() + call("gcc -fPIC -c " + fn + " -o " + filename + ".o", shell=True) + f.close() + os.remove(fn) + + + |