From c9995fd9aa5d82bc8bf935b56fb2ade707856577 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Mon, 7 Jan 2008 06:57:19 +0000 Subject: [PATCH] checking in beginnings of tag state analysis --- .../Analysis/TaskStateAnalysis/FlagInfo.java | 52 +++++ .../Analysis/TaskStateAnalysis/FlagState.java | 16 +- .../TaskStateAnalysis/FlagTagState.java | 27 +++ .../TaskStateAnalysis/ObjWrapper.java | 16 ++ .../Analysis/TaskStateAnalysis/TagState.java | 81 +++++++ .../TaskStateAnalysis/TagWrapper.java | 23 ++ .../TaskStateAnalysis/TaskBinding.java | 122 +++++++++++ .../Analysis/TaskStateAnalysis/TaskQueue.java | 44 ++++ .../TaskStateAnalysis/TaskQueueIterator.java | 148 +++++++++++++ .../TaskStateAnalysis/TaskTagAnalysis.java | 199 ++++++++++++++++++ 10 files changed, 719 insertions(+), 9 deletions(-) create mode 100644 Robust/src/Analysis/TaskStateAnalysis/FlagInfo.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/FlagTagState.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/ObjWrapper.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/TagState.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/TaskBinding.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/TaskQueue.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/TaskQueueIterator.java create mode 100644 Robust/src/Analysis/TaskStateAnalysis/TaskTagAnalysis.java diff --git a/Robust/src/Analysis/TaskStateAnalysis/FlagInfo.java b/Robust/src/Analysis/TaskStateAnalysis/FlagInfo.java new file mode 100644 index 00000000..ecdb162f --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/FlagInfo.java @@ -0,0 +1,52 @@ +package Analysis.TaskStateAnalysis; +import IR.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; +import java.io.File; +import java.io.FileWriter; +import java.io.FileOutputStream; + + +public class FlagInfo { + private Hashtable flags; + private State state; + + public FlagInfo(State state) { + this.state=state; + flags=new Hashtable(); + getFlagsfromClasses(); + } + + public FlagDescriptor[] getFlags(ClassDescriptor cd) { + return flags.get(cd); + } + + /** Builds a table of flags for each class in the Bristlecone + * program. It creates one hashtables: one which holds the + * ClassDescriptors and arrays of * FlagDescriptors as key-value + * pairs. */ + + private void getFlagsfromClasses() { + for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator();it_classes.hasNext();) { + ClassDescriptor cd = (ClassDescriptor)it_classes.next(); + Vector vFlags=new Vector(); + FlagDescriptor flag[]; + int ctr=0; + + /* Adding the flags of the super class */ + ClassDescriptor tmp=cd; + while(tmp!=null) { + for(Iterator it_cflags=tmp.getFlags();it_cflags.hasNext();) { + FlagDescriptor fd = (FlagDescriptor)it_cflags.next(); + vFlags.add(fd); + } + tmp=tmp.getSuperDesc(); + } + + flag=new FlagDescriptor[vFlags.size()]; + + flags.put(cd,flag); + } + } +} \ No newline at end of file diff --git a/Robust/src/Analysis/TaskStateAnalysis/FlagState.java b/Robust/src/Analysis/TaskStateAnalysis/FlagState.java index 9a781812..255057c2 100644 --- a/Robust/src/Analysis/TaskStateAnalysis/FlagState.java +++ b/Robust/src/Analysis/TaskStateAnalysis/FlagState.java @@ -126,13 +126,14 @@ public class FlagState extends GraphNode { } } + public int getTagCount(TagDescriptor tag) { + if (tags.containsKey(tag)) + return tags.get(tag).intValue(); + else return 0; + } + public int getTagCount(String tagtype){ - for (Enumeration en=getTags();en.hasMoreElements();){ - TagDescriptor td=(TagDescriptor)en.nextElement(); - if (tagtype.equals(td.getSymbol())) - return tags.get(td).intValue(); //returns either ONETAG or MULTITAG - } - return NOTAGS; + return getTagCount(new TagDescriptor(tagtype)); } public FlagState[] clearTag(TagDescriptor tag){ @@ -230,9 +231,6 @@ public class FlagState extends GraphNode { return "N"+uid; } - - - public String getTextLabel() { String label=null; for(Iterator it=getFlags();it.hasNext();) { diff --git a/Robust/src/Analysis/TaskStateAnalysis/FlagTagState.java b/Robust/src/Analysis/TaskStateAnalysis/FlagTagState.java new file mode 100644 index 00000000..ee4ffee5 --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/FlagTagState.java @@ -0,0 +1,27 @@ +package Analysis.TaskStateAnalysis; +import IR.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; + +public class FlagTagState { + TagState ts; + FlagState fs; + + public FlagTagState(TagState ts, FlagState fs) { + this.ts=ts; + this.fs=fs; + } + + public boolean equals(Object o) { + if (o instanceof FlagTagState) { + FlagTagState fts=(FlagTagState) o; + return ts.equals(fts.ts)&&fs.equals(fts.fs); + } + return false; + } + + public int hashCode() { + return ts.hashCode()^fs.hashCode(); + } +} diff --git a/Robust/src/Analysis/TaskStateAnalysis/ObjWrapper.java b/Robust/src/Analysis/TaskStateAnalysis/ObjWrapper.java new file mode 100644 index 00000000..042c9226 --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/ObjWrapper.java @@ -0,0 +1,16 @@ +package Analysis.TaskStateAnalysis; +import IR.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; + +public class ObjWrapper { + FlagState fs; + Vector tags; + + public ObjWrapper(FlagState fs) { + this.fs=fs; + tags=new Vector(); + } + +} diff --git a/Robust/src/Analysis/TaskStateAnalysis/TagState.java b/Robust/src/Analysis/TaskStateAnalysis/TagState.java new file mode 100644 index 00000000..b2f4d4d1 --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/TagState.java @@ -0,0 +1,81 @@ +package Analysis.TaskStateAnalysis; +import Analysis.TaskStateAnalysis.*; +import IR.*; +import IR.Flat.*; +import java.util.*; +import Util.GraphNode; + + +public class TagState extends GraphNode { + private TagDescriptor tag; + private Hashtable flags; + public static final int KLIMIT=2; + + public TagState() { + this(null); + } + + public TagState(TagDescriptor tag) { + this.tag=tag; + this.flags=new Hashtable(); + } + + public TagDescriptor getTag() { + return tag; + } + + public TagState[] addnewFS(FlagState fs) { + int num=0; + if (flags.containsKey(fs)) + num=flags.get(fs).intValue(); + if (num getFS() { + return flags.keySet(); + } + + public int hashCode() { + int hashcode=flags.hashCode(); + if (tag!=null) + hashcode^=tag.hashCode(); + return hashcode; + } + + public boolean equals(Object o) { + if (o instanceof TagState) { + TagState t=(TagState)o; + if ((tag==null&&t.tag==null)|| + (tag!=null&&t.tag!=null&&tag.equals(t.tag))) { + return flags.equals(t.flags); + } + } + return false; + } +} diff --git a/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java b/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java new file mode 100644 index 00000000..5ce05f27 --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/TagWrapper.java @@ -0,0 +1,23 @@ +package Analysis.TaskStateAnalysis; +import IR.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; + +public class TagWrapper { + TagState initts; + Vector ts; + + public TagWrapper(TagState ts) { + this.initts=ts; + this.ts=new Vector(); + this.ts.addAll(ts); + } + + public TagWrapper clone() { + TagWrapper tw=new TagWrapper(); + tw.initts=initts; + tw.ts=ts.clone(); + return tw; + } +} diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskBinding.java b/Robust/src/Analysis/TaskStateAnalysis/TaskBinding.java new file mode 100644 index 00000000..27d46c47 --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskBinding.java @@ -0,0 +1,122 @@ +package Analysis.TaskStateAnalysis; +import IR.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; + +public class TaskBinding { + TaskQueueIterator tqi; + Vector decisions; + Hashtable temptotag; + ObjWrapper[] parameterbindings; + boolean increment; + + public TaskBinding(TaskQueueIterator tqi) { + this.tqi=tqi; + this.decisions=new Vector(); + int numobjs=tqi.ftsarray.length; + int numtags=tqi.tq.tags.size(); + this.parameterbindings=new ObjWrapper[numobjs]; + for(int i=0;i<(numtags+numobjs);i++) { + decisions.add(new Integer(0)); + } + } + + public ObjWrapper getParameter(int i) { + return parameterbindings[i]; + } + + public TagWrapper getTag(TempDescriptor tmp) { + return temptotag.get(tmp); + } + + public void next() { + increment=true; + } + + public boolean hasNext() { + Vector tagv=tqi.tq.tags; + int numtags=tagv.size(); + int numobjs=tqi.ftsarray.length; + int incrementlevel=numtags+numobjs; + if (increment) { + //actually do increment + incrementlevel--; + increment=false; + } + + mainloop: + while(true) { + Hashtable> ttable=new Hashtable>(); + temptotag=new Hashtable(); + //build current state + for(int i=0;i<(numtags+numobjs);i++) { + TagState tag=null; + TagWrapper tw=null; + if (i>=numtags) { + int objindex=i-numtags; + tag=tqi.ftsarray[objindex].ts; + } else { + TempDescriptor tmp=tagv.get(i); + tag=tqi.getTS(tmp); + } + int index=decisions.get(i).intValue(); + int currentsize=ttable.get(tag).size(); + if (i==incrementlevel) { + if (index==currentsize) { + if (incrementlevel==0) + return false; + incrementlevel--; + continue mainloop; + } else { + index++; + decisions.set(i, new Integer(index)); + } + } else if (i>incrementlevel) { + index=0; + decisions.set(i, new Integer(index)); + } + if (index>currentsize) { + tw=new TagWrapper(tag); + if (!ttable.containsKey(tag)) { + ttable.put(tag, new Vector()); + } + ttable.get(tag).add(tw); + } else { + //use old instance + tw=ttable.get(tag).get(index); + } + if (i>=numtags) { + int objindex=i-numtags; + FlagTagState fts=tqi.ftsarray[objindex]; + ObjWrapper ow=new ObjWrapper(fts.fs); + Hashtable > ctable=new Hashtable>(); + ctable.put(tw.ts, new HashSet()); + ctable.get(tw.ts).add(tw); + ow.tags.add(tw); + TagExpressionList tel=tqi.tq.task.getTag(tqi.tq.task.getParameter(i)); + for(int j=0;j()); + ctable.get(twtmp.ts).add(twtmp); + ow.tags.add(twtmp); + int tagcount=ctable.get(twtmp.ts).size(); + int fstagcount=fts.fs.getTagCount(twtmp.ts.getTag()); + if (fstagcount>=0&&(tagcount>fstagcount)) { + //Too many unique tags of this type bound to object wrapper + incrementlevel=i; + continue mainloop; + } + } + parameterbindings[objindex]=ow; + } else { + TempDescriptor tmp=tagv.get(i); + temptotag.put(tmp, tw); + } + } + return true; + } + } +} diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskQueue.java b/Robust/src/Analysis/TaskStateAnalysis/TaskQueue.java new file mode 100644 index 00000000..dd6404f7 --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskQueue.java @@ -0,0 +1,44 @@ +package Analysis.TaskStateAnalysis; +import IR.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; + +public class TaskQueue { + protected TaskDescriptor task; + protected HashSet []parameterset; + protected Vector tags; + protected Hashtable > map; + + public int numParameters() { + return parameterset.length; + } + + public TaskDescriptor getTask() { + return task; + } + + public TaskQueue(TaskDescriptor td) { + this.task=td; + this.parameterset=(HashSet[])new HashSet[task.numParameters()]; + this.map=new Hashtable>(); + for(int i=0;i(); + TagExpressionList tel=td.getTag(td.getParameter(i)); + for(int j=0;j()); + } + map.get(fts.fs).add(fts); + return new TaskQueueIterator(this, index, fts); + } +} diff --git a/Robust/src/Analysis/TaskStateAnalysis/TaskQueueIterator.java b/Robust/src/Analysis/TaskStateAnalysis/TaskQueueIterator.java new file mode 100644 index 00000000..7cc2bef5 --- /dev/null +++ b/Robust/src/Analysis/TaskStateAnalysis/TaskQueueIterator.java @@ -0,0 +1,148 @@ +package Analysis.TaskStateAnalysis; +import IR.*; +import IR.Tree.*; +import IR.Flat.*; +import java.util.*; + +public class TaskQueueIterator { + TaskQueue tq; + int index; + FlagTagState fts; + FlagTagState ftsarray[]; + Hashtable tsarray; + Hashtable tsindexarray; + Iterator itarray[]; + boolean needit; + boolean needinit; + + public TaskQueueIterator(TaskQueue tq, int index, FlagTagState fts) { + this.tq=tq; + this.index=index; + this.fts=fts; + this.ftsarray=new FlagTagState[tq.numParameters()]; + this.ftsarray[index]=fts; + this.tsarray=new Hashtable(); + this.tsindexarray=new Hashtable(); + this.itarray=(Iterator[]) new Iterator[tq.numParameters()]; + needit=false; + needinit=true; + init(); + } + + private void init() { + for(int i=ftsarray.length-1;i>=0;i--) { + if (i!=index) + itarray[i]=tq.parameterset[i].iterator(); + VarDescriptor vd=tq.task.getParameter(i); + TagExpressionList tel=tq.task.getTag(vd); + for(int j=0;j0?tel.numTags()-1:0; + needinit=false; + } else + j=0; + tagloop: + for(;j possts=tq.map.get(currfs); + int index=0; + if (currtag!=null) + index=possts.indexOf(new FlagTagState(currtag,currfs)); + if (needit) { + index++; + needit=false; + } + for(int k=index;k toprocess; + Hashtable tasktable; + + + /** + * Class Constructor + * + */ + public TaskTagAnalysis(State state, TagAnalysis taganalysis) { + this.state=state; + this.typeutil=new TypeUtil(state); + this.taganalysis=taganalysis; + this.flaginfo=new FlagInfo(state); + this.toprocess=new HashSet(); + this.tasktable=new Hashtable(); + for(Iterator taskit=state.getTaskSymbolTable().getDescriptorsIterator();taskit.hasNext();) { + TaskDescriptor td=(TaskDescriptor)taskit.next(); + tasktable.put(td, new TaskQueue(td)); + } + } + + private void doAnalysis() { + toprocess.add(createInitialState()); + + while(!toprocess.isEmpty()) { + TagState ts=toprocess.iterator().next(); + toprocess.remove(ts); + //Loop through each task + for(Iterator taskit=state.getTaskSymbolTable().getDescriptorsIterator();taskit.hasNext();) { + TaskDescriptor td=(TaskDescriptor)taskit.next(); + TaskQueue tq=tasktable.get(td); + processTask(td, tq, ts); + } + } + } + + private void processTask(TaskDescriptor td, TaskQueue tq, TagState ts) { + Set flagset=ts.getFS(); + for(Iterator fsit=flagset.iterator();fsit.hasNext();) { + FlagState fs=fsit.next(); + FlagTagState fts=new FlagTagState(ts, fs); + for(int i=0;i computeInitialState(Hashtable> table, FlatNode fn) { + Hashtable table=new Hashtable(); + for(int i=0;i prevtable=table.get(fn); + for(Iterator tmpit=prevtable.keySet().iterator();tmpit.hasNext();) { + TempDescriptor tmp=tmpit.next(); + TagWrapper prevtag=prevtable.get(tmp); + if (table.containsKey(tmp)) { + TagWrapper currtag=table.get(tmp); + } else { + table.put(tmp, prevtag.clone()); + } + + } + } + + return table; + } + + private void doAnalysis(TaskBinding tb) { + TaskDescriptor td=tb.tqi.tq.getTask(); + FlatMethod fm=state.getMethodFlat(td); + Hashtable> table=new Hashtable>(); + table.put(fm, buildinittable(tb)); + HashSet visited=new HashSet(); + HashSet tovisit=new HashSet(); + tovisit.add(fm.getNext(0)); + while(!tovisit.isEmpty()) { + FlatNode fn=tovisit.iterator().next(); + tovisit.remove(fn); + visited.add(fn); + + + for(int i=0;i> buildinittable(TaskBinding tb) { + Hashtable> table=new Hashtable>(); + Vector tagtmps=tb.tqi.tq.tags; + for(int i=0;i tset=new HashSet(); + tset.add(tb.getTag(tmp)); + table.put(tmp, tset); + } + return table; + } + + /* + method summary: + new flag states created + new tag states created + flag states bound to tag parameters + */ + + public boolean canEnqueue(TaskDescriptor td, int paramnum, FlagState fs) { + return typeutil.isSuperorType(td.getParamType(paramnum).getClassDesc(),fs.getClassDescriptor())&& + isTaskTrigger_flag(td.getFlag(td.getParameter(paramnum)),fs)&& + isTaskTrigger_tag(td.getTag(td.getParameter(paramnum)),fs); + } + + private static boolean isTaskTrigger_flag(FlagExpressionNode fen, FlagState fs) { + if (fen==null) + return true; + else if (fen instanceof FlagNode) + return fs.get(((FlagNode)fen).getFlag()); + else + switch (((FlagOpNode)fen).getOp().getOp()) { + case Operation.LOGIC_AND: + return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) && (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs))); + case Operation.LOGIC_OR: + return ((isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)) || (isTaskTrigger_flag(((FlagOpNode)fen).getRight(),fs))); + case Operation.LOGIC_NOT: + return !(isTaskTrigger_flag(((FlagOpNode)fen).getLeft(),fs)); + default: + return false; + } + } + + + private static boolean isTaskTrigger_tag(TagExpressionList tel, FlagState fs){ + if (tel!=null){ + for (int i=0;i