Exemple #1
0
/*!
 * 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());
            }
        }
    }
}
Exemple #2
0
/*!
 * 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();
}
Exemple #3
0
/*!
 * 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();

}
Exemple #4
0
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();
}