// TODO: refactor in separate functions RDLattice RDAnalyzer::transfer(Label lab, RDLattice element) { if(element.isBot()) element.setEmptySet(); SgNode* node=_labeler->getNode(lab); //cout<<"Analyzing:"<<node->class_name()<<endl; /////////////////////////////////////////// // remove undeclared variable at function exit if(_labeler->isFunctionExitLabel(lab)) { if(SgFunctionDefinition* funDef=isSgFunctionDefinition(_labeler->getNode(lab))) { // 1) determine all local variables (including formal parameters) of function // 2) delete all local variables from state // 2a) remove variable from state // ad 1) set<SgVariableDeclaration*> varDecls=SgNodeHelper::localVariableDeclarationsOfFunction(funDef); // ad 2) VariableIdMapping::VariableIdSet localVars=_variableIdMapping.determineVariableIdsOfVariableDeclarations(varDecls); SgInitializedNamePtrList& formalParamInitNames=SgNodeHelper::getFunctionDefinitionFormalParameterList(funDef); VariableIdMapping::VariableIdSet formalParams=_variableIdMapping.determineVariableIdsOfSgInitializedNames(formalParamInitNames); VariableIdMapping::VariableIdSet vars=localVars+formalParams; for(VariableIdMapping::VariableIdSet::iterator i=vars.begin();i!=vars.end();++i) { VariableId varId=*i; element.eraseAllPairsWithVariableId(varId); } return element; } } /////////////////////////////////////////// if(isSgExprStatement(node)) node=SgNodeHelper::getExprStmtChild(node); if(SgAssignOp* assignOp=isSgAssignOp(node)) { transfer_assignment(assignOp,lab,element); } #if 0 cout << "RDAnalyzer: called transfer function. result: "; element.toStream(cout,&_variableIdMapping); cout<<endl; #endif return element; }