/*! * Collect globals for escape analysis */ void MRGenerator::collectGlobals() { PAG* pag = pta->getPAG(); for (PAG::iterator nIter = pag->begin(); nIter != pag->end(); ++nIter) { if(ObjPN* obj = dyn_cast<ObjPN>(nIter->second)) { if (obj->getMemObj()->isGlobalObj()) { allGlobals.set(nIter->getFirst()); allGlobals |= CollectPtsChain(nIter->getFirst()); } } } }
void PTAStat::performStat() { callgraphStat(); PAG* pag = PAG::getPAG(); u32_t numOfFunction = 0; u32_t numOfGlobal = 0; u32_t numOfStack = 0; u32_t numOfHeap = 0; u32_t numOfHasVarArray = 0; u32_t numOfHasVarStruct = 0; u32_t numOfHasConstArray = 0; u32_t numOfHasConstStruct = 0; u32_t numOfScalar = 0; u32_t numOfConstant = 0; u32_t fiObjNumber = 0; u32_t fsObjNumber = 0; std::set<SymID> memObjSet; for(PAG::iterator it = pag->begin(), eit = pag->end(); it!=eit; ++it) { PAGNode* node = it->second; if(ObjPN* obj = dyn_cast<ObjPN>(node)) { const MemObj* mem = obj->getMemObj(); if (memObjSet.insert(mem->getSymId()).second == false) continue; if(mem->isBlackHoleOrConstantObj()) continue; if(mem->isFunction()) numOfFunction++; if(mem->isGlobalObj()) numOfGlobal++; if(mem->isStack()) numOfStack++; if(mem->isHeap()) numOfHeap++; if(mem->isVarArray()) numOfHasVarArray++; if(mem->isVarStruct()) numOfHasVarStruct++; if(mem->isConstArray()) numOfHasConstArray++; if(mem->isConstStruct()) numOfHasConstStruct++; if(mem->hasPtrObj() == false) numOfScalar++; if(mem->isConstant()) numOfConstant++; if (mem->isFieldInsensitive()) fiObjNumber++; else fsObjNumber++; if(pta->isLocalVarInRecursiveFun(node->getId())) { localVarInRecursion.set(node->getId()); } } } generalNumMap[TotalNumOfPointers] = pag->getValueNodeNum() + pag->getFieldValNodeNum(); generalNumMap[TotalNumOfObjects] = pag->getObjectNodeNum(); generalNumMap[TotalNumOfFieldObjects] = pag->getFieldObjNodeNum(); generalNumMap[MaxStructSize] = SymbolTableInfo::Symbolnfo()->getMaxStructSize(); generalNumMap[TotalNumOfEdges] = pag->getPAGEdgeNum(); generalNumMap[NumberOfFieldInsensitiveObj] = fiObjNumber; generalNumMap[NumberOfFieldSensitiveObj] = fsObjNumber; generalNumMap[NumOfAddrs] = pag->getEdgeSet(PAGEdge::Addr).size(); generalNumMap[NumOfLoads] = pag->getEdgeSet(PAGEdge::Load).size(); generalNumMap[NumOfStores] = pag->getEdgeSet(PAGEdge::Store).size(); generalNumMap[NumOfCopys] = pag->getEdgeSet(PAGEdge::Copy).size(); generalNumMap[NumOfGeps] = pag->getEdgeSet(PAGEdge::NormalGep).size() + pag->getEdgeSet(PAGEdge::VariantGep).size(); generalNumMap[NumOfCalls] = pag->getEdgeSet(PAGEdge::Call).size(); generalNumMap[NumOfReturns] = pag->getEdgeSet(PAGEdge::Ret).size(); generalNumMap[NumOfFunctionObjs] = numOfFunction; generalNumMap[NumOfGlobalObjs] = numOfGlobal; generalNumMap[NumOfHeapObjs] = numOfHeap; generalNumMap[NumOfStackObjs] = numOfStack; generalNumMap[NumOfObjsHasVarStruct] = numOfHasVarStruct; generalNumMap[NumOfObjsHasVarArray] = numOfHasVarArray; generalNumMap[NumOfObjsHasConstStruct] = numOfHasConstStruct; generalNumMap[NumOfObjsHasConstArray] = numOfHasConstArray; generalNumMap[NumOfNonPtrObjs] = numOfScalar; generalNumMap[NumOfIndirectCallSites] = pag->getIndirectCallsites().size(); generalNumMap["TotalCallSite"] = pag->getCallSiteSet().size(); generalNumMap["LocalVarInRecur"] = localVarInRecursion.count(); bitcastInstStat(); branchStat(); }