diff options
Diffstat (limited to 'llvm/lib/Analysis/CallPrinter.cpp')
| -rw-r--r-- | llvm/lib/Analysis/CallPrinter.cpp | 106 |
1 files changed, 77 insertions, 29 deletions
diff --git a/llvm/lib/Analysis/CallPrinter.cpp b/llvm/lib/Analysis/CallPrinter.cpp index 829532a0fa10..65e3184fad91 100644 --- a/llvm/lib/Analysis/CallPrinter.cpp +++ b/llvm/lib/Analysis/CallPrinter.cpp @@ -14,18 +14,23 @@ //===----------------------------------------------------------------------===// #include "llvm/Analysis/CallPrinter.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/SmallSet.h" #include "llvm/Analysis/BlockFrequencyInfo.h" -#include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/CallGraph.h" -#include "llvm/Analysis/DOTGraphTraitsPass.h" #include "llvm/Analysis/HeatUtils.h" -#include "llvm/Support/CommandLine.h" +#include "llvm/IR/Instructions.h" #include "llvm/InitializePasses.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/SmallSet.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/DOTGraphTraits.h" +#include "llvm/Support/GraphWriter.h" using namespace llvm; +namespace llvm { +template <class GraphType> struct GraphTraits; +} + // This option shows static (relative) call counts. // FIXME: // Need to show real counts when profile data is available @@ -213,6 +218,71 @@ struct DOTGraphTraits<CallGraphDOTInfo *> : public DefaultDOTGraphTraits { } // end llvm namespace namespace { +void doCallGraphDOTPrinting( + Module &M, function_ref<BlockFrequencyInfo *(Function &)> LookupBFI) { + std::string Filename; + if (!CallGraphDotFilenamePrefix.empty()) + Filename = (CallGraphDotFilenamePrefix + ".callgraph.dot"); + else + Filename = (std::string(M.getModuleIdentifier()) + ".callgraph.dot"); + errs() << "Writing '" << Filename << "'..."; + + std::error_code EC; + raw_fd_ostream File(Filename, EC, sys::fs::OF_Text); + + CallGraph CG(M); + CallGraphDOTInfo CFGInfo(&M, &CG, LookupBFI); + + if (!EC) + WriteGraph(File, &CFGInfo); + else + errs() << " error opening file for writing!"; + errs() << "\n"; +} + +void viewCallGraph(Module &M, + function_ref<BlockFrequencyInfo *(Function &)> LookupBFI) { + CallGraph CG(M); + CallGraphDOTInfo CFGInfo(&M, &CG, LookupBFI); + + std::string Title = + DOTGraphTraits<CallGraphDOTInfo *>::getGraphName(&CFGInfo); + ViewGraph(&CFGInfo, "callgraph", true, Title); +} +} // namespace + +namespace llvm { +PreservedAnalyses CallGraphDOTPrinterPass::run(Module &M, + ModuleAnalysisManager &AM) { + FunctionAnalysisManager &FAM = + AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); + + auto LookupBFI = [&FAM](Function &F) { + return &FAM.getResult<BlockFrequencyAnalysis>(F); + }; + + doCallGraphDOTPrinting(M, LookupBFI); + + return PreservedAnalyses::all(); +} + +PreservedAnalyses CallGraphViewerPass::run(Module &M, + ModuleAnalysisManager &AM) { + + FunctionAnalysisManager &FAM = + AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); + + auto LookupBFI = [&FAM](Function &F) { + return &FAM.getResult<BlockFrequencyAnalysis>(F); + }; + + viewCallGraph(M, LookupBFI); + + return PreservedAnalyses::all(); +} +} // namespace llvm + +namespace { // Viewer class CallGraphViewer : public ModulePass { public: @@ -234,12 +304,7 @@ bool CallGraphViewer::runOnModule(Module &M) { return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI(); }; - CallGraph CG(M); - CallGraphDOTInfo CFGInfo(&M, &CG, LookupBFI); - - std::string Title = - DOTGraphTraits<CallGraphDOTInfo *>::getGraphName(&CFGInfo); - ViewGraph(&CFGInfo, "callgraph", true, Title); + viewCallGraph(M, LookupBFI); return false; } @@ -266,24 +331,7 @@ bool CallGraphDOTPrinter::runOnModule(Module &M) { return &this->getAnalysis<BlockFrequencyInfoWrapperPass>(F).getBFI(); }; - std::string Filename; - if (!CallGraphDotFilenamePrefix.empty()) - Filename = (CallGraphDotFilenamePrefix + ".callgraph.dot"); - else - Filename = (std::string(M.getModuleIdentifier()) + ".callgraph.dot"); - errs() << "Writing '" << Filename << "'..."; - - std::error_code EC; - raw_fd_ostream File(Filename, EC, sys::fs::OF_Text); - - CallGraph CG(M); - CallGraphDOTInfo CFGInfo(&M, &CG, LookupBFI); - - if (!EC) - WriteGraph(File, &CFGInfo); - else - errs() << " error opening file for writing!"; - errs() << "\n"; + doCallGraphDOTPrinting(M, LookupBFI); return false; } |
