X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=blobdiff_plain;f=Repair%2FRepairCompiler%2FMCC%2FIR%2FRepairGenerator.java;h=5d64040d50073b70b3df9c25d92beefb511a3ed7;hp=6074bbd504f07b78536f80471bdbacc67393d079;hb=fcb08dbb9564da3732dd8b0cbf0088d0f9826541;hpb=ad9c0159edd8dd9eed39eb8f74635c5bffb95ed5 diff --git a/Repair/RepairCompiler/MCC/IR/RepairGenerator.java b/Repair/RepairCompiler/MCC/IR/RepairGenerator.java index 6074bbd..5d64040 100755 --- a/Repair/RepairCompiler/MCC/IR/RepairGenerator.java +++ b/Repair/RepairCompiler/MCC/IR/RepairGenerator.java @@ -387,7 +387,22 @@ public class RepairGenerator { crhead.outputline("~"+name+"();"); craux.outputline("#include \""+headername+"\""); craux.outputline("#include \"size.h\""); - + if (Compiler.ALLOCATECPLUSPLUS) { + for(Iterator it=state.stTypes.descriptors();it.hasNext();) { + TypeDescriptor td=(TypeDescriptor)it.next(); + if (td instanceof StructureTypeDescriptor) { + if (((StructureTypeDescriptor)td).size()>0) { + FieldDescriptor fd=((StructureTypeDescriptor)td).get(0); + if (fd.getSymbol().startsWith("_vptr_")) { + String vtable="_ZTV"; + vtable+=td.getSymbol().length(); + vtable+=td.getSymbol(); + craux.outputline("extern void * "+vtable+";"); + } + } + } + } + } craux.outputline(name+"::"+name+"() {"); craux.outputline("// creating hashtables "); @@ -482,6 +497,11 @@ public class RepairGenerator { crhead.outputline("void doanalysis();"); craux.outputline("void "+name +"_state::doanalysis()"); craux.startblock(); + if (Compiler.TIME) { + craux.outputline("struct timeval _begin_time,_end_time;"); + craux.outputline("gettimeofday(&_begin_time,NULL);"); + } + if (Compiler.GENERATEINSTRUMENT) { craux.outputline("updatecount=0;"); craux.outputline("rebuildcount=0;"); @@ -506,6 +526,11 @@ public class RepairGenerator { private void generate_teardown() { CodeWriter cr = new StandardCodeWriter(outputaux); cr.endblock(); + if (Compiler.TIME) { + cr.outputline("gettimeofday(&_end_time,NULL);"); + cr.outputline("printf(\"time=%ld uS\\n\",(_end_time.tv_sec-_begin_time.tv_sec)*1000000+_end_time.tv_usec-_begin_time.tv_usec)"); + } + if (Compiler.GENERATEINSTRUMENT) { cr.outputline("printf(\"updatecount=%d\\n\",updatecount);"); cr.outputline("printf(\"rebuildcount=%d\\n\",rebuildcount);"); @@ -753,15 +778,18 @@ public class RepairGenerator { } private void generate_checks() { - /* do constraint checks */ - // Vector constraints = state.vConstraints; - - - // 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(); + Iterator i; + if (Compiler.REPAIR) + i=termination.constraintdependence.computeOrdering().iterator(); + else + i=state.vConstraints.iterator(); + for (; i.hasNext();) { + Constraint constraint; + if (Compiler.REPAIR) + constraint= (Constraint) ((GraphNode)i.next()).getOwner(); + else + constraint=(Constraint)i.next(); { final SymbolTable st = constraint.getSymbolTable(); @@ -788,7 +816,7 @@ public class RepairGenerator { cr.outputline("if (maybe)"); cr.startblock(); cr.outputline("printf(\"maybe fail " + escape(constraint.toString()) + ". \\n\");"); - cr.outputline("exit(1);"); + //cr.outputline("exit(1);"); cr.endblock(); cr.outputline("else if (!" + constraintboolean.getSafeSymbol() + ")"); @@ -836,14 +864,14 @@ public class RepairGenerator { p.generate(cr,predvalue); if (k==0) cr.outputline("int "+costvar.getSafeSymbol()+"=0;"); - + if (negate) cr.outputline("if (maybe||"+predvalue.getSafeSymbol()+")"); else cr.outputline("if (maybe||!"+predvalue.getSafeSymbol()+")"); cr.outputline(costvar.getSafeSymbol()+"+="+cost.getCost(dpred)+";"); } - + if(!first) { cr.outputline("if ("+costvar.getSafeSymbol()+"<"+mincost.getSafeSymbol()+")"); cr.startblock(); @@ -859,7 +887,6 @@ public class RepairGenerator { for(int j=0;jget("+rightside.getSafeSymbol()+","+leftside.getSafeSymbol()+");"); } - if (negated) - if (opcode==Opcode.GT) { - opcode=Opcode.LE; - } else if (opcode==Opcode.GE) { - opcode=Opcode.LT; - } else if (opcode==Opcode.LT) { - opcode=Opcode.GE; - } else if (opcode==Opcode.LE) { - opcode=Opcode.GT; - } else if (opcode==Opcode.EQ) { - opcode=Opcode.NE; - } else if (opcode==Opcode.NE) { - opcode=Opcode.EQ; - } else { - throw new Error("Unrecognized Opcode"); - } + + opcode=Opcode.translateOpcode(negated,opcode); if (opcode==Opcode.GT) { cr.outputline(newvalue.getSafeSymbol()+"++;"); @@ -1015,6 +1076,35 @@ public class RepairGenerator { /* Do abstract repairs */ if (usageimage) { cr.outputline(rd.getSafeSymbol()+"_hash->remove("+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+");"); + } + if (usageinvimage) { + cr.outputline(rd.getSafeSymbol()+"_hashinv->remove("+rightside.getSafeSymbol()+","+leftside.getSafeSymbol()+");"); + } + + if (needremoveloop) { + if (!inverted) { + cr.outputline("if ("+rd.getSafeSymbol()+"_hash->contains("+leftside.getSafeSymbol()+")) {"); + } else { + cr.outputline("if ("+rd.getSafeSymbol()+"_hashinv->contains("+rightside.getSafeSymbol()+")) {"); + } + for(int i=0;iaddrelation("+rd.getNum()+","+r.getNum()+","+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+",(int) &"+name+");"); + } + } + } + } + cr.outputline("continue;"); + cr.outputline("}"); + } + + if (usageimage) { if (!inverted) { cr.outputline(rd.getSafeSymbol()+"_hash->add("+leftside.getSafeSymbol()+","+newvalue.getSafeSymbol()+");"); } else { @@ -1022,7 +1112,6 @@ public class RepairGenerator { } } if (usageinvimage) { - cr.outputline(rd.getSafeSymbol()+"_hashinv->remove("+rightside.getSafeSymbol()+","+leftside.getSafeSymbol()+");"); if (!inverted) { cr.outputline(rd.getSafeSymbol()+"_hashinv->add("+newvalue.getSafeSymbol()+","+leftside.getSafeSymbol()+");"); } else { @@ -1030,7 +1119,7 @@ public class RepairGenerator { } } /* Do concrete repairs */ - if (munmodify!=null) { + if (munmodify!=null&&(!ar.mayNeedFunctionEnforcement(state))||(munadd==null)||(ar.needsRemoves(state)&&(munremove==null))) { for(int i=0;iaddrelation("+rd.getNum()+","+r.getNum()+","+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+",(int) &"+name+");"); + if (ar.needsRemoves(state)) + for(int i=0;iaddrelation("+rd.getNum()+","+r.getNum()+","+leftside.getSafeSymbol()+","+rightside.getSafeSymbol()+",(int) &"+name+");"); + } } } } - } /* Now do addition */ UpdateNode un=munadd.getUpdate(0); String name=(String)updatenames.get(un); @@ -1069,6 +1158,10 @@ public class RepairGenerator { cr.outputline(name+"(this,"+newmodel.getSafeSymbol()+","+repairtable.getSafeSymbol()+","+newvalue.getSafeSymbol()+","+rightside.getSafeSymbol()+");"); } } + if (needremoveloop) { + cr.outputline("break;"); + cr.outputline("}"); + } } public void generatesizerepair(Conjunction conj, DNFPredicate dpred, CodeWriter cr) { @@ -1139,11 +1232,11 @@ public class RepairGenerator { VarDescriptor rightvar=VarDescriptor.makeNew("rightvar"); if (d instanceof RelationDescriptor) { if (ep.inverted()) { - rightvar=((ImageSetExpr)((SizeofExpr)((OpExpr)expr).left).setexpr).getVar(); + ((ImageSetExpr)((SizeofExpr)expr.left).setexpr).generate_leftside(cr,rightvar); cr.outputline("int "+leftvar.getSafeSymbol()+";"); cr.outputline(d.getSafeSymbol()+"_hashinv->get((int)"+rightvar.getSafeSymbol()+","+leftvar.getSafeSymbol()+");"); } else { - leftvar=((ImageSetExpr)((SizeofExpr)((OpExpr)expr).left).setexpr).getVar(); + ((ImageSetExpr)((SizeofExpr)expr.left).setexpr).generate_leftside(cr,leftvar); cr.outputline("int "+rightvar.getSafeSymbol()+"=0;"); cr.outputline(d.getSafeSymbol()+"_hash->get((int)"+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+");"); } @@ -1182,13 +1275,21 @@ public class RepairGenerator { } cr.endblock(); } + +// In some cases the analysis has determined that generating removes +// is unnecessary + if (generateadd&&munadd==null) + generateadd=false; + if (generateadd) { cr.outputline("for(;"+change.getSafeSymbol()+">0;"+change.getSafeSymbol()+"--)"); cr.startblock(); VarDescriptor newobject=VarDescriptor.makeNew("newobject"); if (d instanceof RelationDescriptor) { - VarDescriptor otherside=((ImageSetExpr)((SizeofExpr)((OpExpr)ep.expr).left).setexpr).vd; + VarDescriptor otherside=VarDescriptor.makeNew("otherside"); + ((ImageSetExpr)((SizeofExpr)expr.left).setexpr).generate_leftside(cr,otherside); + RelationDescriptor rd=(RelationDescriptor)d; if (termination.sources.relsetSource(rd,!ep.inverted())) { /* Set Source */