KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > soot > jimple > spark > solver > MergeChecker


1 /* Soot - a J*va Optimization Framework
2  * Copyright (C) 2002 Ondrej Lhotak
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */

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 /** Checks points-to sets with pointer assignment graph to make sure everything
29  * has been correctly propagated.
30  * @author Ondrej Lhotak
31  */

32
33 public class MergeChecker {
34     public MergeChecker( PAG pag ) { this.pag = pag; }
35     /** Actually does the propagation. */
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     /* End of public methods. */
77     /* End of package methods. */
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 JavaDoc( "container "+container+" is illegal" );
90         if( upstream.getReplacement() != upstream )
91             throw new RuntimeException JavaDoc( "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