From: bdemsky Date: Tue, 27 Apr 2004 21:06:40 +0000 (+0000) Subject: Added array analysis (computes paths used to add elements/tuples to sets/relations. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=repair.git;a=commitdiff_plain;h=803278c8eed228616a37dc70d17b391d7e220625;ds=sidebyside Added array analysis (computes paths used to add elements/tuples to sets/relations. Added a bug fix to the graphanalysis routine (must consider nodes not involved in cycles also for removal). --- diff --git a/Repair/RepairCompiler/MCC/IR/ArrayAnalysis.java b/Repair/RepairCompiler/MCC/IR/ArrayAnalysis.java new file mode 100755 index 0000000..4940d3b --- /dev/null +++ b/Repair/RepairCompiler/MCC/IR/ArrayAnalysis.java @@ -0,0 +1,177 @@ +package MCC.IR; +import java.util.*; +import MCC.State; + +public class ArrayAnalysis { + Termination termination; + State state; + + public ArrayAnalysis(State state, Termination t) { + this.state=state; + this.termination=t; + this.set=new Hashtable(); + this.leftrelation=new Hashtable(); + this.rightrelation=new Hashtable(); + + assert termination.exactsize!=null; + doAnalysis(); + } + + Hashtable set; + Hashtable leftrelation; + Hashtable rightrelation; + + public AccessPath getSet(SetDescriptor sd) { + if (set.containsKey(sd)) + return (AccessPath)set.get(sd); + return null; + } + + + public AccessPath getDomain(RelationDescriptor rd) { + if (leftrelation.containsKey(rd)) + return (AccessPath)leftrelation.get(rd); + return null; + } + + public AccessPath getRange(RelationDescriptor rd) { + if (rightrelation.containsKey(rd)) + return (AccessPath)rightrelation.get(rd); + return null; + } + + private void doAnalysis() { + Vector rules=state.vRules; + for(int i=0;i=0;j--) { + DotExpr de2=(DotExpr) dotvector.get(j); + FieldDescriptor fd=de2.getField(); + if (fd instanceof ArrayDescriptor) { + foundarray=true; + if (((ArrayDescriptor)fd).getField().getPtr()) + return AccessPath.NONE; + } else { + if (foundarray&&fd.getPtr()) + return AccessPath.NONE; + } + ap.addField(fd); + } + return ap; + } + } + } + + public static class AccessPath { + public static final AccessPath NONE=new AccessPath(); + + public AccessPath() { + path=new Vector(); + } + boolean setStart; + SetDescriptor startset; + VarDescriptor startvar; + + public void startSet(SetDescriptor sd) { + this.startset=sd; + setStart=true; + } + + public void startVar(VarDescriptor vd) { + assert vd.isGlobal(); + this.startvar=vd; + setStart=false; + } + + Vector path; + public void addField(FieldDescriptor fd) { + path.add(fd); + } + public boolean equal(AccessPath ap) { + if (this==ap) + return true; + if (setStart&&this.startset!=ap.startset) + return false; + if ((!setStart)&&this.startvar!=ap.startvar) + return false; + if (this.path.size()!=ap.path.size()) + return false; + for(int i=0;i literal(1) in GroupBlock; // rule 3 - adds the inodetableblock block number to the inodetableblock set -[], d.g.InodeTableBlock < d.s.NumberofBlocks => -d.g.InodeTableBlock in InodeTableBlock; +//[], d.g.InodeTableBlock < d.s.NumberofBlocks => +//d.g.InodeTableBlock in InodeTableBlock; // rule 4 - adds the inodebitmapblock block number to the inodebitmapblock set -[], d.g.InodeBitmapBlock < d.s.NumberofBlocks => -d.g.InodeBitmapBlock in InodeBitmapBlock; +[], literal(true) => d.g.InodeBitmapBlock in InodeBitmapBlock; // rule 5 - adds the blockbitmapblock number to the blockbitmapblock set -[], d.g.BlockBitmapBlock < d.s.NumberofBlocks => -d.g.BlockBitmapBlock in BlockBitmapBlock; +//[], d.g.BlockBitmapBlock < d.s.NumberofBlocks => +//d.g.BlockBitmapBlock in BlockBitmapBlock; // rule 6 - adds the rootdirectoryinode number to the set -[], d.s.RootDirectoryInode < d.s.NumberofInodes => -d.s.RootDirectoryInode in RootDirectoryInode; +//[], d.s.RootDirectoryInode < d.s.NumberofInodes => +//d.s.RootDirectoryInode in RootDirectoryInode; // rule 7 delay [for j=literal(0) to d.s.NumberofInodes-literal(1)], -!(j in? UsedInode) => j in FreeInode; +!(j in? UsedInode) => j in FreeInode; // rule 8 delay [for j=literal(0) to d.s.NumberofBlocks-literal(1)], -!(j in? UsedBlock) => j in FreeBlock; +!(j in? UsedBlock) => j in FreeBlock; // rule 9 // for all directoryinodes, loop through there blockptr's and then add // all their directoryentries to DirectoryEntry set -[forall di in DirectoryInode, - forall itb in InodeTableBlock, - for j=literal(0) to (d.s.blocksize/literal(128))-literal(1), - for k=literal(0) to literal(11)], - cast(InodeTable,d.b[itb]).itable[di].Blockptr[k] < d.s.NumberofBlocks => - cast(DirectoryBlock,d.b[cast(InodeTable,d.b[itb]).itable[di].Blockptr[k]]).de[j] - in DirectoryEntry; +//[forall di in DirectoryInode, forall itb in InodeTableBlock, +// for j=literal(0) to (d.s.blocksize/literal(128))-literal(1), +// for k=literal(0) to literal(11)], +// cast(InodeTable,d.b[itb]).itable[di].Blockptr[k] < d.s.NumberofBlocks => +// cast(DirectoryBlock,d.b[cast(InodeTable,d.b[itb]).itable[di].Blockptr[k]]).de[j] +// in DirectoryEntry; // rule 10 // all non-zero blocks in an used inodes blockptr list should be // added to the contents relation -[forall i in UsedInode, - forall itb in InodeTableBlock, - for j=literal(0) to literal(11)], - !(cast(InodeTable,d.b[itb]).itable[i].Blockptr[j]=literal(0)) => - in contents; +//[forall i in UsedInode, +// forall itb in InodeTableBlock, +// for j=literal(0) to literal(11)], +// !(cast(InodeTable,d.b[itb]).itable[i].Blockptr[j]=literal(0)) => +// in contents; // rule 11 seems to be imperfect because it is adding directories and files @@ -60,55 +58,39 @@ delay [for j=literal(0) to d.s.NumberofBlocks-literal(1)], // rule 11 // for each inode in use, add non-zero, valid blocks mentioned in the // inode's blockptr list in the inodetableblock to fileblock -[forall i in UsedInode, forall itb in InodeTableBlock, for j=literal(0) to literal(11)], -cast(InodeTable,d.b[itb]).itable[i].Blockptr[j] -cast(InodeTable,d.b[itb]).itable[i].Blockptr[j] in FileBlock; // was FileDirectoryBlock - -// rule 12 -// if the bit in the inodebitmap is 0 then that inode is marked as -// free in the inodestatus relation -[for j=literal(0) to d.s.NumberofInodes-literal(1), forall ibb in InodeBitmapBlock], -cast(InodeBitmap,d.b[ibb]).inodebitmap[j]=literal(false) => - in inodestatus; +//[forall i in UsedInode, forall itb in InodeTableBlock, for j=literal(0) to literal(11)], +//cast(InodeTable,d.b[itb]).itable[i].Blockptr[j] +//cast(InodeTable,d.b[itb]).itable[i].Blockptr[j] in FileBlock; +// was FileDirectoryBlock // rule 13 -// same as rule 12/19, but instead with used inodes. -[for j=literal(0) to d.s.NumberofInodes-literal(1), forall ibb in InodeBitmapBlock], -cast(InodeBitmap,d.b[ibb]).inodebitmap[j]=literal(true) => - in inodestatus; +// same as rule 12/19, but instead with used inodes. +[forall j in Inode, forall ibb in InodeBitmapBlock], literal(true) => in inodestatus; // rule 14 // adds all non-zero inodenumbers of directory entries to the set // FileInode -[forall de in DirectoryEntry], de.inodenumber de.inodenumber in FileInode; +//[forall de in DirectoryEntry], de.inodenumber de.inodenumber in FileInode; // rule 15 // builds up relation 'inodeof' such that means x is a // directory entry with inode numbered y -[forall de in DirectoryEntry], de.inodenumber - in inodeof; +//[forall de in DirectoryEntry], de.inodenumber +// in inodeof; // rule 16 // populating the referencecount relation with the referencecount // values for every usedinode -[forall j in UsedInode, forall itb in InodeTableBlock], literal(true) => - in referencecount; +//[forall j in UsedInode, forall itb in InodeTableBlock], literal(true) => +// in referencecount; // rule 17 - populate the filesize relation with the sizes inodes' files -[forall j in UsedInode, forall itb in InodeTableBlock], literal(true) => - in filesize; +//[forall j in UsedInode, forall itb in InodeTableBlock], literal(true) => +// in filesize; // rule - similar to rule 19, if the bit in the block bitmap is 0 the that // block is marked as free in the blockstatus relation -[for j=literal(0) to d.s.NumberofBlocks-literal(1), forall bbb in BlockBitmapBlock], -cast(BlockBitmap,d.b[bbb]).blockbitmap[j]=literal(false) => - in blockstatus; - -// rule 19 -// if the bit in the blockbitmap is 1 then that block is marked as -// used in the blockstatus relation -[for j=literal(0) to d.s.NumberofBlocks-literal(1), forall bbb in BlockBitmapBlock], -cast(BlockBitmap,d.b[bbb]).blockbitmap[j]=literal(true) => - in blockstatus; +//[forall j in Block, forall bbb in BlockBitmapBlock], literal(true) => in blockstatus; + diff --git a/Repair/RepairCompiler/MCC/test2.space b/Repair/RepairCompiler/MCC/test2.space index bd84734..8b303c6 100755 --- a/Repair/RepairCompiler/MCC/test2.space +++ b/Repair/RepairCompiler/MCC/test2.space @@ -1,13 +1,13 @@ // sEXT2 - Simple File System Example // Space Definition Language File -set Block(int) : partition +set Block(int) : UsedBlock | FreeBlock; set FreeBlock(int); -set Inode(int) : partition +set Inode(int) : UsedInode | FreeInode; @@ -23,7 +23,7 @@ set DirectoryInode(int) : RootDirectoryInode; set RootDirectoryInode(int); -set UsedBlock(int) : partition +set UsedBlock(int) : SuperBlock | GroupBlock | FileDirectoryBlock | @@ -57,17 +57,10 @@ inodeof: DirectoryEntry -> UsedInode (many->1); contents: UsedInode -> FileDirectoryBlock (1->many); -inodestatus: Inode -> token (many->1); +inodestatus: Inode -> int (many->1); -blockstatus: Block -> token (many->1); +blockstatus: Block -> int (many->1); referencecount: Inode -> int (many->1); filesize: Inode -> int (many->1); - - - - - - -