generateFlatAtomicExitNode(fm, lb, (FlatAtomicExitNode) fn, output);
return;
+ case FKind.FlatSESEEnterNode:
+ generateFlatSESEEnterNode(fm, lb, (FlatSESEEnterNode) fn, output);
+ return;
+
+ case FKind.FlatSESEExitNode:
+ generateFlatSESEExitNode(fm, lb, (FlatSESEExitNode) fn, output);
+ return;
+
case FKind.FlatGlobalConvNode:
generateFlatGlobalConvNode(fm, lb, (FlatGlobalConvNode) fn, output);
return;
output.println("}");
}
+ public void generateFlatSESEEnterNode(FlatMethod fm, LocalityBinding lb, FlatSESEEnterNode faen, PrintWriter output) {
+
+ }
+
+ public void generateFlatSESEExitNode(FlatMethod fm, LocalityBinding lb, FlatSESEExitNode faen, PrintWriter output) {
+
+ }
+
private void generateFlatCheckNode(FlatMethod fm, LocalityBinding lb, FlatCheckNode fcn, PrintWriter output) {
if (state.CONSCHECK) {
String specname=fcn.getSpec();
return new NodePair(faen, faexn);
}
+ private NodePair flattenSESENode(SESENode sn) {
+ if( sn.isStart() ) {
+ FlatSESEEnterNode fsen=new FlatSESEEnterNode(sn);
+ sn.setFlatEnter(fsen);
+ return new NodePair(fsen, fsen);
+ }
+
+ FlatSESEExitNode fsexn=new FlatSESEExitNode(sn);
+ sn.setFlatExit(fsexn);
+ fsexn.setFlatEnter( sn.getStart().getFlatEnter() );
+ sn.getStart().getFlatEnter().setFlatExit( fsexn );
+ return new NodePair(fsexn, fsexn);
+ }
+
private NodePair flattenBlockStatementNode(BlockStatementNode bsn) {
switch(bsn.kind()) {
case Kind.BlockExpressionNode:
case Kind.AtomicNode:
return flattenAtomicNode((AtomicNode)bsn);
+ case Kind.SESENode:
+ return flattenSESENode((SESENode)bsn);
}
throw new Error();
}
public static final int FlatGlobalConvNode=20;
public static final int FlatPrefetchNode=21;
public static final int FlatOffsetNode=22;
+ public static final int FlatSESEEnterNode=23;
+ public static final int FlatSESEExitNode=24;
}
--- /dev/null
+package IR.Flat;
+import IR.Tree.SESENode;
+import java.util.Vector;
+
+public class FlatSESEEnterNode extends FlatNode {
+ private static int identifier=0;
+ private int id;
+ protected FlatSESEExitNode exit;
+ protected SESENode treeNode;
+
+ public FlatSESEEnterNode( SESENode sn ) {
+ this.id=identifier++;
+ treeNode = sn;
+ }
+
+ public SESENode getTreeNode() {
+ return treeNode;
+ }
+
+ public int getIdentifier() {
+ return id;
+ }
+
+ public String toString() {
+ return "sese enter";
+ }
+
+ public void setFlatExit( FlatSESEExitNode fsexn ) {
+ exit = fsexn;
+ }
+
+ public FlatSESEExitNode getFlatExit() {
+ return exit;
+ }
+
+ public int kind() {
+ return FKind.FlatSESEEnterNode;
+ }
+}
--- /dev/null
+package IR.Flat;
+import IR.Tree.SESENode;
+import java.util.Vector;
+
+public class FlatSESEExitNode extends FlatNode {
+ protected SESENode treeNode;
+ FlatSESEEnterNode enter;
+
+ public FlatSESEExitNode( SESENode sn ) {
+ treeNode = sn;
+ }
+
+ public SESENode getTreeNode() {
+ return treeNode;
+ }
+
+ public void setFlatEnter( FlatSESEEnterNode fsen ) {
+ enter = fsen;
+ }
+
+ public FlatSESEEnterNode getSESEEnter() {
+ return enter;
+ }
+
+ public String toString() {
+ return "seseexit";
+ }
+
+ public int kind() {
+ return FKind.FlatSESEExitNode;
+ }
+}
return bn;
}
+ public Vector parseSESEBlock(Vector parentbs, ParseNode pn) {
+ ParseNodeVector pnv=pn.getChildren();
+ Vector bv=new Vector();
+ for(int i=0; i<pnv.size(); i++) {
+ bv.addAll(parseBlockStatement(pnv.elementAt(i)));
+ }
+ return bv;
+ }
+
public Vector parseBlockStatement(ParseNode pn) {
Vector blockstatements=new Vector();
if (isNode(pn,"tag_declaration")) {
ExpressionNode condition=parseExpression(pn.getChild("condition").getFirstChild());
BlockNode body=parseSingleBlock(pn.getChild("statement").getFirstChild());
blockstatements.add(new LoopNode(condition,body,LoopNode.DOWHILELOOP));
+ } else if (isNode(pn,"sese")) {
+ SESENode start=new SESENode();
+ SESENode end =new SESENode();
+ start.setEnd( end );
+ end.setStart( start );
+ blockstatements.add(start);
+ blockstatements.addAll(parseSESEBlock(blockstatements,pn.getChild("body").getFirstChild()));
+ blockstatements.add(end);
} else {
System.out.println("---------------");
System.out.println(pn.PPrint(3,true));
public final static int TagDeclarationNode=20;
public final static int AtomicNode=21;
public final static int OffsetNode=22;
+ public final static int SESENode=23;
}
public static final int FINAL=32;
public static final int NATIVE=64;
public static final int SYNCHRONIZED=128;
- public static final int ATOMIC=2048;
// TRANSIENT=256
// VOLATILE=512
// STRICTFP=1024
+ public static final int ATOMIC=2048;
+
private int value;
--- /dev/null
+package IR.Tree;
+import IR.Flat.FlatSESEEnterNode;
+import IR.Flat.FlatSESEExitNode;
+
+public class SESENode extends BlockStatementNode {
+
+ protected SESENode start;
+ protected SESENode end;
+
+ protected FlatSESEEnterNode enter;
+ protected FlatSESEExitNode exit;
+
+
+ public SESENode() {
+ start = null;
+ end = null;
+ enter = null;
+ exit = null;
+ }
+
+
+ public void setStart( SESENode n ) {
+ start = n;
+ }
+
+ public void setEnd( SESENode n ) {
+ end = n;
+ }
+
+ public boolean isStart() {
+ return end != null;
+ }
+
+ public SESENode getStart() {
+ return start;
+ }
+
+ public SESENode getEnd() {
+ return end;
+ }
+
+ public void setFlatEnter( FlatSESEEnterNode fsen ) {
+ enter = fsen;
+ }
+
+ public void setFlatExit( FlatSESEExitNode fsexn ) {
+ exit = fsexn;
+ }
+
+ public FlatSESEEnterNode getFlatEnter() {
+ return enter;
+ }
+
+ public FlatSESEExitNode getFlatExit() {
+ return exit;
+ }
+
+
+ public String printNode(int indent) {
+ if( isStart() ) {
+ return printSpace(indent)+"START SESE\n";
+ } else {
+ return printSpace(indent)+"END SESE\n";
+ }
+ }
+
+ public int kind() {
+ return Kind.SESENode;
+ }
+}
case Kind.AtomicNode:
checkAtomicNode(md, nametable, (AtomicNode)bsn);
return;
- }
+
+ case Kind.SESENode:
+ // do nothing, no semantic check for SESEs
+ return;
+ }
+
throw new Error();
}
key_table.put("private", new Integer(Sym.PRIVATE));
key_table.put("protected", new Integer(Sym.PROTECTED));
key_table.put("public", new Integer(Sym.PUBLIC));
- key_table.put("return", new Integer(Sym.RETURN));
+ key_table.put("return", new Integer(Sym.RETURN));
key_table.put("short", new Integer(Sym.SHORT));
key_table.put("static", new Integer(Sym.STATIC));
key_table.put("strictfp", new Integer(Sym.STRICTFP));
key_table.put("global", new Integer(Sym.GLOBAL));
//Keywords for hacking prefetch calls in java
key_table.put("getoffset", new Integer(Sym.GETOFFSET));
+ //Keywords for coarse-grain parallelization
+ key_table.put("sese", new Integer(Sym.SESE));
}
}
"implements", "import", "instanceof", "int", "interface", "isavailable",
"long",
"native", "new", "optional", "package", "private", "protected", "public",
- "return", "short", "static", "strictfp", "super", "switch", "synchronized",
+ "return", "sese", "short", "static", "strictfp", "super", "switch", "synchronized",
"tag", "task", "taskexit", //keywords for failure aware computation
"this", "throw", "throws", "transient", "try", "void",
"volatile", "while"
non terminal ParseNode atomic_statement;
non terminal ParseNode getoffset_expression;
+//coarse-grain parallelization
+terminal SESE;
+non terminal ParseNode sese_statement;
+
start with goal;
| return_statement:st {: RESULT=st; :}
| task_exitstatement:st {: RESULT=st; :}
| atomic_statement:st {: RESULT=st; :}
+ | sese_statement:st {: RESULT=st; :}
// | synchronized_statement
// | throw_statement
// | try_statement
RESULT=(new ParseNode("atomic")).addChild(blk).getRoot();
:}
;
+sese_statement ::=
+
+// SESE variable_declarator_id:id LBRACE statement:st RBRACE {:
+
+ SESE block:blk {:
+ ParseNode pn = new ParseNode("sese");
+
+// pn.addChild("identifier").addChild(id);
+
+ pn.addChild("body").addChild(blk);
+ RESULT=pn;
+ :}
+ ;
//try_statement ::=
// TRY block catches
// | TRY block catches_opt finally
--- /dev/null
+PROGRAM=test
+
+SOURCE_FILES=$(PROGRAM).java
+
+BUILDSCRIPT=~/research/Robust/src/buildscript
+BSFLAGS= -recover -ownership -ownallocdepth 1 -ownaliasfile aliases.txt -ownwritedots final -enable-assertions -flatirtasks
+
+all: $(PROGRAM).bin
+
+view: PNGs
+ eog *.png &
+
+PNGs: DOTs
+ d2p *COMPLETE*.dot
+
+DOTs: $(PROGRAM).bin
+
+$(PROGRAM).bin: $(SOURCE_FILES)
+ $(BUILDSCRIPT) $(BSFLAGS) -o $(PROGRAM) $(SOURCE_FILES)
+
+clean:
+ rm -f $(PROGRAM).bin
+ rm -fr tmpbuilddirectory
+ rm -f *~
+ rm -f *.dot
+ rm -f *.png
+ rm -f aliases.txt
--- /dev/null
+
+
+task Startup( StartupObject s{ initialstate } ) {
+
+ int a = 0;
+
+ sese {
+ int x = 3;
+ }
+
+ a = x;
+
+
+ sese {
+ int y = 4;
+ y+=4;
+
+ sese {
+ int z = x + y;
+ z+=6;
+ Integer n=new Integer(23);
+ }
+ }
+
+ x = y + z;
+
+
+ taskexit( s{ !initialstate } );
+}