;
37#define DEBUG_TYPE "CallGraph" 39STATISTIC(NumObjCCallEdges,
"Number of Objective-C method call edges");
40STATISTIC(NumBlockCallEdges,
"Number of block call edges");
53 voidVisitStmt(
Stmt*S) { VisitChildren(S); }
63 return Block->getBlockDecl();
77 if(
Decl*
D= getDeclFromCall(CE))
78addCalledDecl(
D, CE);
92addCalledDecl(FD,
E);
99addCalledDecl(Def,
E);
121 D= IDecl->lookupPrivateMethod(Sel);
123 D= IDecl->lookupPrivateClassMethod(Sel);
125addCalledDecl(
D, ME);
131 voidVisitChildren(
Stmt*S) {
132 for(
Stmt*SubStmt : S->children())
134this->
Visit(SubStmt);
141 if(
BlockDecl*BD = dyn_cast<BlockDecl>(
D))
142addNodeForDecl(BD,
true);
144 for(
auto*I :
D->decls())
145 if(
auto*DC = dyn_cast<DeclContext>(I))
170 if(FD->isDependentContext())
174 if(II && II->
getName().starts_with(
"__inline"))
181voidCallGraph::addNodeForDecl(
Decl*
D,
boolIsGlobal) {
188CGBuilder builder(
this,
Node);
193 if(
autoconstructor = dyn_cast<CXXConstructorDecl>(
D)) {
195builder.Visit(init->getInit());
201FunctionMapTy::const_iterator I = FunctionMap.find(F);
202 if(I == FunctionMap.end())
return nullptr;
203 returnI->second.get();
207 if(F && !isa<ObjCMethodDecl>(F))
210std::unique_ptr<CallGraphNode> &
Node= FunctionMap[F];
214 Node= std::make_unique<CallGraphNode>(F);
222OS <<
" --- Call graph Dump --- \n";
226llvm::ReversePostOrderTraversal<const CallGraph *> RPOT(
this);
227 for(llvm::ReversePostOrderTraversal<const CallGraph *>::rpo_iterator
228I = RPOT.begin(),
E= RPOT.end(); I !=
E; ++I) {
231OS <<
" Function: ";
239CE = N->
end(); CI != CE; ++CI) {
240assert(CI->Callee != Root &&
"No one can call the root node.");
241CI->Callee->print(OS);
250 print(llvm::errs());
254llvm::ViewGraph(
this,
"CallGraph");
258 if(
const NamedDecl*ND = dyn_cast_or_null<NamedDecl>(FD))
259 returnND->printQualifiedName(os);
264 print(llvm::errs());
278 if(
const NamedDecl*ND = dyn_cast_or_null<NamedDecl>(
Node->getDecl()))
279 returnND->getNameAsString();
STATISTIC(NumObjCCallEdges, "Number of Objective-C method call edges")
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Represents a call to a C++ constructor.
Represents a C++ constructor within a class.
Represents a C++ base or member initializer.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a static or instance method of a struct/union/class.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
iterator begin()
Iterators through all the callees/children of the node.
void print(raw_ostream &os) const
SmallVectorImpl< CallRecord >::const_iterator const_iterator
void addCallee(CallRecord Call)
The AST-based call graph.
CallGraphNode * getNode(const Decl *) const
Lookup the node for the given declaration.
void addNodesForBlocks(DeclContext *D)
bool VisitFunctionDecl(FunctionDecl *FD) override
Part of recursive declaration visitation.
CallGraphNode * getOrInsertNode(Decl *)
Lookup the node for the given declaration.
void print(raw_ostream &os) const
static bool includeCalleeInGraph(const Decl *D)
Determine if a declaration should be included in the graph for the purposes of being a callee.
CallGraphNode * getRoot() const
Get the virtual root of the graph, all the functions available externally are represented as callees ...
static bool includeInGraph(const Decl *D)
Determine if a declaration should be included in the graph.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
virtual Stmt * getBody() const
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
virtual bool hasBody() const
Returns true if this Decl represents a declaration for a body of code, such as a function or method d...
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
const T * get() const
Retrieve the stored node as type T.
bool ShouldVisitTemplateInstantiations
Whether this visitor should recurse into template instantiations.
bool ShouldVisitImplicitCode
Whether this visitor should recurse into implicit code, e.g.
bool ShouldWalkTypesOfTypeLocs
Whether this visitor should recurse into the types of TypeLocs.
This represents one expression.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Represents a function declaration or definition.
FunctionDecl * getDefinition()
Get the definition for this declaration.
Declaration of a template function.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
This represents a decl that may have a name.
Represents an ObjC class declaration.
An expression that sends a message to the given Objective-C object or class.
Selector getSelector() const
bool isInstanceMessage() const
Determine whether this is an instance message to either a computed object or to super.
ObjCInterfaceDecl * getReceiverInterface() const
Retrieve the Objective-C interface to which this message is being directed, if known.
Smart pointer class that efficiently represents Objective-C method names.
RetTy Visit(PTR(Stmt) S, ParamTys... P)
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
bool LE(InterpState &S, CodePtr OpPC)
The JSON file list parser is used to communicate input to InstallAPI.
Diagnostic wrappers for TextAPI types for error reporting.
DOTGraphTraits(bool isSimple=false)
static std::string getNodeLabel(const CallGraphNode *Node, const CallGraph *CG)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4