/*! * 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()); } } } }
/*! * Finalize the analysis after solving * Given the alias results, verify whether it is correct or not using alias check functions */ void PointerAnalysis::finalize() { /// Print statistics dumpStat(); PAG* pag = PAG::getPAG(); // dump the PAG graph if (dumpGraph()) pag->dump("pag_final"); /// Dump results if (PTSPrint) { dumpTopLevelPtsTo(); //dumpAllPts(); //dumpCPts(); } if (TYPEPrint) dumpAllTypes(); if(PTSAllPrint) dumpAllPts(); if (FuncPointerPrint) printIndCSTargets(); getPTACallGraph()->vefityCallGraph(); getPTACallGraph()->dump("callgraph_final"); if(!pag->isBuiltFromFile() && EnableAliasCheck) validateTests(); if (!UsePreCompFieldSensitive) resetObjFieldSensitive(); }
/*! * Start here */ void AndersenStat::performStat() { assert(isa<Andersen>(pta) && "not an andersen pta pass!! what else??"); endClk(); PAG* pag = pta->getPAG(); ConstraintGraph* consCG = pta->getConstraintGraph(); // collect constraint graph cycles collectCycleInfo(consCG); // stat null ptr number statNullPtr(); u32_t numOfCopys = 0; u32_t numOfGeps = 0; // collect copy and gep edges for(ConstraintEdge::ConstraintEdgeSetTy::iterator it = consCG->getDirectCGEdges().begin(), eit = consCG->getDirectCGEdges().end(); it!=eit; ++it) { if(isa<CopyCGEdge>(*it)) numOfCopys++; else if(isa<GepCGEdge>(*it)) numOfGeps++; else assert(false && "what else!!"); } u32_t cgNodeNumber = 0; for (ConstraintGraph::ConstraintNodeIDToNodeMapTy::iterator nodeIt = consCG->begin(), nodeEit = consCG->end(); nodeIt != nodeEit; nodeIt++) { cgNodeNumber++; } u32_t totalPointers = 0; u32_t totalTopLevPointers = 0; u32_t totalPtsSize = 0; u32_t totalTopLevPtsSize = 0; for (PAG::iterator iter = pta->getPAG()->begin(), eiter = pta->getPAG()->end(); iter != eiter; ++iter) { NodeID node = iter->first; PointsTo& pts = pta->getPts(node); u32_t size = pts.count(); totalPointers++; totalPtsSize+=size; if(pta->getPAG()->isValidTopLevelPtr(pta->getPAG()->getPAGNode(node))) { totalTopLevPointers++; totalTopLevPtsSize+=size; } if(size > _MaxPtsSize ) _MaxPtsSize = size; } PTAStat::performStat(); timeStatMap[TotalAnalysisTime] = (endTime - startTime)/TIMEINTERVAL; timeStatMap[SCCDetectionTime] = Andersen::timeOfSCCDetection; timeStatMap[SCCMergeTime] = Andersen::timeOfSCCMerges; timeStatMap[CollapseTime] = Andersen::timeOfCollapse; timeStatMap[ProcessLoadStoreTime] = Andersen::timeOfProcessLoadStore; timeStatMap[ProcessCopyGepTime] = Andersen::timeOfProcessCopyGep; timeStatMap[UpdateCallGraphTime] = Andersen::timeOfUpdateCallGraph; PTNumStatMap[TotalNumOfPointers] = pag->getValueNodeNum() + pag->getFieldValNodeNum(); PTNumStatMap[TotalNumOfObjects] = pag->getObjectNodeNum() + pag->getFieldObjNodeNum(); PTNumStatMap[TotalNumOfEdges] = consCG->getLoadCGEdges().size() + consCG->getStoreCGEdges().size() + numOfCopys + numOfGeps; PTNumStatMap[NumOfAddrs] = consCG->getAddrCGEdges().size(); PTNumStatMap[NumOfCopys] = numOfCopys; PTNumStatMap[NumOfGeps] = numOfGeps; PTNumStatMap[NumOfLoads] = consCG->getLoadCGEdges().size(); PTNumStatMap[NumOfStores] = consCG->getStoreCGEdges().size(); PTNumStatMap[NumOfProcessedAddrs] = Andersen::numOfProcessedAddr; PTNumStatMap[NumOfProcessedCopys] = Andersen::numOfProcessedCopy; PTNumStatMap[NumOfProcessedGeps] = Andersen::numOfProcessedGep; PTNumStatMap[NumOfProcessedLoads] = Andersen::numOfProcessedLoad; PTNumStatMap[NumOfProcessedStores] = Andersen::numOfProcessedStore; PTNumStatMap[NumOfPointers] = pag->getValueNodeNum(); PTNumStatMap[NumOfMemObjects] = pag->getObjectNodeNum(); PTNumStatMap[NumOfGepFieldPointers] = pag->getFieldValNodeNum(); PTNumStatMap[NumOfGepFieldObjects] = pag->getFieldObjNodeNum(); PTNumStatMap[NumberOfCGNode] = cgNodeNumber; timeStatMap[AveragePointsToSetSize] = (double)totalPtsSize/totalPointers;; timeStatMap[AverageTopLevPointsToSetSize] = (double)totalTopLevPtsSize/totalTopLevPointers;; PTNumStatMap[MaxPointsToSetSize] = _MaxPtsSize; PTNumStatMap[NumOfIterations] = pta->numOfIteration; PTNumStatMap[NumOfIndirectCallSites] = consCG->getIndirectCallsites().size(); PTNumStatMap[NumOfIndirectEdgeSolved] = pta->getNumOfResolvedIndCallEdge(); PTNumStatMap[NumOfSCCDetection] = Andersen::numOfSCCDetection; PTNumStatMap[NumOfCycles] = _NumOfCycles; PTNumStatMap[NumOfPWCCycles] = _NumOfPWCCycles; PTNumStatMap[NumOfNodesInCycles] = _NumOfNodesInCycles; PTNumStatMap[MaxNumOfNodesInSCC] = _MaxNumOfNodesInSCC; PTNumStatMap[NumOfNullPointer] = _NumOfNullPtr; PTNumStatMap["PointsToConstPtr"] = _NumOfConstantPtr; PTNumStatMap["PointsToBlkPtr"] = _NumOfBlackholePtr; printStat(); }
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(); }