diff options
Diffstat (limited to 'Tools/scripts/gprof2html.py')
-rwxr-xr-x | Tools/scripts/gprof2html.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Tools/scripts/gprof2html.py b/Tools/scripts/gprof2html.py new file mode 100755 index 0000000..aa13d52 --- /dev/null +++ b/Tools/scripts/gprof2html.py @@ -0,0 +1,78 @@ +#! /usr/bin/env python2.3 + +"""Transform gprof(1) output into useful HTML.""" + +import re, os, sys, cgi, webbrowser + +header = """\ +<html> +<head> + <title>gprof output (%s)</title> +</head> +<body> +<pre> +""" + +trailer = """\ +</pre> +</body> +</html> +""" + +def add_escapes(input): + for line in input: + yield cgi.escape(line) + +def main(): + filename = "gprof.out" + if sys.argv[1:]: + filename = sys.argv[1] + outputfilename = filename + ".html" + input = add_escapes(file(filename)) + output = file(outputfilename, "w") + output.write(header % filename) + for line in input: + output.write(line) + if line.startswith(" time"): + break + labels = {} + for line in input: + m = re.match(r"(.* )(\w+)\n", line) + if not m: + output.write(line) + break + stuff, fname = m.group(1, 2) + labels[fname] = fname + output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' % + (stuff, fname, fname, fname)) + for line in input: + output.write(line) + if line.startswith("index % time"): + break + for line in input: + m = re.match(r"(.* )(\w+)(( <cycle.*>)? \[\d+\])\n", line) + if not m: + output.write(line) + if line.startswith("Index by function name"): + break + continue + prefix, fname, suffix = m.group(1, 2, 3) + if fname not in labels: + output.write(line) + continue + if line.startswith("["): + output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' % + (prefix, fname, fname, fname, suffix)) + else: + output.write('%s<a href="#call:%s">%s</a>%s\n' % + (prefix, fname, fname, suffix)) + for line in input: + for part in re.findall(r"(\w+(?:\.c)?|\W+)", line): + if part in labels: + part = '<a href="#call:%s">%s</a>' % (part, part) + output.write(part) + output.write(trailer) + output.close() + webbrowser.open("file:" + os.path.abspath(outputfilename)) + +main() |