#!/usr/bin/python # Tue Oct 27 15:47:02 EDT 2009 jeffm # A script that will generate call traces given cscope data and # a list of functions # import sys import os import re; from optparse import OptionParser lineRe = re.compile("""(\S+)\s+(\S+)\s+"""); gsyms = {} glvls = {} gcnt = {} gmap = {} gcounter = 0 def uniq(seq): # not order preserving set = {} map(set.__setitem__, seq, []) return set.keys() def _lookup_one_sym(sym, filter, nest): global gcounter f = os.popen("cscope -dL -3 " + sym) if sym in gsyms: gcnt[sym] += 1 if sym in glvls: if glvls[sym] > nest: glvls[sym] = nest else: glvls[sym] = nest return gcnt[sym] = 1 gmap[sym] = gcounter glvls[sym] = nest gcounter += 1 syms = [] for line in f.readlines(): m = lineRe.match(line) if m is not None: p = m.group(1) if filter is not None: m2 = filter.match(p) if filter is None or m2 is not None: syms.append(m.group(2)) gsyms[sym] = uniq(syms) for s in gsyms[sym]: _lookup_one_sym(s, filter, nest + 1) def lookup_one_sym(sym, filter): _lookup_one_sym(sym, filter, 0); def _print_syms(sym, seen, nest, path): for i in range(0, len(path) - 1): cur = path[i] next = path[i + 1] if next in gsyms[cur] and gsyms[cur].index(next) < len(gsyms[cur]) - 1: print "| ", else: print " ", if nest > 0: print "+- ", sys.stdout.write("") print sym, if sym in seen or (gcnt[sym] > 1 and glvls[sym] != nest): print "->[" + str(gmap[sym]) + "]" return seen[sym] = 1 if gcnt[sym] > 1: if sym in gmap: print "[" + str(gmap[sym]) + "]", sys.stdout.write("") if len(gsyms[sym]) > 0: print "" else: print " [entry]" path.append(sym) for s in gsyms[sym]: _print_syms(s, seen, nest + 1, path) path.pop() def print_syms(sym): glvls[sym] = 0 _print_syms(sym, {}, 0, []) parser = OptionParser() parser.add_option("-f", "--filter", dest="filter", help="filter pathnames through filter regex", default=None) (options, args) = parser.parse_args() if options.filter is not None: filterRe = re.compile(options.filter) else: filterRe = None for sym in args: lookup_one_sym(sym, filterRe) for sym in args: print_syms(sym) print ""