diff options
author | Mark Wielaard <mjw@redhat.com> | 2009-07-15 15:16:54 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2009-07-15 15:16:54 +0200 |
commit | e4aaabda45427a9b983fa2f01d172dfe5926adaa (patch) | |
tree | 3564c880b9383e1d181a7de11e3c93a14a88bd22 /dtrace.in | |
parent | 00b01a991cc4300f18c747853e85841d187b1fa4 (diff) | |
download | systemtap-steved-e4aaabda45427a9b983fa2f01d172dfe5926adaa.tar.gz systemtap-steved-e4aaabda45427a9b983fa2f01d172dfe5926adaa.tar.xz systemtap-steved-e4aaabda45427a9b983fa2f01d172dfe5926adaa.zip |
PR10399 dtrace should obey prefix install path
* dtrace: Renamed to...
* dtrace.in: Add -I@prefix/include to gcc invocation.
* configure.ac (AC_CONFIG_FILES): List dtrace.
* configure: Regenerated.
Diffstat (limited to 'dtrace.in')
-rwxr-xr-x | dtrace.in | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/dtrace.in b/dtrace.in new file mode 100755 index 00000000..91885977 --- /dev/null +++ b/dtrace.in @@ -0,0 +1,183 @@ +#!/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,string,sys +from subprocess import call +from tempfile import mkstemp + +class provider: + 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("/*") != -1): + in_comment = True + if (line.find("*/") != -1): + in_comment = False + continue + if (in_comment): + continue + if (line.find("provider") != -1): + tokens = line.split() + have_provider = True + self.provider = tokens[1] + 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(")")]) + args_string = "" + arg = "" + i = 0 + c = 0 + while (i < len(args)): + if (args[i:i+1] == ","): + args_string = ('%s %s,' % (args_string, arg.strip())) + c += 1 + typedefs = self.typedef_append (typedefs,this_probe,arg,c) + arg = "" + else: + arg = arg + args[i] + i += 1 + 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 + while (i <= c): + if (i != 1): + define_str += "," + 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,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] + " [--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): + 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 + + +######################################################################## +# main +######################################################################## + +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"): + 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_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() + sys.exit(1) + +if (filename == ""): + if (s_filename != ""): + (filename,ext) = os.path.splitext(s_filename) + filename = os.path.basename(filename) + else: + usage + sys.exit(1) +else: + (filename,ext) = os.path.splitext(filename) + +if (build_header): + providers = provider() + 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("#include \"" + filename + ".h\"\nstatic __dtrace () {}\n") + f.close() + call(["gcc", "-fPIC", "-I.", "-I@prefix@/include", "-g", "-c", fn, "-o", filename + ".o"], shell=False) + os.remove(fn) |