39 cl::desc(
"Show heat colors in call-graph"));
43 cl::desc(
"Show edges labeled with weights"));
47 cl::desc(
"Show call-multigraph (do not remove parallel edges)"));
51 cl::desc(
"The prefix used for the CallGraph dot file names."));
70 for (
Function &
F : M->getFunctionList()) {
71 uint64_t localSumFreq = 0;
72 SmallPtrSet<Function *, 16> Callers;
73 for (User *U : F.users())
75 Callers.insert(cast<Instruction>(U)->getFunction());
76 for (Function *Caller : Callers)
77 localSumFreq += getNumOfCalls(*Caller, F);
78 if (localSumFreq >= MaxFreq)
79 MaxFreq = localSumFreq;
80 Freq[&F] = localSumFreq;
83 removeParallelEdges();
95 void removeParallelEdges() {
96 for (
auto &
I : (*CG)) {
99 bool FoundParallelEdge =
true;
100 while (FoundParallelEdge) {
102 FoundParallelEdge =
false;
103 for (
auto CI =
Node->begin(), CE =
Node->end(); CI != CE; CI++) {
104 if (!(Visited.
insert(CI->second->getFunction())).second) {
105 FoundParallelEdge =
true;
106 Node->removeCallEdge(CI);
123 typedef std::pair<const Function *const, std::unique_ptr<CallGraphNode>>
126 return P.second.get();
147 return "Call graph: " +
161 return "external caller";
163 return "external callee";
166 return std::string(Func->getName());
167 return "external node";
175 decltype(&CGGetValuePtr)>
184 if (Caller ==
nullptr || Caller->isDeclaration())
187 Function *Callee = (*I)->getFunction();
188 if (Callee ==
nullptr)
193 1 + 2 * (double(Counter) / CGInfo->
getMaxFreq());
194 std::string Attrs =
"label=\"" + std::to_string(Counter) +
195 "\" penwidth=" + std::to_string(Width);
211 attrs =
"color=\"" + edgeColor +
"ff\", style=filled, fillcolor=\"" +
221void doCallGraphDOTPrinting(
222 Module &M, function_ref<BlockFrequencyInfo *(Function &)> LookupBFI) {
227 Filename = (std::string(
M.getModuleIdentifier()) +
".callgraph.dot");
234 CallGraphDOTInfo CFGInfo(&M, &CG, LookupBFI);
239 errs() <<
" error opening file for writing!";
243void viewCallGraph(
Module &M,
244 function_ref<BlockFrequencyInfo *(Function &)> LookupBFI) {
246 CallGraphDOTInfo CFGInfo(&M, &CG, LookupBFI);
250 ViewGraph(&CFGInfo,
"callgraph",
true, Title);
264 doCallGraphDOTPrinting(M, LookupBFI);
279 viewCallGraph(M, LookupBFI);
292 void getAnalysisUsage(AnalysisUsage &AU)
const override;
293 bool runOnModule(
Module &M)
override;
296void CallGraphViewer::getAnalysisUsage(
AnalysisUsage &AU)
const {
297 ModulePass::getAnalysisUsage(AU);
302bool CallGraphViewer::runOnModule(
Module &M) {
304 return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(
F).getBFI();
307 viewCallGraph(M, LookupBFI);
314class CallGraphDOTPrinter :
public ModulePass {
317 CallGraphDOTPrinter() : ModulePass(
ID) {}
319 void getAnalysisUsage(AnalysisUsage &AU)
const override;
320 bool runOnModule(
Module &M)
override;
323void CallGraphDOTPrinter::getAnalysisUsage(AnalysisUsage &AU)
const {
324 ModulePass::getAnalysisUsage(AU);
329bool CallGraphDOTPrinter::runOnModule(
Module &M) {
331 return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(
F).getBFI();
334 doCallGraphDOTPrinting(M, LookupBFI);
341char CallGraphViewer::ID = 0;
342INITIALIZE_PASS(CallGraphViewer,
"view-callgraph",
"View call graph",
false,
345char CallGraphDOTPrinter::
ID = 0;
347 "Print call graph to 'dot' file",
false,
false)
356 return new CallGraphDOTPrinter();
This file provides interfaces used to build and manipulate a call graph, which is a very useful tool ...
static cl::opt< bool > ShowHeatColors("callgraph-heat-colors", cl::init(false), cl::Hidden, cl::desc("Show heat colors in call-graph"))
static cl::opt< bool > ShowEdgeWeight("callgraph-show-weights", cl::init(false), cl::Hidden, cl::desc("Show edges labeled with weights"))
static cl::opt< bool > CallMultiGraph("callgraph-multigraph", cl::init(false), cl::Hidden, cl::desc("Show call-multigraph (do not remove parallel edges)"))
static cl::opt< std::string > CallGraphDotFilenamePrefix("callgraph-dot-filename-prefix", cl::Hidden, cl::desc("The prefix used for the CallGraph dot file names."))
This file defines the DenseMap class.
Module.h This file contains the declarations for the Module class.
Machine Check Debug Module
FunctionAnalysisManager FAM
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
CallGraph * getCallGraph() const
std::function< BlockFrequencyInfo *(Function &)> LookupBFI
Module * getModule() const
uint64_t getFreq(const Function *F)
CallGraphDOTInfo(Module *M, CallGraph *CG, function_ref< BlockFrequencyInfo *(Function &)> LookupBFI)
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
A node in the call graph for a module.
std::vector< CallRecord >::const_iterator const_iterator
std::pair< std::optional< WeakTrackingVH >, CallGraphNode * > CallRecord
A pair of the calling instruction (a call or invoke) and the call graph node being called.
LLVM_ABI PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM)
The basic data container for the call graph of a Module of IR.
FunctionMapTy::const_iterator const_iterator
CallGraphNode * getCallsExternalNode() const
CallGraphNode * getExternalCallingNode() const
Returns the CallGraphNode which is used to represent undetermined calls into the callgraph.
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
A Module instance is used to store all the information related to an LLVM module.
const std::string & getModuleIdentifier() const
Get the module identifier which is, essentially, the name of the module.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
An efficient, type-erasing, non-owning reference to a callable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
initializer< Ty > init(const Ty &Val)
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI ModulePass * createCallGraphDOTPrinterPass()
LLVM_ABI uint64_t getNumOfCalls(Function &callerFunction, Function &calledFunction)
InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy
Provide the FunctionAnalysisManager to Module proxy.
raw_ostream & WriteGraph(raw_ostream &O, const GraphType &G, bool ShortNames=false, const Twine &Title="")
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
void ViewGraph(const GraphType &G, const Twine &Name, bool ShortNames=false, const Twine &Title="", GraphProgram::Name Program=GraphProgram::DOT)
ViewGraph - Emit a dot graph, run 'dot', run gv on the postscript file, then cleanup.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI ModulePass * createCallGraphViewerPass()
LLVM_ABI std::string getHeatColor(uint64_t freq, uint64_t maxFreq)
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
DOTGraphTraits(bool isSimple=false)
std::string getNodeAttributes(const CallGraphNode *Node, CallGraphDOTInfo *CGInfo)
static std::string getGraphName(CallGraphDOTInfo *CGInfo)
mapped_iterator< CallGraphNode::const_iterator, decltype(&CGGetValuePtr)> nodes_iterator
static const CallGraphNode * CGGetValuePtr(CallGraphNode::CallRecord P)
static bool isNodeHidden(const CallGraphNode *Node, const CallGraphDOTInfo *CGInfo)
std::string getEdgeAttributes(const CallGraphNode *Node, nodes_iterator I, CallGraphDOTInfo *CGInfo)
std::string getNodeLabel(const CallGraphNode *Node, CallGraphDOTInfo *CGInfo)
static std::string getGraphName(const GraphType &)
getGraphName - Return the label for the graph as a whole.
DefaultDOTGraphTraits(bool simple=false)
static NodeRef getEntryNode(CallGraphDOTInfo *CGInfo)
mapped_iterator< CallGraph::const_iterator, decltype(&CGGetValuePtr)> nodes_iterator
static const CallGraphNode * CGGetValuePtr(const PairTy &P)
static nodes_iterator nodes_begin(CallGraphDOTInfo *CGInfo)
std::pair< const Function *const, std::unique_ptr< CallGraphNode > > PairTy
static nodes_iterator nodes_end(CallGraphDOTInfo *CGInfo)
typename CallGraphDOTInfo *::UnknownGraphTypeError NodeRef