mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-22 20:20:03 +00:00
896f064a49
folding the code into the main Analysis library. There already wasn't much of a distinction between Analysis and IPA. A number of the passes in Analysis are actually IPA passes, and there doesn't seem to be any advantage to separating them. Moreover, it makes it hard to have interactions between analyses that are both local and interprocedural. In trying to make the Alias Analysis infrastructure work with the new pass manager, it becomes particularly awkward to navigate this split. I've tried to find all the places where we referenced this, but I may have missed some. I have also adjusted the C API to continue to be equivalently functional after this change. Differential Revision: http://reviews.llvm.org/D12075 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245318 91177308-0d34-0410-b5e6-96231b3b80d8
93 lines
2.9 KiB
C++
93 lines
2.9 KiB
C++
//===- CallPrinter.cpp - DOT printer for call graph -----------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines '-dot-callgraph', which emit a callgraph.<fnname>.dot
|
|
// containing the call graph of a module.
|
|
//
|
|
// There is also a pass available to directly call dotty ('-view-callgraph').
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Analysis/CallGraph.h"
|
|
#include "llvm/Analysis/CallPrinter.h"
|
|
#include "llvm/Analysis/DOTGraphTraitsPass.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace llvm {
|
|
|
|
template <> struct DOTGraphTraits<CallGraph *> : public DefaultDOTGraphTraits {
|
|
DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
|
|
|
|
static std::string getGraphName(CallGraph *Graph) { return "Call graph"; }
|
|
|
|
std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) {
|
|
if (Function *Func = Node->getFunction())
|
|
return Func->getName();
|
|
|
|
return "external node";
|
|
}
|
|
};
|
|
|
|
struct AnalysisCallGraphWrapperPassTraits {
|
|
static CallGraph *getGraph(CallGraphWrapperPass *P) {
|
|
return &P->getCallGraph();
|
|
}
|
|
};
|
|
|
|
} // end llvm namespace
|
|
|
|
namespace {
|
|
|
|
struct CallGraphViewer
|
|
: public DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *,
|
|
AnalysisCallGraphWrapperPassTraits> {
|
|
static char ID;
|
|
|
|
CallGraphViewer()
|
|
: DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *,
|
|
AnalysisCallGraphWrapperPassTraits>(
|
|
"callgraph", ID) {
|
|
initializeCallGraphViewerPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
};
|
|
|
|
struct CallGraphPrinter : public DOTGraphTraitsModulePrinter<
|
|
CallGraphWrapperPass, true, CallGraph *,
|
|
AnalysisCallGraphWrapperPassTraits> {
|
|
static char ID;
|
|
|
|
CallGraphPrinter()
|
|
: DOTGraphTraitsModulePrinter<CallGraphWrapperPass, true, CallGraph *,
|
|
AnalysisCallGraphWrapperPassTraits>(
|
|
"callgraph", ID) {
|
|
initializeCallGraphPrinterPass(*PassRegistry::getPassRegistry());
|
|
}
|
|
};
|
|
|
|
} // end anonymous namespace
|
|
|
|
char CallGraphViewer::ID = 0;
|
|
INITIALIZE_PASS(CallGraphViewer, "view-callgraph", "View call graph", false,
|
|
false)
|
|
|
|
char CallGraphPrinter::ID = 0;
|
|
INITIALIZE_PASS(CallGraphPrinter, "dot-callgraph",
|
|
"Print call graph to 'dot' file", false, false)
|
|
|
|
// Create methods available outside of this file, to use them
|
|
// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
|
|
// the link time optimization.
|
|
|
|
ModulePass *llvm::createCallGraphViewerPass() { return new CallGraphViewer(); }
|
|
|
|
ModulePass *llvm::createCallGraphPrinterPass() {
|
|
return new CallGraphPrinter();
|
|
}
|