Added comments. Added FIXME regarding how the call graph fixup probably isn't needed anymore. No functionality changes. llvm-svn: 88056
diff --git a/safecode/lib/ArrayBoundChecks/BottomUpCallGraph.cpp b/safecode/lib/ArrayBoundChecks/BottomUpCallGraph.cpp index 78a8cb7..16a1fa6 100755 --- a/safecode/lib/ArrayBoundChecks/BottomUpCallGraph.cpp +++ b/safecode/lib/ArrayBoundChecks/BottomUpCallGraph.cpp
@@ -7,6 +7,16 @@ // //===----------------------------------------------------------------------===// // +// I believe this pass does two things: +// o) It attempts to improve upon the call graph calculated by DSA for those +// call sites in which a callee was not found. +// o) It finds functions that are part of Strongly Connected Components (SCCs) +// in the call graph and marks them being a part of an SCC. +// +// FIXME: +// I believe the fixup of the call graph is no longer necessary; DSA asserts +// if it can't find a callee for a call instruction. +// //===----------------------------------------------------------------------===// #define DEBUG_TYPE "bucg" @@ -25,6 +35,7 @@ using namespace llvm; namespace llvm { + char BottomUpCallGraph::ID = 0; // @@ -106,34 +117,46 @@ } -void BottomUpCallGraph::visit(Function *f) { +void +BottomUpCallGraph::visit (Function *f) { if (Visited.find(f) == Visited.end()) { - //Have not visited it before + // Record that we have now visited this function Visited.insert(f); - //not visited implies it won't be there on the stack anyways, so push it - //on stack + + // + // If we have not visited this function before, that implies that the + // function won't be on the stack; therefore, push it on stack + // Stack.push_back(f); + + // + // Visit all the functions that can call this function. + // if (FuncCallSiteMap.count(f)) { std::vector<CallSite> & callsitelist = FuncCallSiteMap[f]; for (unsigned idx = 0, sz = callsitelist.size(); idx != sz; ++idx) { - Function *parent = callsitelist[idx].getInstruction()->getParent()->getParent(); - visit(parent); + Function *parent = callsitelist[idx].getInstruction()->getParent() + ->getParent(); + visit(parent); } } Stack.pop_back(); } else { - //Have already visited it, check if it forms SCC - std::vector<Function*>::iterator res = std::find(Stack.begin(), Stack.end(), f); + // We have already visited this function; check if it forms an SCC + std::vector<Function*>::iterator res = std::find (Stack.begin(), + Stack.end(), + f); if (res != Stack.end()) { - //Cycle detected. + // Cycle detected. for (; res != Stack.end() ; ++res) { - SccList.insert(*res); + SccList.insert(*res); } } } } -void BottomUpCallGraph::figureOutSCCs(Module &M) { +void +BottomUpCallGraph::figureOutSCCs (Module &M) { for (Module::iterator I = M.begin(), E= M.end(); I != E ; ++I) { visit(I); }