@Override public int getPredNodeCount(CGNode n) { Iterator<CGNode> tmp = cg.getPredNodes(n); int cnt = 0; while (tmp.hasNext()) { CGNode no = tmp.next(); if (keep.contains(no) && !removedEdge(no, n)) { cnt++; } } return cnt; }
@Override public Iterator<CGNode> getPredNodes(CGNode n) { Iterator<CGNode> tmp = cg.getPredNodes(n); Collection<CGNode> col = new LinkedList<>(); while (tmp.hasNext()) { CGNode no = tmp.next(); if (keep.contains(no) && !removedEdge(no, n)) { col.add(no); } } return col.iterator(); }
@Override public int getPredNodeCount(CGNode n) { Iterator<CGNode> tmp = cg.getPredNodes(n); int cnt = 0; while (tmp.hasNext()) { CGNode no = tmp.next(); if (keep.contains(no) && !removedEdge(no, n)) { cnt++; } } return cnt; }
@Override public Iterator<CGNode> getPredNodes(CGNode n) { Iterator<CGNode> tmp = cg.getPredNodes(n); Collection<CGNode> col = new LinkedList<>(); while (tmp.hasNext()) { CGNode no = tmp.next(); if (keep.contains(no) && !removedEdge(no, n)) { col.add(no); } } return col.iterator(); }
private boolean mayBeLiveInSomeCaller(InstanceKey ik, CGNode m) { for (CGNode n : Iterator2Iterable.make(callGraph.getPredNodes(m))) { if (mayBeLive(ik, n, -1)) { return true; } } return false; }
private boolean mayBeLiveInSomeCaller(InstanceKey ik, CGNode m) { for (CGNode n : Iterator2Iterable.make(callGraph.getPredNodes(m))) { if (mayBeLive(ik, n, -1)) { return true; } } return false; }
/** * Add the incoming edges to the entry() block and the outgoing edges from the exit() block for a call graph node. * * @param n a node in the call graph */ @SuppressWarnings("unused") private void addInterproceduralEdgesForEntryAndExitBlocks(CGNode n, ControlFlowGraph<SSAInstruction, ? extends T> cfg) { T entryBlock = cfg.entry(); T exitBlock = cfg.exit(); if (DEBUG_LEVEL > 0) { System.err.println("addInterproceduralEdgesForEntryAndExitBlocks " + n); } for (CGNode caller : Iterator2Iterable.make(cg.getPredNodes(n))) { if (DEBUG_LEVEL > 1) { System.err.println("got caller " + caller); } if (relevant.test(caller)) { addEntryAndExitEdgesToCaller(n, entryBlock, exitBlock, caller); } } }
/** * Add the incoming edges to the entry() block and the outgoing edges from the exit() block for a call graph node. * * @param n a node in the call graph */ @SuppressWarnings("unused") private void addInterproceduralEdgesForEntryAndExitBlocks(CGNode n, ControlFlowGraph<SSAInstruction, ? extends T> cfg) { T entryBlock = cfg.entry(); T exitBlock = cfg.exit(); if (DEBUG_LEVEL > 0) { System.err.println("addInterproceduralEdgesForEntryAndExitBlocks " + n); } for (CGNode caller : Iterator2Iterable.make(cg.getPredNodes(n))) { if (DEBUG_LEVEL > 1) { System.err.println("got caller " + caller); } if (relevant.test(caller)) { addEntryAndExitEdgesToCaller(n, entryBlock, exitBlock, caller); } } }
@Override public Set<CallerSiteContext> getPotentialCallers(PointerKey formalPk) { CGNode callee = null; if (formalPk instanceof LocalPointerKey) { callee = ((LocalPointerKey) formalPk).getNode(); } else if (formalPk instanceof ReturnValueKey) { callee = ((ReturnValueKey) formalPk).getNode(); } else { throw new IllegalArgumentException("formalPk must represent a local"); } Set<CallerSiteContext> ret = callerCache.get(callee); if (ret == null) { ret = HashSetFactory.make(); for (CGNode caller : Iterator2Iterable.make(cg.getPredNodes(callee))) { for (CallSiteReference call : Iterator2Iterable.make(cg.getPossibleSites(caller, callee))) { ret.add(new CallerSiteContext(caller, call)); } } callerCache.put(callee, ret); } return ret; }
@Override public Set<CallerSiteContext> getPotentialCallers(PointerKey formalPk) { CGNode callee = null; if (formalPk instanceof LocalPointerKey) { callee = ((LocalPointerKey) formalPk).getNode(); } else if (formalPk instanceof ReturnValueKey) { callee = ((ReturnValueKey) formalPk).getNode(); } else { throw new IllegalArgumentException("formalPk must represent a local"); } Set<CallerSiteContext> ret = callerCache.get(callee); if (ret == null) { ret = HashSetFactory.make(); for (CGNode caller : Iterator2Iterable.make(cg.getPredNodes(callee))) { for (CallSiteReference call : Iterator2Iterable.make(cg.getPossibleSites(caller, callee))) { ret.add(new CallerSiteContext(caller, call)); } } callerCache.put(callee, ret); } return ret; }
@Override public Iterator<Pair<CGNode, NewSiteReference>> getCreationSites(CallGraph CG) { MethodReference ctorRef = JavaScriptMethods.makeCtorReference(JavaScriptTypes.Function); Set<CGNode> f = CG.getNodes(ctorRef); CGNode ctor = null; for(CGNode n : f) { JavaScriptConstructor c = (JavaScriptConstructor) n.getMethod(); if (c.constructedType().equals(klass)) { ctor = n; break; } } // built in objects if (ctor == null) { return EmptyIterator.instance(); } Iterator<CGNode> callers = CG.getPredNodes(ctor); CGNode caller = callers.next(); assert !callers.hasNext(); Iterator<CallSiteReference> sites = CG.getPossibleSites(caller, ctor); CallSiteReference site = sites.next(); assert !sites.hasNext() : caller + " --> " + ctor + " @ " + site + " and " + sites.next() + '\n' + caller.getIR(); return NonNullSingletonIterator.make(Pair.make(caller, NewSiteReference.make(site.getProgramCounter(), klass.getReference()))); }
@Override public Iterator<Pair<CGNode, NewSiteReference>> getCreationSites(CallGraph CG) { MethodReference ctorRef = JavaScriptMethods.makeCtorReference(JavaScriptTypes.Function); Set<CGNode> f = CG.getNodes(ctorRef); CGNode ctor = null; for(CGNode n : f) { JavaScriptConstructor c = (JavaScriptConstructor) n.getMethod(); if (c.constructedType().equals(klass)) { ctor = n; break; } } // built in objects if (ctor == null) { return EmptyIterator.instance(); } Iterator<CGNode> callers = CG.getPredNodes(ctor); CGNode caller = callers.next(); assert !callers.hasNext(); Iterator<CallSiteReference> sites = CG.getPossibleSites(caller, ctor); CallSiteReference site = sites.next(); assert !sites.hasNext() : caller + " --> " + ctor + " @ " + site + " and " + sites.next() + '\n' + caller.getIR(); return NonNullSingletonIterator.make(Pair.make(caller, NewSiteReference.make(site.getProgramCounter(), klass.getReference()))); }
@Override public Iterator<MethodReference> getPredNodes(MethodReference N) { Set<MethodReference> pred = HashSetFactory.make(10); MethodReference methodReference = N; for (CGNode cgNode : cg.getNodes(methodReference)) for (CGNode p : Iterator2Iterable.make(cg.getPredNodes(cgNode))) pred.add(p.getMethod().getReference()); return pred.iterator(); }
private static Pair<CGNode, NewSiteReference> map(CallGraph CG, Pair<CGNode, NewSiteReference> ptr) { CGNode n = ptr.fst; if (! (n.getMethod() instanceof JavaScriptConstructor)) { return ptr; } Iterator<CGNode> preds = CG.getPredNodes(n); if (! preds.hasNext()) { return ptr; } CGNode caller = preds.next(); assert !preds.hasNext() : n; Iterator<CallSiteReference> sites = CG.getPossibleSites(caller, n); CallSiteReference site = sites.next(); assert ! sites.hasNext(); return Pair.make(caller, new NewSiteReference(site.getProgramCounter(), ptr.snd.getDeclaredType())); }
Iterator<CGNode> callers = cg.getPredNodes(callee);
protected void checkCompareToCalls(CallGraph cg, Set<CGNode> ctnodes, String x, int expected) { // Find node corresponding to id1 TypeReference tid1 = TypeReference.findOrCreate(ClassLoaderReference.Application, "Llambda/SortingExample"); MethodReference mid1 = MethodReference.findOrCreate(tid1, x, "(I)I"); Assert.assertTrue("expect " + x + " node", cg.getNodes(mid1).iterator().hasNext()); CGNode id1node = cg.getNodes(mid1).iterator().next(); // caller of id1 is dynamic from sortForward, and has 1 compareTo CGNode sfnode = cg.getPredNodes(id1node).next(); int count = 0; for(CallSiteReference site : Iterator2Iterable.make(sfnode.iterateCallSites())) { if (ctnodes.containsAll(cg.getPossibleTargets(sfnode, site))) { count++; } } Assert.assertEquals("expected one call to compareTo", expected, count); System.err.println("found " + count + " compareTo calls in " + sfnode); } }
return true; } else { Iterator<CGNode> n = cg.getPredNodes(node); while (n.hasNext()) { Iterator<CGNode> preds = cg.getPredNodes(node); while (preds.hasNext()) { CGNode n2 = preds.next();
private Collection<Statement> findTargetStatement(CallGraph CG) { final Collection<Statement> ss = HashSetFactory.make(); for(CGNode n : getNodes(CG, "suffix:_slice_target_fn")) { for(CGNode caller : Iterator2Iterable.make(CG.getPredNodes(n))) { for(CallSiteReference site : Iterator2Iterable.make(CG.getPossibleSites(caller, n))) { caller.getIR().getCallInstructionIndices(site).foreach(x -> ss.add(new NormalStatement(caller, x))); } } } return ss; } }