diff --git a/Utilities/StaticAnalyzers/scripts/callgraph.py b/Utilities/StaticAnalyzers/scripts/callgraph.py index abe1a9d89ae61..2863f42dff2f1 100755 --- a/Utilities/StaticAnalyzers/scripts/callgraph.py +++ b/Utilities/StaticAnalyzers/scripts/callgraph.py @@ -9,19 +9,18 @@ except ImportError: from yaml import Loader, Dumper -topfunc = re.compile(r"::(accumulate|acquire|startingNewLoop|duringLoop|endOfLoop|beginOfJob|endOfJob|produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream|streamBeginRun|streamBeginLuminosityBlock|streamEndRun|streamEndLuminosityBlock|globalBeginRun|globalEndRun|globalBeginLuminosityBlock|globalEndLuminosityBlock|endRun|endLuminosityBlock)\(") +topfunc = r"::(accumulate|acquire|startingNewLoop|duringLoop|endOfLoop|beginOfJob|endOfJob|produce|analyze|filter|beginLuminosityBlock|beginRun|beginStream|streamBeginRun|streamBeginLuminosityBlock|streamEndRun|streamEndLuminosityBlock|globalBeginRun|globalEndRun|globalBeginLuminosityBlock|globalEndLuminosityBlock|endRun|endLuminosityBlock)\(.*\) (const)?" +topfuncre = re.compile(topfunc) -baseclass = re.compile( - r"(edm::)?(one::|stream::|global::)?((DQM)?(Global|One)?ED(Producer|Filter|Analyzer|(IterateNTimes|NavigateEvents)?Looper)(Base)?|impl::(ExternalWork|Accumulator))") - -assert(baseclass.match('edm::global::EDFilterBase::filter()')) -assert(topfunc.search('edm::global::EDFilterBase::filter()')) +baseclass = r"(edm::)?(one::|stream::|global::)?((DQM)?(Global|One)?ED(Producer|Filter|Analyzer|(IterateNTimes|NavigateEvents)?Looper)(Base)?|impl::(ExternalWork|Accumulator))" +baseclassre = re.compile(baseclass+topfunc) +assert(baseclassre.match('edm::global::EDFilterBase::filter(*) const')) +assert(topfuncre.search('edm::global::EDFilterBase::filter(&) const')) farg = re.compile(r"\(.*?\)") tmpl = re.compile(r'<.*?>') toplevelfuncs = set() -#epfuncre = re.compile(r"edm::eventsetup::EventSetupRecord::get<.*>\(.*\)") epfuncre = re.compile(r"edm::eventsetup::EventSetupRecord::get<(class|struct) edm::ES(Transient)?Handle<(class|struct) .*>>\((const char \*, |const std::string &, )(class|struct) edm::ES(Transient)?Handle<(class|struct).*> &\) const") f= 'edm::eventsetup::EventSetupRecord::get>(const std::string &, class edm::ESHandle &) const' assert(epfuncre.search(f)) @@ -29,18 +28,14 @@ skipfunc = re.compile(r"TGraph::IsA\(.*\)") epfuncs = set() - - function='(anonymous namespace in /src/RecoTracker/TkHitPairs/plugins/HitPairEDProducer.cc)::Impl<(anonymous namespace)::ImplSeedingHitSets, (anonymous namespace)::DoNothing, (anonymous namespace)::RegionsLayersSeparate>::produce(const _Bool, edm::Event &, const edm::EventSetup &);' function2='HitPairEDProducer::produce(edm::Event &, const edm::EventSetup &);' value='HitPairEDProducer' valuere=r'\b%s\b' % value vre=re.compile(valuere) m=vre.search(function) -print(m) assert(m) m2=vre.search(function2) -print(m2) assert(m2) modules = list() @@ -51,22 +46,16 @@ mods_regex=r'\b(' + mods+ r'QQQQQQQQ)\b' comp_mods_regex=re.compile(mods_regex) n=comp_mods_regex.search(function) -print(n) assert(n) n2=comp_mods_regex.search(function2) -print(n2) assert(n2) h = open('module_to_package.yaml', 'r') module2package = yaml.load(h, Loader=yaml.FullLoader) -#print(module2package) for k in module2package.keys(): module2package[k]=sorted(set(module2package[k])) -#h = open('new_module_to_package.yaml', 'w') -#yaml.dump(module2package,h) - G = nx.DiGraph() with open('function-calls-db.txt') as f: for line in f: @@ -78,27 +67,20 @@ if epfuncre.search(fields[3]): epfuncs.add(fields[3]) if fields[2] == ' overrides function ': - if baseclass.search(fields[3]): + if baseclassre.match(fields[3]): G.add_edge(fields[1], fields[3], kind=' overrides function ') - if topfunc.search(fields[3]) and comp_mods_regex.search(fields[1]): + if topfuncre.search(fields[1]) and comp_mods_regex.search(fields[1]): toplevelfuncs.add(fields[1]) else: G.add_edge(fields[3], fields[1], kind=' overriden function calls function ') + if epfuncre.search(fields[3]): + epfuncs.add(fields[3]) -print('Top Level Functions') -for tlf in toplevelfuncs: - print(tlf) -print('End Point Functions') -for epf in epfuncs: - print(epf) - -print('Callstacks') callstacks = set() for tfunc in toplevelfuncs: for epfunc in epfuncs: if G.has_node(tfunc) and G.has_node(epfunc) and nx.has_path(G, tfunc, epfunc): for path in nx.all_shortest_paths(G, tfunc, epfunc): - # path = nx.shortest_path(G, tfunc, epfunc) cs = str("") previous = str("") for p in path: @@ -111,18 +93,15 @@ previous = stripped if cs not in callstacks: callstacks.add(cs) - print(cs) report = dict() for key in sorted(set(module2package.keys())): for value in sorted(set(module2package[key])): if comp_mods_regex.match(value): - print(key, value) regex_str = r'\b%s\b'%value vre=re.compile(regex_str) for callstack in sorted(callstacks): if vre.search(callstack): - print(callstack) report.setdefault(str(key), {}).setdefault(str(value), []).append(str(callstack)) r = open('eventsetuprecord-get.yaml', 'w')