From d5ea243e0719db9c7305abca371af6e82cfdcdca Mon Sep 17 00:00:00 2001 From: Rushabh Lalwani Date: Wed, 6 Oct 2021 12:36:22 +0530 Subject: [PATCH] at-opt code added and build successfully --- .../atOptimzer/AbstractPlaceTree.java | 20 + .../optimizations/atOptimzer/ClassInfo.java | 34 + .../atOptimzer/ClosureDetails.java | 23 + .../x10/optimizations/atOptimzer/EdgeRep.java | 42 + .../atOptimzer/ForClosureObject.java | 23 + .../atOptimzer/ForClosureObjectField.java | 32 + .../atOptimzer/ForClosureObjectcpp.java | 17 + .../x10/optimizations/atOptimzer/ObjNode.java | 21 + .../optimizations/atOptimzer/PlaceNode.java | 40 + .../atOptimzer/VarWithLineNo.java | 14 + .../optimizations/atOptimzer/processInfo.java | 14 + x10.compiler/src/x10cpp/visit/Emitter.java | 36 + .../visit/MessagePassingCodeGenerator.java | 2121 ++++++++++++++++- .../src/x10cpp/visit/X10CPPTranslator.java | 38 +- x10.dist/rushabh-testing/HelloWholeWorld.cc | 195 ++ x10.dist/rushabh-testing/HelloWholeWorld.h | 99 + x10.dist/rushabh-testing/HelloWholeWorld.x10 | 44 + x10.dist/rushabh-testing/HelloWorld.cc | 66 + x10.dist/rushabh-testing/HelloWorld.h | 67 + x10.dist/rushabh-testing/HelloWorld.x10 | 23 + x10.dist/rushabh-testing/a.out | Bin 0 -> 99360 bytes x10.dist/rushabh-testing/xxx_main_xxx.cc | 3 + 22 files changed, 2954 insertions(+), 18 deletions(-) create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/AbstractPlaceTree.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/ClassInfo.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/ClosureDetails.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/EdgeRep.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObject.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObjectField.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObjectcpp.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/ObjNode.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/PlaceNode.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/VarWithLineNo.java create mode 100644 x10.compiler/src/x10/optimizations/atOptimzer/processInfo.java create mode 100644 x10.dist/rushabh-testing/HelloWholeWorld.cc create mode 100644 x10.dist/rushabh-testing/HelloWholeWorld.h create mode 100644 x10.dist/rushabh-testing/HelloWholeWorld.x10 create mode 100644 x10.dist/rushabh-testing/HelloWorld.cc create mode 100644 x10.dist/rushabh-testing/HelloWorld.h create mode 100644 x10.dist/rushabh-testing/HelloWorld.x10 create mode 100755 x10.dist/rushabh-testing/a.out create mode 100644 x10.dist/rushabh-testing/xxx_main_xxx.cc diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/AbstractPlaceTree.java b/x10.compiler/src/x10/optimizations/atOptimzer/AbstractPlaceTree.java new file mode 100644 index 0000000000..d7f27ccf4a --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/AbstractPlaceTree.java @@ -0,0 +1,20 @@ +package x10.optimizations.atOptimzer; + +import x10.optimizations.atOptimzer.PlaceNode; + +public class AbstractPlaceTree +{ + public PlaceNode absPlTree; + + public AbstractPlaceTree(PlaceNode plNode) { + this.absPlTree = plNode; + } + + public AbstractPlaceTree() { + this.absPlTree = null; + } + + public void addPlaceNode(PlaceNode plNode) { + this.absPlTree = plNode; + } +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/ClassInfo.java b/x10.compiler/src/x10/optimizations/atOptimzer/ClassInfo.java new file mode 100644 index 0000000000..80f54e9068 --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/ClassInfo.java @@ -0,0 +1,34 @@ +package x10.optimizations.atOptimzer; + +import java.util.*; + +public class ClassInfo { + + public String classifier; + public String type; + public String name; + /* x10Type also using it for parameter optimization as well. + * for field X10Type is used for storing the type. + * for parameter x10Type is used to maintain the count + */ + public String x10Type = ""; + public int classNo = 0; + public int methodNo = 0; + public int methodNoIn = 0; + public LinkedList methodPara = null; + /* field to store the unique id for identifying function-overloading - for method only*/ + public String uniqueId; + + public ClassInfo() { + this.classifier = null; + this.type = null; + this.name = null; + } + + public ClassInfo(String f_classifier, String f_type, String f_name) { + this.classifier = f_classifier; + this.type = f_type; + this.name = f_name; + } + +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/ClosureDetails.java b/x10.compiler/src/x10/optimizations/atOptimzer/ClosureDetails.java new file mode 100644 index 0000000000..47939378c1 --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/ClosureDetails.java @@ -0,0 +1,23 @@ +package x10.optimizations.atOptimzer; + +import java.util.*; + +public class ClosureDetails { + public String name; + public int fromClass = 0; + public int fromMethod = 0; + public int fromplace = 0; + public int toClass = 0; + public int toMethod = 0; + public int toplace = 0; + public int countCRSWS = -1; + + public ClosureDetails(String closureName, int fromClass, int fromMethod, int fromplace ) { + this.name = closureName; + this.fromClass = fromClass; + this.fromMethod = fromMethod; + this.fromplace = fromplace; + } + +} + diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/EdgeRep.java b/x10.compiler/src/x10/optimizations/atOptimzer/EdgeRep.java new file mode 100644 index 0000000000..0305fd5bea --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/EdgeRep.java @@ -0,0 +1,42 @@ +package x10.optimizations.atOptimzer; + +import java.util.*; + +public class EdgeRep { + + public String edgeType; + public String desName; + public String fieldName = ""; + public String edgeName = ""; + public boolean copyFlag = false; + + public EdgeRep(String edgeType, String desName) { + this.edgeType = edgeType; + this.desName = desName; + } + + public EdgeRep(String edgeType, String desName, boolean copyFlag) { + this.edgeType = edgeType; + this.desName = desName; + this.copyFlag = copyFlag; + } + + public EdgeRep(String edgeType, String desName, String fieldName) { + this.edgeType = edgeType; + this.desName = desName; + this.fieldName = fieldName; + } + + public EdgeRep(String edgeType, String desName, String fieldName, boolean copyFlag) { + this.edgeType = edgeType; + this.desName = desName; + this.fieldName = fieldName; + this.copyFlag = copyFlag; + } + + public EdgeRep() { + this.edgeType = ""; + this.desName = ""; + this.fieldName = ""; + } +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObject.java b/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObject.java new file mode 100644 index 0000000000..0bbbc2ad16 --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObject.java @@ -0,0 +1,23 @@ +package x10.optimizations.atOptimzer; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Stack; + +import x10.optimizations.atOptimzer.ForClosureObjectField; + +public class ForClosureObject { + public String varName = ""; + public boolean ambiguity = false; + public LinkedList fieldDetails = null; + + public ForClosureObject () { + } + + public ForClosureObject(String varName, boolean ambiguity) { + this.varName = varName; + this.ambiguity = ambiguity; + this.fieldDetails = new LinkedList(); + } + +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObjectField.java b/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObjectField.java new file mode 100644 index 0000000000..262aa8ace7 --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObjectField.java @@ -0,0 +1,32 @@ +package x10.optimizations.atOptimzer; + +import java.util.*; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Stack; + +public class ForClosureObjectField { + public String fieldName = ""; + public String tempStoredName = ""; + public String fieldType = ""; + public boolean ambiguity = false; + public String fieldObjName = ""; + + public ForClosureObjectField () { + + } + + public ForClosureObjectField(String fieldName, String tempStoredName, String fieldType) { + this.fieldName = fieldName; + this.tempStoredName = tempStoredName; + this.fieldType = fieldType; + } + + public ForClosureObjectField(String fieldName, String tempStoredName, String fieldType, boolean ambiguity, String fieldObjName) { + this.fieldName = fieldName; + this.tempStoredName = tempStoredName; + this.fieldType = fieldType; + this.ambiguity = ambiguity; + this.fieldObjName = fieldObjName; + } +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObjectcpp.java b/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObjectcpp.java new file mode 100644 index 0000000000..5f38dd8783 --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/ForClosureObjectcpp.java @@ -0,0 +1,17 @@ +package x10.optimizations.atOptimzer; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Stack; + +import x10.optimizations.atOptimzer.ForClosureObjectField; + +public class ForClosureObjectcpp { + public String fldName = ""; + public String zzName = ""; + public String type = ""; + + public ForClosureObjectcpp () { + } + +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/ObjNode.java b/x10.compiler/src/x10/optimizations/atOptimzer/ObjNode.java new file mode 100644 index 0000000000..f3497d5f9d --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/ObjNode.java @@ -0,0 +1,21 @@ +package x10.optimizations.atOptimzer; + +import java.util.*; + +public class ObjNode { + public String name; + public String objType; + public boolean copyFlag = false; + public int counter = 0; + + public ObjNode(String objName, String objType) { + this.name = objName; + this.objType = objType; + } + + public ObjNode(String objName, String objType, boolean copyFlag) { + this.name = objName; + this.objType = objType; + this.copyFlag = copyFlag; + } +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/PlaceNode.java b/x10.compiler/src/x10/optimizations/atOptimzer/PlaceNode.java new file mode 100644 index 0000000000..d7477eb39b --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/PlaceNode.java @@ -0,0 +1,40 @@ +package x10.optimizations.atOptimzer; + +public class PlaceNode +{ + public String toName; + public PlaceNode child; + public PlaceNode sibling; + + public PlaceNode(String placeName) { + this.toName = placeName; + this.child = null; + this.sibling = null; + } + + public PlaceNode() { + this.toName = null; + this.child = null; + this.sibling = null; + } + + public void addChild(PlaceNode plNode) { + PlaceNode temp = this; + + if(temp.child == null) { + temp.child = plNode; + } + else { + PlaceNode temp1 = temp.child; + + while(temp1.sibling != null) { + temp1 = temp1.sibling; + } + temp1.sibling = plNode; + + } + } + + public void addSibling() { + } +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/VarWithLineNo.java b/x10.compiler/src/x10/optimizations/atOptimzer/VarWithLineNo.java new file mode 100644 index 0000000000..9f71df85b3 --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/VarWithLineNo.java @@ -0,0 +1,14 @@ +package x10.optimizations.atOptimzer; + +import java.util.*; + +public class VarWithLineNo { + public String name; + public int lineNo; + + public VarWithLineNo(String varName, int lineNo) { + this.name = varName; + this.lineNo = lineNo; + } + +} diff --git a/x10.compiler/src/x10/optimizations/atOptimzer/processInfo.java b/x10.compiler/src/x10/optimizations/atOptimzer/processInfo.java new file mode 100644 index 0000000000..c6dcb2d260 --- /dev/null +++ b/x10.compiler/src/x10/optimizations/atOptimzer/processInfo.java @@ -0,0 +1,14 @@ +package x10.optimizations.atOptimzer; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Stack; + +import x10.optimizations.atOptimzer.processInfo; + +public class processInfo +{ + public Stack currClass = new Stack(); + public HashMap> classDetails = new HashMap>(); + +} diff --git a/x10.compiler/src/x10cpp/visit/Emitter.java b/x10.compiler/src/x10cpp/visit/Emitter.java index 445ff8b48c..6daf785847 100644 --- a/x10.compiler/src/x10cpp/visit/Emitter.java +++ b/x10.compiler/src/x10cpp/visit/Emitter.java @@ -34,6 +34,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -108,10 +109,24 @@ import x10cpp.debug.LineNumberMap; import x10cpp.types.X10CPPContext_c; +//Nobita code +import static x10cpp.visit.MessagePassingCodeGenerator.currClass; +import static x10cpp.visit.MessagePassingCodeGenerator.currMethod; +import static x10cpp.visit.MessagePassingCodeGenerator.iterationCount; +import static x10cpp.visit.MessagePassingCodeGenerator.classDetails; +import x10.optimizations.atOptimzer.VarWithLineNo; +import x10.optimizations.atOptimzer.ClassInfo; + + + public class Emitter { private final Translator tr; private ASTQuery query; + //nobita code + public static String fieldDec = ""; + public static boolean field = false; + public Emitter(Translator tr) { this.tr = tr; query = new ASTQuery(tr); @@ -240,7 +255,14 @@ void printType(Type type, CodeWriter w) { printType(type,w,null); } void printType(Type type, CodeWriter w, Context ctx) { + if (field) { + String str = translateType(type, true, true, ctx); + fieldDec = str; + w.write(str); + } + else { w.write(translateType(type, true, true, ctx)); + } } /** @@ -915,7 +937,21 @@ void printHeader(FieldDecl_c n, CodeWriter h, Translator tr, boolean qualify) { h.write("volatile "); } + //Nobita code + if (iterationCount == 0) { field = true; fieldDec = "";} printType(n.type().type(), h); + if (field) { + field = false; + VarWithLineNo temp1 = currClass.peek(); + + ClassInfo fieldDetails = new ClassInfo("field", n.type().nameString(), n.name().toString()); + fieldDetails.x10Type = fieldDec; + + LinkedList fi = classDetails.get(temp1.name); + fi.add(fieldDetails); + fieldDec = ""; + } + h.allowBreak(2, 2, " ", 1); if (qualify) { X10ClassType declClass = (X10ClassType)n.fieldDef().asInstance().container().toClass(); diff --git a/x10.compiler/src/x10cpp/visit/MessagePassingCodeGenerator.java b/x10.compiler/src/x10cpp/visit/MessagePassingCodeGenerator.java index 6cb0cae1b0..188e435a03 100644 --- a/x10.compiler/src/x10cpp/visit/MessagePassingCodeGenerator.java +++ b/x10.compiler/src/x10cpp/visit/MessagePassingCodeGenerator.java @@ -21,6 +21,7 @@ import static x10cpp.visit.Emitter.translateFQN; import static x10cpp.visit.Emitter.translate_mangled_FQN; import static x10cpp.visit.Emitter.voidTemplateInstantiation; +import static x10cpp.visit.MessagePassingCodeGenerator.classDetails; import static x10cpp.visit.SharedVarsMethods.CONSTRUCTOR; import static x10cpp.visit.SharedVarsMethods.DESERIALIZATION_BUFFER; import static x10cpp.visit.SharedVarsMethods.DESERIALIZE_METHOD; @@ -55,9 +56,11 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.Map; +import java.util.Stack; import polyglot.ast.Allocation_c; import polyglot.ast.AmbReceiver; @@ -243,6 +246,15 @@ import x10cpp.debug.LineNumberMap; import x10cpp.types.X10CPPContext_c; +/* Nobita's Addition */ +import x10.optimizations.atOptimzer.VarWithLineNo; +import x10.optimizations.atOptimzer.ClassInfo; +import x10.optimizations.atOptimzer.EdgeRep; +import x10.optimizations.atOptimzer.ObjNode; +import x10.optimizations.atOptimzer.ForClosureObjectcpp; + +/* Nobita's Addition */ + /** * Primary visitor for the C++ codegenerator. */ @@ -255,6 +267,48 @@ public class MessagePassingCodeGenerator extends X10DelegatingVisitor { protected ASTQuery query; protected Reporter reporter; + /* Nobita code */ + + //the required static fields + public static int lineNo = 0; + public static int zzCounter = 0; + //to store the last points-to graph + public static Stack>> lastGraphInfo = new Stack>>(); + + //the class details (fields and methods) + public static HashMap> classDetails = new HashMap>(); + + // to continue for next iteration + public static boolean nextIteration_cpp = false; + public static String firstClass = ""; + public static int iterationCount = -1; + + //stack data structure to help maintaining the class, methods and places + public static Stack currClass = new Stack(); + public static Stack currMethod = new Stack(); + public static Stack currPlace = new Stack(); + + //the graph data structure + public static HashMap>>>>> graphInfo = + new HashMap>>>>>(); + + //the set data structure + public static HashMap>>>>> setInfo = new + HashMap>>>>>(); + + //the object data structure + public static HashMap>>> objInfo = new + HashMap>>>(); + + //the condition + public static boolean theCond = false; + + //the code generator assistant + public static HashMap> theAssistant = new HashMap>(); + + + /* Nobita code */ + public MessagePassingCodeGenerator(StreamWrapper sw, Translator tr) { this.sw = sw; this.tr = tr; @@ -330,7 +384,75 @@ public void visit(LocalTypeDef_c n) { } public void visit(X10ClassDecl_c n) { + /* Nobita code */ + if(firstClass.equalsIgnoreCase("")) { + firstClass = n.name().toString(); + nextIteration_cpp = true; + } + else { + if(firstClass.equalsIgnoreCase(n.name().toString()) && currClass.size() == 0) { + lineNo = 0; zzCounter = 0;theAssistant = new HashMap>(); + + nextIteration_cpp = false; + iterationCount++; + + //System.out.println("Printing the iteration: " + iterationCount); + //System.out.println("-------------------------------end of one iteration-----------------------------"); + //System.out.println("-------------------------------end of one iteration-----------------------------"); + + } + } + + //System.out.println("Printing the class name: " + n.name().toString()); + + lineNo++; + + //updating the class stack with current class + VarWithLineNo temp = new VarWithLineNo(n.name().toString(), lineNo); + currClass.push(temp); + + //updating the class details + if (!classDetails.containsKey(n.name().toString())) { + classDetails.put(n.name().toString(), new LinkedList()); + } + + //the graph + if (!graphInfo.containsKey(lineNo)) { + graphInfo.put(lineNo, new HashMap>>>>()); + } + + //the object + if (!objInfo.containsKey(lineNo)) { + objInfo.put(lineNo, new HashMap>>()); + } + + //the set + if (!setInfo.containsKey(lineNo)) { + setInfo.put(lineNo, new HashMap>>>>()); + } + //>// + + /* Nobita code */ + processClass(n); + + /* Nobita code */ + //the printer + /* + if (iterationCount == 0) { + System.out.println("The class details: " + n.name().toString()); + LinkedList fi = classDetails.get(n.name().toString()); + + if (fi != null) { + for (ClassInfo ci:fi) { + System.out.println("The classifier:" + ci.classifier + " Name:" + ci.name + " Type:" + ci.type + " X10TYPE:" + ci.x10Type); + } + } + } + */ + + currClass.pop(); + /* Nobita code */ } /** @@ -1440,6 +1562,183 @@ public static String createMainStub(String container, X10CPPCompilerOptions opti public static final QName HEADER_ANNOTATION = QName.make("x10.compiler.Header"); public void visit(X10MethodDecl_c dec) { + /* Nobita code */ + + lineNo++; + //System.out.println("The name of the method: " + dec.name().toString() + ":" + lineNo); + if (currClass.size() > 0) { + + //the class details + VarWithLineNo temp = currClass.peek(); + + //the current method details + VarWithLineNo temp1 = new VarWithLineNo(dec.name().toString(), lineNo); + currMethod.push(temp1); + + //adding the method details to the class info + if (iterationCount == 0) { + ClassInfo fieldDetails = new ClassInfo("method", dec.returnType().toString(), dec.name().toString()); + fieldDetails.classNo = temp.lineNo; + fieldDetails.methodNo = lineNo; + LinkedList fi = classDetails.get(temp.name); + fi.add(fieldDetails); + } + + //adding the place details + VarWithLineNo temp2 = new VarWithLineNo(Integer.toString(lineNo), lineNo); + currPlace.push(temp2); + + //the sets initialization + HashMap>>>> setMethodInfo = setInfo.get(temp.lineNo); + + if (setMethodInfo != null && iterationCount < 4) { + setMethodInfo.put(lineNo, new HashMap>>>()); + + HashMap>>> placeInfo = setMethodInfo.get(lineNo); + + if(!placeInfo.containsKey(lineNo)) { + placeInfo.put(lineNo, new HashMap>>()); + } + + HashMap>> setDetails = placeInfo.get(lineNo); + + if (!setDetails.containsKey("RS")) { + setDetails.put("RS", new HashMap>()); + setDetails.put("CRS", new HashMap>()); + setDetails.put("WS", new HashMap>()); + setDetails.put("MWS", new HashMap>()); + setDetails.put("CWS", new HashMap>()); + setDetails.put("OS", new HashMap>()); + setDetails.put("OVS", new HashMap>()); + } + } + + //the objects + HashMap>> methodInfo2 = objInfo.get(temp.lineNo); + if (iterationCount < 4) { + + //the method part creation + methodInfo2.put(lineNo, new HashMap>()); + + //the place part creation + HashMap> placeInfo2 = methodInfo2.get(lineNo); + placeInfo2.put(lineNo, new HashMap()); + + //creating and inserting the this and null object + //creation + ObjNode nullObj = new ObjNode("Obj-null", "null"); + ObjNode thisObj = new ObjNode("obj-this", temp.name); + + //insertion + HashMap objDetails = placeInfo2.get(lineNo); + objDetails.put("Obj-null", nullObj); + objDetails.put("obj-this", thisObj); + + //the sets for the this object + HashMap>>>> setMethodInfo1 = setInfo.get(temp.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(lineNo); + if (placeInfoSet != null) { + HashMap>> setDetails = placeInfoSet.get(lineNo); + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + if (!readSet.containsKey("obj-this")) { + readSet.put("obj-this", new HashSet()); + //update modifier boolean + } + HashMap> cumReadSet = setDetails.get("CRS"); + if (!cumReadSet.containsKey("obj-this")) { + cumReadSet.put("obj-this", new HashSet()); + //update modifier boolean + } + HashMap> writeSet = setDetails.get("WS"); + if (!writeSet.containsKey("obj-this")) { + writeSet.put("obj-this", new HashSet()); + //update modifier boolean + } + HashMap> mWriteSet = setDetails.get("MWS"); + if (!mWriteSet.containsKey("obj-this")) { + mWriteSet.put("obj-this", new HashSet()); + //update modifier boolean + } + HashMap> cumWriteSet = setDetails.get("CWS"); + if (!cumWriteSet.containsKey("obj-this")) { + cumWriteSet.put("obj-this", new HashSet()); + //update modifier boolean + } + + HashMap> objectVarSet = setDetails.get("OVS"); + if (!objectVarSet.containsKey("global-ovs")) { + objectVarSet.put("global-ovs", new HashSet()); + //update modifier boolean + } + //you should update the OVS for the analysis of weak updates:TODO: Done + } + } + } + + } + + //the graph + HashMap>>>> methodInfo1 = graphInfo.get(temp.lineNo); + if (methodInfo1 != null) { + + //creating the object for method + methodInfo1.put(lineNo, new HashMap>>>()); + + //creating the object for the place + HashMap>>> placeInfo = methodInfo1.get(lineNo); + placeInfo.put(lineNo, new HashMap>>()); + + //creating the object for the line + HashMap>> lineInfo = placeInfo.get(lineNo); + lineInfo.put(lineNo, new HashMap>()); + + //creating points to graph for the this object + HashMap> varInfo = lineInfo.get(lineNo); + varInfo.put("this", new LinkedList()); + + LinkedList edgeIncl = varInfo.get("this"); + EdgeRep edgeInfo = new EdgeRep("P","obj-this"); + edgeIncl.addLast(edgeInfo); + + //the field edges of the this object + LinkedList ll = classDetails.get(temp.name); + if (ll != null) { + Iterator it = ll.iterator(); + + while (it.hasNext()) { + ClassInfo fd = (ClassInfo)it.next(); + if (fd.classifier.equalsIgnoreCase("field")) { + if((fd != null) && !((fd.type.equalsIgnoreCase("Long")) || (fd.type.equalsIgnoreCase("Float")) || (fd.type.equalsIgnoreCase("String")) || (fd.type.equalsIgnoreCase("FileReader")) || (fd.type.equalsIgnoreCase("Printer")) || (fd.type.equalsIgnoreCase("Random")) || (fd.type.equalsIgnoreCase("FileWriter")) || + (fd.type.equalsIgnoreCase("Double")) || (fd.type.equalsIgnoreCase("Char")) || (fd.type.equalsIgnoreCase("PlaceGroup")) || (fd.type.equalsIgnoreCase("File")) || (fd.type.equalsIgnoreCase("FailedDynamicCheckException")) || (fd.type.equalsIgnoreCase("FinishState")) || (fd.type.equalsIgnoreCase("LongRange")) || + (fd.type.equalsIgnoreCase("Boolean")) || (fd.type.equalsIgnoreCase("Rail")) || (fd.type.equalsIgnoreCase("Place")) || (fd.type.equalsIgnoreCase("Dist")) || (fd.type.equalsIgnoreCase("ArrayList")) || (fd.type.equalsIgnoreCase("Iterator")) || (fd.type.equalsIgnoreCase("Point")) || (fd.type.equalsIgnoreCase("Int")) || + (fd.type.equalsIgnoreCase("Array")) || (fd.type.equalsIgnoreCase("DistArray")) || (fd.type.equalsIgnoreCase("Region")) || (fd.type.equalsIgnoreCase("GlobalRef")))) { + + if(!(varInfo.containsKey("obj-this"))) { + varInfo.put("obj-this", new LinkedList()); + //update modifier boolean + } + + LinkedList edgeInclField = varInfo.get("obj-this"); + if (edgeInclField != null) { + EdgeRep edgeInfo1 = new EdgeRep("F","Obj-null",fd.name); + edgeInclField.addLast(edgeInfo1); + } + } + } + } + } + } + + //inserting into the last graph + HashMap>>> placeInfo = methodInfo1.get(lineNo); + HashMap>> lineInfo = placeInfo.get(lineNo); + HashMap> varInfo = lineInfo.get(lineNo); + lastGraphInfo.push(deepCopy(varInfo)); + } + /* Nobita code */ + X10CPPContext_c context = (X10CPPContext_c) tr.context(); TypeSystem xts = tr.typeSystem(); Flags flags = dec.flags().flags(); @@ -1571,6 +1870,56 @@ public void visit(X10MethodDecl_c dec) { context.genericFunctions.writeln("#endif // "+guard+"_"+Emitter.mangled_method_name(mi.name().toString())+"_"+mid); } context.closures = saved_closure_stream; + + + + /* Nobita code */ + //the pirnter + /* + if ((currClass.size() > 0) && (currMethod.size() > 0)) { + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + VarWithLineNo temp3 = currPlace.peek(); + HashMap>>>> setMethodInfo = setInfo.get(temp1.lineNo); + if (setMethodInfo != null) { + HashMap>>> placeInfo = setMethodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> setDetails = placeInfo.get(temp3.lineNo); + if (setDetails != null) { + + System.out.println("THE READ SET"); + HashMap> rs = setDetails.get("RS"); + if (rs != null) { + HashSet rsSet = rs.get("obj-this"); + if (rsSet != null) { + for (String str:rsSet) { + System.out.println(str); + } + } + } + + System.out.println("THE CUMULATIVE READ SET"); + HashMap> crs = setDetails.get("CRS"); + if (rs != null) { + HashSet crsSet = crs.get("obj-this"); + if(crsSet != null) { + for (String str:crsSet) { + System.out.println(str); + } + } + } + + System.out.println("---------------------------EN DOF ONE FUNCTION CALL-------------------------------------------------"); + } + } + } + } + */ + + + currMethod.pop(); + currPlace.pop(); + /* Nobita code */ } @@ -2114,6 +2463,377 @@ public void visit(Labeled_c label) { public void visit(Assign_c asgn) { + + /* Nobita code */ +if ((currClass.size() > 0) && (currMethod.size() > 0) && iterationCount>=4 && (asgn.right() instanceof X10Cast_c || asgn.right() instanceof X10Call_c)) { + + Expr expr = asgn.right(); + if (asgn.right() instanceof X10Cast_c) { + X10Cast_c ca = (X10Cast_c)asgn.right(); + expr = ca.expr(); + } + + if (expr instanceof X10Call_c) { + X10Call_c call = (X10Call_c)expr; + + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + + //getting the graph + HashMap> varInfo = lastGraphInfo.peek(); + + HashMap>> setDetails = null; + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(lineNo + 1); + } + } + + if(varInfo != null && setDetails != null && call.name().toString().equals("evalAt")) { + Iterator it = varInfo.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry> phase3 = (Map.Entry>)it.next(); + LinkedList edgeIncl = ((LinkedList)phase3.getValue()); + + if (edgeIncl != null && edgeIncl.size() == 1) { + String objName = edgeIncl.getFirst().desName; + LinkedList ll = classDetails.get(temp1.name); + + if (objName.equalsIgnoreCase("obj-this")) { + theAssistant.put("saved_this", new LinkedList()); + LinkedList llcl = theAssistant.get("saved_this"); + + HashMap> rs = setDetails.get("RS"); + HashMap> crs = setDetails.get("CRS"); + HashSet crsSet = crs.get(objName); + HashSet rsSet = rs.get(objName); + rsSet.addAll(crsSet); + if (rsSet != null) { + for (String str:rsSet) { + + if (ll != null) { + for(ClassInfo ci:ll) { + if(ci.classifier.equalsIgnoreCase("field") && ci.name.equalsIgnoreCase(str)) { + + sw.write(ci.x10Type); sw.write(" zztemp"+zzCounter+ " = "); + if (currPlace.size() > 1) { + sw.write("saved_this->FMGL("+str+");"); + } else { + sw.write("this->FMGL("+str+");"); + } + sw.newline(); + ForClosureObjectcpp cl1 = new ForClosureObjectcpp(); + cl1.fldName = str;cl1.zzName = "zztemp"+zzCounter;cl1.type=ci.x10Type; + llcl.addLast(cl1); + zzCounter++; + break; + } + } + } + + } + } + } + else { + //TODO + } + } + } + + } + } + } + + if ((currClass.size() > 0) && (currMethod.size() > 0) && asgn.leftType().toType().name().toString() != null) { + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + VarWithLineNo temp3 = currPlace.peek(); + + String varType = asgn.leftType().toType().name().toString(); + + if(!((varType.equalsIgnoreCase("Long")) || (varType.equalsIgnoreCase("Float")) || (varType.equalsIgnoreCase("String")) || (varType.equalsIgnoreCase("FileReader")) || (varType.equalsIgnoreCase("Printer")) || (varType.equalsIgnoreCase("Random")) || (varType.equalsIgnoreCase("FileWriter")) || + (varType.equalsIgnoreCase("Double")) || (varType.equalsIgnoreCase("Char")) || (varType.equalsIgnoreCase("PlaceGroup")) || (varType.equalsIgnoreCase("File")) || (varType.equalsIgnoreCase("FailedDynamicCheckException")) || (varType.equalsIgnoreCase("FinishState")) || (varType.equalsIgnoreCase("LongRange")) || + (varType.equalsIgnoreCase("Boolean")) || (varType.equalsIgnoreCase("Rail")) || (varType.equalsIgnoreCase("Place")) || (varType.equalsIgnoreCase("Dist")) || (varType.equalsIgnoreCase("ArrayList")) || (varType.equalsIgnoreCase("Iterator")) || (varType.equalsIgnoreCase("Point")) || (varType.equalsIgnoreCase("Int")) || + (varType.equalsIgnoreCase("Array")) || (varType.equalsIgnoreCase("DistArray")) || (varType.equalsIgnoreCase("Region")) || (varType.equalsIgnoreCase("GlobalRef")))) { + if(asgn.right() instanceof Field_c || asgn.left() instanceof Field_c) { + if (asgn.right() instanceof Field_c && asgn.left() instanceof Field_c) { + //will do it later:TODO + } + else if (asgn.right() instanceof Field_c) { + //TODO + } + else if (asgn.left() instanceof Field_c) { + HashMap>>>> methodInfo = graphInfo.get(temp1.lineNo); + if (methodInfo != null) { + HashMap>>> placeInfo = methodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> lineInfo = placeInfo.get(temp3.lineNo); + if (lineInfo != null) { + if (lastGraphInfo.size() > 0) { + lineInfo.put(lineNo, lastGraphInfo.peek()); //check for whether back needs to take for second pass also + //update modifier boolean + } + else { + lineInfo.put(lineNo, new HashMap>()); + //update modifier boolean + } + + HashMap> varInfo = lineInfo.get(lineNo); + + //the RHS is not field type; + String rhsName = ""; boolean isNull = false; + if (asgn.right() instanceof Local_c) { + Local_c tl = (Local_c)asgn.right(); + rhsName = tl.name().toString(); + } + else if (asgn.right() instanceof X10Special_c) { + rhsName = "this"; + } + + if(asgn.right() instanceof NullLit_c) { + isNull = true; + } + + LinkedList fielder = new LinkedList(); + Field_c tf = (Field_c)asgn.left(); + fielder.addFirst(tf.fieldInstance().name().toString()); + + while (true) { + + if (tf.target() instanceof Field_c) { + tf = (Field_c)tf.target(); + fielder.addFirst(tf.fieldInstance().name().toString()); + } + else if (tf.target() instanceof Local_c) { + Local_c tl = (Local_c)tf.target(); + fielder.addFirst(tl.name().toString()); + break; + } + else if (tf.target() instanceof X10Special_c) { + fielder.addFirst("this"); + break; + } + else { + break; + } + } + + String varName = fielder.removeFirst(); + + LinkedList dest = varInfo.get(varName); + LinkedList src = varInfo.get(rhsName); + + //to collect the OVS Set + Stack ovs = new Stack(); + if (dest != null) { + if(dest.size() > 1) { + ovs.add(rhsName); + } + + if (fielder.size() > 0) { + String fldName = fielder.removeFirst(); + + HashMap>> setDetails = null; + for (EdgeRep er:dest) { + //copying the RHS List + LinkedList fielderAsst = new LinkedList(); + for (String str:fielder) { + fielderAsst.addLast(str); + } + + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(lineNo); + } + } + + //calling the function + //assistlocalfldDec(er.desName, fldName, fielderAsst, src, ovs, varInfo, setDetails); + + } + } + } + } + } + } + } + } + } + else { + if(asgn.right() instanceof Field_c || asgn.left() instanceof Field_c) { + if (asgn.right() instanceof Field_c && asgn.left() instanceof Field_c) { + //will do it later:TODO + } + else if (asgn.right() instanceof Field_c) { + HashMap>>>> methodInfo = graphInfo.get(temp1.lineNo); + if (methodInfo != null) { + HashMap>>> placeInfo = methodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> lineInfo = placeInfo.get(temp3.lineNo); + if (lineInfo != null) { + if (lastGraphInfo.size() > 0) { + lineInfo.put(lineNo, lastGraphInfo.peek()); //check for whether back needs to take for second pass also + //update modifier boolean + } + else { + lineInfo.put(lineNo, new HashMap>()); + //update modifier boolean + } + + HashMap> varInfo = lineInfo.get(lineNo); + + LinkedList fielder = new LinkedList(); + Field_c tf = (Field_c)asgn.right(); + fielder.addFirst(tf.fieldInstance().name().toString()); + + while (true) { + + if (tf.target() instanceof Field_c) { + tf = (Field_c)tf.target(); + fielder.addFirst(tf.fieldInstance().name().toString()); + } + else if (tf.target() instanceof Local_c) { + Local_c tl = (Local_c)tf.target(); + fielder.addFirst(tl.name().toString()); + break; + } + else if (tf.target() instanceof X10Special_c) { + fielder.addFirst("this"); + break; + } + else { + break; + } + } + + String varName = fielder.removeFirst(); + + LinkedList dest = varInfo.get(varName); + + if (fielder.size() > 0) { + String fldName = fielder.removeFirst(); + HashMap>> setDetails = null; + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(temp3.lineNo); + } + } + + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + for (EdgeRep er:dest) { + HashSet rs = readSet.get(er.desName); + if (rs != null) { + rs.add(fldName); + } + //calling the function + //assistlocalfldDec(er.desName, fldName, fielderAsst, src, ovs, varInfo, setDetails); + + } + } + } + + //the back up after the changes in points to graph. NOTE:##! check to stop whether it can be done once alone + /*varInfo = lineInfo.get(lineNo); + if (varInfo != null) { + lastGraphInfo.push(deepCopy(varInfo)); + }*/ + } + } + } + } + else if (asgn.left() instanceof Field_c) { + HashMap>>>> methodInfo = graphInfo.get(temp1.lineNo); + if (methodInfo != null) { + HashMap>>> placeInfo = methodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> lineInfo = placeInfo.get(temp3.lineNo); + if (lineInfo != null) { + if (lastGraphInfo.size() > 0) { + lineInfo.put(lineNo, lastGraphInfo.peek()); //check for whether back needs to take for second pass also + //update modifier boolean + } + else { + lineInfo.put(lineNo, new HashMap>()); + //update modifier boolean + } + + HashMap> varInfo = lineInfo.get(lineNo); + + LinkedList fielder = new LinkedList(); + Field_c tf = (Field_c)asgn.left(); + fielder.addFirst(tf.fieldInstance().name().toString()); + + while (true) { + + if (tf.target() instanceof Field_c) { + tf = (Field_c)tf.target(); + fielder.addFirst(tf.fieldInstance().name().toString()); + } + else if (tf.target() instanceof Local_c) { + Local_c tl = (Local_c)tf.target(); + fielder.addFirst(tl.name().toString()); + break; + } + else if (tf.target() instanceof X10Special_c) { + fielder.addFirst("this"); + break; + } + else { + //System.out.println("The first value2:" + tf.target().toString()); + break; + } + } + + if (fielder.size() > 1) { + String varName = fielder.removeFirst(); //System.out.println("The first value1:" + varName); + + LinkedList dest = varInfo.get(varName); + + String fldName = fielder.removeFirst(); //System.out.println("The first value2:" + fldName); + HashMap>> setDetails = null; + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(temp3.lineNo); + } + } + + if (setDetails != null && dest != null) { + HashMap> readSet = setDetails.get("RS"); + for (EdgeRep er:dest) { + HashSet rs = readSet.get(er.desName); + if (rs != null) { + rs.add(fldName); + } + //calling the function + //assistlocalfldDec(er.desName, fldName, fielderAsst, src, ovs, varInfo, setDetails); + + } + } + + //the back up after the changes in points to graph. NOTE:##! check to stop whether it can be done once alone + /*varInfo = lineInfo.get(lineNo); + if (varInfo != null) { + lastGraphInfo.push(deepCopy(varInfo)); + }*/ + } + } + } + } + } + } + } + } + /* Nobita code */ + X10CPPContext_c context = (X10CPPContext_c) tr.context(); boolean unsigned_op = false; String opString = asgn.operator().toString(); @@ -2216,6 +2936,468 @@ public void visit(Formal_c n) { public void visit(LocalDecl_c dec) { + + /* Nobita code */ + lineNo++; + + if ((currClass.size() > 0) && (currMethod.size() > 0) && iterationCount>=4 && (dec.init() instanceof X10Cast_c || dec.init() instanceof X10Call_c)) { + + Expr expr = dec.init(); + if (dec.init() instanceof X10Cast_c) { + X10Cast_c ca = (X10Cast_c)dec.init(); + expr = ca.expr(); + } + + if (expr instanceof X10Call_c) { + X10Call_c call = (X10Call_c)expr; + + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + + //getting the graph + HashMap> varInfo = lastGraphInfo.peek(); + + HashMap>> setDetails = null; + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(lineNo + 1); + } + } + + if(varInfo != null && setDetails != null && call.name().toString().equals("evalAt")) { + Iterator it = varInfo.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry> phase3 = (Map.Entry>)it.next(); + LinkedList edgeIncl = ((LinkedList)phase3.getValue()); + + if (edgeIncl != null && edgeIncl.size() == 1) { + String objName = edgeIncl.getFirst().desName; + LinkedList ll = classDetails.get(temp1.name); + + if (objName.equalsIgnoreCase("obj-this")) { + theAssistant.put("saved_this", new LinkedList()); + LinkedList llcl = theAssistant.get("saved_this"); + + HashMap> rs = setDetails.get("RS"); + HashMap> crs = setDetails.get("CRS"); + HashSet crsSet = crs.get(objName); + HashSet rsSet = rs.get(objName); + rsSet.addAll(crsSet); + if (rsSet != null) { + for (String str:rsSet) { + + if (ll != null) { + for(ClassInfo ci:ll) { + if(ci.classifier.equalsIgnoreCase("field") && ci.name.equalsIgnoreCase(str)) { + + sw.write(ci.x10Type); sw.write(" zztemp"+zzCounter+ " = "); + if (currPlace.size() > 1) { + sw.write("saved_this->FMGL("+str+");"); + } else { + sw.write("this->FMGL("+str+");"); + } + sw.newline(); + ForClosureObjectcpp cl1 = new ForClosureObjectcpp(); + cl1.fldName = str;cl1.zzName = "zztemp"+zzCounter;cl1.type=ci.x10Type; + llcl.addLast(cl1); + zzCounter++; + break; + } + } + } + + } + } + } + else { + //TODO + } + } + } + + } + } + } + + //System.out.println("The name of local decl:" + dec.name().toString()); + //if (dec.init() instanceof Field_c) {Field_c tf = (Field_c)dec.init(); System.out.println("the name:---" + tf.target().toString()); } + + if ((currClass.size() > 0) && (currMethod.size() > 0) && (dec.type().nameString()) != null && dec.init() != null) { + + //getting the threes + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + VarWithLineNo temp3 = currPlace.peek(); + + String varType = dec.type().nameString(); + if((varType != null) && !((varType.equalsIgnoreCase("Long")) || (varType.equalsIgnoreCase("Float")) || (varType.equalsIgnoreCase("String")) || (varType.equalsIgnoreCase("FileReader")) || (varType.equalsIgnoreCase("Printer")) || (varType.equalsIgnoreCase("Random")) || (varType.equalsIgnoreCase("FileWriter")) || + (varType.equalsIgnoreCase("Double")) || (varType.equalsIgnoreCase("Char")) || (varType.equalsIgnoreCase("PlaceGroup")) || (varType.equalsIgnoreCase("File")) || (varType.equalsIgnoreCase("FailedDynamicCheckException")) || (varType.equalsIgnoreCase("FinishState")) || (varType.equalsIgnoreCase("LongRange")) || + (varType.equalsIgnoreCase("Boolean")) || (varType.equalsIgnoreCase("Rail")) || (varType.equalsIgnoreCase("Place")) || (varType.equalsIgnoreCase("Dist")) || (varType.equalsIgnoreCase("ArrayList")) || (varType.equalsIgnoreCase("Iterator")) || (varType.equalsIgnoreCase("Point")) || (varType.equalsIgnoreCase("Int")) || + (varType.equalsIgnoreCase("Array")) || (varType.equalsIgnoreCase("DistArray")) || (varType.equalsIgnoreCase("Region")) || (varType.equalsIgnoreCase("GlobalRef")))) { + HashMap>>>> methodInfo = graphInfo.get(temp1.lineNo); + if (methodInfo != null) { + HashMap>>> placeInfo = methodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> lineInfo = placeInfo.get(temp3.lineNo); + if (lineInfo != null) { + if (lastGraphInfo.size() > 0) { + lineInfo.put(lineNo, lastGraphInfo.peek()); //check for whether back needs to take for second pass also + //update modifier boolean + } + else { + lineInfo.put(lineNo, new HashMap>()); + //update modifier boolean + } + + HashMap> varInfo = lineInfo.get(lineNo); + if(!(varInfo.containsKey(dec.name().toString()))) { + varInfo.put(dec.name().toString(), new LinkedList()); + } + + if (dec.init() instanceof New_c) { + String objName = "obj"+lineNo; + + //the object creation + HashMap>> methodInfo2 = objInfo.get(temp1.lineNo); + if (methodInfo2 != null) { + HashMap> placeInfo2 = methodInfo2.get(temp2.lineNo); + if (placeInfo2 != null) { + HashMap objDetail2 = placeInfo2.get(temp3.lineNo); + if (objDetail2 != null) { + if (!objDetail2.containsKey(objName)) { + ObjNode temp = new ObjNode(objName, varType); + objDetail2.put(objName, temp); + //update modifier boolean + } + } + } + } + + //the graph updates + LinkedList edgeIncl = varInfo.get(dec.name().toString()); + if (edgeIncl != null) { + Iterator it = edgeIncl.iterator(); + boolean found = false; + while (it.hasNext()) { + EdgeRep er1 = (EdgeRep)it.next(); + + if(er1.desName.equalsIgnoreCase(objName)) { + found = true; + break; + } + } + if (!found) { + EdgeRep edgeInfo = new EdgeRep("P",objName); + edgeIncl.addLast(edgeInfo); + //update modifier boolean + } + } + + //the sets updates + HashMap>>>> setMethodInfo = setInfo.get(temp1.lineNo); + if (setMethodInfo != null) { + HashMap>>> placeInfo2 = setMethodInfo.get(temp2.lineNo); + if (placeInfo2 != null) { + HashMap>> setDetails = placeInfo2.get(temp3.lineNo); + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + if (readSet != null && !readSet.containsKey(objName)) { + readSet.put(objName, new HashSet()); + //update modifier boolean + } + HashMap> cumReadSet = setDetails.get("CRS"); + if (cumReadSet != null && !cumReadSet.containsKey(objName)) { + cumReadSet.put(objName, new HashSet()); + //update modifier boolean + } + HashMap> writeSet = setDetails.get("WS"); + if (writeSet != null && !writeSet.containsKey(objName)) { + writeSet.put(objName, new HashSet()); + //update modifier boolean + } + HashMap> mWriteSet = setDetails.get("MWS"); + if (mWriteSet != null && !mWriteSet.containsKey(objName)) { + mWriteSet.put(objName, new HashSet()); + //update modifier boolean + } + HashMap> cumWriteSet = setDetails.get("CWS"); + if (cumWriteSet != null && !cumWriteSet.containsKey(objName)) { + cumWriteSet.put(objName, new HashSet()); + //update modifier boolean + } + HashMap> objectSet = setDetails.get("OS"); + if (objectSet != null && !objectSet.containsKey(objName)) { + objectSet.put(objName, new HashSet()); + //update modifier boolean + } + } + } + } + + //inter-needs to be added + } + else if (dec.init() instanceof Field_c ) { + LinkedList fielder = new LinkedList(); + + Field_c tf = (Field_c)dec.init(); + + fielder.addFirst(tf.fieldInstance().name().toString()); + + while (true) { + + if (tf.target() instanceof Field_c) { + tf = (Field_c)tf.target(); + fielder.addFirst(tf.fieldInstance().name().toString()); + } + else if (tf.target() instanceof Local_c) { + Local_c tl = (Local_c)tf.target(); + fielder.addFirst(tl.name().toString()); + break; + } + else if (tf.target() instanceof X10Special_c) { + fielder.addFirst("this"); + break; + } + else { + break; + } + } + + String varName = fielder.removeFirst(); + + LinkedList dest = varInfo.get(dec.name().toString()); + LinkedList src = varInfo.get(varName); + + //to collect the OVS Set + Stack ovs = new Stack(); + + if (src != null && dest != null && fielder.size() > 0) { + + if(src.size() > 1) { + ovs.add(varName); + } + + if (fielder.size() > 0) { + String fldName = fielder.removeFirst(); + + HashMap>> setDetails = null; + for (EdgeRep er:src) { + //copying the RHS List + LinkedList fielderAsst = new LinkedList(); + for (String str:fielder) { + fielderAsst.addLast(str); + } + + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(temp3.lineNo); + } + } + + //calling the function + assistlocalfldDec(er.desName, fldName, fielderAsst, dest, ovs, varInfo, setDetails); + + } + } + + //add the OVS from the stack + /* HashMap> ovSet = setDetails.get("OVS"); + if (ovSet != null) { + HashSet ovs1 = ovSet.get("global-ovs"); + for (String str:ovs) { + ovs1.add(str); + } + } */ + + } + + + } + else if (dec.init() instanceof NullLit_c) { + if(!(varInfo.containsKey(dec.name().toString()))) { + varInfo.put(dec.name().toString(), new LinkedList()); + //update modifier boolean + } + + LinkedList edgeIncl = varInfo.get(dec.name().toString()); + + if (edgeIncl != null) { + Iterator it = edgeIncl.iterator(); + boolean found = false; + while (it.hasNext()) { + EdgeRep er = (EdgeRep)it.next(); + + if (er.desName.equalsIgnoreCase("Obj-null")) { + found = true; + break; + } + } + if (!found) { + EdgeRep edgeInfo = new EdgeRep("P","Obj-null"); + edgeIncl.addLast(edgeInfo); + //update modifier boolean + } + } + } + else if (dec.init() instanceof Local_c) { + Local_c tempLocal = (Local_c)dec.init(); + String rhsVar = tempLocal.name().toString(); + LinkedList src = varInfo.get(rhsVar); + LinkedList dest = varInfo.get(dec.name().toString()); + + if (src != null && dest != null) { + HashMap>>>> setMethodInfo = setInfo.get(temp1.lineNo); + if (setMethodInfo != null) { + HashMap>>> placeInfo2 = setMethodInfo.get(temp2.lineNo); + if (placeInfo2 != null) { + HashMap>> setDetails = placeInfo2.get(temp3.lineNo); + if (setDetails != null) { + HashMap> ovSet = setDetails.get("OVS"); + if (ovSet != null) { + HashSet set1 = ovSet.get("global-ovs"); + if (set1 != null) { + set1.add(rhsVar); + set1.add(dec.name().toString()); + } + } + } + } + } + + Iterator it = src.iterator(); + while (it.hasNext()) + { + EdgeRep er = (EdgeRep)it.next(); + + Iterator it1 = dest.iterator(); + boolean found = false; + while (it1.hasNext()) { + EdgeRep er1 = (EdgeRep)it1.next(); + if (er1.desName.equalsIgnoreCase(er.desName)) { + found = true; + break; + } + } + + if (!found) { + EdgeRep edgIncl = new EdgeRep("P",er.desName); + dest.addLast(edgIncl); + //update modifier boolean + } + } + } + } + + //the back up after the changes in points to graph. NOTE:##! check to stop whether it can be done once alone + /*varInfo = lineInfo.get(lineNo); + if (varInfo != null) { + lastGraphInfo.push(deepCopy(varInfo)); + }*/ + } + } + } + + } else { + //the remaining part + if(dec.init() instanceof Field_c) { + LinkedList fielder = new LinkedList(); + + Field_c tf = (Field_c)dec.init(); + fielder.addFirst(tf.fieldInstance().name().toString()); + + while (true) { + + if (tf.target() instanceof Field_c) { + tf = (Field_c)tf.target(); + fielder.addFirst(tf.fieldInstance().name().toString()); + } + else if (tf.target() instanceof Local_c) { + Local_c tl = (Local_c)tf.target(); + fielder.addFirst(tl.name().toString()); + break; + } + else if (tf.target() instanceof X10Special_c) { + fielder.addFirst("this"); + break; + } + else { + break; + } + } + + String varName = fielder.removeFirst(); + + + //the graph + //System.out.println("The value of temp3:" + temp3.lineNo); + HashMap>>>> methodInfo = graphInfo.get(temp1.lineNo); + if (methodInfo != null) { + HashMap>>> placeInfo = methodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> lineInfo = placeInfo.get(temp3.lineNo); + if (lineInfo != null) { + if (lastGraphInfo.size() > 0) { + lineInfo.put(lineNo, lastGraphInfo.peek()); //check for whether back needs to take for second pass also + //update modifier boolean + } + else { + lineInfo.put(lineNo, new HashMap>()); + //update modifier boolean + } + HashMap> varInfo = lineInfo.get(lineNo); + + //the sets + HashMap>> setDetails = null; + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(temp3.lineNo); + } + } + + LinkedList src = varInfo.get(varName); + + //to collect the OVS Set + Stack ovs = new Stack(); + + if (src != null) { + if(src.size() > 1) { + ovs.add(varName); + } + + if (fielder.size() > 0) { + String fldName = fielder.removeFirst(); + + for (EdgeRep er:src) { + //copying the RHS List + LinkedList fielderAsst = new LinkedList(); + for (String str:fielder) { + fielderAsst.addLast(str); + } + + //calling the function + assistlocalfldDec_1(er.desName, fldName, fielderAsst, ovs, varInfo, setDetails); + + } + } + } + } + } + } + } + } + + + } + + + /* Nobita code */ + X10CPPContext_c context = (X10CPPContext_c) tr.context(); TypeSystem xts = (TypeSystem)context.typeSystem(); @@ -2418,7 +3600,9 @@ public void visit(For_c n) { sw.allowBreak(0); if (n.cond() != null) { + theCond = true; n.printBlock(n.cond(), sw, tr); + theCond = false; } sw.write(";"); @@ -2505,7 +3689,9 @@ public void visit(Do_c n) { sw.allowBreak(0, " "); sw.write("while ("); sw.begin(0); + theCond = true; n.printBlock(n.cond(), sw, tr); + theCond = false; sw.end(); sw.write(");"); @@ -2527,7 +3713,9 @@ public void visit(While_c n) { sw.write("while ("); sw.begin(0); + theCond = true; n.printBlock(n.cond(), sw, tr); + theCond = false; sw.end(); sw.write(")"); sw.allowBreak(0, " "); @@ -2562,7 +3750,9 @@ public void visit(While_c n) { public void visit(If_c n) { sw.write("if ("); + theCond = true; n.printBlock(n.cond(), sw, tr); + theCond = false; sw.write(")"); sw.allowBreak(0, " "); n.print(n.consequent(), sw, tr); @@ -2609,6 +3799,193 @@ private static boolean needsNullCheck(Receiver e) { } public void visit(X10Call_c n) { + + /* Nobita code */ + //System.out.println("Start of call"); + lineNo++; + String funName = n.name().toString(); + + + //code generation phase + if ((currClass.size() > 0) && (currMethod.size() > 0) && iterationCount>=4 && (funName.equalsIgnoreCase("runAt") || funName.equalsIgnoreCase("runAsync"))) { + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + + //getting the graph + HashMap> varInfo = lastGraphInfo.peek(); + + HashMap>> setDetails = null; + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(lineNo); + } + } + + if(varInfo != null && setDetails != null) { + Iterator it = varInfo.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry> phase3 = (Map.Entry>)it.next(); + LinkedList edgeIncl = ((LinkedList)phase3.getValue()); + + if (edgeIncl != null && edgeIncl.size() == 1 && !currMethod.peek().name.equalsIgnoreCase("main")) { + String objName = edgeIncl.getFirst().desName; + LinkedList ll = classDetails.get(temp1.name); + + if (objName.equalsIgnoreCase("obj-this")) { + + theAssistant.put("saved_this", new LinkedList()); + LinkedList llcl = theAssistant.get("saved_this"); + + HashMap> rs = setDetails.get("RS"); + HashMap> crs = setDetails.get("CRS"); + HashSet crsSet = crs.get(objName); + HashSet rsSet = rs.get(objName); + rsSet.addAll(crsSet); + if (rsSet != null) { + for (String str:rsSet) { + + if (ll != null) { + for(ClassInfo ci:ll) { + if(ci.classifier.equalsIgnoreCase("field") && ci.name.equalsIgnoreCase(str)) { + + sw.write(ci.x10Type); sw.write(" zztemp"+zzCounter+ " = "); + if (currPlace.size() > 1) { + sw.write("saved_this->FMGL("+str+");"); + } else { + sw.write("this->FMGL("+str+");"); + } + sw.newline(); + ForClosureObjectcpp cl1 = new ForClosureObjectcpp(); + cl1.fldName = str;cl1.zzName = "zztemp"+zzCounter;cl1.type=ci.x10Type; + llcl.addLast(cl1); + zzCounter++; + break; + } + } + } + + } + } + } + else { + //TODO + } + } + } + + } + } + + + int parentPlace = 0; + if(funName.equalsIgnoreCase("runAt") || funName.equalsIgnoreCase("evalAt") || funName.equalsIgnoreCase("runAsync")) { + //the previous place number + parentPlace = currPlace.peek().lineNo; + VarWithLineNo temp4 = new VarWithLineNo(Integer.toString(lineNo), lineNo); + currPlace.push(temp4); + + if ((currClass.size() > 0) && (currMethod.size() > 0)) { + + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + VarWithLineNo temp3 = currPlace.peek(); + + //the sets + HashMap>>>> setMethodInfo = setInfo.get(temp1.lineNo); + if (setMethodInfo != null) { + HashMap>>> placeInfo = setMethodInfo.get(temp2.lineNo); + if (placeInfo != null) { + //copying the object alone from the parent place + HashMap>> setDetails1 = null; + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails1 = placeInfoSet.get(parentPlace); + } + } + + if (setDetails1 != null) { + if(!placeInfo.containsKey(lineNo)) { + placeInfo.put(lineNo, deepCopySet(setDetails1)); + } + } + } + } + + //the graphs + HashMap>>>> methodInfo = graphInfo.get(temp1.lineNo); + if (methodInfo != null) { + HashMap>>> placeInfo = methodInfo.get(temp2.lineNo); + if (placeInfo != null) { + placeInfo.put(temp3.lineNo, new HashMap>>()); + + HashMap>> lineInfo = placeInfo.get(temp3.lineNo); + + lineInfo.put(lineNo, lastGraphInfo.peek()); + } + } + + //the objects + //not required: TODO + } + } + + + //for the other functions + String op = "operator"; + boolean pass = true; + for (int i=0;i<8; i++) { + if(op.charAt(i) != funName.charAt(i)) { + pass = false; + break; + } + } + if((currClass.size() > 0) && (currMethod.size() > 0) && !(funName.equalsIgnoreCase("runAt") || funName.equalsIgnoreCase("evalAt") || funName.equalsIgnoreCase("runAsync") || pass || + funName.equalsIgnoreCase("equals") || funName.equalsIgnoreCase("Places"))) { + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + VarWithLineNo temp3 = currPlace.peek(); + + //to get method number of the copying + //System.out.println("The Name Mr Arun"+temp1.name); + LinkedList ll = classDetails.get(temp1.name); + int methodNum = 0; + if (ll != null) { + for(ClassInfo ci:ll) { + if(ci.classifier.equalsIgnoreCase("method") && ci.name.equalsIgnoreCase(funName)) { + methodNum = ci.methodNo; + break; + } + } + } + + HashMap> desRS = null; + HashMap>> setDetails = null; + HashMap>>>> setMethodInfo = setInfo.get(temp1.lineNo); + if (setMethodInfo != null) { + HashMap>>> placeInfo = setMethodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> setDetails1 = placeInfo.get(temp3.lineNo); + if(setDetails1 != null) { + desRS = setDetails1.get("RS"); + } + } + + HashMap>>> placeInfo1 = setMethodInfo.get(methodNum); + if (placeInfo1 != null) { + setDetails = placeInfo1.get(methodNum); + } + } + + if (desRS != null && setDetails != null) { + mergeForPlaces(setDetails,desRS); + } + } + /* Nobita code */ + X10CPPContext_c context = (X10CPPContext_c) tr.context(); TypeSystem xts = tr.typeSystem(); @@ -2807,6 +4184,35 @@ public void visit(X10Call_c n) { if (needsCast) { sw.write(")"); } + + + /* Nobita code */ + if(funName.equalsIgnoreCase("runAt") || funName.equalsIgnoreCase("evalAt") || funName.equalsIgnoreCase("runAsync")) { + if ((currClass.size() > 0) && (currMethod.size() > 0)) { + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + VarWithLineNo temp3 = currPlace.peek(); + + //the sets + HashMap>>>> setMethodInfo = setInfo.get(temp1.lineNo); + if (setMethodInfo != null) { + HashMap>>> placeInfo = setMethodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> setDetails1 = placeInfo.get(temp3.lineNo); + HashMap>> setDetails2 = placeInfo.get(parentPlace); + + if (setDetails1 != null && setDetails2 != null) { + //call the function + HashMap> desCRS = setDetails2.get("CRS"); + mergeForPlaces(setDetails1,desCRS); + } + } + } + } + currPlace.pop(); + } + /* Nobita code */ + //System.out.println("End of call"); } private void invokeInterface(Node_c n, Expr target, List args, String dispType, Type contType, @@ -2854,6 +4260,101 @@ private void printCallActuals(Node_c n, X10CPPContext_c context, TypeSystem xts, public void visit(Field_c n) { + /* Nobita code */ + if(true) { + if ((currClass.size() > 0) && (currMethod.size() > 0)) { + //getting the threes + VarWithLineNo temp1 = currClass.peek(); + VarWithLineNo temp2 = currMethod.peek(); + VarWithLineNo temp3 = currPlace.peek(); + String varType = n.type().name().toString(); + if((varType != null) && !((varType.equalsIgnoreCase("Long")) || (varType.equalsIgnoreCase("Float")) || (varType.equalsIgnoreCase("String")) || (varType.equalsIgnoreCase("FileReader")) || (varType.equalsIgnoreCase("Printer")) || (varType.equalsIgnoreCase("Random")) || (varType.equalsIgnoreCase("FileWriter")) || + (varType.equalsIgnoreCase("Double")) || (varType.equalsIgnoreCase("Char")) || (varType.equalsIgnoreCase("PlaceGroup")) || (varType.equalsIgnoreCase("File")) || (varType.equalsIgnoreCase("FailedDynamicCheckException")) || (varType.equalsIgnoreCase("FinishState")) || (varType.equalsIgnoreCase("LongRange")) || + (varType.equalsIgnoreCase("Boolean")) || (varType.equalsIgnoreCase("Rail")) || (varType.equalsIgnoreCase("Place")) || (varType.equalsIgnoreCase("Dist")) || (varType.equalsIgnoreCase("ArrayList")) || (varType.equalsIgnoreCase("Iterator")) || (varType.equalsIgnoreCase("Point")) || (varType.equalsIgnoreCase("Int")) || + (varType.equalsIgnoreCase("Array")) || (varType.equalsIgnoreCase("DistArray")) || (varType.equalsIgnoreCase("Region")) || (varType.equalsIgnoreCase("GlobalRef")))) { + //TODO + } + else { + HashMap>>>> methodInfo = graphInfo.get(temp1.lineNo); + if (methodInfo != null) { + HashMap>>> placeInfo = methodInfo.get(temp2.lineNo); + if (placeInfo != null) { + HashMap>> lineInfo = placeInfo.get(temp3.lineNo); + if (lineInfo != null) { + if (lastGraphInfo.size() > 0) { + lineInfo.put(lineNo, lastGraphInfo.peek()); //check for whether back needs to take for second pass also + //update modifier boolean + } + else { + lineInfo.put(lineNo, new HashMap>()); + //update modifier boolean + } + + HashMap> varInfo = lineInfo.get(lineNo); + + LinkedList fielder = new LinkedList(); + + Field_c tf = (Field_c)n; + + fielder.addFirst(tf.fieldInstance().name().toString()); + + while (true) { + + if (tf.target() instanceof Field_c) { + tf = (Field_c)tf.target(); + fielder.addFirst(tf.fieldInstance().name().toString()); + } + else if (tf.target() instanceof Local_c) { + Local_c tl = (Local_c)tf.target(); + fielder.addFirst(tl.name().toString()); + break; + } + else if (tf.target() instanceof X10Special_c) { + fielder.addFirst("this"); + break; + } + else { + break; + } + } + + if (fielder.size() > 1) { + String varName = fielder.removeFirst(); + + LinkedList dest = varInfo.get(varName); + String fldName = fielder.removeFirst(); + + HashMap>> setDetails = null; + HashMap>>>> setMethodInfo1 = setInfo.get(temp1.lineNo); + if (setMethodInfo1 != null) { + HashMap>>> placeInfoSet = setMethodInfo1.get(temp2.lineNo); + if (placeInfoSet != null) { + setDetails = placeInfoSet.get(temp3.lineNo); + } + } + + if (setDetails != null && dest != null) { + HashMap> readSet = setDetails.get("RS"); + for (EdgeRep er:dest) { + HashSet rs = readSet.get(er.desName); + if (rs != null) { + rs.add(fldName); + } + //calling the function + //assistlocalfldDec(er.desName, fldName, fielderAsst, src, ovs, varInfo, setDetails); + + } + } + + } + + } + } + } + } + } + } + /* Nobita code */ X10CPPContext_c context = (X10CPPContext_c) tr.context(); Receiver target = n.target(); Type t = target.type(); @@ -3422,6 +4923,8 @@ private void extractParameterTypes(Type t) { } public void visit(Closure_c n) { + + //System.out.println("Printing the closure name: "); X10CPPContext_c c = (X10CPPContext_c) tr.context(); emitter.enterClosure(c); @@ -3678,6 +5181,127 @@ public void visit(Closure_c n) { } sw.end(); sw.write(" { }"); sw.newline(); sw.forceNewline(); + + + + //nobite dec: stack of strings: also its start + Stack theRemains = new Stack(); + boolean passed = true; + + sw.write(cname+"("); + for (int i = 0; i < env.size(); i++) { + //nobita code IF True condition + if ((currClass.size() > 0) && (currMethod.size() > 0) && iterationCount>=4) { + if (i > 0) sw.write(", "); + VarInstance var = (VarInstance) env.get(i); + String name = var.name().toString(); + if (name.equals(THIS)) + name = SAVED_THIS; + else name = mangled_non_method_name(name); + if(theAssistant.containsKey(name)) { + LinkedList llcc = theAssistant.get(name); + if(llcc.size() > 0) { + passed = false; + int ii=0; + for(ForClosureObjectcpp cl:llcc) { + if (ii > 0) sw.write(", "); + sw.write(cl.type+ " "+cl.zzName); + ii++; + } + + } + else { + theRemains.push(name); + if (refs.contains(var)) { + sw.write(make_captured_lval(var.type()) + " " + name); + } else { + sw.write(Emitter.translateType(var.type(), true) + " " + name); + } + } + } + else { + theRemains.push(name); + if (refs.contains(var)) { + sw.write(make_captured_lval(var.type()) + " " + name); + } else { + sw.write(Emitter.translateType(var.type(), true) + " " + name); + } + } + } + else { + if (i > 0) sw.write(", "); + VarInstance var = (VarInstance) env.get(i); + String name = var.name().toString(); + if (name.equals(THIS)) + name = SAVED_THIS; + else name = mangled_non_method_name(name); + if (refs.contains(var)) { + sw.write(make_captured_lval(var.type()) + " " + name); + } else { + sw.write(Emitter.translateType(var.type(), true) + " " + name); + } + } + } + if(passed) { + if (env.size() > 0) { + sw.write(",x10_long zzztemp"); + } + else { + sw.write("x10_long zzztemp"); + } + } + sw.write(")"); + sw.begin(0); + // FIXME: factor out this loop + //boolean h1 = false; + if ((currClass.size() > 0) && (currMethod.size() > 0) && iterationCount>=4) { + sw.newline(); + sw.write("{ "); + sw.newline(); + + for (String str:theRemains) { + sw.write("this->"+str+" = "+str+";"); + sw.newline(); + } + + if(!passed) { + Iterator it = theAssistant.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry> phase3 = (Map.Entry>)it.next(); + String str = (String)phase3.getKey(); + LinkedList llcc = ((LinkedList)phase3.getValue()); + if (llcc.size() > 0) { + sw.write("this->"+str+" = "+"::"+currClass.peek().name+"::_make();"); + sw.newline(); + for(ForClosureObjectcpp cl:llcc) { + sw.write("this->"+str+"->FMGL("+cl.fldName+") = "+cl.zzName+";"); + sw.newline(); + } + } + } + } + + sw.write(" }"); + } + else { + for (int i = 0 ; i < env.size() ; i++) { + VarInstance var = (VarInstance) env.get(i); + String name = var.name().toString(); + if (name.equals(THIS)) + name = SAVED_THIS; + else name = mangled_non_method_name(name); + //if (name.equalsIgnoreCase("h1")) {h1 = true;} + //if (!h1) { + if (i > 0) sw.write(", "); else sw.write(" : "); + sw.write(name + "(" + name + ")"); + //} + } + sw.end(); + sw.write(" { }"); + } + + //may be the end of the nobita code + sw.newline(); sw.forceNewline(); sw.write("static const ::x10aux::serialization_id_t "+SERIALIZATION_ID_FIELD+";"); sw.newline(); sw.forceNewline(); @@ -3752,25 +5376,80 @@ public void visit(Closure_c n) { } sw.write(cname+templateArgs+"("); for (int i = 0; i < env.size(); i++) { - if (i > 0) sw.write(", "); - VarInstance var = (VarInstance) env.get(i); - String name = var.name().toString(); - if (name.equals(THIS)) { - // FIXME: Hack upon hack... - if (((X10CPPContext_c)c.pop()).isInsideClosure()) { - name = SAVED_THIS; - } else if (xts.isStruct(var.type())) { - name = STRUCT_THIS; + //Nobitas modified code only true condition + if ((currClass.size() > 0) && (currMethod.size() > 0) && iterationCount>=4) { + if (i > 0) sw.write(", "); + VarInstance var = (VarInstance) env.get(i); + String name = var.name().toString(); + String theName = ""; + if(name.equalsIgnoreCase("this")) { + theName = "saved_this"; } - } else { - name = mangled_non_method_name(name); - } - if (refs.contains(var)) { - sw.write("&("+name+")"); - } else { - sw.write(name); - } + else { + theName = name; + } + if (name.equals(THIS)) { + // FIXME: Hack upon hack... + if (((X10CPPContext_c)c.pop()).isInsideClosure()) { + name = SAVED_THIS; + } else if (xts.isStruct(var.type())) { + name = STRUCT_THIS; + } + } else { + name = mangled_non_method_name(name); + } + + + + if(theAssistant.containsKey(theName)) { + LinkedList llcc = theAssistant.get(theName); + if(llcc.size() > 0) { + int ii=0; + for(ForClosureObjectcpp cl:llcc) { + if (ii > 0) sw.write(", "); + sw.write(cl.zzName); + ii++; + } + } + else { + if (refs.contains(var)) { + sw.write("&("+name+")"); + } else { + sw.write(name); + } + } + } + else { + if (refs.contains(var)) { + sw.write("&("+name+")"); + } else { + sw.write(name); + } + } + } + else { + if (i > 0) sw.write(", "); + VarInstance var = (VarInstance) env.get(i); + String name = var.name().toString(); + if (name.equals(THIS)) { + // FIXME: Hack upon hack... + if (((X10CPPContext_c)c.pop()).isInsideClosure()) { + name = SAVED_THIS; + } else if (xts.isStruct(var.type())) { + name = STRUCT_THIS; + } + } else { + name = mangled_non_method_name(name); + } + if (refs.contains(var)) { + sw.write("&("+name+")"); + } else { + sw.write(name); + } + } } + //nobita code + theAssistant = new HashMap>(); sw.write(")"); if (!stackAllocateClosure) { sw.write("))"); @@ -3907,6 +5586,11 @@ private Closure_c getClosureLiteral(Expr target) { // (b) a function type // (c) an class (anonymous or not) that has an operator() public void visit(ClosureCall_c c) { + + /* Nobita code */ + + /* Nobita code */ + X10CPPContext_c context = (X10CPPContext_c) tr.context(); Expr target = c.target(); Type t = target.type(); @@ -4199,5 +5883,408 @@ void emitNativeAnnotation(String pat, List typeParams, List } emitter.nativeSubst("Native", components, tr, pat, sw); } + + /* Nobita new methods */ + //for the graph + public HashMap> deepCopy (HashMap> src) { + HashMap> copyGraphInfo = new HashMap>(); + if (src != null) { + //the copier + Iterator it = src.entrySet().iterator(); + + while (it.hasNext()) { + Map.Entry> phase3 = (Map.Entry>)it.next(); + LinkedList edgeIncl = ((LinkedList)phase3.getValue()); + + if(edgeIncl != null) { + Iterator it1 = edgeIncl.iterator(); + + //inserting into new DS + copyGraphInfo.put(phase3.getKey(), new LinkedList()); + LinkedList edgeCopy = copyGraphInfo.get(phase3.getKey()); + + while (it1.hasNext()) { + EdgeRep er = (EdgeRep)it1.next(); + EdgeRep edgeDest = new EdgeRep(er.edgeType, er.desName, er.fieldName, er.copyFlag); + edgeDest.edgeName = er.edgeName; + edgeCopy.addLast(edgeDest); + } + } + } + } + + return copyGraphInfo; + } + + + //for the local decleration - object fields + public void assistlocalfldDec(String desName, String fldName, LinkedList fielderAsst, LinkedList dest, Stack ovs, + HashMap> varInfo, HashMap>> setDetails) { + + int forOvs = 0; + String edgeName = ""; + if(fielderAsst.size() > 0) { + if (desName.equalsIgnoreCase("Obj-null")) { + boolean found = false; + for (EdgeRep er1: dest) { + if (er1.desName.equals("Obj-null")) { + found = true; + break; + } + } + if (!found) { + EdgeRep edgIncl = new EdgeRep("P","Obj-null"); + dest.addLast(edgIncl); + } + } + else { + LinkedList src = varInfo.get(desName); + + if (fielderAsst.size() > 0) { + fldName = fielderAsst.removeFirst(); + + if (src != null) { + for (EdgeRep er:src) { + //copying the RHS List + LinkedList fielderAsst1 = new LinkedList(); + for (String str:fielderAsst) { + fielderAsst1.addLast(str); + } + + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + if(readSet != null) { + HashSet rs = readSet.get(desName); + if (rs != null) { + //note sure whether contains works fine for HashSet + if (!rs.contains(fldName)) { + rs.add(fldName); + //update modifier boolean + } + } + } + } + + + //calling the function + assistlocalfldDec(er.desName, fldName, fielderAsst1, dest, ovs, varInfo, setDetails); + } + } + } + + //call the function + //assistlocalfldDec(er.desName, fldName, fielderAsst, dest, ovs, varInfo, setDetails); + } + } + else { + LinkedList src = varInfo.get(desName); + if (src != null) { + for (EdgeRep er:src) { + if (er.edgeType.equalsIgnoreCase("F") && (er.fieldName.equalsIgnoreCase(fldName))) { + boolean found = false; + for (EdgeRep er1: dest) { + if (er1.desName.equals(er.desName)) { + found = true; + forOvs++; + edgeName = er.edgeName; + break; + } + } + + if (!found) { + forOvs++; + edgeName = er.edgeName; + EdgeRep edgIncl = new EdgeRep("P",er.desName); + dest.addLast(edgIncl); + } + + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + HashMap> writeSet = setDetails.get("WS"); + if(readSet != null && writeSet != null) { + HashSet ws = writeSet.get(desName); + if ( ws != null && !(ws.contains(fldName))) { + HashSet rs = readSet.get(desName); + if (rs != null) { + //note sure whether contains works fine for HashSet + if (!rs.contains(fldName)) { + rs.add(fldName); + //update modifier boolean + } + } + } + } + } + } + } + + if (forOvs > 1) { + ovs.add(edgeName); + } + + } + else if (desName.equalsIgnoreCase("Obj-null")) { + boolean found = false; + for (EdgeRep er1: dest) { + if (er1.desName.equals("Obj-null")) { + found = true; + break; + } + } + if (!found) { + EdgeRep edgIncl = new EdgeRep("P","Obj-null"); + dest.addLast(edgIncl); + } + } + } + } + + + + //local decleration - non-object fields + public void assistlocalfldDec_1(String desName, String fldName, LinkedList fielderAsst, Stack ovs, + HashMap> varInfo, HashMap>> setDetails) { + + int forOvs = 0; + String edgeName = ""; + if(fielderAsst.size() > 0) { + + if (desName.equalsIgnoreCase("Obj-null")) { + + } + else { + LinkedList src = varInfo.get(desName); + + if (fielderAsst.size() > 0) { + fldName = fielderAsst.removeFirst(); + + if (src != null) { + for (EdgeRep er:src) { + //copying the RHS List + LinkedList fielderAsst1 = new LinkedList(); + for (String str:fielderAsst) { + fielderAsst1.addLast(str); + } + + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + if(readSet != null) { + HashSet rs = readSet.get(desName); + if (rs != null) { + //note sure whether contains works fine for HashSet + if (!rs.contains(fldName)) { + rs.add(fldName); + //update modifier boolean + } + } + } + } + + + //calling the function + assistlocalfldDec_1(er.desName, fldName, fielderAsst1, ovs, varInfo, setDetails); + } + } + } + + //call the function + //assistlocalfldDec(er.desName, fldName, fielderAsst, dest, ovs, varInfo, setDetails); + } + } + else { + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + if(readSet != null) { + HashSet rs = readSet.get(desName); + rs.add(fldName); + } + } + } + } + + //for the field assign assistance + public void assistfldAssig(String desName, String fldName, LinkedList fielderAsst, LinkedList dest, Stack ovs, + HashMap> varInfo, HashMap>> setDetails) { + + int forOvs = 0; + String edgeName = ""; + if(fielderAsst.size() > 0) { + if (desName.equalsIgnoreCase("Obj-null")) { + boolean found = false; + for (EdgeRep er1: dest) { + if (er1.desName.equals("Obj-null")) { + found = true; + break; + } + } + if (!found) { + EdgeRep edgIncl = new EdgeRep("P","Obj-null"); + dest.addLast(edgIncl); + } + } + else { + LinkedList src = varInfo.get(desName); + fldName = fielderAsst.removeFirst(); + + for (EdgeRep er:src) { + //copying the RHS List + LinkedList fielderAsst1 = new LinkedList(); + for (String str:fielderAsst) { + fielderAsst1.addLast(str); + } + + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + if(readSet != null) { + HashSet rs = readSet.get(desName); + if (rs != null) { + //note sure whether contains works fine for HashSet + if (!rs.contains(fldName)) { + rs.add(fldName); + //update modifier boolean + } + } + } + } + + + //calling the function + assistlocalfldDec(er.desName, fldName, fielderAsst1, dest, ovs, varInfo, setDetails); + } + + //call the function + //assistlocalfldDec(er.desName, fldName, fielderAsst, dest, ovs, varInfo, setDetails); + } + } + else { + LinkedList src = varInfo.get(desName); + if (src != null) { + for (EdgeRep er:src) { + if (er.edgeType.equalsIgnoreCase("F") && (er.fieldName.equalsIgnoreCase(fldName))) { + boolean found = false; + for (EdgeRep er1: dest) { + if (er1.desName.equals(er.desName)) { + found = true; + forOvs++; + edgeName = er.edgeName; + break; + } + } + + if (!found) { + forOvs++; + edgeName = er.edgeName; + EdgeRep edgIncl = new EdgeRep("P",er.desName); + dest.addLast(edgIncl); + } + + if (setDetails != null) { + HashMap> readSet = setDetails.get("RS"); + HashMap> writeSet = setDetails.get("WS"); + if(readSet != null && writeSet != null) { + HashSet ws = writeSet.get(desName); + if ( ws != null && !(ws.contains(fldName))) { + HashSet rs = readSet.get(desName); + if (rs != null) { + //note sure whether contains works fine for HashSet + if (!rs.contains(fldName)) { + rs.add(fldName); + //update modifier boolean + } + } + } + } + } + } + } + + if (forOvs > 1) { + ovs.add(edgeName); + } + + } + else if (desName.equalsIgnoreCase("Obj-null")) { + boolean found = false; + for (EdgeRep er1: dest) { + if (er1.desName.equals("Obj-null")) { + found = true; + break; + } + } + if (!found) { + EdgeRep edgIncl = new EdgeRep("P","Obj-null"); + dest.addLast(edgIncl); + } + } + } + } + + /* Nobita code - a method */ + public HashMap>> deepCopySet (HashMap>> src) { + HashMap>> setDetails = new HashMap>>(); + + if (src != null) { + //the iterator + Iterator it = src.entrySet().iterator(); + + while (it.hasNext()) { + Map.Entry>> phase2 = (Map.Entry>>) it.next(); + + //inserting sets into new [setDetails] + setDetails.put(phase2.getKey(), new HashMap>()); + HashMap> sets = (HashMap>)phase2.getValue(); + + if (sets != null) { + //the variable insertion-1 + HashMap> variable = setDetails.get(phase2.getKey()); + + Iterator it1 = sets.entrySet().iterator(); + while (it1.hasNext()) { + Map.Entry> phase3 = (Map.Entry>)it1.next(); + + //the variable insertion-2 + variable.put(phase3.getKey(), new HashSet()); + } + } + } + } + return setDetails; + } + + + public void mergeForPlaces (HashMap>> src, HashMap> desCRS) { + + if (src != null) { + //the iterator + Iterator it = src.entrySet().iterator(); + + while (it.hasNext()) { + Map.Entry>> phase2 = (Map.Entry>>) it.next(); + + if (phase2.getKey().equalsIgnoreCase("RS") || phase2.getKey().equalsIgnoreCase("CRS")) { + HashMap> sets = (HashMap>)phase2.getValue(); + + if (sets != null) { + Iterator it1 = sets.entrySet().iterator(); + while (it1.hasNext()) { + Map.Entry> phase3 = (Map.Entry>)it1.next(); + HashSet srcSet = (HashSet)phase3.getValue(); + HashSet desSet = desCRS.get(phase3.getKey()); + if (srcSet != null && desSet != null) { + for (String str:srcSet) { + desSet.add(str); + } + } + } + } + } + } + } + } } // end of MessagePassingCodeGenerator // vim:tabstop=4:shiftwidth=4:expandtab + + + + + diff --git a/x10.compiler/src/x10cpp/visit/X10CPPTranslator.java b/x10.compiler/src/x10cpp/visit/X10CPPTranslator.java index a61777910c..e09e51451e 100644 --- a/x10.compiler/src/x10cpp/visit/X10CPPTranslator.java +++ b/x10.compiler/src/x10cpp/visit/X10CPPTranslator.java @@ -98,8 +98,17 @@ import x10cpp.postcompiler.SharedLibProperties; import x10cpp.types.X10CPPContext_c; +/* Nobita code */ +import static x10cpp.visit.MessagePassingCodeGenerator.nextIteration_cpp; +/* Nobita code */ + public class X10CPPTranslator extends Translator { + /* Nobita code */ + public static int chance = 0; + public static String pathFile = ""; + /* Nobita code */ + public X10CPPTranslator(Job job, TypeSystem ts, NodeFactory nf, TargetFactory tf) { super(job, ts, nf, tf); } @@ -346,6 +355,15 @@ private static void maybeCopyTo (String file, String src_path_, String dest_path * @see polyglot.visit.Translator#translateSource(polyglot.ast.SourceFile) */ protected boolean translateSource(SourceFile sfn) { + + /*Nobita code */ + boolean first = false; + if (pathFile.equalsIgnoreCase("")) { + first = true; + pathFile = sfn.toString(); + } + /*Nobita code */ + int outputWidth = job.compiler().outputWidth(); @@ -463,6 +481,18 @@ protected boolean translateSource(SourceFile sfn) { fstreams.commitStreams(); } + + /* Nobita code */ + if (nextIteration_cpp && pathFile.equalsIgnoreCase(sfn.toString())) { + translateSource(sfn); + } + + if((chance <= 4) && pathFile.equalsIgnoreCase(sfn.toString())) { + chance++; + translateSource(sfn); + } + /* Nobita code */ + return true; } catch (IOException e) { @@ -559,7 +589,13 @@ public static boolean postCompile(X10CPPCompilerOptions options, Compiler compil compiler.outputWidth()); List mainMethods = new ArrayList(); for (Job job : ext.scheduler().commandLineJobs()) { - mainMethods.addAll(getMainMethods(job)); + List mainMethods_temp = new ArrayList(); + /* nobita's modified code */ + mainMethods_temp.addAll(getMainMethods(job)); + if (mainMethods_temp.size() > 0) { + mainMethods.add(mainMethods_temp.get(0)); + } + /* nobita's modified code */ } if (mainMethods.size() < 1) { // If there are no main() methods in the command-line jobs, try other files diff --git a/x10.dist/rushabh-testing/HelloWholeWorld.cc b/x10.dist/rushabh-testing/HelloWholeWorld.cc new file mode 100644 index 0000000000..2d7cad15eb --- /dev/null +++ b/x10.dist/rushabh-testing/HelloWholeWorld.cc @@ -0,0 +1,195 @@ +/*************************************************/ +/* START of HelloWholeWorld */ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef HELLOWHOLEWORLD__CLOSURE__7_CLOSURE +#define HELLOWHOLEWORLD__CLOSURE__7_CLOSURE +#include +#include +class HelloWholeWorld__closure__7 : public ::x10::lang::Closure { + public: + + static ::x10::lang::VoidFun_0_0::itable _itable; + static ::x10aux::itable_entry _itables[2]; + + virtual ::x10aux::itable_entry* _getITables() { return _itables; } + + void __apply(){ + ::x10::io::Console::FMGL(OUT__get)()->x10::io::Printer::println(reinterpret_cast< ::x10::lang::Any*>(::x10::lang::String::__plus(::x10::lang::String::__plus(::x10::lang::Place::_make(::x10aux::here), (&::HelloWholeWorld_Strings::sl__225)), ::x10aux::nullCheck(args)->x10::lang::Rail< ::x10::lang::String* >::__apply( + ((x10_long)0ll))))); + } + + // captured environment + ::x10::lang::Rail< ::x10::lang::String* >* args; + + ::x10aux::serialization_id_t _get_serialization_id() { + return _serialization_id; + } + + ::x10aux::serialization_id_t _get_network_id() { + return _network_id; + } + + void _serialize_body(::x10aux::serialization_buffer &buf) { + buf.write(this->args); + } + + static x10::lang::Reference* _deserialize(::x10aux::deserialization_buffer &buf) { + HelloWholeWorld__closure__7* storage = ::x10aux::alloc_z(); + buf.record_reference(storage); + ::x10::lang::Rail< ::x10::lang::String* >* that_args = buf.read< ::x10::lang::Rail< ::x10::lang::String* >*>(); + HelloWholeWorld__closure__7* this_ = new (storage) HelloWholeWorld__closure__7(that_args); + return this_; + } + + HelloWholeWorld__closure__7(::x10::lang::Rail< ::x10::lang::String* >* args) : args(args) { } + + HelloWholeWorld__closure__7(::x10::lang::Rail< ::x10::lang::String* >* args,x10_long zzztemp){ + this->args = args; + } + + static const ::x10aux::serialization_id_t _serialization_id; + + static const ::x10aux::serialization_id_t _network_id; + + static const ::x10aux::RuntimeType* getRTT() { return ::x10aux::getRTT< ::x10::lang::VoidFun_0_0>(); } + virtual const ::x10aux::RuntimeType *_type() const { return ::x10aux::getRTT< ::x10::lang::VoidFun_0_0>(); } + + const char* toNativeString() { + return "HelloWholeWorld.x10:38"; + } + + }; + + #endif // HELLOWHOLEWORLD__CLOSURE__7_CLOSURE + +//#line 31 "HelloWholeWorld.x10" +void HelloWholeWorld::main(::x10::lang::Rail< ::x10::lang::String* >* args) { + + //#line 32 "HelloWholeWorld.x10" + if ((((x10_long)(::x10aux::nullCheck(args)->FMGL(size))) < (((x10_long)1ll)))) + { + + //#line 33 "HelloWholeWorld.x10" + ::x10::io::Console::FMGL(OUT__get)()->x10::io::Printer::println( + reinterpret_cast< ::x10::lang::Any*>((&::HelloWholeWorld_Strings::sl__224))); + + //#line 34 "HelloWholeWorld.x10" + return; + } + { + + //#line 37 "HelloWholeWorld.x10" + ::x10::xrx::Runtime::ensureNotInAtomic(); + ::x10::xrx::FinishState* fs__187 = ::x10::xrx::Runtime::startFinish(); + try { + { + { + ::x10::lang::Iterator< ::x10::lang::Place>* p__181; + for (p__181 = ::x10::lang::Place::places()->iterator(); + ::x10::lang::Iterator< ::x10::lang::Place>::hasNext(::x10aux::nullCheck(p__181)); + ) { + ::x10::lang::Place p = ::x10::lang::Iterator< ::x10::lang::Place>::next(::x10aux::nullCheck(p__181)); + + //#line 38 "HelloWholeWorld.x10" + ::x10::xrx::Runtime::runAsync(p, reinterpret_cast< ::x10::lang::VoidFun_0_0*>((new (::x10aux::alloc< ::x10::lang::VoidFun_0_0>(sizeof(HelloWholeWorld__closure__7)))HelloWholeWorld__closure__7(args))), + ::x10aux::class_cast_unchecked< ::x10::xrx::Runtime__Profile*>(reinterpret_cast< ::x10::lang::NullType*>(X10_NULL))); + } + } + + } + } + catch (::x10::lang::CheckedThrowable* __exc25) { + { + ::x10::lang::CheckedThrowable* ct__185 = __exc25; + { + ::x10::xrx::Runtime::pushException(ct__185); + } + } + } + ::x10::xrx::Runtime::stopFinish(fs__187); + } + + //#line 40 "HelloWholeWorld.x10" + ::x10::io::Console::FMGL(OUT__get)()->x10::io::Printer::println( + reinterpret_cast< ::x10::lang::Any*>((&::HelloWholeWorld_Strings::sl__226))); +} + +//#line 30 "HelloWholeWorld.x10" +::HelloWholeWorld* HelloWholeWorld::HelloWholeWorld____this__HelloWholeWorld( + ) { + return this; + +} +void HelloWholeWorld::_constructor() { + this->HelloWholeWorld::__fieldInitializers_HelloWholeWorld(); +} +::HelloWholeWorld* HelloWholeWorld::_make() { + ::HelloWholeWorld* this_ = new (::x10aux::alloc_z< ::HelloWholeWorld>()) ::HelloWholeWorld(); + this_->_constructor(); + return this_; +} + + +void HelloWholeWorld::__fieldInitializers_HelloWholeWorld( + ) { + +} +const ::x10aux::serialization_id_t HelloWholeWorld::_serialization_id = + ::x10aux::DeserializationDispatcher::addDeserializer(::HelloWholeWorld::_deserializer); + +void HelloWholeWorld::_serialize_body(::x10aux::serialization_buffer& buf) { + +} + +::x10::lang::Reference* ::HelloWholeWorld::_deserializer(::x10aux::deserialization_buffer& buf) { + ::HelloWholeWorld* this_ = new (::x10aux::alloc_z< ::HelloWholeWorld>()) ::HelloWholeWorld(); + buf.record_reference(this_); + this_->_deserialize_body(buf); + return this_; +} + +void HelloWholeWorld::_deserialize_body(::x10aux::deserialization_buffer& buf) { + +} + +::x10aux::RuntimeType HelloWholeWorld::rtt; +void HelloWholeWorld::_initRTT() { + if (rtt.initStageOne(&rtt)) return; + const ::x10aux::RuntimeType** parents = NULL; + rtt.initStageTwo("HelloWholeWorld",::x10aux::RuntimeType::class_kind, 0, parents, 0, NULL, NULL); +} + +::x10::lang::String HelloWholeWorld_Strings::sl__225(" says hello and "); +::x10::lang::String HelloWholeWorld_Strings::sl__224("Usage: HelloWholeWorld message"); +::x10::lang::String HelloWholeWorld_Strings::sl__226("Goodbye"); + +::x10::lang::VoidFun_0_0::itableHelloWholeWorld__closure__7::_itable(&::x10::lang::Reference::equals, &::x10::lang::Closure::hashCode, &HelloWholeWorld__closure__7::__apply, &HelloWholeWorld__closure__7::toString, &::x10::lang::Closure::typeName); +::x10aux::itable_entry HelloWholeWorld__closure__7::_itables[2] = {::x10aux::itable_entry(&::x10aux::getRTT< ::x10::lang::VoidFun_0_0>, &HelloWholeWorld__closure__7::_itable),::x10aux::itable_entry(NULL, NULL)}; + +const ::x10aux::serialization_id_t HelloWholeWorld__closure__7::_serialization_id = + ::x10aux::DeserializationDispatcher::addDeserializer(HelloWholeWorld__closure__7::_deserialize); +const ::x10aux::serialization_id_t HelloWholeWorld__closure__7::_network_id = + ::x10aux::NetworkDispatcher::addNetworkDeserializer(HelloWholeWorld__closure__7::_deserialize,::x10aux::CLOSURE_KIND_ASYNC_CLOSURE); + +/* END of HelloWholeWorld */ +/*************************************************/ diff --git a/x10.dist/rushabh-testing/HelloWholeWorld.h b/x10.dist/rushabh-testing/HelloWholeWorld.h new file mode 100644 index 0000000000..8f5de0888f --- /dev/null +++ b/x10.dist/rushabh-testing/HelloWholeWorld.h @@ -0,0 +1,99 @@ +#ifndef __HELLOWHOLEWORLD_H +#define __HELLOWHOLEWORLD_H + +#include + + +namespace x10 { namespace lang { +template class Rail; +} } +namespace x10 { namespace lang { +class String; +} } +namespace x10 { namespace io { +class Printer; +} } +namespace x10 { namespace io { +class Console; +} } +namespace x10 { namespace lang { +class Any; +} } +namespace x10 { namespace xrx { +class Runtime; +} } +namespace x10 { namespace xrx { +class FinishState; +} } +namespace x10 { namespace lang { +template class Iterator; +} } +namespace x10 { namespace lang { +class Place; +} } +namespace x10 { namespace lang { +template class Iterable; +} } +namespace x10 { namespace lang { +class PlaceGroup; +} } +namespace x10 { namespace lang { +class VoidFun_0_0; +} } +namespace x10 { namespace compiler { +class AsyncClosure; +} } +namespace x10 { namespace xrx { +class Runtime__Profile; +} } +namespace x10 { namespace lang { +class CheckedThrowable; +} } +namespace x10 { namespace compiler { +class Synthetic; +} } + +class HelloWholeWorld_Strings { + public: + static ::x10::lang::String sl__225; + static ::x10::lang::String sl__224; + static ::x10::lang::String sl__226; +}; + +class HelloWholeWorld : public ::x10::lang::X10Class { + public: + RTT_H_DECLS_CLASS + + static void main(::x10::lang::Rail< ::x10::lang::String* >* args); + virtual ::HelloWholeWorld* HelloWholeWorld____this__HelloWholeWorld(); + void _constructor(); + + static ::HelloWholeWorld* _make(); + + virtual void __fieldInitializers_HelloWholeWorld(); + + // Serialization + public: static const ::x10aux::serialization_id_t _serialization_id; + + public: virtual ::x10aux::serialization_id_t _get_serialization_id() { + return _serialization_id; + } + + public: virtual void _serialize_body(::x10aux::serialization_buffer& buf); + + public: static ::x10::lang::Reference* _deserializer(::x10aux::deserialization_buffer& buf); + + public: void _deserialize_body(::x10aux::deserialization_buffer& buf); + +}; + +#endif // HELLOWHOLEWORLD_H + +class HelloWholeWorld; + +#ifndef HELLOWHOLEWORLD_H_NODEPS +#define HELLOWHOLEWORLD_H_NODEPS +#ifndef HELLOWHOLEWORLD_H_GENERICS +#define HELLOWHOLEWORLD_H_GENERICS +#endif // HELLOWHOLEWORLD_H_GENERICS +#endif // __HELLOWHOLEWORLD_H_NODEPS diff --git a/x10.dist/rushabh-testing/HelloWholeWorld.x10 b/x10.dist/rushabh-testing/HelloWholeWorld.x10 new file mode 100644 index 0000000000..54beb2a324 --- /dev/null +++ b/x10.dist/rushabh-testing/HelloWholeWorld.x10 @@ -0,0 +1,44 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2016. + */ + +import x10.io.Console; + +/** + * The classic hello world program, with a twist - prints a message + * from the command line at every Place. + * The messages from each Place may appear in any order, but the + * finish ensures that the last message printed will be "Goodbye" + *
+ * Typical output:
+ * [dgrove@linchen samples]$ ./HelloWholeWorld 'best wishes'
+ * Place(1) says hello and best wishes
+ * Place(2) says hello and best wishes
+ * Place(3) says hello and best wishes
+ * Place(0) says hello and best wishes
+ * Goodbye 
+ * [dgrove@linchen samples]$
+ * 
+ */ +public class HelloWholeWorld { + public static def main(args:Rail[String]):void { + if (args.size < 1) { + Console.OUT.println("Usage: HelloWholeWorld message"); + return; + } + + finish for (p in Place.places()) { + at (p) async Console.OUT.println(here+" says hello and "+args(0)); + } + Console.OUT.println("Goodbye"); + } +} + + diff --git a/x10.dist/rushabh-testing/HelloWorld.cc b/x10.dist/rushabh-testing/HelloWorld.cc new file mode 100644 index 0000000000..b2f1a6b964 --- /dev/null +++ b/x10.dist/rushabh-testing/HelloWorld.cc @@ -0,0 +1,66 @@ +/*************************************************/ +/* START of HelloWorld */ +#include + +#include +#include +#include +#include +#include +#include +#include + +//#line 18 "HelloWorld.x10" +void HelloWorld::main(::x10::lang::Rail< ::x10::lang::String* >* id__0) { + + //#line 19 "HelloWorld.x10" + ::x10::io::Console::FMGL(OUT__get)()->x10::io::Printer::println(reinterpret_cast< ::x10::lang::Any*>((&::HelloWorld_Strings::sl__17))); +} + +//#line 17 "HelloWorld.x10" +::HelloWorld* HelloWorld::HelloWorld____this__HelloWorld() { + return this; + +} +void HelloWorld::_constructor() { + this->HelloWorld::__fieldInitializers_HelloWorld(); +} +::HelloWorld* HelloWorld::_make() { + ::HelloWorld* this_ = new (::x10aux::alloc_z< ::HelloWorld>()) ::HelloWorld(); + this_->_constructor(); + return this_; +} + + +void HelloWorld::__fieldInitializers_HelloWorld() { + +} +const ::x10aux::serialization_id_t HelloWorld::_serialization_id = + ::x10aux::DeserializationDispatcher::addDeserializer(::HelloWorld::_deserializer); + +void HelloWorld::_serialize_body(::x10aux::serialization_buffer& buf) { + +} + +::x10::lang::Reference* ::HelloWorld::_deserializer(::x10aux::deserialization_buffer& buf) { + ::HelloWorld* this_ = new (::x10aux::alloc_z< ::HelloWorld>()) ::HelloWorld(); + buf.record_reference(this_); + this_->_deserialize_body(buf); + return this_; +} + +void HelloWorld::_deserialize_body(::x10aux::deserialization_buffer& buf) { + +} + +::x10aux::RuntimeType HelloWorld::rtt; +void HelloWorld::_initRTT() { + if (rtt.initStageOne(&rtt)) return; + const ::x10aux::RuntimeType** parents = NULL; + rtt.initStageTwo("HelloWorld",::x10aux::RuntimeType::class_kind, 0, parents, 0, NULL, NULL); +} + +::x10::lang::String HelloWorld_Strings::sl__17("Hello World!"); + +/* END of HelloWorld */ +/*************************************************/ diff --git a/x10.dist/rushabh-testing/HelloWorld.h b/x10.dist/rushabh-testing/HelloWorld.h new file mode 100644 index 0000000000..af0ea62a38 --- /dev/null +++ b/x10.dist/rushabh-testing/HelloWorld.h @@ -0,0 +1,67 @@ +#ifndef __HELLOWORLD_H +#define __HELLOWORLD_H + +#include + + +namespace x10 { namespace lang { +template class Rail; +} } +namespace x10 { namespace lang { +class String; +} } +namespace x10 { namespace io { +class Printer; +} } +namespace x10 { namespace io { +class Console; +} } +namespace x10 { namespace lang { +class Any; +} } +namespace x10 { namespace compiler { +class Synthetic; +} } + +class HelloWorld_Strings { + public: + static ::x10::lang::String sl__17; +}; + +class HelloWorld : public ::x10::lang::X10Class { + public: + RTT_H_DECLS_CLASS + + static void main(::x10::lang::Rail< ::x10::lang::String* >* id__0); + virtual ::HelloWorld* HelloWorld____this__HelloWorld(); + void _constructor(); + + static ::HelloWorld* _make(); + + virtual void __fieldInitializers_HelloWorld(); + + // Serialization + public: static const ::x10aux::serialization_id_t _serialization_id; + + public: virtual ::x10aux::serialization_id_t _get_serialization_id() { + return _serialization_id; + } + + public: virtual void _serialize_body(::x10aux::serialization_buffer& buf); + + public: static ::x10::lang::Reference* _deserializer(::x10aux::deserialization_buffer& buf); + + public: void _deserialize_body(::x10aux::deserialization_buffer& buf); + +}; + +#endif // HELLOWORLD_H + +class HelloWorld; + +#ifndef HELLOWORLD_H_NODEPS +#define HELLOWORLD_H_NODEPS +#ifndef HELLOWORLD_H_GENERICS +#define HELLOWORLD_H_GENERICS +#endif // HELLOWORLD_H_GENERICS +#endif // __HELLOWORLD_H_NODEPS diff --git a/x10.dist/rushabh-testing/HelloWorld.x10 b/x10.dist/rushabh-testing/HelloWorld.x10 new file mode 100644 index 0000000000..2efd4d9ac2 --- /dev/null +++ b/x10.dist/rushabh-testing/HelloWorld.x10 @@ -0,0 +1,23 @@ +/* + * This file is part of the X10 project (http://x10-lang.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.opensource.org/licenses/eclipse-1.0.php + * + * (C) Copyright IBM Corporation 2006-2016. + */ + +import x10.io.Console; + +/** + * The classic hello world program, shows how to output to the console. + */ +public class HelloWorld { + public static def main(Rail[String]) { + Console.OUT.println("Hello World!" ); + } +} + + diff --git a/x10.dist/rushabh-testing/a.out b/x10.dist/rushabh-testing/a.out new file mode 100755 index 0000000000000000000000000000000000000000..8f6b5768ea51da9eb59e457cec17a66eb7e8ca7b GIT binary patch literal 99360 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 +#include +extern "C" { int main(int ac, char **av) { return ::x10aux::template_main< ::HelloWholeWorld>(ac,av); } }