From: bdemsky <bdemsky>
Date: Fri, 10 Mar 2006 19:12:50 +0000 (+0000)
Subject: changes
X-Git-Tag: preEdgeChange~958
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ac27e8c8e05bf1de76a82ceaa11d11d563c82c21;p=IRC.git

changes
---

diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java
index 32684bc6..374674a2 100644
--- a/Robust/src/IR/Flat/BuildFlat.java
+++ b/Robust/src/IR/Flat/BuildFlat.java
@@ -12,6 +12,10 @@ public class BuildFlat {
 	temptovar=new Hashtable();
     }
 
+    public Hashtable getMap() {
+	return temptovar;
+    }
+
     public void buildFlat() {
 	Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
 	while(it.hasNext()) {
@@ -27,6 +31,11 @@ public class BuildFlat {
 	    BlockNode bn=state.getMethodBody(md);
 	    FlatNode fn=flattenBlockNode(bn).getBegin();
 	    FlatMethod fm=new FlatMethod(md, fn);
+	    if (!md.isStatic())
+		fm.addParameterTemp(getTempforVar(md.getThis()));
+	    for(int i=0;i<md.numParameters();i++) {
+		fm.addParameterTemp(getTempforVar(md.getParameter(i)));
+	    }
 	    System.out.println(fm.printMethod());
 	    state.addFlatCode(md,fm);
 	}
@@ -56,12 +65,12 @@ public class BuildFlat {
     }
 
     private NodePair flattenBlockExpressionNode(BlockExpressionNode en) {
-	TempDescriptor tmp=TempDescriptor.tempFactory("neverused");
+	TempDescriptor tmp=TempDescriptor.tempFactory("neverused",en.getExpression().getType());
 	return flattenExpressionNode(en.getExpression(),tmp);
     }
 
     private NodePair flattenCastNode(CastNode cn,TempDescriptor out_temp) {
-	TempDescriptor tmp=TempDescriptor.tempFactory("tocast");
+	TempDescriptor tmp=TempDescriptor.tempFactory("tocast",cn.getExpression().getType());
 	NodePair np=flattenExpressionNode(cn.getExpression(), tmp);
 	FlatCastNode fcn=new FlatCastNode(cn.getType(), tmp, out_temp);
 	np.getEnd().addNext(fcn);
@@ -81,7 +90,7 @@ public class BuildFlat {
 	//Build arguments
 	for(int i=0;i<con.numArgs();i++) {
 	    ExpressionNode en=con.getArg(i);
-	    TempDescriptor tmp=TempDescriptor.tempFactory("arg");
+	    TempDescriptor tmp=TempDescriptor.tempFactory("arg",en.getType());
 	    temps[i]=tmp;
 	    NodePair np=flattenExpressionNode(en, tmp);
 	    last.addNext(np.getBegin());
@@ -101,7 +110,7 @@ public class BuildFlat {
 	TempDescriptor thisarg=null;
 
 	if (min.getExpression()!=null) {
-	    thisarg=TempDescriptor.tempFactory("thisarg");
+	    thisarg=TempDescriptor.tempFactory("thisarg",min.getExpression().getType());
 	    NodePair np=flattenExpressionNode(min.getExpression(),thisarg);
 	    first=np.getBegin();
 	    last=np.getEnd();
@@ -110,7 +119,7 @@ public class BuildFlat {
 	//Build arguments
 	for(int i=0;i<min.numArgs();i++) {
 	    ExpressionNode en=min.getArg(i);
-	    TempDescriptor td=TempDescriptor.tempFactory("arg");
+	    TempDescriptor td=TempDescriptor.tempFactory("arg",en.getType());
 	    temps[i]=td;
 	    NodePair np=flattenExpressionNode(en, td);
 	    if (first==null)
@@ -132,7 +141,7 @@ public class BuildFlat {
     }
 
     private NodePair flattenFieldAccessNode(FieldAccessNode fan,TempDescriptor out_temp) {
-	TempDescriptor tmp=TempDescriptor.tempFactory("temp");
+	TempDescriptor tmp=TempDescriptor.tempFactory("temp",fan.getExpression().getType());
 	NodePair npe=flattenExpressionNode(fan.getExpression(),tmp);
 	FlatFieldNode fn=new FlatFieldNode(fan.getField(),tmp,out_temp);
 	npe.getEnd().addNext(fn);
@@ -145,14 +154,14 @@ public class BuildFlat {
 	// left side is field
 	
 	Operation base=an.getOperation().getBaseOp();
-	TempDescriptor src_tmp=TempDescriptor.tempFactory("src");
+	TempDescriptor src_tmp=TempDescriptor.tempFactory("src",an.getSrc().getType());
 	NodePair np_src=flattenExpressionNode(an.getSrc(),src_tmp);
 	FlatNode last=np_src.getEnd();
 	if (base!=null) {
-	    TempDescriptor src_tmp2=TempDescriptor.tempFactory("tmp");
+	    TempDescriptor src_tmp2=TempDescriptor.tempFactory("tmp", an.getDest().getType());
 	    NodePair np_dst_init=flattenExpressionNode(an.getDest(),src_tmp2);
 	    last.addNext(np_dst_init.getBegin());
-	    TempDescriptor dst_tmp=TempDescriptor.tempFactory("dst_tmp");
+	    TempDescriptor dst_tmp=TempDescriptor.tempFactory("dst_tmp",an.getDest().getType());
 	    FlatOpNode fon=new FlatOpNode(dst_tmp, src_tmp,src_tmp2, base);
 	    np_dst_init.getEnd().addNext(fon);
 	    last=fon;
@@ -162,7 +171,7 @@ public class BuildFlat {
 	if (an.getDest().kind()==Kind.FieldAccessNode) {
 	    FieldAccessNode fan=(FieldAccessNode)an.getDest();
 	    ExpressionNode en=fan.getExpression();
-	    TempDescriptor dst_tmp=TempDescriptor.tempFactory("dst");
+	    TempDescriptor dst_tmp=TempDescriptor.tempFactory("dst",en.getType());
 	    NodePair np_baseexp=flattenExpressionNode(en, dst_tmp);
 	    last.addNext(np_baseexp.getBegin());
 	    FlatSetFieldNode fsfn=new FlatSetFieldNode(dst_tmp, fan.getField(), src_tmp);
@@ -173,7 +182,7 @@ public class BuildFlat {
 	    if (nn.getExpression()!=null) {
 		FieldAccessNode fan=(FieldAccessNode)nn.getExpression();
 		ExpressionNode en=fan.getExpression();
-		TempDescriptor dst_tmp=TempDescriptor.tempFactory("dst");
+		TempDescriptor dst_tmp=TempDescriptor.tempFactory("dst",en.getType());
 		NodePair np_baseexp=flattenExpressionNode(en, dst_tmp);
 		last.addNext(np_baseexp.getBegin());
 		FlatSetFieldNode fsfn=new FlatSetFieldNode(dst_tmp, fan.getField(), src_tmp);
@@ -210,13 +219,15 @@ public class BuildFlat {
     }
 
     private NodePair flattenOpNode(OpNode on,TempDescriptor out_temp) {
-	TempDescriptor temp_left=TempDescriptor.tempFactory("leftop");
-	TempDescriptor temp_right=TempDescriptor.tempFactory("rightop");
+	TempDescriptor temp_left=TempDescriptor.tempFactory("leftop",on.getLeft().getType());
+	TempDescriptor temp_right=null;
+
 	NodePair left=flattenExpressionNode(on.getLeft(),temp_left);
 	NodePair right;
-	if (on.getRight()!=null)
+	if (on.getRight()!=null) {
+	    temp_right=TempDescriptor.tempFactory("rightop",on.getRight().getType());
 	    right=flattenExpressionNode(on.getRight(),temp_right);
-	else {
+	} else {
 	    FlatNop nop=new FlatNop();
 	    right=new NodePair(nop,nop);
 	}
@@ -264,14 +275,14 @@ public class BuildFlat {
 	if (temptovar.containsKey(vd))
 	    return (TempDescriptor)temptovar.get(vd);
 	else {
-	    TempDescriptor td=TempDescriptor.tempFactory(vd.getName());
+	    TempDescriptor td=TempDescriptor.tempFactory(vd.getName(),vd.getType());
 	    temptovar.put(vd,td);
 	    return td;
 	}
     }
 
     private NodePair flattenIfStatementNode(IfStatementNode isn) {
-	TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
+	TempDescriptor cond_temp=TempDescriptor.tempFactory("condition",new TypeDescriptor(TypeDescriptor.BOOLEAN));
 	NodePair cond=flattenExpressionNode(isn.getCondition(),cond_temp);
 	FlatCondBranch fcb=new FlatCondBranch(cond_temp);
 	NodePair true_np=flattenBlockNode(isn.getTrueBlock());
@@ -296,7 +307,7 @@ public class BuildFlat {
     private NodePair flattenLoopNode(LoopNode ln) {
 	if (ln.getType()==LoopNode.FORLOOP) {
 	    NodePair initializer=flattenBlockNode(ln.getInitializer());
-	    TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
+	    TempDescriptor cond_temp=TempDescriptor.tempFactory("condition", new TypeDescriptor(TypeDescriptor.BOOLEAN));
 	    NodePair condition=flattenExpressionNode(ln.getCondition(),cond_temp);
 	    NodePair update=flattenBlockNode(ln.getUpdate());
 	    NodePair body=flattenBlockNode(ln.getBody());
@@ -312,7 +323,7 @@ public class BuildFlat {
 	    fcb.addTrueNext(body.getBegin());
 	    return new NodePair(begin,nopend);
 	} else if (ln.getType()==LoopNode.WHILELOOP) {
-	    TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
+	    TempDescriptor cond_temp=TempDescriptor.tempFactory("condition", new TypeDescriptor(TypeDescriptor.BOOLEAN));
 	    NodePair condition=flattenExpressionNode(ln.getCondition(),cond_temp);
 	    NodePair body=flattenBlockNode(ln.getBody());
 	    FlatNode begin=condition.getBegin();
@@ -325,7 +336,7 @@ public class BuildFlat {
 	    fcb.addTrueNext(body.getBegin());
 	    return new NodePair(begin,nopend);
 	} else if (ln.getType()==LoopNode.DOWHILELOOP) {
-	    TempDescriptor cond_temp=TempDescriptor.tempFactory("condition");
+	    TempDescriptor cond_temp=TempDescriptor.tempFactory("condition", new TypeDescriptor(TypeDescriptor.BOOLEAN));
 	    NodePair condition=flattenExpressionNode(ln.getCondition(),cond_temp);
 	    NodePair body=flattenBlockNode(ln.getBody());
 	    FlatNode begin=body.getBegin();
@@ -341,7 +352,7 @@ public class BuildFlat {
     }
 	    
     private NodePair flattenReturnNode(ReturnNode rntree) {
-	TempDescriptor retval=TempDescriptor.tempFactory("ret_value");
+	TempDescriptor retval=TempDescriptor.tempFactory("ret_value", rntree.getReturnExpression().getType());
 	NodePair cond=flattenExpressionNode(rntree.getReturnExpression(),retval);
 	FlatReturnNode rnflat=new FlatReturnNode(retval);
 	cond.getEnd().addNext(rnflat);
diff --git a/Robust/src/IR/Flat/FlatCall.java b/Robust/src/IR/Flat/FlatCall.java
index df88face..d11d79d8 100644
--- a/Robust/src/IR/Flat/FlatCall.java
+++ b/Robust/src/IR/Flat/FlatCall.java
@@ -33,4 +33,28 @@ public class FlatCall extends FlatNode {
 	}
 	return st+")";
     }
+
+    public int kind() {
+	return FKind.FlatCall;
+    }
+
+    public TempDescriptor [] readsTemps() {
+	int size=args.length;
+	if (this_temp!=null)
+	    size++;
+	TempDescriptor [] t=new TempDescriptor[size];
+	int offset=0;
+	if (this_temp!=null)
+	    t[offset++]=this_temp;
+	for(int i=0;i<args.length;i++)
+	    t[offset++]=args[i];
+	return t;
+    }
+
+    public TempDescriptor [] writesTemps() {
+	if (dst!=null)
+	    return new TempDescriptor[] {dst};
+	else
+	    return new TempDescriptor[0];
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatCastNode.java b/Robust/src/IR/Flat/FlatCastNode.java
index 2b3e45a7..d8d80b5f 100644
--- a/Robust/src/IR/Flat/FlatCastNode.java
+++ b/Robust/src/IR/Flat/FlatCastNode.java
@@ -15,4 +15,17 @@ public class FlatCastNode extends FlatNode {
     public String toString() {
 	return dst.toString()+"=("+type.toString()+")"+src.toString();
     }
+
+    public int kind() {
+	return FKind.FlatCastNode;
+    }
+
+    public TempDescriptor [] writesTemps() {
+	return new TempDescriptor[] {dst};
+    }
+
+    public TempDescriptor [] readsTemps() {
+	return new TempDescriptor[] {src};
+    }
+
 }
diff --git a/Robust/src/IR/Flat/FlatCondBranch.java b/Robust/src/IR/Flat/FlatCondBranch.java
index 82471ed6..f6a885bf 100644
--- a/Robust/src/IR/Flat/FlatCondBranch.java
+++ b/Robust/src/IR/Flat/FlatCondBranch.java
@@ -32,4 +32,12 @@ public class FlatCondBranch extends FlatNode {
     public void addNext(FlatNode n) {
 	throw new Error();
     }
+
+    public int kind() {
+	return FKind.FlatCondBranch;
+    }
+
+    public TempDescriptor [] readsTemps() {
+	return new TempDescriptor[] {test_cond};
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatFieldNode.java b/Robust/src/IR/Flat/FlatFieldNode.java
index 7dfc2e19..48054b37 100644
--- a/Robust/src/IR/Flat/FlatFieldNode.java
+++ b/Robust/src/IR/Flat/FlatFieldNode.java
@@ -19,4 +19,16 @@ public class FlatFieldNode extends FlatNode {
     public String toString() {
 	return dst.toString()+"="+src.toString()+"."+field.getSymbol();
     }
+
+    public int kind() {
+	return FKind.FlatFieldNode;
+    }
+
+    public TempDescriptor [] writesTemps() {
+	return new TempDescriptor[] {dst};
+    }
+
+    public TempDescriptor [] readsTemps() {
+	return new TempDescriptor[] {src};
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatLiteralNode.java b/Robust/src/IR/Flat/FlatLiteralNode.java
index 78c2cca5..c27836bc 100644
--- a/Robust/src/IR/Flat/FlatLiteralNode.java
+++ b/Robust/src/IR/Flat/FlatLiteralNode.java
@@ -34,4 +34,12 @@ public class FlatLiteralNode extends FlatNode {
 	}
 	return new_st;
     }
+
+    public int kind() {
+	return FKind.FlatLiteralNode;
+    }
+
+    public TempDescriptor [] writesTemps() {
+	return new TempDescriptor[] {dst};
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatMethod.java b/Robust/src/IR/Flat/FlatMethod.java
index d0c7b83e..fc444128 100644
--- a/Robust/src/IR/Flat/FlatMethod.java
+++ b/Robust/src/IR/Flat/FlatMethod.java
@@ -5,18 +5,24 @@ import java.util.*;
 public class FlatMethod extends FlatNode {
     FlatNode method_entry;
     MethodDescriptor method;
+    Vector parameterTemps;
 
     FlatMethod(MethodDescriptor md, FlatNode entry) {
 	method=md;
 	method_entry=entry;
+	parameterTemps=new Vector();
     }
-    
+
     public String toString() {
 	return method.toString();
     }
     
+    public void addParameterTemp(TempDescriptor t) {
+	parameterTemps.add(t);
+    }
+
     public String printMethod() {
-	String st=method+"\n";
+	String st=method+" {\n";
 	HashSet tovisit=new HashSet();
 	HashSet visited=new HashSet();
 	int labelindex=0;
@@ -79,7 +85,10 @@ public class FlatMethod extends FlatNode {
 		    current_node=current_node.getNext(0);
 	    } else throw new Error();
 	}
-	return st;
+	return st+"}\n";
+    }
+    
+    public TempDescriptor [] writesTemps() {
+	return (TempDescriptor[]) parameterTemps.toArray(new TempDescriptor[ parameterTemps.size()]);
     }
-
 }
diff --git a/Robust/src/IR/Flat/FlatNew.java b/Robust/src/IR/Flat/FlatNew.java
index e8aeaa63..c8769bdb 100644
--- a/Robust/src/IR/Flat/FlatNew.java
+++ b/Robust/src/IR/Flat/FlatNew.java
@@ -13,4 +13,12 @@ public class FlatNew extends FlatNode {
     public String toString() {
 	return dst.toString()+"= NEW "+type.toString();
     }
+
+    public int kind() {
+	return FKind.FlatNew;
+    }
+
+    public TempDescriptor [] writesTemps() {
+	return new TempDescriptor[] {dst};
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatNode.java b/Robust/src/IR/Flat/FlatNode.java
index ba5641bf..b624516d 100644
--- a/Robust/src/IR/Flat/FlatNode.java
+++ b/Robust/src/IR/Flat/FlatNode.java
@@ -34,4 +34,15 @@ public class FlatNode {
     protected void addPrev(FlatNode p) {
 	prev.add(p);
     }
+    public int kind() {
+	throw new Error();
+    }
+
+    public TempDescriptor [] readsTemps() {
+	return new TempDescriptor[0];
+    }
+
+    public TempDescriptor [] writesTemps() {
+	return new TempDescriptor[0];
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatNop.java b/Robust/src/IR/Flat/FlatNop.java
index 62fad291..36079fbf 100644
--- a/Robust/src/IR/Flat/FlatNop.java
+++ b/Robust/src/IR/Flat/FlatNop.java
@@ -8,4 +8,8 @@ public class FlatNop extends FlatNode {
     public String toString() {
 	return "nop";
     }
+
+    public int kind() {
+	return FKind.FlatNop;
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatOpNode.java b/Robust/src/IR/Flat/FlatOpNode.java
index 150b225b..09692906 100644
--- a/Robust/src/IR/Flat/FlatOpNode.java
+++ b/Robust/src/IR/Flat/FlatOpNode.java
@@ -39,4 +39,19 @@ public class FlatOpNode extends FlatNode {
 	else
 	    return dest.toString()+" "+op.toString() +" "+left.toString();
     }
+
+    public int kind() {
+	return FKind.FlatOpNode;
+    }
+
+    public TempDescriptor [] readsTemps() {
+	if (right!=null)
+	    return new TempDescriptor [] {left,right};
+	else
+	    return new TempDescriptor [] {left};
+    }
+
+    public TempDescriptor [] writesTemps() {
+	return new TempDescriptor [] {dest};
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatReturnNode.java b/Robust/src/IR/Flat/FlatReturnNode.java
index d407a38d..313bf84c 100644
--- a/Robust/src/IR/Flat/FlatReturnNode.java
+++ b/Robust/src/IR/Flat/FlatReturnNode.java
@@ -10,5 +10,13 @@ public class FlatReturnNode extends FlatNode {
     public String toString() {
 	return "return "+tempdesc;
     }
-
+    public int kind() {
+	return FKind.FlatReturnNode;
+    }
+    public TempDescriptor [] readsTemps() {
+	if (tempdesc==null)
+	    return new TempDescriptor [0];
+	else
+	    return new TempDescriptor [] {tempdesc};
+    }
 }
diff --git a/Robust/src/IR/Flat/FlatSetFieldNode.java b/Robust/src/IR/Flat/FlatSetFieldNode.java
index 874193a3..396627ac 100644
--- a/Robust/src/IR/Flat/FlatSetFieldNode.java
+++ b/Robust/src/IR/Flat/FlatSetFieldNode.java
@@ -19,4 +19,12 @@ public class FlatSetFieldNode extends FlatNode {
     public String toString() {
 	return dst.toString()+"."+field.getSymbol()+"="+src.toString();
     }
+
+    public int kind() {
+	return FKind.FlatSetFieldNode;
+    }
+    
+    public TempDescriptor [] readsTemps() {
+	return new TempDescriptor [] {src,dst};
+    }
 }
diff --git a/Robust/src/IR/Flat/TempDescriptor.java b/Robust/src/IR/Flat/TempDescriptor.java
index 8cff4119..22daa688 100644
--- a/Robust/src/IR/Flat/TempDescriptor.java
+++ b/Robust/src/IR/Flat/TempDescriptor.java
@@ -5,11 +5,17 @@ public class TempDescriptor {
     static int currentid=0;
     int id;
     String safename;
+    TypeDescriptor type;
 
     public TempDescriptor(String name) {
 	safename="__"+name+"__";
 	id=currentid++;
     }
+
+    public TempDescriptor(String name, TypeDescriptor td) {
+	this(name);
+	type=td;
+    }
     
     public static TempDescriptor tempFactory() {
 	return new TempDescriptor("temp_"+currentid);
@@ -19,7 +25,20 @@ public class TempDescriptor {
 	return new TempDescriptor(name+currentid);
     }
 
+    public static TempDescriptor tempFactory(String name, TypeDescriptor td) {
+	return new TempDescriptor(name+currentid,td);
+    }
+
+
     public String toString() {
 	return safename;
     }
+
+    public void setType(TypeDescriptor td) {
+	type=td;
+    }
+
+    public TypeDescriptor getType() {
+	return type;
+    }
 }
diff --git a/Robust/src/IR/MethodDescriptor.java b/Robust/src/IR/MethodDescriptor.java
index 970dc9ea..acf3c5d8 100644
--- a/Robust/src/IR/MethodDescriptor.java
+++ b/Robust/src/IR/MethodDescriptor.java
@@ -49,6 +49,10 @@ public class MethodDescriptor extends Descriptor {
 	paramtable.add(vd);
     }
 
+    public VarDescriptor getThis() {
+	return thisvd;
+    }
+
     public boolean isStatic() {
 	return modifier.isStatic();
     }
@@ -89,6 +93,10 @@ public class MethodDescriptor extends Descriptor {
 	return params.size();
     }
 
+    public VarDescriptor getParameter(int i) {
+	return (VarDescriptor)params.get(i);
+    }
+
     public String getParamName(int i) {
 	return ((VarDescriptor)params.get(i)).getName();
     }
diff --git a/Robust/src/Main/Main.java b/Robust/src/Main/Main.java
index f8a83bb0..e49e2112 100644
--- a/Robust/src/Main/Main.java
+++ b/Robust/src/Main/Main.java
@@ -7,6 +7,7 @@ import IR.Tree.ParseNode;
 import IR.Tree.BuildIR;
 import IR.Tree.SemanticCheck;
 import IR.Flat.BuildFlat;
+import IR.Flat.BuildCode;
 import IR.State;
 import IR.TypeUtil;
 
@@ -21,7 +22,6 @@ public class Main {
     java_cup.runtime.lr_parser g;
     g = new Parse.Parser(l);
     ParseNode p=(ParseNode) g./*debug_*/parse().value;
-    //    System.out.println(p.PPrint(2,true));
     State state=new State(p);
 
     BuildIR bir=new BuildIR(state);
@@ -35,6 +35,9 @@ public class Main {
     BuildFlat bf=new BuildFlat(state);
     bf.buildFlat();
 
+    BuildCode bc=new BuildCode(state, bf.getMap());
+    
+
     System.exit(l.numErrors());
   }
 }