C-Breeze
C Compiler Infrastructure

[ Project home page]

callgraph.h

Go to the documentation of this file.
00001 // $Id: callgraph.h,v 1.6 2003/08/07 23:13:40 pnav Exp $
00002 // ----------------------------------------------------------------------
00003 //
00004 //  C-Breeze
00005 //  C Compiler Framework
00006 // 
00007 //  Copyright (c) 2000 University of Texas at Austin
00008 // 
00009 //  Samuel Z. Guyer
00010 //  Daniel A. Jimenez
00011 //  Calvin Lin
00012 // 
00013 //  Permission is hereby granted, free of charge, to any person
00014 //  obtaining a copy of this software and associated documentation
00015 //  files (the "Software"), to deal in the Software without
00016 //  restriction, including without limitation the rights to use, copy,
00017 //  modify, merge, publish, distribute, sublicense, and/or sell copies
00018 //  of the Software, and to permit persons to whom the Software is
00019 //  furnished to do so, subject to the following conditions:
00020 //  
00021 //  The above copyright notice and this permission notice shall be
00022 //  included in all copies or substantial portions of the Software.
00023 //  
00024 //  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00025 //  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00026 //  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00027 //  NONINFRINGEMENT.  IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT
00028 //  AUSTIN BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
00029 //  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
00030 //  OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00031 //  THE SOFTWARE.
00032 //
00033 //  We acknowledge the C-to-C Translator from MIT Laboratory for
00034 //  Computer Science for inspiring parts of the C-Breeze design.
00035 //
00036 // ----------------------------------------------------------------------
00037 
00038 #ifndef CBZ_CALLGRAPH_H
00039 #define CBZ_CALLGRAPH_H
00040 
00041 #include "linker.h"
00042 #include <set>
00043 
00044 class callGraphNode;
00045 
00046 typedef list< callGraphNode * > callgraph_edge_list;
00047 typedef callgraph_edge_list::iterator callgraph_edge_list_p;
00048 typedef callgraph_edge_list::const_iterator callgraph_edge_list_cp;
00049 
00050 typedef set< callGraphNode * > callgraph_node_set;
00051 typedef callgraph_node_set::iterator callgraph_node_set_p;
00052 
00055 class callGraphNode
00056 {
00057 private:
00058 
00059   procNode * _proc;
00060   callgraph_edge_list _calls;
00061   callgraph_edge_list _called_by;
00062   int _times_called;
00063 
00064 public:
00065 
00066   callGraphNode(procNode * proc)
00067     : _proc(proc),
00068       _calls(),
00069       _called_by(),
00070       _times_called(-1)
00071   {}
00072 
00073   void add_edge(callGraphNode * to);
00078   procNode * proc() const { return _proc; }
00079 
00083   const callgraph_edge_list & calls() const { return _calls; }
00084 
00085 
00089   const callgraph_edge_list & called_by() const { return _called_by; }
00090 
00092   int times_called();
00093 
00094   void ancestors(callgraph_node_set & ancestors_set);
00095 
00096 private:
00097 
00098   int times_called(callgraph_node_set & visited);
00099 
00100 };
00101 
00102 typedef map< procNode *, callGraphNode *> callgraph_map;
00103 typedef callgraph_map::iterator callgraph_map_p;
00104 
00108 class callGraph : public Walker
00109 {
00110 private:
00111 
00112   callgraph_map _callgraph;
00113   procNode * _root;
00114   Linker & _linker;
00115   callGraphNode * _current;
00116 
00117 public:
00118 
00122   callGraph(procNode * root, Linker & linker);
00123 
00124   ~callGraph();
00125 
00126   virtual void at_id(idNode * the_id, Order ord);
00127 
00128   callGraphNode * lookup(procNode * proc);
00129 
00130   void show_all_contexts();
00131 
00132 private:
00133 
00134   void show_all_contexts(callGraphNode * cur,
00135                          callgraph_edge_list & stack,
00136                          int & count);
00137 };
00138 
00139 
00140 #endif // CBZ_CALLGRAPH_H
00141 

Generated on February 1, 2006
Back to the C-Breeze home page