01: package dk.brics.soot.transformations;
02:
03: import java.util.Iterator;
04: import java.util.Map;
05:
06: import dk.brics.soot.analyses.SimpleVeryBusyExpressions;
07: import dk.brics.soot.analyses.VeryBusyExpressions;
08:
09: import soot.*;
10: import soot.tagkit.ColorTag;
11: import soot.tagkit.StringTag;
12: import soot.toolkits.graph.ExceptionalUnitGraph;
13:
14: public class VeryBusyExpsTagger extends BodyTransformer {
15: public static final String PHASE_NAME = "vbetagger";
16: public static final String TAG_TYPE = "Busy Expressions";
17:
18: // NOTE: According to SOOT coding rules, this is not the correct way of
19: // providing a singleton. Instead one should add the class name to
20: // %SOOTHOME/src/singletons.list and then run:
21: // %SOOTHOME/src/make_singletons > soot/src/soot/Singletons.java
22: // and then provide:
23: // 1. public VeryBusyExpsTagger(Singletons.G.global g) {}
24: // 2. public static VeryBusyExpsTagger v() {return G.v().<singleton_name>}
25: // This is so that when resetting soot by calling G.v().reset() this
26: // class will also be reset. (But there's nothing to reset here so
27: // I'll ignore that for now :) )
28: private static VeryBusyExpsTagger instance = new VeryBusyExpsTagger();
29:
30: private VeryBusyExpsTagger() {
31: }
32:
33: public static VeryBusyExpsTagger v() {
34: return instance;
35: }
36:
37: /**
38: * Adds <code>StringTag</code>s and <code>ColorTag</code>s to the body
39: * in the interest of using Eclipse to relay information to the user.<br/>
40: * Every unit that has a busy expression flowing out of it, gets a
41: * <code>StringTag</code> describing that fact (per expression).
42: * If an expression that is busy out of that unit is also used within
43: * it, then we add a <code>ColorTag</code> to that expression.
44: * @param b the body to transform
45: * @param phaseName the name of the phase this transform belongs to
46: * @param options any options to this transform (in this case always empty)
47: */
48: protected void internalTransform(Body b, String phaseName,
49: Map options) {
50: VeryBusyExpressions vbe = new SimpleVeryBusyExpressions(
51: new ExceptionalUnitGraph(b));
52:
53: Iterator unitIt = b.getUnits().iterator();
54: while (unitIt.hasNext()) {
55: Unit u = (Unit) unitIt.next();
56: Iterator veryBusyIt = vbe.getBusyExpressionsAfter(u)
57: .iterator();
58: while (veryBusyIt.hasNext()) {
59: Value v = (Value) veryBusyIt.next();
60: u.addTag(new StringTag("Busy expression: " + v,
61: TAG_TYPE));
62:
63: Iterator usesIt = u.getUseBoxes().iterator();
64: while (usesIt.hasNext()) {
65: ValueBox use = (ValueBox) usesIt.next();
66: if (use.getValue().equivTo(v))
67: use
68: .addTag(new ColorTag(ColorTag.RED,
69: TAG_TYPE));
70: }
71: }
72: }
73: }
74: }
|