Esempio n. 1
0
/*!
 * Expand all fields of an aggregate in all points-to sets
 */
void BVDataPTAImpl::expandFIObjs(const PointsTo& pts, PointsTo& expandedPts) {
    expandedPts = pts;;
    for(PointsTo::iterator pit = pts.begin(), epit = pts.end(); pit!=epit; ++pit) {
        if(pag->getBaseObjNode(*pit)==*pit) {
            expandedPts |= pag->getAllFieldsObjNode(*pit);
        }
    }
}
Esempio n. 2
0
/*!
 * Add copy edges which haven't been added before
 */
bool AndersenWaveDiff::handleStore(NodeID node, const ConstraintEdge* edge)
{
    /// calculate diff pts.
    PointsTo & cache = getCachePts(edge);
    PointsTo & pts = getPts(node);
    PointsTo newPts;
    newPts.intersectWithComplement(pts, cache);
    cache |= newPts;

    bool changed = false;
    for (PointsTo::iterator piter = newPts.begin(), epiter = newPts.end(); piter != epiter; ++piter) {
        NodeID ptdId = *piter;
        if (processStore(ptdId, edge)) {
            changed = true;
        }
    }

    return changed;
}
Esempio n. 3
0
/*!
 * Given a condition pts, insert into cptsToRepCPtsMap
 * Always map it to its superset(rep) cpts according to existing items
 * 1) map cpts to its superset(rep) which exists in the map, otherwise its superset is itself
 * 2) adjust existing items in the map if their supersets are cpts
 */
void MRGenerator::sortPointsTo(const PointsTo& cpts) {

    if(cptsToRepCPtsMap.find(cpts)!=cptsToRepCPtsMap.end())
        return;

    PointsToList subSetList;
    PointsTo repCPts = cpts;
    for(PtsToRepPtsSetMap::iterator it = cptsToRepCPtsMap.begin(),
            eit = cptsToRepCPtsMap.end(); it!=eit; ++it) {
        PointsTo& existCPts = it->second;
        if(cpts.contains(existCPts)) {
            subSetList.insert(it->first);
        }
        else if(existCPts.contains(cpts)) {
            repCPts = existCPts;
        }
    }

    for(PointsToList::iterator it = subSetList.begin(), eit = subSetList.end(); it!=eit; ++it) {
        cptsToRepCPtsMap[*it] = cpts;
    }

    cptsToRepCPtsMap[cpts] = repCPts;
}