summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIru Cai <mytbk920423@gmail.com>2014-11-27 15:07:54 +0800
committerIru Cai <mytbk920423@gmail.com>2014-11-27 15:07:54 +0800
commitf0db604d42595101d32240cb445272dd400a9716 (patch)
treefe69c137b9d59b2f00a91187dad1183fd4fd82db
parent13d99117abb64f97b5636029134ccae8acb89f59 (diff)
downloadminijava-f0db604d42595101d32240cb445272dd400a9716.tar.xz
get def use
-rw-r--r--src/spiglet/spiglet2kanga/SpgExpr.java30
-rw-r--r--src/spiglet/spiglet2kanga/SpgProc.java7
-rw-r--r--src/spiglet/spiglet2kanga/SpgSimpExpr.java12
-rw-r--r--src/spiglet/spiglet2kanga/SpgStmt.java44
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;
+
+ }
+ }
}