more changes toward compiler DSM support
authorbdemsky <bdemsky>
Thu, 9 Aug 2007 23:46:01 +0000 (23:46 +0000)
committerbdemsky <bdemsky>
Thu, 9 Aug 2007 23:46:01 +0000 (23:46 +0000)
Robust/src/Analysis/Locality/LocalityAnalysis.java
Robust/src/Analysis/Locality/LocalityBinding.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FlatAtomicEnterNode.java
Robust/src/IR/Flat/FlatAtomicExitNode.java
Robust/src/IR/Flat/TempDescriptor.java
Robust/src/Makefile

index bee5d13a1a7c1adda93abcfb09265263961490a3..23a6c90bcdb856219494eb05e19e0e616a91599f 100644 (file)
@@ -74,6 +74,16 @@ public class LocalityAnalysis {
        return tempstosave.get(lb);
     }
 
+    public Set<TempDescriptor> getTempSet(LocalityBinding lb) {
+       HashSet<TempDescriptor> set=new HashSet<TempDescriptor>();
+       Hashtable<FlatAtomicEnterNode, Set<TempDescriptor>> table=getTemps(lb);
+       for(Iterator<FlatAtomicEnterNode> faenit=table.keySet().iterator();faenit.hasNext();) {
+           FlatAtomicEnterNode faen=faenit.next();
+           set.addAll(table.get(faen));
+       }
+       return set;
+    }
+
     private void doAnalysis() {
        computeLocalityBindings();
        computeTempstoSave();
@@ -150,6 +160,8 @@ public class LocalityAnalysis {
            switch(fn.kind()) {
            case FKind.FlatAtomicEnterNode:
                processAtomicEnterNode((FlatAtomicEnterNode)fn, atomictable);
+               if (!lb.isAtomic())
+                   lb.setHasAtomic();
                break;
            case FKind.FlatAtomicExitNode:
                processAtomicExitNode((FlatAtomicExitNode)fn, atomictable);
index 28795f9c18a5e6981da522c5c8ccb475e4ec92a0..a679c60c4c28220e05836e662c02835ec14043e9 100644 (file)
@@ -8,6 +8,7 @@ public class LocalityBinding {
     private Integer isglobalreturn;
     private Integer isglobalthis;
     private LocalityBinding parent;
+    private boolean hasatomic;
 
     public LocalityBinding(MethodDescriptor md, boolean atomic) {
        this.md=md;
@@ -15,6 +16,14 @@ public class LocalityBinding {
        isatomic=atomic;
     }
 
+    public void setHasAtomic() {
+       hasatomic=true;
+    }
+
+    public boolean getHasAtomic() {
+       return hasatomic;
+    }
+
     private static String globalToString(Integer g) {
        if (g==LocalityAnalysis.GLOBAL)
            return "G";
index 6a833534c2d9701d6fbd487ac4a13793ff05ba03..df52097aebc89b6064bf0771af8c716c06774e34 100644 (file)
@@ -33,6 +33,7 @@ public class BuildCode {
     ClassDescriptor[] cdarray;
     TypeDescriptor[] arraytable;
     LocalityAnalysis locality;
+    Hashtable<TempDescriptor, TempDescriptor> backuptable;
 
     public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil) {
        state=st;
@@ -48,6 +49,7 @@ public class BuildCode {
     public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality) {
        this(st, temptovar, typeutil);
        this.locality=locality;
+       this.backuptable=new Hashtable<TempDescriptor, TempDescriptor>();
     }
 
     /** The buildCode method outputs C code for all the methods.  The Flat
@@ -642,11 +644,12 @@ public class BuildCode {
      * These objects tell the compiler which temps need to be
      * allocated.  */
 
-    private void generateTempStructs(FlatMethod fm) {
+    private void generateTempStructs(FlatMethod fm, LocalityBinding lb) {
        MethodDescriptor md=fm.getMethod();
        TaskDescriptor task=fm.getTask();
-
+       Set<TempDescriptor> saveset=state.DSM?locality.getTempSet(lb):null;
        ParamsObject objectparams=md!=null?new ParamsObject(md,tag++):new ParamsObject(task, tag++);
+
        if (md!=null)
            paramstable.put(md, objectparams);
        else
@@ -659,6 +662,9 @@ public class BuildCode {
                objectparams.addPtr(temp);
            else
                objectparams.addPrim(temp);
+           if(state.DSM&&saveset.contains(temp)) {
+               backuptable.put(temp, temp.createNew());
+           }
        }
 
        for(int i=0;i<fm.numTags();i++) {
@@ -685,8 +691,22 @@ public class BuildCode {
                    objecttemps.addPtr(temp);
                else
                    objecttemps.addPrim(temp);
+               if(state.DSM&&saveset.contains(temp)&&
+                  !backuptable.containsKey(temp))
+                   backuptable.put(temp, temp.createNew());
            }
        }
+
+       /* Create backup temps */
+       if (state.DSM)
+           for(Iterator<TempDescriptor> tmpit=backuptable.values().iterator();tmpit.hasNext();) {
+               TempDescriptor tmp=tmpit.next();
+               TypeDescriptor type=tmp.getType();
+               if ((type.isPtr()||type.isArray())&&GENERATEPRECISEGC)
+                   objecttemps.addPtr(tmp);
+               else
+                   objecttemps.addPrim(tmp);
+           }
     }
 
     /** This method outputs the following information about classes
@@ -866,7 +886,7 @@ public class BuildCode {
            /* Classify parameters */
            MethodDescriptor md=(MethodDescriptor)methodit.next();
            FlatMethod fm=state.getMethodFlat(md);
-           generateTempStructs(fm);
+           generateTempStructs(fm, null);
 
            ParamsObject objectparams=(ParamsObject) paramstable.get(md);
            TempObject objecttemps=(TempObject) tempstable.get(md);
@@ -943,7 +963,7 @@ public class BuildCode {
            /* Classify parameters */
            TaskDescriptor task=(TaskDescriptor)taskit.next();
            FlatMethod fm=state.getMethodFlat(task);
-           generateTempStructs(fm);
+           generateTempStructs(fm, null);
 
            ParamsObject objectparams=(ParamsObject) paramstable.get(task);
            TempObject objecttemps=(TempObject) tempstable.get(task);
@@ -1004,9 +1024,7 @@ public class BuildCode {
                ClassDescriptor cn=md!=null?md.getClassDesc():null;
 
        ParamsObject objectparams=(ParamsObject)paramstable.get(md!=null?md:task);
-
        generateHeader(fm, lb, md!=null?md:task,output);
-
        TempObject objecttemp=(TempObject) tempstable.get(md!=null?md:task);
 
        if (GENERATEPRECISEGC) {
@@ -1066,14 +1084,14 @@ public class BuildCode {
            }
            if (current_node.numNext()==0) {
                output.print("   ");
-               generateFlatNode(fm, current_node, output);
+               generateFlatNode(fm, lb, current_node, output);
                if (current_node.kind()!=FKind.FlatReturnNode) {
                    output.println("   return;");
                }
                current_node=null;
            } else if(current_node.numNext()==1) {
                output.print("   ");
-               generateFlatNode(fm, current_node, output);
+               generateFlatNode(fm, lb, current_node, output);
                FlatNode nextnode=current_node.getNext(0);
                if (visited.contains(nextnode)) {
                    output.println("goto L"+nodetolabel.get(nextnode)+";");
@@ -1097,7 +1115,7 @@ public class BuildCode {
        output.println("}\n\n");
     }
 
-    /** This method assigns labels to flatnodes */
+    /** This method assigns labels to FlatNodes */
 
     private Hashtable<FlatNode, Integer> assignLabels(FlatMethod fm) {
        HashSet tovisit=new HashSet();
@@ -1131,7 +1149,7 @@ public class BuildCode {
     }
 
 
-    /** Generate text string that corresponds to the Temp td. */
+    /** Generate text string that corresponds to the TempDescriptor td. */
     private String generateTemp(FlatMethod fm, TempDescriptor td) {
        MethodDescriptor md=fm.getMethod();
        TaskDescriptor task=fm.getTask();
@@ -1151,13 +1169,13 @@ public class BuildCode {
        throw new Error();
     }
 
-    private void generateFlatNode(FlatMethod fm, FlatNode fn, PrintWriter output) {
+    private void generateFlatNode(FlatMethod fm, LocalityBinding lb, FlatNode fn, PrintWriter output) {
        switch(fn.kind()) {
        case FKind.FlatAtomicEnterNode:
-           generateFlatAtomicEnterNode(fm, (FlatAtomicEnterNode) fn, output);
+           generateFlatAtomicEnterNode(fm, lb, (FlatAtomicEnterNode) fn, output);
            return;
        case FKind.FlatAtomicExitNode:
-           generateFlatAtomicExitNode(fm, (FlatAtomicExitNode) fn, output);
+           generateFlatAtomicExitNode(fm, lb, (FlatAtomicExitNode) fn, output);
            return;
        case FKind.FlatTagDeclaration:
            generateFlatTagDeclaration(fm, (FlatTagDeclaration) fn,output);
@@ -1212,10 +1230,37 @@ public class BuildCode {
 
     }
     
-    public void generateFlatAtomicEnterNode(FlatMethod fm,  FlatAtomicEnterNode faen, PrintWriter output) {
+    public void generateFlatAtomicEnterNode(FlatMethod fm,  LocalityBinding lb, FlatAtomicEnterNode faen, PrintWriter output) {
+       /* Check to see if we need to generate code for this atomic */
+       if (locality.getAtomic(lb).get(faen.getPrev(0)).intValue()>0)
+           return;
+       /* Backup the temps. */
+       for(Iterator<TempDescriptor> tmpit=locality.getTemps(lb).get(faen).iterator();tmpit.hasNext();) {
+           TempDescriptor tmp=tmpit.next();
+           output.println(generateTemp(fm, backuptable.get(tmp))+"="+generateTemp(fm,tmp)+";");
+       }
+       output.println("goto transstart"+faen.getIdentifier()+";");
+
+       /******* Print code to abort transaction *******/
+       output.println("transabort"+faen.getIdentifier()+":");
+
+       /* Restore temps */
+       for(Iterator<TempDescriptor> tmpit=locality.getTemps(lb).get(faen).iterator();tmpit.hasNext();) {
+           TempDescriptor tmp=tmpit.next();
+           output.println(generateTemp(fm, tmp)+"="+generateTemp(fm,backuptable.get(tmp))+";");
+       }
+
+       /******* Tell the runtime to start the transaction *******/
+       
+       output.println("transstart"+faen.getIdentifier()+":");
+       output.println("trans=transStart();");
     }
 
-    public void generateFlatAtomicExitNode(FlatMethod fm,  FlatAtomicExitNode faen, PrintWriter output) {
+    public void generateFlatAtomicExitNode(FlatMethod fm,  LocalityBinding lb, FlatAtomicExitNode faen, PrintWriter output) {
+       /* Check to see if we need to generate code for this atomic */
+       if (locality.getAtomic(lb).get(faen).intValue()>0)
+           return;
+
     }
 
     private void generateFlatCheckNode(FlatMethod fm,  FlatCheckNode fcn, PrintWriter output) {
@@ -1282,7 +1327,6 @@ public class BuildCode {
        if (md.isStatic()||md.getReturnType()==null||singleCall(fc.getThis().getType().getClassDesc(),md)) {
            output.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor());
        } else {
-           
            output.print("((");
            if (md.getReturnType().isClass()||md.getReturnType().isArray())
                output.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
index be735ffa9bed702a094d7838daab5596e928fdcb..a651fb1b58dc65ca53229f9e21aadaffa149c809 100644 (file)
@@ -102,11 +102,18 @@ public class BuildFlat {
        }
     }
 
+    FlatAtomicEnterNode curran=null;
+
     private void flattenClass(ClassDescriptor cn) {
        Iterator methodit=cn.getMethods();
        while(methodit.hasNext()) {
            currmd=(MethodDescriptor)methodit.next();
            BlockNode bn=state.getMethodBody(currmd);
+
+           if (state.DSM&&currmd.getModifiers().isAtomic()) {
+               curran=new FlatAtomicEnterNode();
+           } else
+               curran=null;
            NodePair np=flattenBlockNode(bn);
            FlatNode fn=np.getBegin();
            if (state.THREAD&&currmd.getModifiers().isSynchronized()) {
@@ -123,11 +130,10 @@ public class BuildFlat {
                    fcunlock.addNext(rnflat);
                }
            } else if (state.DSM&&currmd.getModifiers().isAtomic()) {
-               FlatAtomicEnterNode an=new FlatAtomicEnterNode();
-               an.addNext(fn);
-               fn=an;
+               curran.addNext(fn);
+               fn=curran;
                if (np.getEnd().kind()!=FKind.FlatReturnNode) {
-                   FlatAtomicExitNode aen=new FlatAtomicExitNode();
+                   FlatAtomicExitNode aen=new FlatAtomicExitNode(curran);
                    np.getEnd().addNext(aen);
                    FlatReturnNode rnflat=new FlatReturnNode(null);
                    aen.addNext(rnflat);
@@ -858,9 +864,14 @@ public class BuildFlat {
            MethodDescriptor memd=(MethodDescriptor)typeutil.getClass("Object").getMethodTable().get("MonitorExit");
            TempDescriptor thistd=getTempforVar(currmd.getThis());
            FlatCall fc=new FlatCall(memd, null, thistd, new TempDescriptor[0]);
-           fc.addNext(rnflat);
+           fc.addNext(ln);
            ln=fc;
        }
+       if (state.DSM&&currmd.getModifiers().isAtomic()) {
+           FlatAtomicExitNode faen=new FlatAtomicExitNode(curran);
+           faen.addNext(ln);
+           ln=faen;
+       }
 
        if (cond!=null) {
            cond.getEnd().addNext(ln);
@@ -913,7 +924,7 @@ public class BuildFlat {
     private NodePair flattenAtomicNode(AtomicNode sbn) {
        NodePair np=flattenBlockNode(sbn.getBlockNode());
        FlatAtomicEnterNode faen=new FlatAtomicEnterNode();
-       FlatAtomicExitNode faexn=new FlatAtomicExitNode();
+       FlatAtomicExitNode faexn=new FlatAtomicExitNode(faen);
        faen.addNext(np.getBegin());
        np.getEnd().addNext(faexn);
        return new NodePair(faen, faexn);
index 48f86ddbe7a1d9c69f7f1aeedba287164a0580ca..4866c29f7fb4c1d50dc9768b1147eddd9ee0faee 100644 (file)
@@ -2,7 +2,18 @@ package IR.Flat;
 import java.util.Vector;
 
 public class FlatAtomicEnterNode extends FlatNode {
+    private static int identifier=0;
+
+    private int id;
+
     public FlatAtomicEnterNode() {
+       this.id=identifier++;
+    }
+
+    /* Returns an unique identifier for this atomic enter node */
+
+    public int getIdentifier() {
+       return id;
     }
 
     public String toString() {
index 2effb30a3d919962335cebb56dc4c70ed17f58ea..b69f76f0e1d19129dd95f35e966cc882ebc213f9 100644 (file)
@@ -2,7 +2,13 @@ package IR.Flat;
 import java.util.Vector;
 
 public class FlatAtomicExitNode extends FlatNode {
-    public FlatAtomicExitNode() {
+    FlatAtomicEnterNode faen;
+    public FlatAtomicExitNode(FlatAtomicEnterNode faen) {
+       this.faen=faen;
+    }
+
+    public FlatAtomicEnterNode getAtomicEnter() {
+       return faen;
     }
 
     public String toString() {
index 9e3034c2b94332aaf1caa4545f65a7eb8dbcc2db..40faaa4c829b6a8e6eb9ff7162f8e589a052f2aa 100644 (file)
@@ -23,6 +23,13 @@ public class TempDescriptor extends Descriptor {
        this.type=type;
        tag=td;
     }
+
+    public TempDescriptor createNew() {
+       if (tag==null)
+           return new TempDescriptor(name, type);
+       else
+           return new TempDescriptor(name, type, tag);
+    }
     
     public static TempDescriptor tempFactory() {
        return new TempDescriptor("temp_"+currentid);
index 0ae5fda81675e9b8163430751061ad476e75394b..1a8c70de159e3bf8e8e120879b867257fa85ec4e 100644 (file)
@@ -82,6 +82,12 @@ Interface/WebInterface.class
 
 all: Parse/Sym.class Parse/Parser.class $(CLASSFILES) javadoc
 
+wc:
+       wc Interface/*.java Analysis/*/*.java IR/*.java IR/*/*.java Lex/*.java Util/*.java
+
+wcrun:
+       wc Runtime/*.[c,h]
+
 Parse/Parser.java Parse/Sym.java: Parse/java14.cup
        cd Parse && \
         java -cp ../../cup:$(CLASSPATH) java_cup.Main -parser Parser -symbols Sym < java14.cup
@@ -91,7 +97,7 @@ Parse/Parser.java Parse/Sym.java: Parse/java14.cup
 
 javadoc:
        mkdir javadoc
-       javadoc -classpath ../cup:.:$(CLASSPATH) -sourcepath . -private -d javadoc Lex Util IR IR.Tree IR.Flat Analysis Analysis.CallGraph Analysis.Flag Analysis.TaskStateAnalysis Main 
+       javadoc -classpath ../cup:.:$(CLASSPATH) -sourcepath . -private -d javadoc Lex Util IR IR.Tree IR.Flat Analysis Analysis.CallGraph Analysis.Flag Analysis.TaskStateAnalysis Analysis.Locality Main 
 
 clean:
        rm IR/*.class IR/Tree/*.class Main/*.class Lex/*.class Parse/*.class Parse/Sym.java Parse/Parser.java IR/Flat/*.class classdefs.h methodheaders.h methods.c structdefs.h virtualtable.h task.h taskdefs.c taskdefs.h Analysis/*.class Analysis/Flag/*.class Analysis/CallGraph/*.class  Analysis/TaskStateAnalysis/*.class Interface/*.class Util/*.class Analysis/Locality/*.class