// TODO: USEDEF FUNCTIONS : ELIMINATE THIS FUNCTION // this function assumes that a pointer to an AST subtree representing a LHS of an assignment has been passed VariableIdMapping::VariableIdSet RDAnalyzer::determineLValueVariableIdSet(SgNode* node) { VariableIdMapping::VariableIdSet resultSet; // only x=... is supported yet if(SgVarRefExp* lhsVar=isSgVarRefExp(node)) { resultSet.insert(_variableIdMapping.variableId(lhsVar)); } else { cout<<"WARNING: unsupported lhs of assignment: "<<SgNodeHelper::nodeToString(node)<<" ... grabbing all variables."<<std::endl; RoseAst ast(node); for(RoseAst::iterator i=ast.begin();i!=ast.end();++i) { if(SgVarRefExp* lhsVar_i=isSgVarRefExp(node)) resultSet.insert(_variableIdMapping.variableId(lhsVar_i)); } } return resultSet; }
/*! * \author Markus Schordan * \date 2012. */ VariableIdMapping::VariableIdSet VariableIdMapping::determineVariableIdsOfVariableDeclarations(set<SgVariableDeclaration*> varDecls) { VariableIdMapping::VariableIdSet resultSet; for(set<SgVariableDeclaration*>::iterator i=varDecls.begin();i!=varDecls.end();++i) { SgSymbol* sym=SgNodeHelper::getSymbolOfVariableDeclaration(*i); if(sym) { resultSet.insert(variableId(sym)); } } return resultSet; }
VariableIdSet AnalysisAbstractionLayer::globalVariables(SgProject* project, VariableIdMapping* variableIdMapping) { list<SgVariableDeclaration*> globalVars=SgNodeHelper::listOfGlobalVars(project); VariableIdMapping::VariableIdSet globalVarsIdSet; for(list<SgVariableDeclaration*>::iterator i=globalVars.begin();i!=globalVars.end();++i) { VariableId globalVarId=variableIdMapping->variableId(*i); globalVarsIdSet.insert(globalVarId); } return globalVarsIdSet; }
/*! * \author Markus Schordan * \date 2012. */ VariableIdMapping::VariableIdSet VariableIdMapping::determineVariableIdsOfSgInitializedNames(SgInitializedNamePtrList& namePtrList) { VariableIdMapping::VariableIdSet resultSet; for(SgInitializedNamePtrList::iterator i=namePtrList.begin();i!=namePtrList.end();++i) { assert(*i); SgSymbol* sym=SgNodeHelper::getSymbolOfInitializedName(*i); if(sym) { resultSet.insert(variableId(sym)); } } return resultSet; }
void DFAnalyzer<LatticeType>::initialize(SgProject* root) { cout << "INIT: Creating VariableIdMapping."<<endl; _variableIdMapping.computeVariableSymbolMapping(root); cout << "INIT: Creating Labeler."<<endl; _labeler= new Labeler(root,getVariableIdMapping()); //cout << "INIT: Initializing ExprAnalyzer."<<endl; //exprAnalyzer.setVariableIdMapping(getVariableIdMapping()); cout << "INIT: Creating CFAnalyzer."<<endl; _cfanalyzer=new CFAnalyzer(_labeler); //cout<< "DEBUG: mappingLabelToLabelProperty: "<<endl<<getLabeler()->toString()<<endl; cout << "INIT: Building CFG for each function."<<endl; _flow=_cfanalyzer->flow(root); cout << "STATUS: Building CFGs finished."<<endl; cout << "INIT: Intra-Flow OK. (size: " << _flow.size() << " edges)"<<endl; InterFlow interFlow=_cfanalyzer->interFlow(_flow); cout << "INIT: Inter-Flow OK. (size: " << interFlow.size()*2 << " edges)"<<endl; _cfanalyzer->intraInterFlow(_flow,interFlow); cout << "INIT: IntraInter-CFG OK. (size: " << _flow.size() << " edges)"<<endl; for(long l=0;l<_labeler->numberOfLabels();++l) { LatticeType le; _analyzerDataPreInfo.push_back(le); _analyzerData.push_back(le); } cout << "INIT: Optimizing CFGs for label-out-info solver 1."<<endl; { size_t numDeletedEdges=_cfanalyzer->deleteFunctioncCallLocalEdges(_flow); int numReducedNodes=_cfanalyzer->reduceBlockBeginNodes(_flow); cout << "INIT: Optimization finished (educed nodes: "<<numReducedNodes<<" deleted edges: "<<numDeletedEdges<<")"<<endl; } cout << "STATUS: initialized monotone data flow analyzer for "<<_analyzerData.size()<< " labels."<<endl; #if 0 std::string functionToStartAt="main"; std::string funtofind=functionToStartAt; RoseAst completeast(root); SgFunctionDefinition* startFunRoot=completeast.findFunctionByName(funtofind); if(startFunRoot==0) { std::cerr << "Function '"<<funtofind<<"' not found.\n"; exit(1); } else { // determine label of function Label startlab=_labeler->getLabel(startFunRoot); set<Label> elab; elab.insert(startlab); setExtremalLabels(elab); _analyzerData[startlab]=initializeGlobalVariables(root); cout << "STATUS: Initial info established at label "<<startlab<<endl; } #endif // create empty state #if 0 PState emptyPState; const PState* emptyPStateStored=processNew(emptyPState); assert(emptyPStateStored); cout << "INIT: Empty state(stored): "<<emptyPStateStored->toString()<<endl; assert(cfanalyzer); Label startLabel=cfanalyzer->getLabel(startFunRoot); if(SgProject* project=isSgProject(root)) { cout << "STATUS: Number of global variables: "; list<SgVariableDeclaration*> globalVars=SgNodeHelper::listOfGlobalVars(project); cout << globalVars.size()<<endl; list<SgVarRefExp*> varRefExpList=SgNodeHelper::listOfUsedVarsInFunctions(project); // compute set of varIds (it is a set because we want multiple uses of the same var to be represented by one id) VariableIdMapping::VariableIdSet setOfUsedVars; for(list<SgVarRefExp*>::iterator i=varRefExpList.begin();i!=varRefExpList.end();++i) { setOfUsedVars.insert(variableIdMapping.variableId(*i)); } cout << "STATUS: Number of used variables: "<<setOfUsedVars.size()<<endl; int filteredVars=0; for(list<SgVariableDeclaration*>::iterator i=globalVars.begin();i!=globalVars.end();++i) { if(setOfUsedVars.find(variableIdMapping.variableId(*i))!=setOfUsedVars.end()) { globalVarName2VarIdMapping[variableIdMapping.variableName(variableIdMapping.variableId(*i))]=variableIdMapping.variableId(*i); //estate=analyzeVariableDeclaration(*i,estate,estate.label()); } else filteredVars++; } cout << "STATUS: Number of filtered variables for initial pstate: "<<filteredVars<<endl; } else { cout << "INIT: no global scope."; } #endif }