00001 #include <boost/graph/adjacency_list.hpp>
00002 #include <boost/graph/astar_search.hpp>
00003
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
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
00034
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
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
00046
00047
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
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
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
00100
00101
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
00140 return graph;
00141 }
00142
00143
00144
00145
00146 std::pair<std::vector<SgGraphNode*>, std::vector<SgDirectedGraphEdge*> > getAllNodesAndEdges(SgIncidenceDirectedGraph* g, SgGraphNode* start) {
00147
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
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
00179 edsnew.insert(*j);
00180
00181 }
00182
00183
00184
00185
00186
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
00198
00199 return retpr;
00200 }
00201