summaryrefslogtreecommitdiffstats
path: root/dtrace.in
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2009-07-15 15:16:54 +0200
committerMark Wielaard <mjw@redhat.com>2009-07-15 15:16:54 +0200
commite4aaabda45427a9b983fa2f01d172dfe5926adaa (patch)
tree3564c880b9383e1d181a7de11e3c93a14a88bd22 /dtrace.in
parent00b01a991cc4300f18c747853e85841d187b1fa4 (diff)
downloadsystemtap-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-xdtrace.in183
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)