From: bdemsky Date: Wed, 23 Aug 2006 23:12:01 +0000 (+0000) Subject: check in checkpoint code X-Git-Tag: preEdgeChange~847 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a353f6f1d953fa5e9c722df4259d3feafdc53a85;p=IRC.git check in checkpoint code --- diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 069043b0..94f6e620 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -22,6 +22,8 @@ public class BuildCode { Virtual virtualcalls; TypeUtil typeutil; private int maxtaskparams=0; + ClassDescriptor[] cdarray; + TypeDescriptor[] arraytable; public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil) { state=st; @@ -153,9 +155,13 @@ public class BuildCode { outmethod.println("#include \"virtualtable.h\""); outmethod.println("#include "); outclassdefs.println("extern int classsize[];"); + outclassdefs.println("extern int * pointerarray[];"); //Store the sizes of classes & array elements generateSizeArray(outmethod); + + //Store the layout of classes + generateLayoutStructs(outmethod); /* Generate code for methods */ Iterator classit=state.getClassSymbolTable().getDescriptorsIterator(); @@ -344,7 +350,7 @@ public class BuildCode { private void generateSizeArray(PrintWriter outclassdefs) { outclassdefs.print("int classsize[]={"); Iterator it=state.getClassSymbolTable().getDescriptorsIterator(); - ClassDescriptor[] cdarray=new ClassDescriptor[state.numClasses()]; + cdarray=new ClassDescriptor[state.numClasses()]; while(it.hasNext()) { ClassDescriptor cd=(ClassDescriptor)it.next(); cdarray[cd.getId()]=cd; @@ -357,19 +363,19 @@ public class BuildCode { needcomma=true; } - TypeDescriptor[] sizetable=new TypeDescriptor[state.numArrays()]; + arraytable=new TypeDescriptor[state.numArrays()]; Iterator arrayit=state.getArrayIterator(); while(arrayit.hasNext()) { TypeDescriptor td=(TypeDescriptor)arrayit.next(); int id=state.getArrayNumber(td); - sizetable[id]=td; + arraytable[id]=td; } for(int i=0;i"+fd.getSafeSymbol()+"))"); + } + } + output.println("};"); + } + output.println("int * pointerarray[]={"); + boolean needcomma=false; + for(int i=0;i + +void ** makecheckpoint(int numparams, void ** pointerarray, struct SimpleHash * forward, struct SimpleHash * reverse) { + void **newarray=RUNMALLOC(sizeof(void *)*numparams); + struct SimpleHash *todo=allocateSimpleHash(100); + int i; + for(i=0;i___length___; + int i; + for(i=0;i___length___)+sizeof(int)))[i]; + if (SimpleHashcontainskey(forward, (int) objptr)) + SimpleHashget(forward,(int) objptr,(int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]); + else { + void * copy=createcopy(objptr); + SimpleHashadd(forward, (int) objptr, (int)copy); + SimpleHashadd(reverse, (int) copy, (int) objptr); + SimpleHashadd(todo, (int) objptr, (int) objptr); + ((void **)(((char *)& ao->___length___)+sizeof(int)))[i]=copy; + } + } + } else { + int size=pointer[0]; + int i; + for(i=1;i<=size;i++) { + int offset=pointer[i]; + void * objptr=*((void **)(((int)ptr)+offset)); + if (SimpleHashcontainskey(forward, (int) objptr)) + SimpleHashget(forward, (int) objptr, (int *) &(((char *)cpy)[offset])); + else { + void * copy=createcopy(objptr); + SimpleHashadd(forward, (int) objptr, (int) copy); + SimpleHashadd(reverse, (int) copy, (int) objptr); + SimpleHashadd(todo, (int) objptr, (int) objptr); + *((void **) ((int)cpy)+offset)=copy; + } + } + } + } + } +} + +void * createcopy(void * orig) { + int type=((int *)orig)[0]; + if (type___length___; + int size=sizeof(struct ArrayObject)+length*elementsize; + void *newobj=RUNMALLOC(size); + memcpy(newobj, orig, size); + return newobj; + } +} + +void restorecheckpoint(int numparams, void ** original, void ** checkpoint, struct SimpleHash *forward, struct SimpleHash * reverse) { + struct SimpleHash *todo=allocateSimpleHash(100); + int i; + + for(i=0;i___length___; + int i; + for(i=0;i___length___)+sizeof(int)))[i]; + SimpleHashget(reverse, (int) objptr, (int *) &((void **)(((char *)& ao->___length___)+sizeof(int)))[i]); + } + } else { + int size=pointer[0]; + int i; + for(i=1;i<=size;i++) { + int offset=pointer[i]; + void * objptr=*((void **)(((int)ptr)+offset)); + SimpleHashget(reverse, (int) objptr, (int *) &(((char *)cpy)[offset])); + } + } + } + } +} + + diff --git a/Robust/src/Runtime/checkpoint.h b/Robust/src/Runtime/checkpoint.h new file mode 100644 index 00000000..80006a6b --- /dev/null +++ b/Robust/src/Runtime/checkpoint.h @@ -0,0 +1,11 @@ +#ifndef CHECKPOINT_H +#define CHECKPOINT_H +#include "SimpleHash.h" + +void ** makecheckpoint(int numparams, void ** pointerarray, struct SimpleHash * forward, struct SimpleHash * reverse); + +void restorecheckpoint(int numparams, void ** original, void ** checkpoint, struct SimpleHash *forward, struct SimpleHash * reverse); + +void * createcopy(void * orig); + +#endif diff --git a/Robust/src/buildscripttask b/Robust/src/buildscripttask index 07cb3d6d..fdf88dd3 100755 --- a/Robust/src/buildscripttask +++ b/Robust/src/buildscripttask @@ -4,4 +4,4 @@ MAINFILE=$1 shift mkdir tmpbuilddirectory java -cp $ROBUSTROOT/../cup/:$ROBUSTROOT Main.Main -classlibrary $ROBUSTROOT/ClassLibrary/ -dir tmpbuilddirectory -task $@ -gcc -I$ROBUSTROOT/Runtime -Itmpbuilddirectory -O0 -DTASK -g tmpbuilddirectory/methods.c tmpbuilddirectory/taskdefs.c $ROBUSTROOT/Runtime/runtime.c $ROBUSTROOT/Runtime/Queue.c $ROBUSTROOT/Runtime/SimpleHash.c -o $MAINFILE.bin \ No newline at end of file +gcc -I$ROBUSTROOT/Runtime -Itmpbuilddirectory -O0 -DTASK -g tmpbuilddirectory/methods.c tmpbuilddirectory/taskdefs.c $ROBUSTROOT/Runtime/runtime.c $ROBUSTROOT/Runtime/Queue.c $ROBUSTROOT/Runtime/SimpleHash.c $ROBUSTROOT/Runtime/checkpoint.c -o $MAINFILE.bin \ No newline at end of file