import java.util.*;
import MCC.IR.DebugItem;
+import MCC.IR.RepairGenerator;
/**
* A generic command-line interface for 6.035 compilers. This class
* files.
*
* @author le01, 6.035 Staff (<tt>6.035-staff@mit.edu</tt>)
- * @version <tt>$Id: CLI.java,v 1.19 2005/10/17 00:29:13 bdemsky Exp $</tt>
+ * @version <tt>$Id: CLI.java,v 1.20 2005/11/09 16:47:42 bdemsky Exp $</tt>
*/
public class CLI {
/**
System.out.println("-printrepairs -- print log of repair actions");
System.out.println("-exactallocation -- application calls malloc for each struct and");
System.out.println(" allocates exactly the right amount of space.");
-
+ System.out.println("-name -- set name");
System.exit(-1);
}
Compiler.PRUNEQUANTIFIERS=true;
} else if (args[i].equals("-cplusplus")) {
Compiler.ALLOCATECPLUSPLUS=true;
+ } else if (args[i].equals("-name")) {
+ i++;
+ RepairGenerator.name=args[i];
+ RepairGenerator.postfix=args[i];
} else if (args[i].equals("-verbose") || args[i].equals("-v")) {
context = 0;
verbose++;
UpdateNode un=new UpdateNode(null);
un.addUpdate(u);
un.generate(writer,false,false,null,null,null,null);
- writer.outputline("break;");
+ writer.outputline("free"+RepairGenerator.name+"("+RepairGenerator.newmodel.getSafeSymbol()+");");
+ writer.outputline("computesizes(thisvar);");
+ writer.outputline(RepairGenerator.name+"_staterecomputesizes(thisvar);");
+ writer.outputline("goto rebuild;");
+
+ // writer.outputline("break;");
+
} else if ((indexbound instanceof OpExpr)&&
(((OpExpr)indexbound).getOpcode()==Opcode.MULT)&&
(((OpExpr)indexbound).getLeftExpr() instanceof DotExpr)&&
UpdateNode un=new UpdateNode(null);
un.addUpdate(u);
un.generate(writer,false,false,null,null,null,null);
- writer.outputline("break;");
+ writer.outputline("free"+RepairGenerator.name+"("+RepairGenerator.newmodel.getSafeSymbol()+");");
+ writer.outputline("computesizes(thisvar);");
+ writer.outputline(RepairGenerator.name+"_staterecomputesizes(thisvar);");
+ writer.outputline("goto rebuild;");
+ // writer.outputline("break;");
writer.endblock();
}
writer.outputline("else if (("+rightside.getSafeSymbol()+"!=0)&&("+numElements.getSafeSymbol()+"%"+rightside.getSafeSymbol()+"==0))");
UpdateNode un=new UpdateNode(null);
un.addUpdate(u);
un.generate(writer,false,false,null,null,null,null);
- writer.outputline("break;");
+ writer.outputline("free"+RepairGenerator.name+"("+RepairGenerator.newmodel.getSafeSymbol()+");");
+ writer.outputline("computesizes(thisvar);");
+ writer.outputline(RepairGenerator.name+"_staterecomputesizes(thisvar);");
+ writer.outputline("goto rebuild;");
+ // writer.outputline("break;");
writer.endblock();
}
PrintWrapper outputrepair = null;
PrintWrapper outputaux = null;
PrintWrapper outputhead = null;
- String name="foo";
+ public static String name="foo";
+ public static String postfix="";
String headername;
static VarDescriptor oldmodel=null;
static VarDescriptor newmodel=null;
if (togenerate.contains(gn))
for (int i=0;i<mun.numUpdates();i++) {
UpdateNode un=mun.getUpdate(i);
- String name="update"+String.valueOf(count++);
+ String name="update"+RepairGenerator.name+String.valueOf(count++);
updatenames.put(un,name);
}
}
cr.outputline(vdstate.getSafeSymbol()+"->"+vd.getSafeSymbol()+"=("+vd.getType().getGenerateType().getSafeSymbol()+")"+vd.getSafeSymbol()+";");
}
/* Insert repair here */
- cr.outputline("doanalysis("+vdstate.getSafeSymbol()+");");
+ cr.outputline("doanalysis"+postfix+"("+vdstate.getSafeSymbol()+");");
globals=state.stGlobals.descriptors();
while (globals.hasNext()) {
VarDescriptor vd=(VarDescriptor) globals.next();
craux.outputline("int abstractcount;");
}
- crhead.outputline("void doanalysis(struct "+name+"_state *);");
- craux.outputline("void doanalysis(struct "+name+"_state * thisvar)");
+ crhead.outputline("void doanalysis"+postfix+"(struct "+name+"_state *);");
+ craux.outputline("void doanalysis"+postfix+"(struct "+name+"_state * thisvar)");
craux.startblock();
craux.outputline("int highmark;"); /* This declaration is special...need it to be first */
craux.startBuffer();