X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=Repair%2FRepairCompiler%2FMCC%2FIR%2FUpdateNode.java;h=ee6bdac134c291c4ecd870f71e8324ee7b8e8de8;hb=ffaf9068b5b6b06866bee46a83abb9e3c00b1b85;hp=bc669986eef83ecbc77021ec69373e0821551422;hpb=fca2f901d2ec73f9ff6902e35b827271cda87fbf;p=repair.git diff --git a/Repair/RepairCompiler/MCC/IR/UpdateNode.java b/Repair/RepairCompiler/MCC/IR/UpdateNode.java index bc66998..ee6bdac 100755 --- a/Repair/RepairCompiler/MCC/IR/UpdateNode.java +++ b/Repair/RepairCompiler/MCC/IR/UpdateNode.java @@ -5,13 +5,14 @@ import MCC.State; class UpdateNode { Vector updates; Vector bindings; + Vector invariants; Hashtable binding; Rule rule; - public UpdateNode(Rule r) { updates=new Vector(); bindings=new Vector(); + invariants=new Vector(); binding=new Hashtable(); rule=r; } @@ -22,11 +23,18 @@ class UpdateNode { public String toString() { String st=""; + st+="Bindings:\n"; for(int i=0;i"+rd.getJustSafeSymbol() + "_hash->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");"); + cr.outputline("SimpleHashremove("+rg.stmodel+"->"+rd.getJustSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");"); if (usageinvimage) - cr.outputline(rg.stmodel+"->"+rd.getJustSafeSymbol() + "_hashinv->remove((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); - + cr.outputline("SimpleHashremove("+rg.stmodel+"->"+rd.getJustSafeSymbol()+"_hashinv, (int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); + for(int i=0;iaddrelation("+rd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+",(int) &"+name+");"); + cr.outputline("RepairHashaddrelation("+rg.strepairtable+","+rd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+",(int) &"+name+");"); } } } } } else { SetDescriptor sd=(SetDescriptor) d; - cr.outputline(rg.stmodel+"->"+sd.getJustSafeSymbol() + "_hash->remove((int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); + cr.outputline("SimpleHashremove("+rg.stmodel+"->"+sd.getJustSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); for(int i=0;iaddset("+sd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+",(int) &"+name+");"); + cr.outputline("RepairHashaddset("+rg.strepairtable+","+sd.getNum()+","+r.getNum()+","+leftvar.getSafeSymbol()+",(int) &"+name+");"); } } } @@ -304,16 +341,16 @@ class UpdateNode { boolean usageimage=rd.testUsage(RelationDescriptor.IMAGE); boolean usageinvimage=rd.testUsage(RelationDescriptor.INVIMAGE); if (usageimage) - cr.outputline(rg.stmodel+"->"+rd.getJustSafeSymbol() + "_hash->add((int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");"); + cr.outputline("SimpleHashadd("+rg.stmodel+"->"+rd.getJustSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + rightvar.getSafeSymbol() + ");"); if (usageinvimage) - cr.outputline(rg.stmodel+"->"+rd.getJustSafeSymbol() + "_hashinv->add((int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); + cr.outputline("SimpleHashadd("+rg.stmodel+"->"+rd.getJustSafeSymbol()+"_hashinv, (int)" + rightvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); UpdateNode un=mun.getUpdate(0); String name=(String)rg.updatenames.get(un); cr.outputline(name+"(this,"+rg.stmodel+","+rg.strepairtable+","+leftvar.getSafeSymbol()+","+rightvar.getSafeSymbol()+");"); } else { SetDescriptor sd=(SetDescriptor)d; - cr.outputline(rg.stmodel+"->"+sd.getJustSafeSymbol() + "_hash->add((int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); + cr.outputline("SimpleHashadd("+rg.stmodel+"->"+sd.getJustSafeSymbol()+"_hash, (int)" + leftvar.getSafeSymbol() + ", (int)" + leftvar.getSafeSymbol() + ");"); UpdateNode un=mun.getUpdate(0); /* Update for rule rule r */ @@ -321,7 +358,6 @@ class UpdateNode { cr.outputline(name+"(this,"+rg.stmodel+","+rg.strepairtable+","+leftvar.getSafeSymbol()+");"); } } - } public void generate(CodeWriter cr, boolean removal, boolean modify, String slot0, String slot1, String slot2, RepairGenerator rg) { @@ -341,13 +377,16 @@ class UpdateNode { break; case Updates.POSITION: case Updates.ACCESSPATH: - if (u.getRightPos()==0) - cr.outputline("int "+right.getSafeSymbol()+"="+slot0+";"); - else if (u.getRightPos()==1) - cr.outputline("int "+right.getSafeSymbol()+"="+slot1+";"); - else if (u.getRightPos()==2) - cr.outputline("int "+right.getSafeSymbol()+"="+slot2+";"); - else throw new Error("Error w/ Position"); + if (u.getRightPos()==0) { + cr.addDeclaration("int", right.getSafeSymbol()); + cr.outputline(right.getSafeSymbol()+"="+slot0+";"); + } else if (u.getRightPos()==1) { + cr.addDeclaration("int", right.getSafeSymbol()); + cr.outputline(right.getSafeSymbol()+"="+slot1+";"); + } else if (u.getRightPos()==2) { + cr.addDeclaration("int", right.getSafeSymbol()); + cr.outputline(right.getSafeSymbol()+"="+slot2+";"); + } else throw new Error("Error w/ Position"); break; default: throw new Error(); @@ -391,11 +430,11 @@ class UpdateNode { intindex.generate(cr,indexvd); FieldDescriptor fd=(FieldDescriptor)u.getDescriptor(); StructureTypeDescriptor std=(StructureTypeDescriptor)subexpr.getType(); + Expr offsetbits = std.getOffsetExpr(fd); if (fd instanceof ArrayDescriptor) { fd = ((ArrayDescriptor) fd).getField(); } - Expr offsetbits = std.getOffsetExpr(fd); if (intindex != null) { Expr basesize = fd.getBaseSizeExpr(); offsetbits = new OpExpr(Opcode.ADD, offsetbits, new OpExpr(Opcode.MULT, basesize, intindex)); @@ -416,7 +455,7 @@ class UpdateNode { } else if (rtd==ReservedTypeDescriptor.BIT) { Expr tmp = new OpExpr(Opcode.SHL, offsetbytes, new IntegerLiteralExpr(3)); Expr offset=new OpExpr(Opcode.SUB, offsetbits, tmp); - Expr mask=new OpExpr(Opcode.SHR, new IntegerLiteralExpr(1), offset); + Expr mask=new OpExpr(Opcode.SHL, new IntegerLiteralExpr(1), offset); VarDescriptor maskvar=VarDescriptor.makeNew("mask"); mask.generate(cr,maskvar); cr.outputline("*((char *) "+addr.getSafeSymbol()+")|="+maskvar.getSafeSymbol()+";"); @@ -454,7 +493,8 @@ class UpdateNode { ArrayAnalysis.AccessPath ap=u.getAccessPath(); VarDescriptor init=VarDescriptor.makeNew("init"); if (ap.isSet()) { - cr.outputline("int "+init.getSafeSymbol()+"="+ap.getSet().getSafeSymbol()+"_hash->firstkey();"); + cr.addDeclaration("int", init.getSafeSymbol()); + cr.outputline(init.getSafeSymbol()+"= SimpleHashfirstkey("+ap.getSet().getSafeSymbol()+"_hash);"); init.td=ap.getSet().getType(); } else { init=ap.getVar(); @@ -504,7 +544,8 @@ class UpdateNode { if (b.getType()==Binding.SEARCH) { VarDescriptor vd=b.getVar(); - cr.outputline(vd.getType().getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"="+b.getSet().getSafeSymbol()+"_hash->firstkey();"); + cr.addDeclaration(vd.getType().getGenerateType().getSafeSymbol(), vd.getSafeSymbol()); + cr.outputline(vd.getSafeSymbol()+"=SimpleHashfirstkey("+b.getSet().getSafeSymbol()+"_hash);"); } else if (b.getType()==Binding.CREATE) { throw new Error("Creation not supported"); // source.generateSourceAlloc(cr,vd,b.getSet()); @@ -512,10 +553,12 @@ class UpdateNode { VarDescriptor vd=b.getVar(); switch(b.getPosition()) { case 0: - cr.outputline(vd.getType().getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"="+slot0+";"); + cr.addDeclaration(vd.getType().getGenerateType().getSafeSymbol(), vd.getSafeSymbol()); + cr.outputline(vd.getSafeSymbol()+"="+slot0+";"); break; case 1: - cr.outputline(vd.getType().getGenerateType().getSafeSymbol()+" "+vd.getSafeSymbol()+"="+slot1+";"); + cr.addDeclaration(vd.getType().getGenerateType().getSafeSymbol(), vd.getSafeSymbol()); + cr.outputline(vd.getSafeSymbol()+"="+slot1+";"); break; default: throw new Error("Slot >1 doesn't exist.");