Example #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());
            }
        }
    }
}
Example #2
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();
}