diff options
Diffstat (limited to 'src/spiglet')
-rw-r--r-- | src/spiglet/spiglet2kanga/SpgExpr.java | 30 | ||||
-rw-r--r-- | src/spiglet/spiglet2kanga/SpgProc.java | 7 | ||||
-rw-r--r-- | src/spiglet/spiglet2kanga/SpgSimpExpr.java | 12 | ||||
-rw-r--r-- | src/spiglet/spiglet2kanga/SpgStmt.java | 44 |
4 files changed, 92 insertions, 1 deletions
diff --git a/src/spiglet/spiglet2kanga/SpgExpr.java b/src/spiglet/spiglet2kanga/SpgExpr.java index f10c4b7..9f5fef9 100644 --- a/src/spiglet/spiglet2kanga/SpgExpr.java +++ b/src/spiglet/spiglet2kanga/SpgExpr.java @@ -1,10 +1,18 @@ package spiglet.spiglet2kanga; +import java.util.HashSet; import java.util.Vector; public class SpgExpr extends SpgSym { public enum ExpType { CALL, ALLOC, BinOp, Simple }; + /* + * CALL Simp (Tmp Tmp ...) + * HALLOCATE Simp + * BinOP Tmp Simp + * Simp := Tmp | Int | Label + */ + public ExpType type; public String op; public SpgTemp oprand; @@ -44,4 +52,26 @@ public class SpgExpr extends SpgSym { } } + + public HashSet<SpgTemp> getTmpUsed() { + HashSet<SpgTemp> s = new HashSet<SpgTemp>(); + switch (type) { + case ALLOC: + return se.getTmpUsed(); + case BinOp: + s.add(oprand); + s.addAll(se.getTmpUsed()); + return s; + case CALL: + s.addAll(se.getTmpUsed()); + s.addAll(callParams); + return s; + case Simple: + System.err.println("Should not be here..."); + return ((SpgSimpExpr)this).getTmpUsed(); + default: + return null; + + } + } } diff --git a/src/spiglet/spiglet2kanga/SpgProc.java b/src/spiglet/spiglet2kanga/SpgProc.java index f1f0f34..84ff49f 100644 --- a/src/spiglet/spiglet2kanga/SpgProc.java +++ b/src/spiglet/spiglet2kanga/SpgProc.java @@ -45,6 +45,7 @@ public class SpgProc extends SpgSym { } } + // then map the labels to statements for (int i=0; i<statements.size(); i++) { SpgStmt stmt = statements.elementAt(i); if (stmt.type==SpgStmt.StmtType.JUMP) { @@ -65,7 +66,11 @@ public class SpgProc extends SpgSym { } } - + public void getDefUse() { + for (int i=0; i<statements.size(); i++) { + statements.elementAt(i).getDefUse(); + } + } } diff --git a/src/spiglet/spiglet2kanga/SpgSimpExpr.java b/src/spiglet/spiglet2kanga/SpgSimpExpr.java index eec575d..9b7d98a 100644 --- a/src/spiglet/spiglet2kanga/SpgSimpExpr.java +++ b/src/spiglet/spiglet2kanga/SpgSimpExpr.java @@ -1,5 +1,7 @@ package spiglet.spiglet2kanga; +import java.util.HashSet; + public class SpgSimpExpr extends SpgExpr { public enum SExprType { TEMP, INT, LB }; SExprType type; @@ -24,4 +26,14 @@ public class SpgSimpExpr extends SpgExpr { } } + + public HashSet<SpgTemp> getTmpUsed() { + if (this instanceof SpgTemp) { + HashSet<SpgTemp> s = new HashSet<SpgTemp>(); + s.add((SpgTemp)this); + return s; + } else { + return null; + } + } } diff --git a/src/spiglet/spiglet2kanga/SpgStmt.java b/src/spiglet/spiglet2kanga/SpgStmt.java index d5921b9..4f2ffb2 100644 --- a/src/spiglet/spiglet2kanga/SpgStmt.java +++ b/src/spiglet/spiglet2kanga/SpgStmt.java @@ -1,5 +1,7 @@ package spiglet.spiglet2kanga; +import java.util.HashSet; + public class SpgStmt extends SpgSym{ public enum StmtType { NOOP, ERROR, CJUMP, JUMP, STORE, LOAD, MOVE, PRINT }; StmtType type; @@ -11,6 +13,8 @@ public class SpgStmt extends SpgSym{ public String lb; public SpgStmt succ1, succ2; + public HashSet<SpgTemp> def, use; + public SpgStmt(StmtType t) { type = t; } @@ -39,4 +43,44 @@ public class SpgStmt extends SpgSym{ return null; } } + + public void getDefUse() { + switch (type) { + case CJUMP: + def = null; + use = tmp1.getTmpUsed(); + break; + case ERROR: + def = use = null; + break; + case JUMP: + def = use = null; + break; + case LOAD: + def = tmp1.getTmpUsed(); + use = tmp2.getTmpUsed(); + break; + case MOVE: + def = tmp1.getTmpUsed(); + use = exp.getTmpUsed(); + break; + case NOOP: + def = use = null; + break; + case PRINT: + def = null; + use = exp.getTmpUsed(); + break; + case STORE: + def = null; + use = tmp1.getTmpUsed(); + use.add(tmp2); + break; + default: + System.err.println("Unknown statement type"); + def = use = null; + break; + + } + } } |