SgGraphTemplate.h

Go to the documentation of this file.
00001 #include <boost/graph/adjacency_list.hpp>
00002 #include <boost/graph/astar_search.hpp>
00003 //#include <graphProcessing.h>
00004 #include <staticCFG.h>
00005 #include <interproceduralCFG.h>
00006 #include <rose.h>
00007 struct Vertex{
00008     SgGraphNode* sg;
00009     CFGNode cfgnd;
00010 };
00011 
00012 struct Edge {
00013     SgDirectedGraphEdge* gedge;
00014 };
00015 
00016 typedef boost::adjacency_list<
00017         boost::vecS,
00018         boost::vecS,
00019         boost::bidirectionalS,
00020         Vertex,
00021         Edge
00022 > myGraph;
00023 
00024 typedef myGraph::vertex_descriptor VertexID;
00025 typedef myGraph::edge_descriptor EdgeID;
00026 
00027 //myGraph* instantiateGraph(SgIncidencedDirectedGraph* g, StaticCFG::CFG cfg);
00028 std::pair<std::vector<SgGraphNode*>, std::vector<SgDirectedGraphEdge*> > getAllNodesAndEdges(SgIncidenceDirectedGraph* g, SgGraphNode* start);
00029 std::map<VertexID, SgGraphNode*> getGraphNode;
00030 std::map<SgGraphNode*, VertexID> VSlink;
00031 
00032 myGraph* instantiateGraph(SgIncidenceDirectedGraph*& g, StaticCFG::InterproceduralCFG& cfg, SgNode* pstart) {
00033     //SgNode* prestart = cfg.getEntry();
00034     //cfg.buildFullCFG();
00035     CFGNode startN = cfg.getEntry();
00036     SgGraphNode* start = cfg.toGraphNode(startN);
00037     ROSE_ASSERT(startN != NULL);
00038     ROSE_ASSERT(start != NULL);
00039     myGraph* graph = new myGraph;
00040     //std::map<SgGraphNode*, VertexID> VSlink;
00041     std::pair<std::vector<SgGraphNode*>, std::vector<SgDirectedGraphEdge*> > alledsnds = getAllNodesAndEdges(g, start);
00042     std::vector<SgGraphNode*> nods = alledsnds.first;
00043     std::vector<SgDirectedGraphEdge*> eds = alledsnds.second;
00044     std::set<std::pair<VertexID, VertexID> > prs;
00045     //for (std::vector<vertex_descriptor> i = nods.begin(); i != nods.end(); i++) {
00046     //    VertexID vID = boost::add_vertex(graph);
00047     //    graph[vID].cfgnd = cfg->toCFGNode(*i);
00048     //}
00049     for (std::vector<SgDirectedGraphEdge*>::iterator j = eds.begin(); j != eds.end(); j++) {
00050         SgDirectedGraphEdge* u = *j;
00051         SgGraphNode* u1 = u->get_from();
00052         SgGraphNode* u2 = u->get_to();
00053         VertexID v1;
00054         VertexID v2;
00055         if (VSlink.find(u1) == VSlink.end()) {
00056             v1 = boost::add_vertex(*graph);
00057             getGraphNode[v1] = u1;
00058             VSlink[u1] = v1;
00059             (*graph)[v1].sg = u1;
00060             (*graph)[v1].cfgnd = cfg.toCFGNode(u1);
00061         }
00062         else {
00063             v1 = VSlink[u1];
00064         }
00065         if (VSlink.find(u2) != VSlink.end()) {
00066             v2 = VSlink[u2];
00067         }
00068         else {
00069             v2 = boost::add_vertex(*graph);
00070             VSlink[u2] = v2;
00071             (*graph)[v2].sg = u2;
00072             getGraphNode[v2] = u2;
00073             (*graph)[v2].cfgnd = cfg.toCFGNode(u2);
00074         }
00075         bool ok;
00076         EdgeID uE;
00077         std::pair<VertexID, VertexID> pr;
00078         pr.first = v1;
00079         pr.second = v2;
00080         if (prs.find(pr) == prs.end()) {
00081             prs.insert(pr);
00082             boost::tie(uE, ok) = boost::add_edge(v1, v2, *graph);
00083         }
00084     }
00085     //std::cout << "prs.size: " << prs.size() << std::endl;
00086     return graph;
00087 }
00088 
00089 
00090 
00091 myGraph* instantiateGraph(SgIncidenceDirectedGraph*& g, StaticCFG::CFG& cfg) {
00092     SgGraphNode* start = cfg.getEntry();
00093     myGraph* graph = new myGraph;
00094     //std::map<SgGraphNode*, VertexID> VSlink;
00095     std::pair<std::vector<SgGraphNode*>, std::vector<SgDirectedGraphEdge*> > alledsnds = getAllNodesAndEdges(g, start);
00096     std::vector<SgGraphNode*> nods = alledsnds.first;
00097     std::vector<SgDirectedGraphEdge*> eds = alledsnds.second;
00098     std::set<std::pair<VertexID, VertexID> > prs;
00099     //for (std::vector<vertex_descriptor> i = nods.begin(); i != nods.end(); i++) {
00100     //    VertexID vID = boost::add_vertex(graph);
00101     //    graph[vID].cfgnd = cfg->toCFGNode(*i);
00102     //}
00103     for (std::vector<SgDirectedGraphEdge*>::iterator j = eds.begin(); j != eds.end(); j++) {
00104         SgDirectedGraphEdge* u = *j;
00105         SgGraphNode* u1 = u->get_from();
00106         SgGraphNode* u2 = u->get_to();
00107         VertexID v1;
00108         VertexID v2;
00109         if (VSlink.find(u1) == VSlink.end()) {
00110             v1 = boost::add_vertex(*graph);
00111             getGraphNode[v1] = u1;
00112             VSlink[u1] = v1;
00113             (*graph)[v1].sg = u1;
00114             (*graph)[v1].cfgnd = cfg.toCFGNode(u1);
00115         }
00116         else {
00117             v1 = VSlink[u1];
00118         }
00119         if (VSlink.find(u2) != VSlink.end()) {
00120             v2 = VSlink[u2];
00121         }
00122         else {
00123             v2 = boost::add_vertex(*graph);
00124             VSlink[u2] = v2;
00125             (*graph)[v2].sg = u2;
00126             getGraphNode[v2] = u2;
00127             (*graph)[v2].cfgnd = cfg.toCFGNode(u2);
00128         }
00129         bool ok;
00130         EdgeID uE;
00131         std::pair<VertexID, VertexID> pr;
00132         pr.first = v1;
00133         pr.second = v2;
00134         if (prs.find(pr) == prs.end()) {
00135             prs.insert(pr);
00136             boost::tie(uE, ok) = boost::add_edge(v1, v2, *graph);
00137         }
00138     }
00139     //std::cout << "prs.size: " << prs.size() << std::endl;
00140     return graph;
00141 }
00142 
00143 
00144     
00145             
00146 std::pair<std::vector<SgGraphNode*>, std::vector<SgDirectedGraphEdge*> > getAllNodesAndEdges(SgIncidenceDirectedGraph* g, SgGraphNode* start) {
00147     //for (int i = 0; i < starts.size(); i++) {
00148     SgGraphNode* n = start;
00149     std::vector<SgGraphNode*> nods;
00150     std::vector<SgGraphNode*> newnods;
00151     std::set<SgDirectedGraphEdge*> edsnew;
00152     std::vector<SgDirectedGraphEdge*> eds;
00153     std::vector<SgDirectedGraphEdge*> feds;
00154     std::vector<SgGraphNode*> fnods;
00155     std::set<std::pair<EdgeID, EdgeID> > prs;
00156     std::set<SgDirectedGraphEdge*> oeds = g->computeEdgeSetOut(start);
00157     fnods.push_back(start);
00158     newnods.push_back(n);
00159     
00160     while (oeds.size() > 0) {
00161         for (std::set<SgDirectedGraphEdge*>::iterator j = oeds.begin(); j != oeds.end(); j++) {
00162             //if (find(eds.begin(), eds.end(), *j) == eds.end()) {
00163                 if (find(feds.begin(), feds.end(), *j) == feds.end()) {
00164                     feds.push_back(*j);
00165                     edsnew.insert(*j);
00166                 }
00167                 if (find(fnods.begin(), fnods.end(), (*j)->get_to()) == fnods.end()) {
00168                     fnods.push_back((*j)->get_to());
00169                 }
00170                 newnods.push_back((*j)->get_to());
00171             //}
00172         }
00173         
00174         for (unsigned int i = 0; i < newnods.size(); i++) {
00175            std::set<SgDirectedGraphEdge*> oedsp = g->computeEdgeSetOut(newnods[i]);
00176            for (std::set<SgDirectedGraphEdge*>::iterator j = oedsp.begin(); j != oedsp.end(); j++) {
00177                if (find(feds.begin(), feds.end(), *j) == feds.end()) {
00178               //    feds.push_back(*j);
00179                   edsnew.insert(*j);
00180                   
00181                }
00182                //if (find(fnods.begin(), fnods.end(), (*j)->get_to()) == fnods.end()) {
00183                //    fnods.push_back((*j)->get_to());
00184                //    newnods.push_back((*j)->get_to());
00185               // }
00186     //           newnods.push_back((*j)->get_to());
00187            }
00188         }
00189         nods = newnods;
00190         oeds = edsnew;
00191         edsnew.clear();
00192         newnods.clear();
00193     }
00194     std::pair<std::vector<SgGraphNode*>, std::vector<SgDirectedGraphEdge*> > retpr;
00195     retpr.first = fnods;
00196     retpr.second = feds;
00197     //std::cout << "fnods.size()" << fnods.size() << std::endl;
00198     //std::cout << "feds.size()" << feds.size() << std::endl;
00199     return retpr;
00200 }
00201          

Generated on Wed May 16 06:18:11 2012 for ROSE by  doxygen 1.4.7