CallGraphSCCPass.cpp revision b576c94c15af9a440f69d9d03c2afead7971118c
1//===- CallGraphSCCPass.cpp - Pass that operates BU on call graph ---------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the CallGraphSCCPass class, which is used for passes 11// which are implemented as bottom-up traversals on the call graph. Because 12// there may be cycles in the call graph, passes of this type operate on the 13// call-graph in SCC order: that is, they process function bottom-up, except for 14// recursive functions, which they process all at once. 15// 16//===----------------------------------------------------------------------===// 17 18#include "llvm/CallGraphSCCPass.h" 19#include "llvm/Analysis/CallGraph.h" 20#include "Support/SCCIterator.h" 21 22/// getAnalysisUsage - For this class, we declare that we require and preserve 23/// the call graph. If the derived class implements this method, it should 24/// always explicitly call the implementation here. 25void CallGraphSCCPass::getAnalysisUsage(AnalysisUsage &AU) const { 26 AU.addRequired<CallGraph>(); 27 AU.addPreserved<CallGraph>(); 28} 29 30bool CallGraphSCCPass::run(Module &M) { 31 CallGraph &CG = getAnalysis<CallGraph>(); 32 bool Changed = false; 33 for (scc_iterator<CallGraph*> I = scc_begin(&CG), E = scc_end(&CG); 34 I != E; ++I) 35 Changed = runOnSCC(*I); 36 return Changed; 37} 38