diff --git a/include/BasicBlock.h b/include/BasicBlock.h index 8fbab54..3d2f723 100644 --- a/include/BasicBlock.h +++ b/include/BasicBlock.h @@ -26,7 +26,7 @@ private: BB() : nodeType(0),traversed(0),start(0),length(0), numHlIcodes(0),flg(0), inEdges(0), - numOutEdges(0),edges(0),beenOnH(0),inEdgeCount(0),reachingInt(0), + edges(0),beenOnH(0),inEdgeCount(0),reachingInt(0), inInterval(0),correspInt(0),liveUse(0),def(0),liveIn(0),liveOut(0), dfsFirstNum(0),dfsLastNum(0),immedDom(0),ifFollow(0),loopType(0),latchNode(0), numBackEdges(0),loopHead(0),loopFollow(0),caseHead(0),caseTail(0),index(0) @@ -37,24 +37,24 @@ private: //Int numInEdges; /* Number of in edges */ public: - Int begin(); - Int end(); - Int rbegin(); - Int rend(); - ICODE &front(); - ICODE &back(); - size_t size(); + Int begin(); + Int end(); + Int rbegin(); + Int rend(); + ICODE &front(); + ICODE &back(); + size_t size(); byte nodeType; /* Type of node */ int traversed; /* Boolean: traversed yet? */ Int start; /* First instruction offset */ Int length; /* No. of instructions this BB */ Int numHlIcodes; /* No. of high-level icodes */ flags32 flg; /* BB flags */ - + /* In edges and out edges */ std::vector inEdges; // does not own held pointers - Int numOutEdges; /* Number of out edges */ + //Int numOutEdges; /* Number of out edges */ std::vector edges;/* Array of ptrs. to out edges */ /* For interval construction */ diff --git a/src/BasicBlock.cpp b/src/BasicBlock.cpp index 83fc42f..d2b39ea 100644 --- a/src/BasicBlock.cpp +++ b/src/BasicBlock.cpp @@ -22,7 +22,6 @@ BB *BB::Create(Int start, Int ip, byte nodeType, Int numOutEdges, Function *pare pnewBB->nodeType = nodeType; /* Initialise */ pnewBB->start = start; pnewBB->length = ip - start + 1; - pnewBB->numOutEdges = (byte)numOutEdges; pnewBB->immedDom = NO_DOM; pnewBB->loopHead = pnewBB->caseHead = pnewBB->caseTail = pnewBB->latchNode= pnewBB->loopFollow = NO_NODE; @@ -57,9 +56,9 @@ void BB::display() { printf("\nnode type = %s, ", s_nodeType[nodeType]); printf("start = %ld, length = %ld, #out edges = %ld\n", - start, length, numOutEdges); + start, length, edges.size()); - for (int i = 0; i < numOutEdges; i++) + for (int i = 0; i < edges.size(); i++) printf(" outEdge[%2d] = %ld\n",i, edges[i].BBptr->start); } /***************************************************************************** @@ -73,7 +72,7 @@ void BB::displayDfs() printf("node type = %s, ", s_nodeType[nodeType]); printf("start = %ld, length = %ld, #in-edges = %ld, #out-edges = %ld\n", - start, length, inEdges.size(), numOutEdges); + start, length, inEdges.size(), edges.size()); printf("dfsFirst = %ld, dfsLast = %ld, immed dom = %ld\n", dfsFirstNum, dfsLastNum, immedDom == MAX ? -1 : immedDom); @@ -94,7 +93,7 @@ void BB::displayDfs() printf (" inEdge[%ld] = %ld\n", i, inEdges[i]->begin()); /* Display out edges information */ - for (i = 0; i < numOutEdges; i++) + for (i = 0; i < edges.size(); i++) if (nodeType == INTERVAL_NODE) printf(" outEdge[%ld] = %ld\n", i, edges[i].BBptr->correspInt->numInt); @@ -103,9 +102,12 @@ void BB::displayDfs() printf("----\n"); /* Recursive call on successors of current node */ - for (i = 0; i < numOutEdges; i++) - if (edges[i].BBptr->traversed != DFS_DISP) - edges[i].BBptr->displayDfs(); + std::for_each(edges.begin(), edges.end(), + [](TYPEADR_TYPE &pb) + { + if (pb.BBptr->traversed != DFS_DISP) + pb.BBptr->displayDfs(); + }); } /* Recursive procedure that writes the code for the given procedure, pointed * to by pBB. diff --git a/src/control.cpp b/src/control.cpp index fef3d97..425edcc 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -127,7 +127,7 @@ static void findEndlessFollow (Function * pProc, nodeList &loopNodes, BB * head) nodeList::iterator p = loopNodes.begin(); for( ;p != loopNodes.end();++p) { - for (j = 0; j < pProc->dfsLast[*p]->numOutEdges; j++) + for (j = 0; j < pProc->dfsLast[*p]->edges.size(); j++) { succ = pProc->dfsLast[*p]->edges[j].BBptr->dfsLastNum; if ((! inList(loopNodes, succ)) && (succ < head->loopFollow)) diff --git a/src/dataflow.cpp b/src/dataflow.cpp index 5e07da2..346a27a 100644 --- a/src/dataflow.cpp +++ b/src/dataflow.cpp @@ -247,7 +247,7 @@ void Function::liveRegAnalysis (dword in_liveOut) /* liveOut(b) = U LiveIn(s); where s is successor(b) * liveOut(b) = {liveOut}; when b is a HLI_RET node */ - if (pbb->numOutEdges == 0) /* HLI_RET node */ + if (pbb->edges.empty()) /* HLI_RET node */ { pbb->liveOut = in_liveOut; @@ -265,7 +265,7 @@ void Function::liveRegAnalysis (dword in_liveOut) } else /* Check successors */ { - for (j = 0; j < pbb->numOutEdges; j++) + for (j = 0; j < pbb->edges.size(); j++) pbb->liveOut |= pbb->edges[j].BBptr->liveIn; /* propagate to invoked procedure */ diff --git a/src/graph.cpp b/src/graph.cpp index e05e240..426331c 100644 --- a/src/graph.cpp +++ b/src/graph.cpp @@ -344,7 +344,6 @@ void BB::mergeFallThrough( CIcodeRec &Icode) nodeType = pChild->nodeType; length = pChild->start + pChild->length - start; Icode.ClearLlFlag(pChild->start, TARGET); - numOutEdges = pChild->numOutEdges; edges.swap(pChild->edges); pChild->inEdges.clear(); diff --git a/src/reducible.cpp b/src/reducible.cpp index 45cc4ea..19a15b5 100644 --- a/src/reducible.cpp +++ b/src/reducible.cpp @@ -19,8 +19,10 @@ static Int numInt; /* Number of intervals */ #define nonEmpty(q) (q != NULL) /* Returns whether the queue q is empty or not */ - -#define trivialGraph(G) (G->numOutEdges == 0) +bool trivialGraph(BB *G) +{ + return G->edges.empty(); +} /* Returns whether the graph is a trivial graph or not */ @@ -297,7 +299,7 @@ bool Function::nextOrderGraph (derSeq *derivedGi) curr = new_entry.Gi = bbs.front(); for(auto curr=bbs.begin(); curr!=bbs.end(); ++curr) { - for (i = 0; i < (*curr)->numOutEdges; i++) + for (i = 0; i < (*curr)->edges.size(); i++) { BBnode = new_entry.Gi; /* BB of an interval */ TYPEADR_TYPE &edge=(*curr)->edges[i];