1 19 20 package soot.jimple.spark.solver; 21 import soot.jimple.spark.*; 22 import soot.jimple.spark.pag.*; 23 import soot.jimple.spark.sets.*; 24 import soot.*; 25 import soot.util.*; 26 import java.util.*; 27 28 32 33 public class MergeChecker { 34 public MergeChecker( PAG pag ) { this.pag = pag; } 35 36 public void check() { 37 for( Iterator it = pag.allocSources().iterator(); it.hasNext(); ) { 38 handleAllocNode( (AllocNode) it.next() ); 39 } 40 for( Iterator it = pag.simpleSources().iterator(); it.hasNext(); ) { 41 handleSimples( (VarNode) it.next() ); 42 } 43 for( Iterator it = pag.loadSources().iterator(); it.hasNext(); ) { 44 handleLoads( (FieldRefNode) it.next() ); 45 } 46 for( Iterator it = pag.storeSources().iterator(); it.hasNext(); ) { 47 handleStores( (VarNode) it.next() ); 48 } 49 for( Iterator frIt = pag.loadSources().iterator(); frIt.hasNext(); ) { 50 final FieldRefNode fr = (FieldRefNode) frIt.next(); 51 fieldToBase.put( fr.getField(), fr.getBase() ); 52 } 53 for( Iterator frIt = pag.storeInvSources().iterator(); frIt.hasNext(); ) { 54 final FieldRefNode fr = (FieldRefNode) frIt.next(); 55 fieldToBase.put( fr.getField(), fr.getBase() ); 56 } 57 for( Iterator srcIt = pag.getVarNodeNumberer().iterator(); srcIt.hasNext(); ) { 58 final VarNode src = (VarNode) srcIt.next(); 59 for( Iterator frIt = src.getAllFieldRefs().iterator(); frIt.hasNext(); ) { 60 final FieldRefNode fr = (FieldRefNode) frIt.next(); 61 for( Iterator dstIt = fieldToBase.get( fr.getField() ).iterator(); dstIt.hasNext(); ) { 62 final VarNode dst = (VarNode) dstIt.next(); 63 if( !src.getP2Set().hasNonEmptyIntersection( 64 dst.getP2Set() ) ) continue; 65 FieldRefNode fr2 = dst.dot( fr.getField() ); 66 if( fr2.getReplacement() != fr.getReplacement() ) { 67 G.v().out.println( "Check failure: " 68 +fr+" should be merged with "+fr2 ); 69 } 70 } 71 } 72 } 73 74 } 75 76 77 78 79 protected void checkAll( final Node container, PointsToSetInternal nodes, 80 final Node upstream ) { 81 nodes.forall( new P2SetVisitor() { 82 public final void visit( Node n ) { 83 checkNode( container, n, upstream ); 84 } 85 } ); 86 } 87 protected void checkNode( Node container, Node n, Node upstream ) { 88 if( container.getReplacement() != container ) 89 throw new RuntimeException ( "container "+container+" is illegal" ); 90 if( upstream.getReplacement() != upstream ) 91 throw new RuntimeException ( "upstream "+upstream+" is illegal" ); 92 PointsToSetInternal p2set = container.getP2Set(); 93 FastHierarchy fh = pag.getTypeManager().getFastHierarchy(); 94 if( !p2set.contains( n ) 95 && ( fh == null || container.getType() == null || 96 fh.canStoreType( n.getType(), container.getType() ) ) ) { 97 G.v().out.println( "Check failure: "+container+" does not have "+n 98 +"; upstream is "+upstream ); 99 } 100 } 101 protected void handleAllocNode( AllocNode src ) { 102 Node[] targets = pag.allocLookup( src ); 103 for( int i = 0; i < targets.length; i++ ) { 104 checkNode( targets[i], src, src ); 105 } 106 } 107 108 protected void handleSimples( VarNode src ) { 109 PointsToSetInternal srcSet = src.getP2Set(); 110 if( srcSet.isEmpty() ) return; 111 final Node[] simpleTargets = pag.simpleLookup( src ); 112 for( int i = 0; i < simpleTargets.length; i++ ) { 113 checkAll( simpleTargets[i], srcSet, src ); 114 } 115 } 116 117 protected void handleStores( final VarNode src ) { 118 final PointsToSetInternal srcSet = src.getP2Set(); 119 if( srcSet.isEmpty() ) return; 120 Node[] storeTargets = pag.storeLookup( src ); 121 for( int i = 0; i < storeTargets.length; i++ ) { 122 final FieldRefNode fr = (FieldRefNode) storeTargets[i]; 123 checkAll( fr, srcSet, src ); 124 } 125 } 126 127 protected void handleLoads( final FieldRefNode src ) { 128 final Node[] loadTargets = pag.loadLookup( src ); 129 PointsToSetInternal set = src.getP2Set(); 130 if( set.isEmpty() ) return; 131 for( int i = 0; i < loadTargets.length; i++ ) { 132 VarNode target = (VarNode) loadTargets[i]; 133 checkAll( target, set, src ); 134 } 135 } 136 137 protected PAG pag; 138 protected MultiMap fieldToBase = new HashMultiMap(); 139 } 140 141 142 143 | Popular Tags |