LabelSet LabelSet::operator+(LabelSet& s2) { LabelSet result; result=*this; for(LabelSet::iterator i2=s2.begin();i2!=s2.end();++i2) result.insert(*i2); return result; }
Flow CFAnalysis::controlDependenceGraph(Flow& controlFlow) { LabelSet condLabels=conditionLabels(controlFlow); LabelSet targetLabels; Flow controlDependenceEdges; for(LabelSet::iterator i=condLabels.begin();i!=condLabels.end();++i) { SgNode* condition=getLabeler()->getNode(*i); cerr<<"DEBUG: cond:"<<condition->class_name()<<endl; SgNode* stmt=SgNodeHelper::getParent(condition); cerr<<"DEBUG: stmt:"<<stmt->class_name()<<endl; // while/dowhile/for if(SgNodeHelper::isLoopCond(condition)) { SgNode* loopBody=SgNodeHelper::getLoopBody(stmt); cerr<<"DEBUG: loopBody:"<<loopBody->class_name()<<endl; LabelSet loopBodyInitLabels=setOfInitialLabelsOfStmtsInBlock(loopBody); targetLabels=loopBodyInitLabels; } // if if(isSgIfStmt(stmt)) { SgNode* trueBranch=SgNodeHelper::getTrueBranch(stmt); LabelSet trueBranchInitLabels=setOfInitialLabelsOfStmtsInBlock(trueBranch); SgNode* falseBranch=SgNodeHelper::getFalseBranch(stmt); LabelSet falseBranchInitLabels=setOfInitialLabelsOfStmtsInBlock(falseBranch); targetLabels=trueBranchInitLabels+falseBranchInitLabels; } for(LabelSet::iterator j=targetLabels.begin();j!=targetLabels.end();++j) { controlDependenceEdges.insert(Edge(*i,EDGE_FORWARD,*j)); } } return controlDependenceEdges; }
LabelSet CFAnalysis::functionEntryLabels(Flow& flow) { LabelSet resultSet; LabelSet nodeLabels; nodeLabels=flow.nodeLabels(); for(LabelSet::iterator i=nodeLabels.begin();i!=nodeLabels.end();++i) { if(labeler->isFunctionEntryLabel(*i)) resultSet.insert(*i); } return resultSet; }
// MS: will possibly be replaced with an implementation from the BOOST graph library LabelSet Flow::reachableNodesButNotBeyondTargetNode(Label start, Label target) { LabelSet reachableNodes; LabelSet toVisitSet=succ(start); size_t oldSize=0; size_t newSize=0; do { LabelSet newToVisitSet; for(LabelSet::iterator i=toVisitSet.begin();i!=toVisitSet.end();++i) { LabelSet succSet=succ(*i); for(LabelSet::iterator j=succSet.begin();j!=succSet.end();++j) { if(reachableNodes.find(*j)==reachableNodes.end()) newToVisitSet.insert(*j); } } toVisitSet=newToVisitSet; oldSize=reachableNodes.size(); reachableNodes+=toVisitSet; newSize=reachableNodes.size(); } while(oldSize!=newSize); return reachableNodes; }