X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=blobdiff_plain;f=Repair%2FRepairCompiler%2FMCC%2FIR%2FRepairGenerator.java;h=1114e1af8876f682a4271289113db61aad282eb8;hp=8bff95979b21a2b555a82e1a6d67102e13b9607f;hb=2834d0a0299416114317d21a700c0ff7d5341996;hpb=1ac19ae1b06036f6883e3a5f91b8a85ecab9ab72 diff --git a/Repair/RepairCompiler/MCC/IR/RepairGenerator.java b/Repair/RepairCompiler/MCC/IR/RepairGenerator.java index 8bff959..1114e1a 100755 --- a/Repair/RepairCompiler/MCC/IR/RepairGenerator.java +++ b/Repair/RepairCompiler/MCC/IR/RepairGenerator.java @@ -25,7 +25,6 @@ public class RepairGenerator { HashSet togenerate; static boolean DEBUG=false; Cost cost; - Sources sources; ModelRuleDependence mrd; public RepairGenerator(State state, Termination t) { @@ -40,7 +39,6 @@ public class RepairGenerator { togenerate.removeAll(removed); GraphNode.computeclosure(togenerate,removed); cost=new Cost(); - sources=new Sources(state); mrd=ModelRuleDependence.doAnalysis(state); Repair.repairgenerator=this; } @@ -88,12 +86,20 @@ public class RepairGenerator { generate_call(); generate_start(); generate_rules(); + if (!Compiler.REPAIR||Compiler.GENERATEDEBUGPRINT) { + generate_print(); + } generate_checks(); generate_teardown(); CodeWriter crhead = new StandardCodeWriter(this.outputhead); CodeWriter craux = new StandardCodeWriter(this.outputaux); crhead.outputline("};"); craux.outputline("}"); + + if (Compiler.GENERATEDEBUGHOOKS) { + crhead.outputline("void debughook();"); + craux.outputline("void debughook() {}"); + } generatetypechecks(false); generate_computesizes(); generatetypechecks(true); @@ -116,6 +122,8 @@ public class RepairGenerator { int count=0; CodeWriter crhead = new StandardCodeWriter(outputhead); CodeWriter craux = new StandardCodeWriter(outputaux); + RelationDescriptor.prefix = "model->"; + SetDescriptor.prefix = "model->"; /* Rewrite globals */ @@ -203,7 +211,7 @@ public class RepairGenerator { methodcall+=", int "+fq.getVar().getSafeSymbol(); } } - methodcall+=", "+stleft+", "+stright+", "+stnew; + methodcall+=", int "+stleft+", int "+stright+", int "+stnew; methodcall+=")"; crhead.outputline(methodcall+";"); craux.outputline(methodcall); @@ -288,6 +296,7 @@ public class RepairGenerator { }; cr.outputline("void "+name+"_state::computesizes(int *sizearray,int **numele) {"); + cr.outputline("int maybe=0;"); for(int i=0;icount());"); + cr.outputline("SimpleIterator __setiterator;"); + cr.outputline("" + setname + "_hash->iterator(__setiterator);"); + cr.outputline("while (__setiterator.hasNext())"); + cr.startblock(); + cr.outputline("int __setval = (int) __setiterator.next();"); + + TypeDescriptor td = sd.getType(); + if (td instanceof StructureTypeDescriptor) { + StructureTypeDescriptor std = (StructureTypeDescriptor) td; + VarDescriptor vd = new VarDescriptor ("__setval", "__setval", td, false); + std.generate_printout(cr, vd); + } else { // Missing type descriptor or reserved type, just print int + cr.outputline("printf(\"<%d> \", __setval);"); + } + + + cr.endblock(); + cr.endblock(); + } + + cr.outputline("printf(\"\\n\\n------------------- END PRINTING\\n\");"); + } + Set ruleset=null; private void generate_rules() { /* first we must sort the rules */ @@ -630,10 +688,13 @@ public class RepairGenerator { private void generate_checks() { /* do constraint checks */ - Vector constraints = state.vConstraints; + // Vector constraints = state.vConstraints; + - for (int i = 0; i < constraints.size(); i++) { - Constraint constraint = (Constraint) constraints.elementAt(i); + // for (int i = 0; i < constraints.size(); i++) { + // Constraint constraint = (Constraint) constraints.elementAt(i); + for (Iterator i = termination.constraintdependence.computeOrdering().iterator(); i.hasNext();) { + Constraint constraint = (Constraint) ((GraphNode)i.next()).getOwner(); { final SymbolTable st = constraint.getSymbolTable(); @@ -665,20 +726,24 @@ public class RepairGenerator { cr.outputline("else if (!" + constraintboolean.getSafeSymbol() + ")"); cr.startblock(); - if (!Compiler.REPAIR) + if (!Compiler.REPAIR||Compiler.GENERATEDEBUGHOOKS) cr.outputline("printf(\"fail " + escape(constraint.toString()) + ". \\n\");"); - else { + + if (Compiler.REPAIR) { /* Do repairs */ /* Build new repair table */ cr.outputline("if ("+repairtable.getSafeSymbol()+")"); cr.outputline("delete "+repairtable.getSafeSymbol()+";"); cr.outputline(repairtable.getSafeSymbol()+"=new RepairHash();"); - + if (Compiler.GENERATEDEBUGHOOKS) + cr.outputline("debughook();"); /* Compute cost of each repair */ VarDescriptor mincost=VarDescriptor.makeNew("mincost"); VarDescriptor mincostindex=VarDescriptor.makeNew("mincostindex"); - DNFConstraint dnfconst=constraint.dnfconstraint; + Vector dnfconst=new Vector(); + dnfconst.addAll((Set)termination.conjunctionmap.get(constraint)); + if (dnfconst.size()<=1) { cr.outputline("int "+mincostindex.getSafeSymbol()+"=0;"); } @@ -686,8 +751,8 @@ public class RepairGenerator { cr.outputline("int "+mincostindex.getSafeSymbol()+";"); boolean first=true; for(int j=0;jget("+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+");"); } else { - expr.getLeftExpr().generate(cr,rightside); + ((RelationExpr)expr.getLeftExpr()).getExpr().generate(cr,rightside); expr.getRightExpr().generate(cr,newvalue); cr.outputline(rd.getDomain().getType().getGenerateType().getSafeSymbol()+" "+leftside.getSafeSymbol()+";"); - cr.outputline(rd.getSafeSymbol()+"_hashinv->get("+leftside.getSafeSymbol()+","+leftside.getSafeSymbol()+");"); + cr.outputline(rd.getSafeSymbol()+"_hashinv->get("+rightside.getSafeSymbol()+","+leftside.getSafeSymbol()+");"); } if (negated) if (opcode==Opcode.GT) { @@ -1053,24 +1121,25 @@ public class RepairGenerator { if (d instanceof RelationDescriptor) { VarDescriptor otherside=((ImageSetExpr)((SizeofExpr)((OpExpr)ep.expr).left).setexpr).vd; RelationDescriptor rd=(RelationDescriptor)d; - if (sources.relsetSource(rd,!ep.inverted())) { + if (termination.sources.relsetSource(rd,!ep.inverted())) { /* Set Source */ - SetDescriptor sd=sources.relgetSourceSet(rd,!ep.inverted()); + SetDescriptor sd=termination.sources.relgetSourceSet(rd,!ep.inverted()); VarDescriptor iterator=VarDescriptor.makeNew("iterator"); cr.outputline(sd.getType().getGenerateType().getSafeSymbol() +" "+newobject.getSafeSymbol()+";"); - cr.outputline("for("+iterator.getSafeSymbol()+"="+sd.getSafeSymbol()+"_hash->iterator();"+iterator.getSafeSymbol()+".hasNext();)"); + cr.outputline("SimpleIterator "+iterator.getSafeSymbol()+";"); + cr.outputline("for("+sd.getSafeSymbol()+"_hash->iterator("+ iterator.getSafeSymbol() +");"+iterator.getSafeSymbol()+".hasNext();)"); cr.startblock(); if (ep.inverted()) { - cr.outputline("if !"+rd.getSafeSymbol()+"_hashinv->contains("+iterator.getSafeSymbol()+"->key(),"+otherside.getSafeSymbol()+")"); + cr.outputline("if (!"+rd.getSafeSymbol()+"_hashinv->contains("+iterator.getSafeSymbol()+".key(),"+otherside.getSafeSymbol()+"))"); } else { - cr.outputline("if !"+rd.getSafeSymbol()+"_hash->contains("+otherside.getSafeSymbol()+","+iterator.getSafeSymbol()+"->key())"); + cr.outputline("if (!"+rd.getSafeSymbol()+"_hash->contains("+otherside.getSafeSymbol()+","+iterator.getSafeSymbol()+".key()))"); } cr.outputline(newobject.getSafeSymbol()+"="+iterator.getSafeSymbol()+".key();"); - cr.outputline(iterator.getSafeSymbol()+"->next();"); + cr.outputline(iterator.getSafeSymbol()+".next();"); cr.endblock(); - } else if (sources.relallocSource(rd,!ep.inverted())) { + } else if (termination.sources.relallocSource(rd,!ep.inverted())) { /* Allocation Source*/ - sources.relgenerateSourceAlloc(cr,newobject,rd,!ep.inverted()); + termination.sources.relgenerateSourceAlloc(cr,newobject,rd,!ep.inverted()); } else throw new Error("No source for adding to Relation"); if (ep.inverted()) { boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE); @@ -1096,21 +1165,22 @@ public class RepairGenerator { } } else { SetDescriptor sd=(SetDescriptor)d; - if (sources.setSource(sd)) { + if (termination.sources.setSource(sd)) { /* Set Source */ /* Set Source */ - SetDescriptor sourcesd=sources.getSourceSet(sd); + SetDescriptor sourcesd=termination.sources.getSourceSet(sd); VarDescriptor iterator=VarDescriptor.makeNew("iterator"); cr.outputline(sourcesd.getType().getGenerateType().getSafeSymbol() +" "+newobject.getSafeSymbol()+";"); - cr.outputline("for("+iterator.getSafeSymbol()+"="+sourcesd.getSafeSymbol()+"_hash->iterator();"+iterator.getSafeSymbol()+".hasNext();)"); + cr.outputline("SimpleIterator "+iterator.getSafeSymbol()+";"); + cr.outputline("for("+sourcesd.getSafeSymbol()+"_hash->iterator("+iterator.getSafeSymbol()+");"+iterator.getSafeSymbol()+".hasNext();)"); cr.startblock(); - cr.outputline("if !"+sd.getSafeSymbol()+"_hash->contains("+iterator.getSafeSymbol()+"->key())"); + cr.outputline("if (!"+sd.getSafeSymbol()+"_hash->contains("+iterator.getSafeSymbol()+".key()))"); cr.outputline(newobject.getSafeSymbol()+"="+iterator.getSafeSymbol()+".key();"); - cr.outputline(iterator.getSafeSymbol()+"->next();"); + cr.outputline(iterator.getSafeSymbol()+".next();"); cr.endblock(); - } else if (sources.allocSource(sd)) { + } else if (termination.sources.allocSource(sd)) { /* Allocation Source*/ - sources.generateSourceAlloc(cr,newobject,sd); + termination.sources.generateSourceAlloc(cr,newobject,sd); } else throw new Error("No source for adding to Set"); cr.outputline(sd.getSafeSymbol()+"_hash->add("+newobject.getSafeSymbol()+","+newobject.getSafeSymbol()+");"); UpdateNode un=munadd.getUpdate(0); @@ -1151,7 +1221,7 @@ public class RepairGenerator { Rule r=(Rule)state.vRules.get(i); if (r.getInclusion().getTargetDescriptors().contains(rd)) { for(int j=0;jgetrelation2("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");"); + VarDescriptor ismdfyptr=VarDescriptor.makeNew("ismodifyptr"); + cr.outputline("int "+ismdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->ismodify("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");"); + + + String parttype=""; for(int i=0;igetrelation("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");"); - cr.outputline("if ("+mdfyptr.getSafeSymbol()+")"); + cr.outputline("if ("+ismdfyptr.getSafeSymbol()+")"); { cr.startblock(); - cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)) "+tmpptr.getSafeSymbol()); - cr.outputline(methodcall+leftvar+", "+rightvar+", "+mdfyptr.getSafeSymbol() +");"); + cr.outputline("int "+mdfyptr.getSafeSymbol()+"="+repairtable.getSafeSymbol()+"->getrelation2("+rd.getNum()+","+currentrule.getNum()+","+leftvar+","+rightvar+");"); + cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+",int,int,int)) "+tmpptr.getSafeSymbol()+";"); + cr.outputline(methodcall+","+leftvar+", "+rightvar+", "+mdfyptr.getSafeSymbol() +");"); cr.endblock(); } cr.outputline("else "); { cr.startblock(); - cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")) "+tmpptr.getSafeSymbol()); + cr.outputline("void (*"+funptr.getSafeSymbol()+") ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")="+"(void (*) ("+name+"_state *,"+name+"*,RepairHash *"+parttype+")) "+tmpptr.getSafeSymbol()+";"); cr.outputline(methodcall+");"); cr.endblock(); } + cr.outputline("delete "+newmodel.getSafeSymbol()+";"); cr.outputline("goto rebuild;"); } cr.endblock(); @@ -1371,6 +1447,7 @@ public class RepairGenerator { } methodcall+=");"; cr.outputline(methodcall); + cr.outputline("delete "+newmodel.getSafeSymbol()+";"); cr.outputline("goto rebuild;"); } } @@ -1378,17 +1455,36 @@ public class RepairGenerator { } String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol(); - cr.outputline("int " + addeditem + ";"); + cr.outputline("int " + addeditem + "=0;"); + + String ifstring="if (!maybe&&"; + boolean dogenerate=false; + if (rd.getDomain().getType() instanceof StructureTypeDescriptor) { + dogenerate=true; + ifstring+=leftvar; + } + + if (rd.getRange().getType() instanceof StructureTypeDescriptor) { + if (dogenerate) + ifstring+="&&"+rightvar; + else + ifstring+=rightvar; + dogenerate=true; + } + + ifstring+=")"; + if (rd.testUsage(RelationDescriptor.IMAGE)) { + cr.outputline(ifstring); cr.outputline(addeditem + " = " + rd.getSafeSymbol() + "_hash->add((int)" + leftvar + ", (int)" + rightvar+ ");"); } if (rd.testUsage(RelationDescriptor.INVIMAGE)) { + cr.outputline(ifstring); cr.outputline(addeditem + " = " + rd.getSafeSymbol() + "_hashinv->add((int)" + rightvar + ", (int)" + leftvar + ");"); } - Vector dispatchrules = getrulelist(rd); Set toremove=new HashSet(); @@ -1467,6 +1563,7 @@ public class RepairGenerator { } methodcall+=");"; cr.outputline(methodcall); + cr.outputline("delete "+newmodel.getSafeSymbol()+";"); cr.outputline("goto rebuild;"); } cr.endblock(); @@ -1494,6 +1591,7 @@ public class RepairGenerator { } methodcall+=");"; cr.outputline(methodcall); + cr.outputline("delete "+newmodel.getSafeSymbol()+";"); cr.outputline("goto rebuild;"); } } @@ -1501,7 +1599,11 @@ public class RepairGenerator { } String addeditem = (VarDescriptor.makeNew("addeditem")).getSafeSymbol(); - cr.outputline("int " + addeditem + " = 1;"); + cr.outputline("int " + addeditem + " = 0;"); + if (sd.getType() instanceof StructureTypeDescriptor) { + cr.outputline("if (!maybe&&"+setvar+")"); + } else + cr.outputline("if (!maybe)"); cr.outputline(addeditem + " = " + sd.getSafeSymbol() + "_hash->add((int)" + setvar + ", (int)" + setvar + ");"); cr.startblock(); Vector dispatchrules = getrulelist(sd);