[cfe-commits] r151950 - in /cfe/trunk: examples/wpa/clang-wpa.cpp include/clang/Index/CallGraph.h include/clang/Index/GlobalCallGraph.h lib/Index/CallGraph.cpp lib/Index/GlobalCallGraph.cpp
Delesley Hutchins
delesley at google.com
Fri Mar 2 15:06:09 PST 2012
Please update the makefiles accordingly; clang no longer builds.
-DeLesley
On Fri, Mar 2, 2012 at 2:54 PM, Anna Zaks <ganna at apple.com> wrote:
> Author: zaks
> Date: Fri Mar 2 16:54:36 2012
> New Revision: 151950
>
> URL: http://llvm.org/viewvc/llvm-project?rev=151950&view=rev
> Log:
> [analyzer] Rename clang::CallGraph into clang::idx::CallGraph + rename
> the corresponding files to avoid confusion.
>
> This is a preparation to adding an AST-based call graph to Analysis. The
> existing call graph works with indexer entries. We might be able to
> refactor it to use the AST based graph in the future.
>
> (Minimal testing here as the only example that uses the API has been
> completely broken, does not compile.)
>
> Added:
> cfe/trunk/include/clang/Index/GlobalCallGraph.h
> - copied, changed from r151947, cfe/trunk/include/clang/Index/CallGraph.h
> cfe/trunk/lib/Index/GlobalCallGraph.cpp
> - copied, changed from r151947, cfe/trunk/lib/Index/CallGraph.cpp
> Removed:
> cfe/trunk/include/clang/Index/CallGraph.h
> cfe/trunk/lib/Index/CallGraph.cpp
> Modified:
> cfe/trunk/examples/wpa/clang-wpa.cpp
>
> Modified: cfe/trunk/examples/wpa/clang-wpa.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/wpa/clang-wpa.cpp?rev=151950&r1=151949&r2=151950&view=diff
> ==============================================================================
> --- cfe/trunk/examples/wpa/clang-wpa.cpp (original)
> +++ cfe/trunk/examples/wpa/clang-wpa.cpp Fri Mar 2 16:54:36 2012
> @@ -22,7 +22,7 @@
> #include "clang/StaticAnalyzer/Checkers/LocalCheckers.h"
> #include "clang/Frontend/ASTUnit.h"
> #include "clang/Frontend/CompilerInstance.h"
> -#include "clang/Index/CallGraph.h"
> +#include "clang/Index/GlobalCallGraph.h"
> #include "clang/Index/Indexer.h"
> #include "clang/Index/TranslationUnit.h"
> #include "clang/Index/DeclReferenceMap.h"
> @@ -104,8 +104,8 @@
> }
>
> if (ViewCallGraph) {
> - OwningPtr<CallGraph> CG;
> - CG.reset(new CallGraph(Prog));
> + OwningPtr<clang::idx::CallGraph> CG;
> + CG.reset(new clang::idx::CallGraph(Prog));
>
> for (unsigned i = 0, e = ASTUnits.size(); i != e; ++i)
> CG->addTU(ASTUnits[i]->getASTContext());
>
> Removed: cfe/trunk/include/clang/Index/CallGraph.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/CallGraph.h?rev=151949&view=auto
> ==============================================================================
> --- cfe/trunk/include/clang/Index/CallGraph.h (original)
> +++ cfe/trunk/include/clang/Index/CallGraph.h (removed)
> @@ -1,146 +0,0 @@
> -//== CallGraph.cpp - Call graph building ------------------------*- C++ -*--==//
> -//
> -// The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -//
> -// This file defined the CallGraph and CallGraphNode classes.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef LLVM_CLANG_ANALYSIS_CALLGRAPH
> -#define LLVM_CLANG_ANALYSIS_CALLGRAPH
> -
> -#include "clang/Index/ASTLocation.h"
> -#include "clang/Index/Entity.h"
> -#include "clang/Index/Program.h"
> -#include "llvm/ADT/DenseMap.h"
> -#include "llvm/ADT/GraphTraits.h"
> -#include "llvm/ADT/STLExtras.h"
> -#include <vector>
> -#include <map>
> -
> -namespace clang {
> -
> -class CallGraphNode {
> - idx::Entity F;
> - typedef std::pair<idx::ASTLocation, CallGraphNode*> CallRecord;
> - std::vector<CallRecord> CalledFunctions;
> -
> -public:
> - CallGraphNode(idx::Entity f) : F(f) {}
> -
> - typedef std::vector<CallRecord>::iterator iterator;
> - typedef std::vector<CallRecord>::const_iterator const_iterator;
> -
> - iterator begin() { return CalledFunctions.begin(); }
> - iterator end() { return CalledFunctions.end(); }
> - const_iterator begin() const { return CalledFunctions.begin(); }
> - const_iterator end() const { return CalledFunctions.end(); }
> -
> - void addCallee(idx::ASTLocation L, CallGraphNode *Node) {
> - CalledFunctions.push_back(std::make_pair(L, Node));
> - }
> -
> - bool hasCallee() const { return begin() != end(); }
> -
> - std::string getName() const { return F.getPrintableName(); }
> -
> - Decl *getDecl(ASTContext &Ctx) const { return F.getDecl(Ctx); }
> -};
> -
> -class CallGraph {
> - /// Program manages all Entities.
> - idx::Program &Prog;
> -
> - typedef std::map<idx::Entity, CallGraphNode *> FunctionMapTy;
> -
> - /// FunctionMap owns all CallGraphNodes.
> - FunctionMapTy FunctionMap;
> -
> - /// CallerCtx maps a caller to its ASTContext.
> - llvm::DenseMap<CallGraphNode *, ASTContext *> CallerCtx;
> -
> - /// Root node is the 'main' function or 0.
> - CallGraphNode *Root;
> -
> - /// ExternalCallingNode has edges to all external functions.
> - CallGraphNode *ExternalCallingNode;
> -
> -public:
> - CallGraph(idx::Program &P);
> - ~CallGraph();
> -
> - typedef FunctionMapTy::iterator iterator;
> - typedef FunctionMapTy::const_iterator const_iterator;
> -
> - iterator begin() { return FunctionMap.begin(); }
> - iterator end() { return FunctionMap.end(); }
> - const_iterator begin() const { return FunctionMap.begin(); }
> - const_iterator end() const { return FunctionMap.end(); }
> -
> - CallGraphNode *getRoot() { return Root; }
> -
> - CallGraphNode *getExternalCallingNode() { return ExternalCallingNode; }
> -
> - void addTU(ASTContext &AST);
> -
> - idx::Program &getProgram() { return Prog; }
> -
> - CallGraphNode *getOrInsertFunction(idx::Entity F);
> -
> - Decl *getDecl(CallGraphNode *Node);
> -
> - void print(raw_ostream &os);
> - void dump();
> -
> - void ViewCallGraph() const;
> -};
> -
> -} // end clang namespace
> -
> -namespace llvm {
> -
> -template <> struct GraphTraits<clang::CallGraph> {
> - typedef clang::CallGraph GraphType;
> - typedef clang::CallGraphNode NodeType;
> -
> - typedef std::pair<clang::idx::ASTLocation, NodeType*> CGNPairTy;
> - typedef std::pointer_to_unary_function<CGNPairTy, NodeType*> CGNDerefFun;
> -
> - typedef mapped_iterator<NodeType::iterator, CGNDerefFun> ChildIteratorType;
> -
> - static NodeType *getEntryNode(GraphType *CG) {
> - return CG->getExternalCallingNode();
> - }
> -
> - static ChildIteratorType child_begin(NodeType *N) {
> - return map_iterator(N->begin(), CGNDerefFun(CGNDeref));
> - }
> - static ChildIteratorType child_end(NodeType *N) {
> - return map_iterator(N->end(), CGNDerefFun(CGNDeref));
> - }
> -
> - typedef std::pair<clang::idx::Entity, NodeType*> PairTy;
> - typedef std::pointer_to_unary_function<PairTy, NodeType*> DerefFun;
> -
> - typedef mapped_iterator<GraphType::const_iterator, DerefFun> nodes_iterator;
> -
> - static nodes_iterator nodes_begin(const GraphType &CG) {
> - return map_iterator(CG.begin(), DerefFun(CGDeref));
> - }
> - static nodes_iterator nodes_end(const GraphType &CG) {
> - return map_iterator(CG.end(), DerefFun(CGDeref));
> - }
> -
> - static NodeType *CGNDeref(CGNPairTy P) { return P.second; }
> -
> - static NodeType *CGDeref(PairTy P) { return P.second; }
> -};
> -
> -} // end llvm namespace
> -
> -#endif
>
> Copied: cfe/trunk/include/clang/Index/GlobalCallGraph.h (from r151947, cfe/trunk/include/clang/Index/CallGraph.h)
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Index/GlobalCallGraph.h?p2=cfe/trunk/include/clang/Index/GlobalCallGraph.h&p1=cfe/trunk/include/clang/Index/CallGraph.h&r1=151947&r2=151950&rev=151950&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Index/CallGraph.h (original)
> +++ cfe/trunk/include/clang/Index/GlobalCallGraph.h Fri Mar 2 16:54:36 2012
> @@ -1,4 +1,4 @@
> -//== CallGraph.cpp - Call graph building ------------------------*- C++ -*--==//
> +//== GlobalCallGraph.h - Call graph building --------------------*- C++ -*--==//
> //
> // The LLVM Compiler Infrastructure
> //
> @@ -11,8 +11,8 @@
> //
> //===----------------------------------------------------------------------===//
>
> -#ifndef LLVM_CLANG_ANALYSIS_CALLGRAPH
> -#define LLVM_CLANG_ANALYSIS_CALLGRAPH
> +#ifndef LLVM_CLANG_INDEX_CALLGRAPH
> +#define LLVM_CLANG_INDEX_CALLGRAPH
>
> #include "clang/Index/ASTLocation.h"
> #include "clang/Index/Entity.h"
> @@ -23,15 +23,18 @@
> #include <vector>
> #include <map>
>
> +using namespace clang;
> +
> namespace clang {
> +namespace idx {
>
> class CallGraphNode {
> - idx::Entity F;
> - typedef std::pair<idx::ASTLocation, CallGraphNode*> CallRecord;
> + Entity F;
> + typedef std::pair<ASTLocation, CallGraphNode*> CallRecord;
> std::vector<CallRecord> CalledFunctions;
>
> public:
> - CallGraphNode(idx::Entity f) : F(f) {}
> + CallGraphNode(Entity f) : F(f) {}
>
> typedef std::vector<CallRecord>::iterator iterator;
> typedef std::vector<CallRecord>::const_iterator const_iterator;
> @@ -41,7 +44,7 @@
> const_iterator begin() const { return CalledFunctions.begin(); }
> const_iterator end() const { return CalledFunctions.end(); }
>
> - void addCallee(idx::ASTLocation L, CallGraphNode *Node) {
> + void addCallee(ASTLocation L, CallGraphNode *Node) {
> CalledFunctions.push_back(std::make_pair(L, Node));
> }
>
> @@ -54,9 +57,9 @@
>
> class CallGraph {
> /// Program manages all Entities.
> - idx::Program &Prog;
> + Program &Prog;
>
> - typedef std::map<idx::Entity, CallGraphNode *> FunctionMapTy;
> + typedef std::map<Entity, CallGraphNode *> FunctionMapTy;
>
> /// FunctionMap owns all CallGraphNodes.
> FunctionMapTy FunctionMap;
> @@ -71,7 +74,7 @@
> CallGraphNode *ExternalCallingNode;
>
> public:
> - CallGraph(idx::Program &P);
> + CallGraph(Program &P);
> ~CallGraph();
>
> typedef FunctionMapTy::iterator iterator;
> @@ -88,7 +91,7 @@
>
> void addTU(ASTContext &AST);
>
> - idx::Program &getProgram() { return Prog; }
> + Program &getProgram() { return Prog; }
>
> CallGraphNode *getOrInsertFunction(idx::Entity F);
>
> @@ -100,13 +103,13 @@
> void ViewCallGraph() const;
> };
>
> -} // end clang namespace
> +}} // end clang idx namespace
>
> namespace llvm {
>
> -template <> struct GraphTraits<clang::CallGraph> {
> - typedef clang::CallGraph GraphType;
> - typedef clang::CallGraphNode NodeType;
> +template <> struct GraphTraits<clang::idx::CallGraph> {
> + typedef clang::idx::CallGraph GraphType;
> + typedef clang::idx::CallGraphNode NodeType;
>
> typedef std::pair<clang::idx::ASTLocation, NodeType*> CGNPairTy;
> typedef std::pointer_to_unary_function<CGNPairTy, NodeType*> CGNDerefFun;
>
> Removed: cfe/trunk/lib/Index/CallGraph.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/CallGraph.cpp?rev=151949&view=auto
> ==============================================================================
> --- cfe/trunk/lib/Index/CallGraph.cpp (original)
> +++ cfe/trunk/lib/Index/CallGraph.cpp (removed)
> @@ -1,150 +0,0 @@
> -//== CallGraph.cpp - Call graph building ------------------------*- C++ -*--==//
> -//
> -// The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -//
> -// This file defined the CallGraph and CGBuilder classes.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#include "clang/Index/CallGraph.h"
> -
> -#include "clang/AST/ASTContext.h"
> -#include "clang/AST/StmtVisitor.h"
> -
> -#include "llvm/Support/GraphWriter.h"
> -
> -using namespace clang;
> -using namespace idx;
> -
> -namespace {
> -class CGBuilder : public StmtVisitor<CGBuilder> {
> -
> - CallGraph &G;
> - FunctionDecl *FD;
> -
> - Entity CallerEnt;
> -
> - CallGraphNode *CallerNode;
> -
> -public:
> - CGBuilder(CallGraph &g, FunctionDecl *fd, Entity E, CallGraphNode *N)
> - : G(g), FD(fd), CallerEnt(E), CallerNode(N) {}
> -
> - void VisitStmt(Stmt *S) { VisitChildren(S); }
> -
> - void VisitCallExpr(CallExpr *CE);
> -
> - void VisitChildren(Stmt *S) {
> - for (Stmt::child_range I = S->children(); I; ++I)
> - if (*I)
> - static_cast<CGBuilder*>(this)->Visit(*I);
> - }
> -};
> -}
> -
> -void CGBuilder::VisitCallExpr(CallExpr *CE) {
> - if (FunctionDecl *CalleeDecl = CE->getDirectCallee()) {
> - Entity Ent = Entity::get(CalleeDecl, G.getProgram());
> - CallGraphNode *CalleeNode = G.getOrInsertFunction(Ent);
> - CallerNode->addCallee(ASTLocation(FD, CE), CalleeNode);
> - }
> -}
> -
> -CallGraph::CallGraph(Program &P) : Prog(P), Root(0) {
> - ExternalCallingNode = getOrInsertFunction(Entity());
> -}
> -
> -CallGraph::~CallGraph() {
> - if (!FunctionMap.empty()) {
> - for (FunctionMapTy::iterator I = FunctionMap.begin(), E = FunctionMap.end();
> - I != E; ++I)
> - delete I->second;
> - FunctionMap.clear();
> - }
> -}
> -
> -void CallGraph::addTU(ASTContext& Ctx) {
> - DeclContext *DC = Ctx.getTranslationUnitDecl();
> - for (DeclContext::decl_iterator I = DC->decls_begin(), E = DC->decls_end();
> - I != E; ++I) {
> -
> - if (FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) {
> - if (FD->doesThisDeclarationHaveABody()) {
> - // Set caller's ASTContext.
> - Entity Ent = Entity::get(FD, Prog);
> - CallGraphNode *Node = getOrInsertFunction(Ent);
> - CallerCtx[Node] = &Ctx;
> -
> - // If this function has external linkage, anything could call it.
> - if (FD->isGlobal())
> - ExternalCallingNode->addCallee(idx::ASTLocation(), Node);
> -
> - // Set root node to 'main' function.
> - if (FD->getNameAsString() == "main")
> - Root = Node;
> -
> - CGBuilder builder(*this, FD, Ent, Node);
> - builder.Visit(FD->getBody());
> - }
> - }
> - }
> -}
> -
> -CallGraphNode *CallGraph::getOrInsertFunction(Entity F) {
> - CallGraphNode *&Node = FunctionMap[F];
> - if (Node)
> - return Node;
> -
> - return Node = new CallGraphNode(F);
> -}
> -
> -Decl *CallGraph::getDecl(CallGraphNode *Node) {
> - // Get the function's context.
> - ASTContext *Ctx = CallerCtx[Node];
> -
> - return Node->getDecl(*Ctx);
> -}
> -
> -void CallGraph::print(raw_ostream &os) {
> - for (iterator I = begin(), E = end(); I != E; ++I) {
> - if (I->second->hasCallee()) {
> - os << "function: " << I->first.getPrintableName()
> - << " calls:\n";
> - for (CallGraphNode::iterator CI = I->second->begin(),
> - CE = I->second->end(); CI != CE; ++CI) {
> - os << " " << CI->second->getName();
> - }
> - os << '\n';
> - }
> - }
> -}
> -
> -void CallGraph::dump() {
> - print(llvm::errs());
> -}
> -
> -void CallGraph::ViewCallGraph() const {
> - llvm::ViewGraph(*this, "CallGraph");
> -}
> -
> -namespace llvm {
> -
> -template <>
> -struct DOTGraphTraits<CallGraph> : public DefaultDOTGraphTraits {
> -
> - DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {}
> -
> - static std::string getNodeLabel(const CallGraphNode *Node,
> - const CallGraph &CG) {
> - return Node->getName();
> -
> - }
> -
> -};
> -
> -}
>
> Copied: cfe/trunk/lib/Index/GlobalCallGraph.cpp (from r151947, cfe/trunk/lib/Index/CallGraph.cpp)
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/GlobalCallGraph.cpp?p2=cfe/trunk/lib/Index/GlobalCallGraph.cpp&p1=cfe/trunk/lib/Index/CallGraph.cpp&r1=151947&r2=151950&rev=151950&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Index/CallGraph.cpp (original)
> +++ cfe/trunk/lib/Index/GlobalCallGraph.cpp Fri Mar 2 16:54:36 2012
> @@ -1,4 +1,4 @@
> -//== CallGraph.cpp - Call graph building ------------------------*- C++ -*--==//
> +//== GlobalCallGraph.cpp - Call graph building ------------------*- C++ -*--==//
> //
> // The LLVM Compiler Infrastructure
> //
> @@ -11,15 +11,17 @@
> //
> //===----------------------------------------------------------------------===//
>
> -#include "clang/Index/CallGraph.h"
> +#include "clang/Index/GlobalCallGraph.h"
>
> #include "clang/AST/ASTContext.h"
> #include "clang/AST/StmtVisitor.h"
>
> #include "llvm/Support/GraphWriter.h"
>
> -using namespace clang;
> -using namespace idx;
> +using namespace clang::idx;
> +using clang::FunctionDecl;
> +using clang::DeclContext;
> +using clang::ASTContext;
>
> namespace {
> class CGBuilder : public StmtVisitor<CGBuilder> {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
--
DeLesley Hutchins | Software Engineer | delesley at google.com | 505-206-0315
More information about the cfe-commits
mailing list