/** * @return set of d2 s.t. d1 -> d2 is a path edge for node n */ private IntSet getReachableFast(int n, int d1) { IBinaryNaturalRelation R = altPaths.get(d1); if (R != null) { return R.getRelated(n); } return null; }
/** * @return set of d2 s.t. d1 -> d2 is a path edge for node n */ private IntSet getReachableFast(int n, int d1) { IBinaryNaturalRelation R = altPaths.get(d1); if (R != null) { return R.getRelated(n); } return null; }
protected int getNumberOfTargets(CallSiteReference site) { Object result = targets.get(site.getProgramCounter()); if (result == null) { return 0; } else if (result instanceof CGNode) { return 1; } else { return ((IntSet) result).size(); } }
protected int getNumberOfTargets(CallSiteReference site) { Object result = targets.get(site.getProgramCounter()); if (result == null) { return 0; } else if (result instanceof CGNode) { return 1; } else { return ((IntSet) result).size(); } }
/** * @param s_p local block number an entry * @param x local block number of an exit block * @param d1 source dataflow fact * @return set of d2 s.t. d1 -> d2 recorded as a summary edge for (s_p,x), or null if none */ public IntSet getSummaryEdges(int s_p, int x, int d1) { int n = getIndexForEntryExitPair(s_p, x); IBinaryNaturalRelation R = summaries.get(n); if (R == null) { return null; } else { return R.getRelated(d1); } }
/** * @param s_p local block number an entry * @param x local block number of an exit block * @param d1 source dataflow fact * @return set of d2 s.t. d1 -> d2 recorded as a summary edge for (s_p,x), or null if none */ public IntSet getSummaryEdges(int s_p, int x, int d1) { int n = getIndexForEntryExitPair(s_p, x); IBinaryNaturalRelation R = summaries.get(n); if (R == null) { return null; } else { return R.getRelated(d1); } }
/** * Does a particular summary edge exist? * * @param s_p local block number an entry * @param x local block number of an exit block * @param d1 source dataflow fact * @param d2 target dataflow fact */ public boolean contains(int s_p, int x, int d1, int d2) { int n = getIndexForEntryExitPair(s_p, x); IBinaryNaturalRelation R = summaries.get(n); if (R == null) { return false; } else { return R.contains(d1, d2); } }
/** * Does a particular summary edge exist? * * @param s_p local block number an entry * @param x local block number of an exit block * @param d1 source dataflow fact * @param d2 target dataflow fact */ public boolean contains(int s_p, int x, int d1, int d2) { int n = getIndexForEntryExitPair(s_p, x); IBinaryNaturalRelation R = summaries.get(n); if (R == null) { return false; } else { return R.contains(d1, d2); } }
protected IntSet getPossibleTargetNumbers(CallSiteReference site) { Object t = targets.get(site.getProgramCounter()); if (t == null) { return null; } else if (t instanceof CGNode) { return SparseIntSet.singleton(getCallGraph().getNumber((CGNode) t)); } else { return (IntSet) t; } }
protected IntSet getPossibleTargetNumbers(CallSiteReference site) { Object t = targets.get(site.getProgramCounter()); if (t == null) { return null; } else if (t instanceof CGNode) { return SparseIntSet.singleton(getCallGraph().getNumber((CGNode) t)); } else { return (IntSet) t; } }
protected Set<CGNode> getPossibleTargets(CallSiteReference site) { Object result = targets.get(site.getProgramCounter()); if (result == null) { return Collections.emptySet(); } else if (result instanceof CGNode) { Set<CGNode> s = Collections.singleton((CGNode) result); return s; } else { IntSet s = (IntSet) result; HashSet<CGNode> h = HashSetFactory.make(s.size()); for (IntIterator it = s.intIterator(); it.hasNext();) { h.add(getCallGraph().getNode(it.next())); } return h; } }
protected Set<CGNode> getPossibleTargets(CallSiteReference site) { Object result = targets.get(site.getProgramCounter()); if (result == null) { return Collections.emptySet(); } else if (result instanceof CGNode) { Set<CGNode> s = Collections.singleton((CGNode) result); return s; } else { IntSet s = (IntSet) result; HashSet<CGNode> h = HashSetFactory.make(s.size()); for (IntIterator it = s.intIterator(); it.hasNext();) { h.add(getCallGraph().getNode(it.next())); } return h; } }
@Override public Set<CGNode> getPossibleTargets(CallSiteReference site) { Object result = targets.get(site.getProgramCounter()); if (result != null && result instanceof CallSite) { CallSite p = (CallSite) result; CGNode n = p.getNode(); CallSiteReference s = p.getSite(); return DelegatingExplicitCallGraph.this.getPossibleTargets(n, s); } else { return super.getPossibleTargets(site); } }
@Override public IntSet getPossibleTargetNumbers(CallSiteReference site) { Object t = targets.get(site.getProgramCounter()); if (t != null && t instanceof CallSite) { CallSite p = (CallSite) t; DelegatingCGNode n = (DelegatingCGNode) p.getNode(); CallSiteReference s = p.getSite(); return n.getPossibleTargetNumbers(s); } else { return super.getPossibleTargetNumbers(site); } }
@Override public Set<CGNode> getPossibleTargets(CallSiteReference site) { Object result = targets.get(site.getProgramCounter()); if (result != null && result instanceof CallSite) { CallSite p = (CallSite) result; CGNode n = p.getNode(); CallSiteReference s = p.getSite(); return DelegatingExplicitCallGraph.this.getPossibleTargets(n, s); } else { return super.getPossibleTargets(site); } }
@Override public IntSet getPossibleTargetNumbers(CallSiteReference site) { Object t = targets.get(site.getProgramCounter()); if (t != null && t instanceof CallSite) { CallSite p = (CallSite) t; DelegatingCGNode n = (DelegatingCGNode) p.getNode(); CallSiteReference s = p.getSite(); return n.getPossibleTargetNumbers(s); } else { return super.getPossibleTargetNumbers(site); } }
@Override public int getNumberOfTargets(CallSiteReference site) { Object result = targets.get(site.getProgramCounter()); if (result != null && result instanceof CallSite) { CallSite p = (CallSite) result; CGNode n = p.getNode(); CallSiteReference s = p.getSite(); return DelegatingExplicitCallGraph.this.getNumberOfTargets(n,s); } else { return super.getNumberOfTargets(site); } }
@Override public int getNumberOfTargets(CallSiteReference site) { Object result = targets.get(site.getProgramCounter()); if (result != null && result instanceof CallSite) { CallSite p = (CallSite) result; CGNode n = p.getNode(); CallSiteReference s = p.getSite(); return DelegatingExplicitCallGraph.this.getNumberOfTargets(n,s); } else { return super.getNumberOfTargets(site); } }
/** * Record a summary edge for the flow d1 -> d2 from an entry s_p to an exit x. * * @param s_p local block number an entry * @param x local block number of an exit block * @param d1 source dataflow fact * @param d2 target dataflow fact */ public void insertSummaryEdge(int s_p, int x, int d1, int d2) { int n = getIndexForEntryExitPair(s_p, x); IBinaryNaturalRelation R = summaries.get(n); if (R == null) { // we expect R to usually be sparse R = new BasicNaturalRelation(new byte[] { BasicNaturalRelation.SIMPLE_SPACE_STINGY }, BasicNaturalRelation.SIMPLE); summaries.set(n, R); } R.add(d1, d2); // if (TabulationSolver.DEBUG_LEVEL > 1) { // // System.err.println("recording summary edge, now n=" + n + " summarized by " + R); // } }
/** * Note: This is inefficient. Use with care. * * @param s_p local block number an entry * @param x local block number of an exit block * @param d2 target dataflow fact * @return set of d1 s.t. d1 -> d2 recorded as a summary edge for (s_p,x), or null if none */ public IntSet getInvertedSummaryEdgesForTarget(int s_p, int x, int d2) { int n = getIndexForEntryExitPair(s_p, x); IBinaryNaturalRelation R = summaries.get(n); if (R == null) { return null; } else { MutableSparseIntSet result = MutableSparseIntSet.makeEmpty(); for (IntPair p : R) { if (p.getY() == d2) { result.add(p.getX()); } } return result; } }