/// FindAllDataStructures - Inspect the program specified by ECG, adding to /// 'Nodes' all of the data structures node in the program that contain the /// "IncludeFlags" and do not contain "ExcludeFlags" node flags. If /// OnlyHomogenous is true, only type-homogenous nodes are considered. void FindAllDataStructures(std::set<DSNode*> &Nodes, unsigned IncludeFlags, unsigned ExcludeFlags, bool OnlyHomogenous, EquivClassGraphs &ECG) { // Loop over all of the graphs in ECG, finding nodes that are not incomplete // and do not have any of the flags specified by Flags. ExcludeFlags |= DSNode::Incomplete; /// FIXME: nodes in the global graph should not be marked incomplete in main!! for (hash_map<const Function*, DSGraph*>::iterator GI = ECG.DSInfo.begin(), E = ECG.DSInfo.end(); GI != E; ++GI) { assert(GI->second && "Null graph pointer?"); DSGraph &G = *GI->second; for (DSGraph::node_iterator I = G.node_begin(), E = G.node_end(); I != E; ++I) // If this node matches our constraints, include it. if ((I->getNodeFlags() & IncludeFlags) == IncludeFlags && (I->getNodeFlags() & ExcludeFlags) == 0) if (!OnlyHomogenous || !I->isNodeCompletelyFolded()) Nodes.insert(I); } }
static void printCollection(const Collection &C, llvm::raw_ostream &O, const Module *M, const std::string &Prefix) { if (M == 0) { O << "Null Module pointer, cannot continue!\n"; return; } unsigned TotalNumNodes = 0, TotalCallNodes = 0; for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I) if (C.hasDSGraph(*I)) { DSGraph* Gr = C.getDSGraph((const Function&)*I); unsigned NumCalls = Gr->shouldUseAuxCalls() ? Gr->getAuxFunctionCalls().size() : Gr->getFunctionCalls().size(); bool IsDuplicateGraph = false; //if no only print options, print everything bool doPrint = OnlyPrint.begin() == OnlyPrint.end(); //otherwise check the name if (!doPrint) doPrint = OnlyPrint.end() != std::find(OnlyPrint.begin(), OnlyPrint.end(), I->getName().str()); if (doPrint) { const Function *SCCFn = Gr->retnodes_begin()->first; if (&*I == SCCFn) { Gr->writeGraphToFile(O, Prefix+I->getName().str()); } else { IsDuplicateGraph = true; // Don't double count node/call nodes. O << "Didn't write '" << Prefix+I->getName().str() << ".dot' - Graph already emitted to '" << Prefix+SCCFn->getName().str() << "\n"; } } else { const Function *SCCFn = Gr->retnodes_begin()->first; if (&*I == SCCFn) { //O << "Skipped Writing '" << Prefix+I->getName().str() << ".dot'... [" // << Gr->getGraphSize() << "+" << NumCalls << "]\n"; } else { IsDuplicateGraph = true; // Don't double count node/call nodes. } } if (!IsDuplicateGraph) { unsigned GraphSize = Gr->getGraphSize(); if (MaxGraphSize < GraphSize) MaxGraphSize = GraphSize; TotalNumNodes += Gr->getGraphSize(); TotalCallNodes += NumCalls; for (DSGraph::node_iterator NI = Gr->node_begin(), E = Gr->node_end(); NI != E; ++NI) if (NI->isNodeCompletelyFolded()) ++NumFoldedNodes; } } DSGraph* GG = C.getGlobalsGraph(); TotalNumNodes += GG->getGraphSize(); TotalCallNodes += GG->getFunctionCalls().size(); GG->writeGraphToFile(O, Prefix + "GlobalsGraph"); O << "\nGraphs contain [" << TotalNumNodes << "+" << TotalCallNodes << "] nodes total\n"; }