From 8aefc94cde4ea6546abdd003505e592f3ae4e373 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Thu, 9 Aug 2007 23:46:01 +0000 Subject: [PATCH] more changes toward compiler DSM support --- .../Analysis/Locality/LocalityAnalysis.java | 12 +++ .../Analysis/Locality/LocalityBinding.java | 9 +++ Robust/src/IR/Flat/BuildCode.java | 76 +++++++++++++++---- Robust/src/IR/Flat/BuildFlat.java | 23 ++++-- Robust/src/IR/Flat/FlatAtomicEnterNode.java | 11 +++ Robust/src/IR/Flat/FlatAtomicExitNode.java | 8 +- Robust/src/IR/Flat/TempDescriptor.java | 7 ++ Robust/src/Makefile | 8 +- 8 files changed, 130 insertions(+), 24 deletions(-) diff --git a/Robust/src/Analysis/Locality/LocalityAnalysis.java b/Robust/src/Analysis/Locality/LocalityAnalysis.java index bee5d13a..23a6c90b 100644 --- a/Robust/src/Analysis/Locality/LocalityAnalysis.java +++ b/Robust/src/Analysis/Locality/LocalityAnalysis.java @@ -74,6 +74,16 @@ public class LocalityAnalysis { return tempstosave.get(lb); } + public Set getTempSet(LocalityBinding lb) { + HashSet set=new HashSet(); + Hashtable> table=getTemps(lb); + for(Iterator 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); diff --git a/Robust/src/Analysis/Locality/LocalityBinding.java b/Robust/src/Analysis/Locality/LocalityBinding.java index 28795f9c..a679c60c 100644 --- a/Robust/src/Analysis/Locality/LocalityBinding.java +++ b/Robust/src/Analysis/Locality/LocalityBinding.java @@ -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"; diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index 6a833534..df52097a 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -33,6 +33,7 @@ public class BuildCode { ClassDescriptor[] cdarray; TypeDescriptor[] arraytable; LocalityAnalysis locality; + Hashtable 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(); } /** 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 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 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 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 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 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()+" * "); diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java index be735ffa..a651fb1b 100644 --- a/Robust/src/IR/Flat/BuildFlat.java +++ b/Robust/src/IR/Flat/BuildFlat.java @@ -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); diff --git a/Robust/src/IR/Flat/FlatAtomicEnterNode.java b/Robust/src/IR/Flat/FlatAtomicEnterNode.java index 48f86ddb..4866c29f 100644 --- a/Robust/src/IR/Flat/FlatAtomicEnterNode.java +++ b/Robust/src/IR/Flat/FlatAtomicEnterNode.java @@ -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() { diff --git a/Robust/src/IR/Flat/FlatAtomicExitNode.java b/Robust/src/IR/Flat/FlatAtomicExitNode.java index 2effb30a..b69f76f0 100644 --- a/Robust/src/IR/Flat/FlatAtomicExitNode.java +++ b/Robust/src/IR/Flat/FlatAtomicExitNode.java @@ -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() { diff --git a/Robust/src/IR/Flat/TempDescriptor.java b/Robust/src/IR/Flat/TempDescriptor.java index 9e3034c2..40faaa4c 100644 --- a/Robust/src/IR/Flat/TempDescriptor.java +++ b/Robust/src/IR/Flat/TempDescriptor.java @@ -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); diff --git a/Robust/src/Makefile b/Robust/src/Makefile index 0ae5fda8..1a8c70de 100644 --- a/Robust/src/Makefile +++ b/Robust/src/Makefile @@ -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 -- 2.34.1