2 import IR.Tree.Modifiers;
3 import IR.Tree.FlagExpressionNode;
4 import IR.Tree.DNFFlag;
5 import IR.Tree.DNFFlagAtom;
6 import IR.Tree.TagExpressionList;
7 import IR.Tree.OffsetNode;
14 import Analysis.TaskStateAnalysis.FlagState;
15 import Analysis.TaskStateAnalysis.FlagComparator;
16 import Analysis.TaskStateAnalysis.OptionalTaskDescriptor;
17 import Analysis.TaskStateAnalysis.Predicate;
18 import Analysis.TaskStateAnalysis.SafetyAnalysis;
19 import Analysis.TaskStateAnalysis.TaskIndex;
20 import Analysis.Locality.LocalityAnalysis;
21 import Analysis.Locality.LocalityBinding;
22 import Analysis.Locality.DiscoverConflicts;
23 import Analysis.Locality.DCWrapper;
24 import Analysis.Locality.DelayComputation;
25 import Analysis.Locality.BranchAnalysis;
26 import Analysis.CallGraph.CallGraph;
27 import Analysis.Prefetch.*;
28 import Analysis.Loops.WriteBarrier;
29 import Analysis.Loops.GlobalFieldType;
30 import Analysis.Locality.TypeAnalysis;
31 import Util.CodePrinter;
33 public class BuildCode {
36 Hashtable paramstable;
41 String localsprefix="___locals___";
42 String localsprefixaddr="&"+localsprefix;
43 String localsprefixderef=localsprefix+".";
44 String fcrevert="___fcrevert___";
45 String paramsprefix="___params___";
46 String oidstr="___nextobject___";
47 String nextobjstr="___nextobject___";
48 String localcopystr="___localcopy___";
49 public static boolean GENERATEPRECISEGC=false;
50 public static String PREFIX="";
51 public static String arraytype="ArrayObject";
52 public static int flagcount = 0;
55 protected int maxtaskparams=0;
56 private int maxcount=0;
57 ClassDescriptor[] cdarray;
58 TypeDescriptor[] arraytable;
59 LocalityAnalysis locality;
60 Hashtable<LocalityBinding, TempDescriptor> reverttable;
61 Hashtable<LocalityBinding, Hashtable<TempDescriptor, TempDescriptor>> backuptable;
66 DiscoverConflicts recorddc;
69 Hashtable<String, Integer> printedfieldstbl;
72 public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, SafetyAnalysis sa, PrefetchAnalysis pa) {
73 this(st, temptovar, typeutil, null, sa, pa);
76 public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality, PrefetchAnalysis pa) {
77 this(st, temptovar, typeutil, locality, null, pa);
80 public BuildCode(State st, Hashtable temptovar, TypeUtil typeutil, LocalityAnalysis locality, SafetyAnalysis sa, PrefetchAnalysis pa) {
84 callgraph=new CallGraph(state);
86 oidstr="___objlocation___";
87 this.temptovar=temptovar;
88 paramstable=new Hashtable();
89 tempstable=new Hashtable();
90 fieldorder=new Hashtable();
91 flagorder=new Hashtable();
92 this.typeutil=typeutil;
93 virtualcalls=new Virtual(state,locality);
95 this.locality=locality;
96 this.reverttable=new Hashtable<LocalityBinding, TempDescriptor>();
97 this.backuptable=new Hashtable<LocalityBinding, Hashtable<TempDescriptor, TempDescriptor>>();
98 this.wb=new WriteBarrier(locality, st);
100 if (state.SINGLETM&&state.DCOPTS) {
101 TypeAnalysis typeanalysis=new TypeAnalysis(locality, st, typeutil,callgraph);
102 GlobalFieldType gft=new GlobalFieldType(callgraph, st, typeutil.getMain());
103 this.dc=new DiscoverConflicts(locality, st, typeanalysis, gft);
106 if (state.DELAYCOMP) {
107 TypeAnalysis typeanalysis=new TypeAnalysis(locality, st, typeutil,callgraph);
108 GlobalFieldType gft=new GlobalFieldType(callgraph, st, typeutil.getMain());
109 delaycomp=new DCWrapper(locality, st, typeanalysis, gft);
110 dc=delaycomp.getConflicts();
111 recorddc=new DiscoverConflicts(locality, st, typeanalysis, delaycomp.getCannotDelayMap(), true, true, null);
112 recorddc.doAnalysis();
114 printedfieldstbl = new Hashtable<String, Integer>();
117 /** The buildCode method outputs C code for all the methods. The Flat
118 * versions of the methods must already be generated and stored in
119 * the State object. */
120 PrintWriter outsandbox=null;
122 public void buildCode() {
123 /* Create output streams to write to */
124 PrintWriter outclassdefs=null;
125 PrintWriter outstructs=null;
126 PrintWriter outrepairstructs=null;
127 PrintWriter outmethodheader=null;
128 PrintWriter outmethod=null;
129 PrintWriter outvirtual=null;
130 PrintWriter outtask=null;
131 PrintWriter outtaskdefs=null;
132 PrintWriter outoptionalarrays=null;
133 PrintWriter optionalheaders=null;
134 PrintWriter outglobaldefs=null;
138 outsandbox=new CodePrinter(new FileOutputStream(PREFIX+"sandboxdefs.c"), true);
140 outstructs=new CodePrinter(new FileOutputStream(PREFIX+"structdefs.h"), true);
141 outmethodheader=new CodePrinter(new FileOutputStream(PREFIX+"methodheaders.h"), true);
142 outclassdefs=new CodePrinter(new FileOutputStream(PREFIX+"classdefs.h"), true);
144 // TODO add version for normal Java later
145 outglobaldefs=new CodePrinter(new FileOutputStream(PREFIX+"globaldefs.h"), true);
147 outmethod=new CodePrinter(new FileOutputStream(PREFIX+"methods.c"), true);
148 outvirtual=new CodePrinter(new FileOutputStream(PREFIX+"virtualtable.h"), true);
150 outtask=new CodePrinter(new FileOutputStream(PREFIX+"task.h"), true);
151 outtaskdefs=new CodePrinter(new FileOutputStream(PREFIX+"taskdefs.c"), true);
152 if (state.OPTIONAL) {
153 outoptionalarrays=new CodePrinter(new FileOutputStream(PREFIX+"optionalarrays.c"), true);
154 optionalheaders=new CodePrinter(new FileOutputStream(PREFIX+"optionalstruct.h"), true);
157 if (state.structfile!=null) {
158 outrepairstructs=new CodePrinter(new FileOutputStream(PREFIX+state.structfile+".struct"), true);
160 } catch (Exception e) {
165 /* Fix field safe symbols due to shadowing */
166 FieldShadow.handleFieldShadow(state);
168 /* Build the virtual dispatch tables */
169 buildVirtualTables(outvirtual);
171 /* Tag the methods that are invoked by static blocks */
172 tagMethodInvokedByStaticBlock();
174 /* Output includes */
175 outmethodheader.println("#ifndef METHODHEADERS_H");
176 outmethodheader.println("#define METHODHEADERS_H");
177 outmethodheader.println("#include \"structdefs.h\"");
179 outmethodheader.println("#include \"dstm.h\"");
181 outmethodheader.println("#include \"sandbox.h\"");
183 if (state.EVENTMONITOR) {
184 outmethodheader.println("#include \"monitor.h\"");
186 if (state.SINGLETM) {
187 outmethodheader.println("#include \"tm.h\"");
188 outmethodheader.println("#include \"delaycomp.h\"");
189 outmethodheader.println("#include \"inlinestm.h\"");
191 if (state.ABORTREADERS) {
192 outmethodheader.println("#include \"abortreaders.h\"");
193 outmethodheader.println("#include <setjmp.h>");
197 additionalIncludesMethodsHeader(outmethodheader);
200 /* Output Structures */
201 outputStructs(outstructs);
203 // Output the C class declarations
204 // These could mutually reference each other
207 // TODO add version for normal Java later
208 outglobaldefs.println("#ifndef __GLOBALDEF_H_");
209 outglobaldefs.println("#define __GLOBALDEF_H_");
210 outglobaldefs.println("");
211 outglobaldefs.println("struct global_defs_t {");
214 outclassdefs.println("#ifndef __CLASSDEF_H_");
215 outclassdefs.println("#define __CLASSDEF_H_");
216 outputClassDeclarations(outclassdefs, outglobaldefs);
218 // Output function prototypes and structures for parameters
219 Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
220 while(it.hasNext()) {
221 ClassDescriptor cn=(ClassDescriptor)it.next();
222 generateCallStructs(cn, outclassdefs, outstructs, outmethodheader, outglobaldefs);
224 outclassdefs.println("#endif");
225 outclassdefs.close();
227 // TODO add version for normal Java later
228 outglobaldefs.println("};");
229 outglobaldefs.println("");
230 outglobaldefs.println("extern struct global_defs_t * global_defs_p;");
231 outglobaldefs.println("#endif");
232 outglobaldefs.flush();
233 outglobaldefs.close();
237 /* Map flags to integers */
238 /* The runtime keeps track of flags using these integers */
239 it=state.getClassSymbolTable().getDescriptorsIterator();
240 while(it.hasNext()) {
241 ClassDescriptor cn=(ClassDescriptor)it.next();
245 generateTaskStructs(outstructs, outmethodheader);
247 /* Outputs generic task structures if this is a task
249 outputTaskTypes(outtask);
253 // an opportunity for subclasses to do extra
255 preCodeGenInitialization();
258 /* Build the actual methods */
259 outputMethods(outmethod);
262 // opportunity for subclasses to gen extra code
263 additionalCodeGen(outmethodheader,
269 /* Output code for tasks */
270 outputTaskCode(outtaskdefs, outmethod);
272 /* Record maximum number of task parameters */
273 outstructs.println("#define MAXTASKPARAMS "+maxtaskparams);
274 } else if (state.main!=null) {
275 /* Generate main method */
276 outputMainMethod(outmethod);
279 /* Generate information for task with optional parameters */
280 if (state.TASK&&state.OPTIONAL) {
281 generateOptionalArrays(outoptionalarrays, optionalheaders, state.getAnalysisResult(), state.getOptionalTaskDescriptors());
282 outoptionalarrays.close();
285 /* Output structure definitions for repair tool */
286 if (state.structfile!=null) {
287 buildRepairStructs(outrepairstructs);
288 outrepairstructs.close();
292 outmethodheader.println("#endif");
293 outmethodheader.close();
295 outstructs.println("#endif");
300 postCodeGenCleanUp();
305 /* This method goes though the call graph and tag those methods that are
306 * invoked inside static blocks
308 protected void tagMethodInvokedByStaticBlock() {
310 Iterator it_sclasses = this.state.getSClassSymbolTable().getDescriptorsIterator();
311 MethodDescriptor current_md=null;
312 HashSet tovisit=new HashSet();
313 HashSet visited=new HashSet();
315 while(it_sclasses.hasNext()) {
316 ClassDescriptor cd = (ClassDescriptor)it_sclasses.next();
317 MethodDescriptor md = (MethodDescriptor)cd.getMethodTable().get("staticblocks");
323 while(!tovisit.isEmpty()) {
324 current_md=(MethodDescriptor)tovisit.iterator().next();
325 tovisit.remove(current_md);
326 visited.add(current_md);
327 Iterator it_callee = this.callgraph.getCalleeSet(current_md).iterator();
328 while(it_callee.hasNext()) {
329 Descriptor d = (Descriptor)it_callee.next();
330 if(d instanceof MethodDescriptor) {
331 if(!visited.contains(d)) {
332 ((MethodDescriptor)d).setIsInvokedByStatic(true);
338 } // TODO for normal Java version
341 /* This code generates code for each static block and static field
343 protected void outputStaticBlocks(PrintWriter outmethod) {
344 // execute all the static blocks and all the static field initializations
348 /* This code generates code to create a Class object for each class for
351 protected void outputClassObjects(PrintWriter outmethod) {
352 // for each class, initialize its Class object
356 /* This code just generates the main C method for java programs.
357 * The main C method packs up the arguments into a string array
358 * and passes it to the java main method. */
360 protected void outputMainMethod(PrintWriter outmethod) {
361 outmethod.println("int main(int argc, const char *argv[]) {");
362 outmethod.println(" int i;");
364 outputStaticBlocks(outmethod);
365 outputClassObjects(outmethod);
368 additionalCodeAtTopOfMain(outmethod);
372 if (state.DSMRECOVERYSTATS) {
373 outmethod.println("#ifdef RECOVERYSTATS \n");
374 outmethod.println("handle();\n");
375 outmethod.println("#endif\n");
377 outmethod.println("#if defined(TRANSSTATS) || defined(RECOVERYSTATS) \n");
378 outmethod.println("handle();\n");
379 outmethod.println("#endif\n");
383 if (state.THREAD||state.DSM||state.SINGLETM) {
384 outmethod.println("initializethreads();");
387 outmethod.println("if (dstmStartup(argv[1])) {");
388 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
389 outmethod.println(" struct ArrayObject * stringarray=allocate_newarray(NULL, STRINGARRAYTYPE, argc-2);");
391 outmethod.println(" struct ArrayObject * stringarray=allocate_newarray(STRINGARRAYTYPE, argc-2);");
394 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
395 outmethod.println(" struct ArrayObject * stringarray=allocate_newarray(NULL, STRINGARRAYTYPE, argc-1);");
397 outmethod.println(" struct ArrayObject * stringarray=allocate_newarray(STRINGARRAYTYPE, argc-1);");
401 outmethod.println(" for(i=2;i<argc;i++) {");
403 outmethod.println(" for(i=1;i<argc;i++) {");
404 outmethod.println(" int length=strlen(argv[i]);");
405 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
406 outmethod.println(" struct ___String___ *newstring=NewString(NULL, argv[i], length);");
408 outmethod.println(" struct ___String___ *newstring=NewString(argv[i], length);");
411 outmethod.println(" ((void **)(((char *)& stringarray->___length___)+sizeof(int)))[i-2]=newstring;");
413 outmethod.println(" ((void **)(((char *)& stringarray->___length___)+sizeof(int)))[i-1]=newstring;");
414 outmethod.println(" }");
416 MethodDescriptor md=typeutil.getMain();
417 ClassDescriptor cd=typeutil.getMainClass();
419 outmethod.println(" {");
420 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
421 if (state.DSM||state.SINGLETM) {
422 outmethod.print(" struct "+cd.getSafeSymbol()+locality.getMain().getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __parameterlist__={");
424 outmethod.print(" struct "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __parameterlist__={");
425 outmethod.println("1, NULL,"+"stringarray};");
426 if (state.DSM||state.SINGLETM)
427 outmethod.println(" "+cd.getSafeSymbol()+locality.getMain().getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(& __parameterlist__);");
429 outmethod.println(" "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(& __parameterlist__);");
431 if (state.DSM||state.SINGLETM)
432 outmethod.println(" "+cd.getSafeSymbol()+locality.getMain().getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(stringarray);");
434 outmethod.println(" "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(stringarray);");
436 outmethod.println(" }");
439 outmethod.println("}");
442 if (state.THREAD||state.DSM||state.SINGLETM) {
443 outmethod.println("pthread_mutex_lock(&gclistlock);");
444 outmethod.println("threadcount--;");
445 outmethod.println("pthread_cond_signal(&gccond);");
446 outmethod.println("pthread_mutex_unlock(&gclistlock);");
449 if (state.DSM||state.SINGLETM) {
450 outmethod.println("#if defined(TRANSSTATS) \n");
451 outmethod.println("printf(\"****** Transaction Stats ******\\n\");");
452 outmethod.println("printf(\"numTransCommit= %d\\n\", numTransCommit);");
453 outmethod.println("printf(\"numTransAbort= %d\\n\", numTransAbort);");
454 outmethod.println("printf(\"nSoftAbort= %d\\n\", nSoftAbort);");
456 outmethod.println("printf(\"nchashSearch= %d\\n\", nchashSearch);");
457 outmethod.println("printf(\"nmhashSearch= %d\\n\", nmhashSearch);");
458 outmethod.println("printf(\"nprehashSearch= %d\\n\", nprehashSearch);");
459 outmethod.println("printf(\"ndirtyCacheObj= %d\\n\", ndirtyCacheObj);");
460 outmethod.println("printf(\"nRemoteReadSend= %d\\n\", nRemoteSend);");
461 outmethod.println("printf(\"bytesSent= %d\\n\", bytesSent);");
462 outmethod.println("printf(\"bytesRecv= %d\\n\", bytesRecv);");
463 outmethod.println("printf(\"totalObjSize= %d\\n\", totalObjSize);");
464 outmethod.println("printf(\"sendRemoteReq= %d\\n\", sendRemoteReq);");
465 outmethod.println("printf(\"getResponse= %d\\n\", getResponse);");
466 } else if (state.SINGLETM) {
467 outmethod.println("printf(\"nSoftAbortAbort= %d\\n\", nSoftAbortAbort);");
468 outmethod.println("printf(\"nSoftAbortCommit= %d\\n\", nSoftAbortCommit);");
469 outmethod.println("#ifdef STMSTATS\n");
470 outmethod.println("for(i=0; i<TOTALNUMCLASSANDARRAY; i++) {\n");
471 outmethod.println(" printf(\"typesCausingAbort[%2d] numaccess= %5d numabort= %3d\\n\", i, typesCausingAbort[i].numaccess, typesCausingAbort[i].numabort);\n");
472 outmethod.println("}\n");
473 outmethod.println("#endif\n");
474 outmethod.println("fflush(stdout);");
476 outmethod.println("#endif\n");
479 if (state.EVENTMONITOR) {
480 outmethod.println("dumpdata();");
483 if (state.THREAD||state.SINGLETM)
484 outmethod.println("pthread_exit(NULL);");
487 additionalCodeAtBottomOfMain(outmethod);
490 outmethod.println("}");
493 /* This method outputs code for each task. */
495 private void outputTaskCode(PrintWriter outtaskdefs, PrintWriter outmethod) {
496 /* Compile task based program */
497 outtaskdefs.println("#include \"task.h\"");
498 outtaskdefs.println("#include \"methodheaders.h\"");
499 Iterator taskit=state.getTaskSymbolTable().getDescriptorsIterator();
500 while(taskit.hasNext()) {
501 TaskDescriptor td=(TaskDescriptor)taskit.next();
502 FlatMethod fm=state.getMethodFlat(td);
503 generateFlatMethod(fm, null, outmethod);
504 generateTaskDescriptor(outtaskdefs, fm, td);
507 //Output task descriptors
508 taskit=state.getTaskSymbolTable().getDescriptorsIterator();
509 outtaskdefs.println("struct taskdescriptor * taskarray[]= {");
511 while(taskit.hasNext()) {
512 TaskDescriptor td=(TaskDescriptor)taskit.next();
516 outtaskdefs.println(",");
517 outtaskdefs.print("&task_"+td.getSafeSymbol());
519 outtaskdefs.println("};");
521 outtaskdefs.println("int numtasks="+state.getTaskSymbolTable().getValueSet().size()+";");
525 /* This method outputs most of the methods.c file. This includes
526 * some standard includes and then an array with the sizes of
527 * objets and array that stores supertype and then the code for
528 * the Java methods.. */
529 protected void outputMethods(PrintWriter outmethod) {
530 outmethod.println("#include \"methodheaders.h\"");
531 outmethod.println("#include \"virtualtable.h\"");
532 outmethod.println("#include \"runtime.h\"");
534 // always include: compiler directives will leave out
535 // instrumentation when option is not set
536 outmethod.println("#include \"coreprof/coreprof.h\"");
539 outmethod.println("#include \"sandboxdefs.c\"");
542 outmethod.println("#include \"addPrefetchEnhance.h\"");
543 outmethod.println("#include \"localobjects.h\"");
545 if (state.FASTCHECK) {
546 outmethod.println("#include \"localobjects.h\"");
548 if(state.MULTICORE) {
550 outmethod.println("#include \"task.h\"");
552 outmethod.println("#include \"multicoreruntime.h\"");
553 outmethod.println("#include \"runtime_arch.h\"");
555 if (state.THREAD||state.DSM||state.SINGLETM) {
556 outmethod.println("#include <thread.h>");
559 outmethod.println("#include \"thread.h\"");
561 if (state.main!=null) {
562 outmethod.println("#include <string.h>");
564 if (state.CONSCHECK) {
565 outmethod.println("#include \"checkers.h\"");
569 additionalIncludesMethodsImplementation(outmethod);
573 // TODO add version for normal Java later
574 outmethod.println("struct global_defs_t * global_defs_p;");
576 //Store the sizes of classes & array elements
577 generateSizeArray(outmethod);
579 //Store table of supertypes
580 generateSuperTypeTable(outmethod);
582 //Store the layout of classes
583 generateLayoutStructs(outmethod);
586 additionalCodeAtTopMethodsImplementation(outmethod);
589 /* Generate code for methods */
590 if (state.DSM||state.SINGLETM) {
591 for(Iterator<LocalityBinding> lbit=locality.getLocalityBindings().iterator(); lbit.hasNext(); ) {
592 LocalityBinding lb=lbit.next();
593 MethodDescriptor md=lb.getMethod();
594 FlatMethod fm=state.getMethodFlat(md);
596 if (!md.getModifiers().isNative()) {
597 generateFlatMethod(fm, lb, outmethod);
601 Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
602 while(classit.hasNext()) {
603 ClassDescriptor cn=(ClassDescriptor)classit.next();
604 Iterator methodit=cn.getMethods();
605 while(methodit.hasNext()) {
606 /* Classify parameters */
607 MethodDescriptor md=(MethodDescriptor)methodit.next();
608 FlatMethod fm=state.getMethodFlat(md);
609 if (!md.getModifiers().isNative()) {
610 generateFlatMethod(fm, null, outmethod);
617 protected void outputStructs(PrintWriter outstructs) {
618 outstructs.println("#ifndef STRUCTDEFS_H");
619 outstructs.println("#define STRUCTDEFS_H");
620 outstructs.println("#include \"classdefs.h\"");
621 outstructs.println("#ifndef INTPTR");
622 outstructs.println("#ifdef BIT64");
623 outstructs.println("#define INTPTR long");
624 outstructs.println("#else");
625 outstructs.println("#define INTPTR int");
626 outstructs.println("#endif");
627 outstructs.println("#endif");
630 additionalIncludesStructsHeader(outstructs);
633 /* Output #defines that the runtime uses to determine type
634 * numbers for various objects it needs */
635 outstructs.println("#define MAXCOUNT "+maxcount);
636 if (state.DSM||state.SINGLETM) {
637 LocalityBinding lbrun=new LocalityBinding(typeutil.getRun(), false);
639 lbrun.setGlobalThis(LocalityAnalysis.GLOBAL);
640 } else if (state.SINGLETM) {
641 lbrun.setGlobalThis(LocalityAnalysis.NORMAL);
643 outstructs.println("#define RUNMETHOD "+virtualcalls.getLocalityNumber(lbrun));
647 LocalityBinding lbexecute = new LocalityBinding(typeutil.getExecute(), false);
649 lbexecute.setGlobalThis(LocalityAnalysis.GLOBAL);
650 else if( state.SINGLETM)
651 lbexecute.setGlobalThis(LocalityAnalysis.NORMAL);
652 outstructs.println("#define EXECUTEMETHOD " + virtualcalls.getLocalityNumber(lbexecute));
655 outstructs.println("#define STRINGARRAYTYPE "+
656 (state.getArrayNumber(
657 (new TypeDescriptor(typeutil.getClass(TypeUtil.StringClass))).makeArray(state))+state.numClasses()));
659 outstructs.println("#define OBJECTARRAYTYPE "+
660 (state.getArrayNumber(
661 (new TypeDescriptor(typeutil.getClass(TypeUtil.ObjectClass))).makeArray(state))+state.numClasses()));
664 outstructs.println("#define STRINGTYPE "+typeutil.getClass(TypeUtil.StringClass).getId());
665 outstructs.println("#define CHARARRAYTYPE "+
666 (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.CHAR)).makeArray(state))+state.numClasses()));
668 outstructs.println("#define BYTEARRAYTYPE "+
669 (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state))+state.numClasses()));
671 outstructs.println("#define BYTEARRAYARRAYTYPE "+
672 (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.BYTE)).makeArray(state).makeArray(state))+state.numClasses()));
674 outstructs.println("#define NUMCLASSES "+state.numClasses());
675 int totalClassSize = state.numClasses() + state.numArrays();
676 outstructs.println("#define TOTALNUMCLASSANDARRAY "+ totalClassSize);
678 outstructs.println("#define STARTUPTYPE "+typeutil.getClass(TypeUtil.StartupClass).getId());
679 outstructs.println("#define TAGTYPE "+typeutil.getClass(TypeUtil.TagClass).getId());
680 outstructs.println("#define TAGARRAYTYPE "+
681 (state.getArrayNumber(new TypeDescriptor(typeutil.getClass(TypeUtil.TagClass)).makeArray(state))+state.numClasses()));
685 protected void outputClassDeclarations(PrintWriter outclassdefs, PrintWriter outglobaldefs) {
686 if (state.THREAD||state.DSM||state.SINGLETM)
687 outclassdefs.println("#include <pthread.h>");
688 outclassdefs.println("#ifndef INTPTR");
689 outclassdefs.println("#ifdef BIT64");
690 outclassdefs.println("#define INTPTR long");
691 outclassdefs.println("#else");
692 outclassdefs.println("#define INTPTR int");
693 outclassdefs.println("#endif");
694 outclassdefs.println("#endif");
696 outclassdefs.println("#include \"optionalstruct.h\"");
697 outclassdefs.println("struct "+arraytype+";");
698 /* Start by declaring all structs */
699 Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
700 while(it.hasNext()) {
701 ClassDescriptor cn=(ClassDescriptor)it.next();
702 outclassdefs.println("struct "+cn.getSafeSymbol()+";");
705 // TODO add version for normal Java later
706 if((cn.getNumStaticFields() != 0) || (cn.getNumStaticBlocks() != 0)) {
707 // this class has static fields/blocks, need to add a global flag to
708 // indicate if its static fields have been initialized and/or if its
709 // static blocks have been executed
710 outglobaldefs.println(" int "+cn.getSafeSymbol()+"static_block_exe_flag;");
713 // for each class, create a global object
714 outglobaldefs.println(" struct ___Object___ "+cn.getSafeSymbol()+"classobj;");
717 outclassdefs.println("");
718 //Print out definition for array type
719 outclassdefs.println("struct "+arraytype+" {");
720 outclassdefs.println(" int type;");
723 additionalClassObjectFields(outclassdefs);
726 if (state.EVENTMONITOR) {
727 outclassdefs.println(" int objuid;");
730 outclassdefs.println(" pthread_t tid;");
731 outclassdefs.println(" void * lockentry;");
732 outclassdefs.println(" int lockcount;");
735 outclassdefs.println(" int mutex;");
736 outclassdefs.println(" int objlock;");
737 if(state.MULTICOREGC) {
738 outclassdefs.println(" int marked;");
742 outclassdefs.println(" int flag;");
743 if(!state.MULTICORE) {
744 outclassdefs.println(" void * flagptr;");
746 outclassdefs.println(" int version;");
747 outclassdefs.println(" int * lock;"); // lock entry for this obj
748 outclassdefs.println(" int mutex;");
749 outclassdefs.println(" int lockcount;");
750 if(state.MULTICOREGC) {
751 outclassdefs.println(" int marked;");
755 outclassdefs.println(" int numfses;");
756 outclassdefs.println(" int * fses;");
760 printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs, outglobaldefs);
761 printedfieldstbl.clear();
763 if (state.STMARRAY) {
764 outclassdefs.println(" int lowindex;");
765 outclassdefs.println(" int highindex;");
768 outclassdefs.println(" int paddingforarray;");
769 if (state.DUALVIEW) {
770 outclassdefs.println(" int arrayversion;");
773 outclassdefs.println(" int ___length___;");
774 outclassdefs.println("};\n");
777 // TODO add version for normal Java later
778 outclassdefs.println("");
779 //Print out definition for Class type
780 outclassdefs.println("struct Class {");
781 outclassdefs.println(" int type;");
784 additionalClassObjectFields(outclassdefs);
787 if (state.EVENTMONITOR) {
788 outclassdefs.println(" int objuid;");
791 outclassdefs.println(" pthread_t tid;");
792 outclassdefs.println(" void * lockentry;");
793 outclassdefs.println(" int lockcount;");
796 outclassdefs.println(" int mutex;");
797 outclassdefs.println(" int objlock;");
798 if(state.MULTICOREGC) {
799 outclassdefs.println(" int marked;");
803 outclassdefs.println(" int flag;");
804 if(!state.MULTICORE) {
805 outclassdefs.println(" void * flagptr;");
807 outclassdefs.println(" int version;");
808 outclassdefs.println(" int * lock;"); // lock entry for this obj
809 outclassdefs.println(" int mutex;");
810 outclassdefs.println(" int lockcount;");
811 if(state.MULTICOREGC) {
812 outclassdefs.println(" int marked;");
816 outclassdefs.println(" int numfses;");
817 outclassdefs.println(" int * fses;");
820 printClassStruct(typeutil.getClass(TypeUtil.ObjectClass), outclassdefs, outglobaldefs);
821 printedfieldstbl.clear();
822 outclassdefs.println("};\n");
825 outclassdefs.println("");
826 outclassdefs.println("extern int classsize[];");
827 outclassdefs.println("extern int hasflags[];");
828 outclassdefs.println("extern unsigned INTPTR * pointerarray[];");
829 outclassdefs.println("extern int supertypes[];");
830 outclassdefs.println("");
833 /** Prints out definitions for generic task structures */
835 private void outputTaskTypes(PrintWriter outtask) {
836 outtask.println("#ifndef _TASK_H");
837 outtask.println("#define _TASK_H");
838 outtask.println("struct parameterdescriptor {");
839 outtask.println("int type;");
840 outtask.println("int numberterms;");
841 outtask.println("int *intarray;");
842 outtask.println("void * queue;");
843 outtask.println("int numbertags;");
844 outtask.println("int *tagarray;");
845 outtask.println("};");
847 outtask.println("struct taskdescriptor {");
848 outtask.println("void * taskptr;");
849 outtask.println("int numParameters;");
850 outtask.println(" int numTotal;");
851 outtask.println("struct parameterdescriptor **descriptorarray;");
852 outtask.println("char * name;");
853 outtask.println("};");
854 outtask.println("extern struct taskdescriptor * taskarray[];");
855 outtask.println("extern numtasks;");
856 outtask.println("#endif");
860 private void buildRepairStructs(PrintWriter outrepairstructs) {
861 Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
862 while(classit.hasNext()) {
863 ClassDescriptor cn=(ClassDescriptor)classit.next();
864 outrepairstructs.println("structure "+cn.getSymbol()+" {");
865 outrepairstructs.println(" int __type__;");
867 outrepairstructs.println(" int __flag__;");
868 if(!state.MULTICORE) {
869 outrepairstructs.println(" int __flagptr__;");
872 printRepairStruct(cn, outrepairstructs);
873 outrepairstructs.println("}\n");
876 for(int i=0; i<state.numArrays(); i++) {
877 TypeDescriptor tdarray=arraytable[i];
878 TypeDescriptor tdelement=tdarray.dereference();
879 outrepairstructs.println("structure "+arraytype+"_"+state.getArrayNumber(tdarray)+" {");
880 outrepairstructs.println(" int __type__;");
881 printRepairStruct(typeutil.getClass(TypeUtil.ObjectClass), outrepairstructs);
882 outrepairstructs.println(" int length;");
883 outrepairstructs.println("}\n");
887 private void printRepairStruct(ClassDescriptor cn, PrintWriter output) {
888 ClassDescriptor sp=cn.getSuperDesc();
890 printRepairStruct(sp, output);
892 Vector fields=(Vector)fieldorder.get(cn);
894 for(int i=0; i<fields.size(); i++) {
895 FieldDescriptor fd=(FieldDescriptor)fields.get(i);
896 if (fd.getType().isArray()) {
897 output.println(" "+arraytype+"_"+ state.getArrayNumber(fd.getType()) +" * "+fd.getSymbol()+";");
898 } else if (fd.getType().isClass())
899 output.println(" "+fd.getType().getRepairSymbol()+" * "+fd.getSymbol()+";");
900 else if (fd.getType().isFloat())
901 output.println(" int "+fd.getSymbol()+"; /* really float */");
903 output.println(" "+fd.getType().getRepairSymbol()+" "+fd.getSymbol()+";");
907 /** This method outputs TaskDescriptor information */
908 private void generateTaskDescriptor(PrintWriter output, FlatMethod fm, TaskDescriptor task) {
909 for (int i=0; i<task.numParameters(); i++) {
910 VarDescriptor param_var=task.getParameter(i);
911 TypeDescriptor param_type=task.getParamType(i);
912 FlagExpressionNode param_flag=task.getFlag(param_var);
913 TagExpressionList param_tag=task.getTag(param_var);
916 if (param_flag==null) {
917 output.println("int parameterdnf_"+i+"_"+task.getSafeSymbol()+"[]={");
918 output.println("0x0, 0x0 };");
921 DNFFlag dflag=param_flag.getDNF();
922 dnfterms=dflag.size();
924 Hashtable flags=(Hashtable)flagorder.get(param_type.getClassDesc());
925 output.println("int parameterdnf_"+i+"_"+task.getSafeSymbol()+"[]={");
926 for(int j=0; j<dflag.size(); j++) {
929 Vector term=dflag.get(j);
932 for(int k=0; k<term.size(); k++) {
933 DNFFlagAtom dfa=(DNFFlagAtom)term.get(k);
934 FlagDescriptor fd=dfa.getFlag();
935 boolean negated=dfa.getNegated();
936 int flagid=1<<((Integer)flags.get(fd)).intValue();
941 output.print("0x"+Integer.toHexString(andmask)+", 0x"+Integer.toHexString(checkmask));
943 output.println("};");
946 output.println("int parametertag_"+i+"_"+task.getSafeSymbol()+"[]={");
948 for(int j=0; j<param_tag.numTags(); j++) {
951 /* for each tag we need */
952 /* which slot it is */
953 /* what type it is */
954 TagVarDescriptor tvd=(TagVarDescriptor)task.getParameterTable().get(param_tag.getName(j));
955 TempDescriptor tmp=param_tag.getTemp(j);
956 int slot=fm.getTagInt(tmp);
957 output.println(slot+", "+state.getTagId(tvd.getTag()));
959 output.println("};");
961 output.println("struct parameterdescriptor parameter_"+i+"_"+task.getSafeSymbol()+"={");
962 output.println("/* type */"+param_type.getClassDesc().getId()+",");
963 output.println("/* number of DNF terms */"+dnfterms+",");
964 output.println("parameterdnf_"+i+"_"+task.getSafeSymbol()+",");
965 output.println("0,");
967 output.println("/* number of tags */"+param_tag.numTags()+",");
969 output.println("/* number of tags */ 0,");
970 output.println("parametertag_"+i+"_"+task.getSafeSymbol());
971 output.println("};");
975 output.println("struct parameterdescriptor * parameterdescriptors_"+task.getSafeSymbol()+"[] = {");
976 for (int i=0; i<task.numParameters(); i++) {
979 output.print("¶meter_"+i+"_"+task.getSafeSymbol());
981 output.println("};");
983 output.println("struct taskdescriptor task_"+task.getSafeSymbol()+"={");
984 output.println("&"+task.getSafeSymbol()+",");
985 output.println("/* number of parameters */" +task.numParameters() + ",");
986 int numtotal=task.numParameters()+fm.numTags();
987 output.println("/* number total parameters */" +numtotal + ",");
988 output.println("parameterdescriptors_"+task.getSafeSymbol()+",");
989 output.println("\""+task.getSymbol()+"\"");
990 output.println("};");
994 /** The buildVirtualTables method outputs the virtual dispatch
995 * tables for methods. */
997 protected void buildVirtualTables(PrintWriter outvirtual) {
998 Iterator classit=state.getClassSymbolTable().getDescriptorsIterator();
999 while(classit.hasNext()) {
1000 ClassDescriptor cd=(ClassDescriptor)classit.next();
1001 if (virtualcalls.getMethodCount(cd)>maxcount)
1002 maxcount=virtualcalls.getMethodCount(cd);
1004 MethodDescriptor[][] virtualtable=null;
1005 LocalityBinding[][] lbvirtualtable=null;
1006 if (state.DSM||state.SINGLETM)
1007 lbvirtualtable=new LocalityBinding[state.numClasses()+state.numArrays()][maxcount];
1009 virtualtable=new MethodDescriptor[state.numClasses()+state.numArrays()][maxcount];
1011 /* Fill in virtual table */
1012 classit=state.getClassSymbolTable().getDescriptorsIterator();
1013 while(classit.hasNext()) {
1014 ClassDescriptor cd=(ClassDescriptor)classit.next();
1015 if(cd.isInterface()) {
1018 if (state.DSM||state.SINGLETM)
1019 fillinRow(cd, lbvirtualtable, cd.getId());
1021 fillinRow(cd, virtualtable, cd.getId());
1024 ClassDescriptor objectcd=typeutil.getClass(TypeUtil.ObjectClass);
1025 Iterator arrayit=state.getArrayIterator();
1026 while(arrayit.hasNext()) {
1027 TypeDescriptor td=(TypeDescriptor)arrayit.next();
1028 int id=state.getArrayNumber(td);
1029 if (state.DSM||state.SINGLETM)
1030 fillinRow(objectcd, lbvirtualtable, id+state.numClasses());
1032 fillinRow(objectcd, virtualtable, id+state.numClasses());
1035 outvirtual.print("void * virtualtable[]={");
1036 boolean needcomma=false;
1037 for(int i=0; i<state.numClasses()+state.numArrays(); i++) {
1038 for(int j=0; j<maxcount; j++) {
1040 outvirtual.print(", ");
1041 if ((state.DSM||state.SINGLETM)&&lbvirtualtable[i][j]!=null) {
1042 LocalityBinding lb=lbvirtualtable[i][j];
1043 MethodDescriptor md=lb.getMethod();
1044 outvirtual.print("& "+md.getClassDesc().getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor());
1045 } else if (!(state.DSM||state.SINGLETM)&&virtualtable[i][j]!=null) {
1046 MethodDescriptor md=virtualtable[i][j];
1047 outvirtual.print("& "+md.getClassDesc().getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor());
1049 outvirtual.print("0");
1053 outvirtual.println("");
1055 outvirtual.println("};");
1059 private void fillinRow(ClassDescriptor cd, MethodDescriptor[][] virtualtable, int rownum) {
1060 /* Get inherited methods */
1061 if (cd.getSuperDesc()!=null)
1062 fillinRow(cd.getSuperDesc(), virtualtable, rownum);
1064 // TODO add version for normal Java later
1065 Iterator it_sifs = cd.getSuperInterfaces();
1066 while(it_sifs.hasNext()) {
1067 ClassDescriptor superif = (ClassDescriptor)it_sifs.next();
1068 fillinRow(superif, virtualtable, rownum);
1071 /* Override them with our methods */
1072 for(Iterator it=cd.getMethods(); it.hasNext(); ) {
1073 MethodDescriptor md=(MethodDescriptor)it.next();
1074 if (md.isStatic()||md.getReturnType()==null)
1076 int methodnum=virtualcalls.getMethodNumber(md);
1077 virtualtable[rownum][methodnum]=md;
1081 private void fillinRow(ClassDescriptor cd, LocalityBinding[][] virtualtable, int rownum) {
1082 /* Get inherited methods */
1083 if (cd.getSuperDesc()!=null)
1084 fillinRow(cd.getSuperDesc(), virtualtable, rownum);
1085 /* Override them with our methods */
1086 if (locality.getClassBindings(cd)!=null)
1087 for(Iterator<LocalityBinding> lbit=locality.getClassBindings(cd).iterator(); lbit.hasNext(); ) {
1088 LocalityBinding lb=lbit.next();
1089 MethodDescriptor md=lb.getMethod();
1090 //Is the method static or a constructor
1091 if (md.isStatic()||md.getReturnType()==null)
1093 int methodnum=virtualcalls.getLocalityNumber(lb);
1094 virtualtable[rownum][methodnum]=lb;
1098 /** Generate array that contains the sizes of class objects. The
1099 * object allocation functions in the runtime use this
1102 private void generateSizeArray(PrintWriter outclassdefs) {
1103 outclassdefs.print("extern struct prefetchCountStats * evalPrefetch;\n");
1104 outclassdefs.print("#ifdef TRANSSTATS \n");
1105 outclassdefs.print("extern int numTransAbort;\n");
1106 outclassdefs.print("extern int numTransCommit;\n");
1107 outclassdefs.print("extern int nSoftAbort;\n");
1109 outclassdefs.print("extern int nchashSearch;\n");
1110 outclassdefs.print("extern int nmhashSearch;\n");
1111 outclassdefs.print("extern int nprehashSearch;\n");
1112 outclassdefs.print("extern int ndirtyCacheObj;\n");
1113 outclassdefs.print("extern int nRemoteSend;\n");
1114 outclassdefs.print("extern int sendRemoteReq;\n");
1115 outclassdefs.print("extern int getResponse;\n");
1116 outclassdefs.print("extern int bytesSent;\n");
1117 outclassdefs.print("extern int bytesRecv;\n");
1118 outclassdefs.print("extern int totalObjSize;\n");
1119 outclassdefs.print("extern void handle();\n");
1120 } else if (state.SINGLETM) {
1121 outclassdefs.println("extern int nSoftAbortAbort;");
1122 outclassdefs.println("extern int nSoftAbortCommit;");
1123 outclassdefs.println("#ifdef STMSTATS\n");
1124 outclassdefs.println("extern objtypestat_t typesCausingAbort[];");
1125 outclassdefs.println("#endif\n");
1127 outclassdefs.print("#endif\n");
1129 outclassdefs.print("int numprefetchsites = " + pa.prefetchsiteid + ";\n");
1132 Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
1133 cdarray=new ClassDescriptor[state.numClasses()];
1135 while(it.hasNext()) {
1136 ClassDescriptor cd=(ClassDescriptor)it.next();
1137 if(!cd.isInterface()) {
1138 cdarray[cd.getId()]=cd;
1142 arraytable=new TypeDescriptor[state.numArrays()];
1144 Iterator arrayit=state.getArrayIterator();
1145 while(arrayit.hasNext()) {
1146 TypeDescriptor td=(TypeDescriptor)arrayit.next();
1147 int id=state.getArrayNumber(td);
1153 /* Print out types */
1154 outclassdefs.println("/* ");
1155 for(int i=0; i<state.numClasses(); i++) {
1156 ClassDescriptor cd=cdarray[i];
1158 outclassdefs.println("NULL " + i);
1160 outclassdefs.println(cd +" "+i);
1164 for(int i=0; i<state.numArrays(); i++) {
1165 TypeDescriptor arraytd=arraytable[i];
1166 outclassdefs.println(arraytd.toPrettyString() +" "+(i+state.numClasses()));
1169 outclassdefs.println("*/");
1172 outclassdefs.print("int classsize[]={");
1174 boolean needcomma=false;
1175 for(int i=0; i<state.numClasses(); i++) {
1177 outclassdefs.print(", ");
1179 outclassdefs.print("sizeof(struct "+cdarray[i].getSafeSymbol()+")");
1181 outclassdefs.print("0");
1187 for(int i=0; i<state.numArrays(); i++) {
1189 outclassdefs.print(", ");
1190 TypeDescriptor tdelement=arraytable[i].dereference();
1191 if (tdelement.isArray()||tdelement.isClass()||tdelement.isNull())
1192 outclassdefs.print("sizeof(void *)");
1194 outclassdefs.print("sizeof("+tdelement.getSafeSymbol()+")");
1198 outclassdefs.println("};");
1200 ClassDescriptor objectclass=typeutil.getClass(TypeUtil.ObjectClass);
1202 outclassdefs.print("int typearray[]={");
1203 for(int i=0; i<state.numClasses(); i++) {
1204 ClassDescriptor cd=cdarray[i];
1205 ClassDescriptor supercd=i>0 ? cd.getSuperDesc() : null;
1207 outclassdefs.print(", ");
1209 outclassdefs.print("-1");
1211 outclassdefs.print(supercd.getId());
1215 for(int i=0; i<state.numArrays(); i++) {
1216 TypeDescriptor arraytd=arraytable[i];
1217 ClassDescriptor arraycd=arraytd.getClassDesc();
1218 if (arraycd==null) {
1220 outclassdefs.print(", ");
1221 outclassdefs.print(objectclass.getId());
1225 ClassDescriptor cd=arraycd.getSuperDesc();
1228 TypeDescriptor supertd=new TypeDescriptor(cd);
1229 supertd.setArrayCount(arraytd.getArrayCount());
1230 type=state.getArrayNumber(supertd);
1232 type+=state.numClasses();
1235 cd=cd.getSuperDesc();
1238 outclassdefs.print(", ");
1239 outclassdefs.print(type);
1243 outclassdefs.println("};");
1248 outclassdefs.print("int typearray2[]={");
1249 for(int i=0; i<state.numArrays(); i++) {
1250 TypeDescriptor arraytd=arraytable[i];
1251 ClassDescriptor arraycd=arraytd.getClassDesc();
1252 if (arraycd==null) {
1254 outclassdefs.print(", ");
1255 outclassdefs.print("-1");
1259 ClassDescriptor cd=arraycd.getSuperDesc();
1260 int level=arraytd.getArrayCount()-1;
1262 for(; level>0; level--) {
1263 TypeDescriptor supertd=new TypeDescriptor(objectclass);
1264 supertd.setArrayCount(level);
1265 type=state.getArrayNumber(supertd);
1267 type+=state.numClasses();
1272 outclassdefs.print(", ");
1273 outclassdefs.print(type);
1277 outclassdefs.println("};");
1280 /** Constructs params and temp objects for each method or task.
1281 * These objects tell the compiler which temps need to be
1284 protected void generateTempStructs(FlatMethod fm, LocalityBinding lb) {
1285 MethodDescriptor md=fm.getMethod();
1286 TaskDescriptor task=fm.getTask();
1287 Set<TempDescriptor> saveset=lb!=null ? locality.getTempSet(lb) : null;
1288 ParamsObject objectparams=md!=null ? new ParamsObject(md,tag++) : new ParamsObject(task, tag++);
1290 paramstable.put(lb, objectparams);
1291 backuptable.put(lb, new Hashtable<TempDescriptor, TempDescriptor>());
1292 } else if (md!=null)
1293 paramstable.put(md, objectparams);
1295 paramstable.put(task, objectparams);
1297 for(int i=0; i<fm.numParameters(); i++) {
1298 TempDescriptor temp=fm.getParameter(i);
1299 TypeDescriptor type=temp.getType();
1300 if (type.isPtr()&&((GENERATEPRECISEGC) || (this.state.MULTICOREGC)))
1301 objectparams.addPtr(temp);
1303 objectparams.addPrim(temp);
1304 if(lb!=null&&saveset.contains(temp)) {
1305 backuptable.get(lb).put(temp, temp.createNew());
1309 for(int i=0; i<fm.numTags(); i++) {
1310 TempDescriptor temp=fm.getTag(i);
1311 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC))
1312 objectparams.addPtr(temp);
1314 objectparams.addPrim(temp);
1317 TempObject objecttemps=md!=null ? new TempObject(objectparams,md,tag++) : new TempObject(objectparams, task, tag++);
1319 tempstable.put(lb, objecttemps);
1321 tempstable.put(md, objecttemps);
1323 tempstable.put(task, objecttemps);
1325 for(Iterator nodeit=fm.getNodeSet().iterator(); nodeit.hasNext(); ) {
1326 FlatNode fn=(FlatNode)nodeit.next();
1327 TempDescriptor[] writes=fn.writesTemps();
1328 for(int i=0; i<writes.length; i++) {
1329 TempDescriptor temp=writes[i];
1330 TypeDescriptor type=temp.getType();
1331 if (type.isPtr()&&((GENERATEPRECISEGC) || (this.state.MULTICOREGC)))
1332 objecttemps.addPtr(temp);
1334 objecttemps.addPrim(temp);
1335 if(lb!=null&&saveset.contains(temp)&&
1336 !backuptable.get(lb).containsKey(temp))
1337 backuptable.get(lb).put(temp, temp.createNew());
1341 /* Create backup temps */
1343 for(Iterator<TempDescriptor> tmpit=backuptable.get(lb).values().iterator(); tmpit.hasNext(); ) {
1344 TempDescriptor tmp=tmpit.next();
1345 TypeDescriptor type=tmp.getType();
1346 if (type.isPtr()&&((GENERATEPRECISEGC) || (this.state.MULTICOREGC)))
1347 objecttemps.addPtr(tmp);
1349 objecttemps.addPrim(tmp);
1351 /* Create temp to hold revert table */
1352 if (state.DSM&&(lb.getHasAtomic()||lb.isAtomic())) {
1353 TempDescriptor reverttmp=new TempDescriptor("revertlist", typeutil.getClass(TypeUtil.ObjectClass));
1354 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC))
1355 objecttemps.addPtr(reverttmp);
1357 objecttemps.addPrim(reverttmp);
1358 reverttable.put(lb, reverttmp);
1363 /** This method outputs the following information about classes
1365 * (1) For classes, what are the locations of pointers.
1366 * (2) For arrays, does the array contain pointers or primitives.
1367 * (3) For classes, does the class contain flags.
1370 private void generateLayoutStructs(PrintWriter output) {
1371 Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
1372 while(it.hasNext()) {
1373 ClassDescriptor cn=(ClassDescriptor)it.next();
1374 output.println("unsigned INTPTR "+cn.getSafeSymbol()+"_pointers[]={");
1375 Iterator allit=cn.getFieldTable().getAllDescriptorsIterator();
1377 while(allit.hasNext()) {
1378 FieldDescriptor fd=(FieldDescriptor)allit.next();
1379 TypeDescriptor type=fd.getType();
1380 if (state.DSM&&fd.isGlobal()) //Don't GC the global objects for now
1385 output.print(count);
1386 allit=cn.getFieldTable().getAllDescriptorsIterator();
1387 while(allit.hasNext()) {
1388 FieldDescriptor fd=(FieldDescriptor)allit.next();
1389 TypeDescriptor type=fd.getType();
1390 if (state.DSM&&fd.isGlobal()) //Don't GC the global objects for now
1393 output.println(",");
1394 output.print("((unsigned INTPTR)&(((struct "+cn.getSafeSymbol() +" *)0)->"+
1395 fd.getSafeSymbol()+"))");
1398 output.println("};");
1400 output.println("unsigned INTPTR * pointerarray[]={");
1401 boolean needcomma=false;
1402 for(int i=0; i<state.numClasses(); i++) {
1403 ClassDescriptor cn=cdarray[i];
1405 output.println(",");
1408 output.print(cn.getSafeSymbol()+"_pointers");
1410 output.print("NULL");
1414 for(int i=0; i<state.numArrays(); i++) {
1416 output.println(", ");
1417 TypeDescriptor tdelement=arraytable[i].dereference();
1418 if (tdelement.isArray()||tdelement.isClass())
1419 output.print("((unsigned INTPTR *)1)");
1425 output.println("};");
1427 output.println("int hasflags[]={");
1428 for(int i=0; i<state.numClasses(); i++) {
1429 ClassDescriptor cn=cdarray[i];
1431 output.println(", ");
1433 if ((cn != null) && (cn.hasFlags()))
1438 output.println("};");
1441 /** Print out table to give us supertypes */
1442 private void generateSuperTypeTable(PrintWriter output) {
1443 output.println("int supertypes[]={");
1444 boolean needcomma=false;
1445 for(int i=0; i<state.numClasses(); i++) {
1446 ClassDescriptor cn=cdarray[i];
1448 output.println(",");
1450 if ((cn != null) && (cn.getSuperDesc()!=null)) {
1451 ClassDescriptor cdsuper=cn.getSuperDesc();
1452 output.print(cdsuper.getId());
1456 output.println("};");
1459 /** Print out table to give us classnames */
1460 /*private void generateClassNameTable(PrintWriter output) {
1461 output.println("char * classname[]={");
1462 boolean needcomma=false;
1463 for(int i=0; i<state.numClasses(); i++) {
1464 ClassDescriptor cn=cdarray[i];
1466 output.println(",");
1468 if ((cn != null) && (cn.getSuperDesc()!=null)) {
1469 output.print("\"" + cn.getSymbol() + "\"");
1471 output.print("\"\"");
1473 output.println("};");
1476 /** Force consistent field ordering between inherited classes. */
1478 private void printClassStruct(ClassDescriptor cn, PrintWriter classdefout, PrintWriter globaldefout) {
1480 ClassDescriptor sp=cn.getSuperDesc();
1482 printClassStruct(sp, classdefout, /*globaldefout*/ null);
1484 SymbolTable sitbl = cn.getSuperInterfaceTable();
1485 Iterator it_sifs = sitbl.getDescriptorsIterator();
1487 while(it_sifs.hasNext()) {
1488 ClassDescriptor si = (ClassDescriptor)it_sifs.next();
1489 printClassStruct(si, classdefout, /*globaldefout*/ null);
1493 if (!fieldorder.containsKey(cn)) {
1494 Vector fields=new Vector();
1495 fieldorder.put(cn,fields);
1497 Vector fieldvec=cn.getFieldVec();
1498 for(int i=0; i<fieldvec.size(); i++) {
1499 FieldDescriptor fd=(FieldDescriptor)fieldvec.get(i);
1501 if((sp != null) && sp.getFieldTable().contains(fd.getSymbol())) {
1504 it_sifs = sitbl.getDescriptorsIterator();
1505 boolean hasprinted = false;
1506 while(it_sifs.hasNext()) {
1507 ClassDescriptor si = (ClassDescriptor)it_sifs.next();
1508 if(si.getFieldTable().contains(fd.getSymbol())) {
1514 // this field has been defined in the super class
1520 if ((sp==null) || (!sp.getFieldTable().contains(fd.getSymbol())))
1525 //Vector fields=(Vector)fieldorder.get(cn);
1527 Vector fields = cn.getFieldVec();
1529 for(int i=0; i<fields.size(); i++) {
1530 FieldDescriptor fd=(FieldDescriptor)fields.get(i);
1531 String fstring = fd.isStatic()?fd.getSafeSymbol():fd.getSymbol();
1532 if(printedfieldstbl.containsKey(fstring)) {
1533 if(!fd.isStatic()) {
1534 int index = printedfieldstbl.get(fstring).intValue();
1536 fd.changeSafeSymbol(index);
1537 printedfieldstbl.put(fstring, index);
1542 printedfieldstbl.put(fstring, 0);
1544 if (state.MGC && fd.getType().isClass()
1545 && fd.getType().getClassDesc().isEnum()) {
1546 classdefout.println(" int " + fd.getSafeSymbol() + ";");
1547 } else if (fd.getType().isClass()||fd.getType().isArray()) {
1548 if ((state.MGC) && (fd.isStatic())) {
1549 // TODO add version for normal Java later
1551 if(globaldefout != null) {
1552 if(fd.isVolatile()) {
1553 globaldefout.println(" volatile struct "+fd.getType().getSafeSymbol()+ " * "+fd.getSafeSymbol()+";");
1555 globaldefout.println(" struct "+fd.getType().getSafeSymbol()+ " * "+fd.getSafeSymbol()+";");
1558 classdefout.println(" struct "+fd.getType().getSafeSymbol()+" ** "+fd.getSafeSymbol()+";");
1559 } else if ((state.MGC) && (fd.isVolatile())) {
1560 // TODO add version for normal Java later
1562 if(globaldefout != null) {
1563 globaldefout.println(" volatile struct "+fd.getType().getSafeSymbol()+ " * "+fd.getSafeSymbol()+";");
1565 classdefout.println(" struct"+fd.getType().getSafeSymbol()+" ** "+fd.getSafeSymbol()+";");
1567 classdefout.println(" struct "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
1569 } else if ((state.MGC) && (fd.isStatic())) {
1570 // TODO add version for normal Java later
1572 if(globaldefout != null) {
1573 if(fd.isVolatile()) {
1574 globaldefout.println(" volatile "+fd.getType().getSafeSymbol()+ " "+fd.getSafeSymbol()+";");
1576 globaldefout.println(" "+fd.getType().getSafeSymbol()+ " "+fd.getSafeSymbol()+";");
1579 classdefout.println(" "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
1580 } else if ((state.MGC) && (fd.isVolatile())) {
1581 // TODO add version for normal Java later
1583 if(globaldefout != null) {
1584 globaldefout.println(" volatile "+fd.getType().getSafeSymbol()+ " "+fd.getSafeSymbol()+";");
1586 classdefout.println(" "+fd.getType().getSafeSymbol()+" * "+fd.getSafeSymbol()+";");
1588 classdefout.println(" "+fd.getType().getSafeSymbol()+" "+fd.getSafeSymbol()+";");
1593 /* Map flags to integers consistently between inherited
1596 protected void mapFlags(ClassDescriptor cn) {
1597 ClassDescriptor sp=cn.getSuperDesc();
1601 if (!flagorder.containsKey(cn)) {
1602 Hashtable flags=new Hashtable();
1603 flagorder.put(cn,flags);
1605 Hashtable superflags=(Hashtable)flagorder.get(sp);
1606 Iterator superflagit=superflags.keySet().iterator();
1607 while(superflagit.hasNext()) {
1608 FlagDescriptor fd=(FlagDescriptor)superflagit.next();
1609 Integer number=(Integer)superflags.get(fd);
1610 flags.put(fd, number);
1611 if ((number.intValue()+1)>max)
1612 max=number.intValue()+1;
1616 Iterator flagit=cn.getFlags();
1617 while(flagit.hasNext()) {
1618 FlagDescriptor fd=(FlagDescriptor)flagit.next();
1619 if (sp==null||!sp.getFlagTable().contains(fd.getSymbol()))
1620 flags.put(fd, new Integer(max++));
1626 /** This function outputs (1) structures that parameters are
1627 * passed in (when PRECISE GC is enabled) and (2) function
1628 * prototypes for the methods */
1630 protected void generateCallStructs(ClassDescriptor cn, PrintWriter classdefout, PrintWriter output, PrintWriter headersout, PrintWriter globaldefout) {
1631 /* Output class structure */
1632 classdefout.println("struct "+cn.getSafeSymbol()+" {");
1633 classdefout.println(" int type;");
1636 additionalClassObjectFields(classdefout);
1639 if (state.EVENTMONITOR) {
1640 classdefout.println(" int objuid;");
1643 classdefout.println(" pthread_t tid;");
1644 classdefout.println(" void * lockentry;");
1645 classdefout.println(" int lockcount;");
1648 classdefout.println(" int mutex;");
1649 classdefout.println(" int objlock;");
1650 if(state.MULTICOREGC) {
1651 classdefout.println(" int marked;");
1655 classdefout.println(" int flag;");
1656 if((!state.MULTICORE) || (cn.getSymbol().equals("TagDescriptor"))) {
1657 classdefout.println(" void * flagptr;");
1658 } else if (state.MULTICORE) {
1659 classdefout.println(" int version;");
1660 classdefout.println(" int * lock;"); // lock entry for this obj
1661 classdefout.println(" int mutex;");
1662 classdefout.println(" int lockcount;");
1663 if(state.MULTICOREGC) {
1664 classdefout.println(" int marked;");
1667 if (state.OPTIONAL) {
1668 classdefout.println(" int numfses;");
1669 classdefout.println(" int * fses;");
1672 printClassStruct(cn, classdefout, globaldefout);
1673 printedfieldstbl.clear();// = new Hashtable<String, ClassDescriptor>();
1674 classdefout.println("};\n");
1676 if (state.DSM||state.SINGLETM) {
1677 /* Cycle through LocalityBindings */
1678 HashSet<MethodDescriptor> nativemethods=new HashSet<MethodDescriptor>();
1679 Set<LocalityBinding> lbset=locality.getClassBindings(cn);
1681 for(Iterator<LocalityBinding> lbit=lbset.iterator(); lbit.hasNext(); ) {
1682 LocalityBinding lb=lbit.next();
1683 MethodDescriptor md=lb.getMethod();
1684 if (md.getModifiers().isNative()) {
1685 //make sure we only print a native method once
1686 if (nativemethods.contains(md)) {
1687 FlatMethod fm=state.getMethodFlat(md);
1688 generateTempStructs(fm, lb);
1691 nativemethods.add(md);
1693 generateMethod(cn, md, lb, headersout, output);
1696 for(Iterator methodit=cn.getMethods(); methodit.hasNext(); ) {
1697 MethodDescriptor md=(MethodDescriptor)methodit.next();
1698 if (md.getModifiers().isNative()&&!nativemethods.contains(md)) {
1699 //Need to build param structure for library code
1700 FlatMethod fm=state.getMethodFlat(md);
1701 generateTempStructs(fm, null);
1702 generateMethodParam(cn, md, null, output);
1707 for(Iterator methodit=cn.getMethods(); methodit.hasNext(); ) {
1708 MethodDescriptor md=(MethodDescriptor)methodit.next();
1709 generateMethod(cn, md, null, headersout, output);
1713 private void generateMethodParam(ClassDescriptor cn, MethodDescriptor md, LocalityBinding lb, PrintWriter output) {
1714 /* Output parameter structure */
1715 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
1716 ParamsObject objectparams=(ParamsObject) paramstable.get(lb!=null ? lb : md);
1717 if ((state.DSM||state.SINGLETM)&&lb!=null)
1718 output.println("struct "+cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params {");
1720 output.println("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params {");
1721 output.println(" int size;");
1722 output.println(" void * next;");
1723 for(int i=0; i<objectparams.numPointers(); i++) {
1724 TempDescriptor temp=objectparams.getPointer(i);
1725 if(state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
1726 output.println(" int " + temp.getSafeSymbol() + ";");
1728 output.println(" struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
1731 output.println("};\n");
1735 private void generateMethod(ClassDescriptor cn, MethodDescriptor md, LocalityBinding lb, PrintWriter headersout, PrintWriter output) {
1736 FlatMethod fm=state.getMethodFlat(md);
1737 generateTempStructs(fm, lb);
1739 ParamsObject objectparams=(ParamsObject) paramstable.get(lb!=null ? lb : md);
1740 TempObject objecttemps=(TempObject) tempstable.get(lb!=null ? lb : md);
1742 generateMethodParam(cn, md, lb, output);
1744 /* Output temp structure */
1745 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
1746 if (state.DSM||state.SINGLETM)
1747 output.println("struct "+cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals {");
1749 output.println("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals {");
1750 output.println(" int size;");
1751 output.println(" void * next;");
1752 for(int i=0; i<objecttemps.numPointers(); i++) {
1753 TempDescriptor temp=objecttemps.getPointer(i);
1754 if (temp.getType().isNull())
1755 output.println(" void * "+temp.getSafeSymbol()+";");
1757 output.println(" struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
1759 output.println("};\n");
1762 /********* Output method declaration ***********/
1763 if (state.DSM||state.SINGLETM) {
1764 headersout.println("#define D"+cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+" 1");
1766 headersout.println("#define D"+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+" 1");
1768 /* First the return type */
1769 if (md.getReturnType()!=null) {
1770 if(state.MGC && md.getReturnType().isClass() && md.getReturnType().getClassDesc().isEnum()) {
1771 headersout.println(" int ");
1772 } else if (md.getReturnType().isClass()||md.getReturnType().isArray())
1773 headersout.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
1775 headersout.print(md.getReturnType().getSafeSymbol()+" ");
1777 //catch the constructor case
1778 headersout.print("void ");
1780 /* Next the method name */
1781 if (state.DSM||state.SINGLETM) {
1782 headersout.print(cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(");
1784 headersout.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(");
1786 boolean printcomma=false;
1787 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
1788 if (state.DSM||state.SINGLETM) {
1789 headersout.print("struct "+cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * "+paramsprefix);
1791 headersout.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * "+paramsprefix);
1795 /* Output parameter list*/
1796 for(int i=0; i<objectparams.numPrimitives(); i++) {
1797 TempDescriptor temp=objectparams.getPrimitive(i);
1799 headersout.print(", ");
1801 if(state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
1802 headersout.print("int " + temp.getSafeSymbol());
1803 } else if (temp.getType().isClass()||temp.getType().isArray())
1804 headersout.print("struct " + temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol());
1806 headersout.print(temp.getType().getSafeSymbol()+" "+temp.getSafeSymbol());
1808 headersout.println(");\n");
1812 /** This function outputs (1) structures that parameters are
1813 * passed in (when PRECISE GC is enabled) and (2) function
1814 * prototypes for the tasks */
1816 private void generateTaskStructs(PrintWriter output, PrintWriter headersout) {
1817 /* Cycle through tasks */
1818 Iterator taskit=state.getTaskSymbolTable().getDescriptorsIterator();
1820 while(taskit.hasNext()) {
1821 /* Classify parameters */
1822 TaskDescriptor task=(TaskDescriptor)taskit.next();
1823 FlatMethod fm=state.getMethodFlat(task);
1824 generateTempStructs(fm, null);
1826 ParamsObject objectparams=(ParamsObject) paramstable.get(task);
1827 TempObject objecttemps=(TempObject) tempstable.get(task);
1829 /* Output parameter structure */
1830 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
1831 output.println("struct "+task.getSafeSymbol()+"_params {");
1832 output.println(" int size;");
1833 output.println(" void * next;");
1834 for(int i=0; i<objectparams.numPointers(); i++) {
1835 TempDescriptor temp=objectparams.getPointer(i);
1836 output.println(" struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
1839 output.println("};\n");
1840 if ((objectparams.numPointers()+fm.numTags())>maxtaskparams) {
1841 maxtaskparams=objectparams.numPointers()+fm.numTags();
1845 /* Output temp structure */
1846 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
1847 output.println("struct "+task.getSafeSymbol()+"_locals {");
1848 output.println(" int size;");
1849 output.println(" void * next;");
1850 for(int i=0; i<objecttemps.numPointers(); i++) {
1851 TempDescriptor temp=objecttemps.getPointer(i);
1852 if (temp.getType().isNull())
1853 output.println(" void * "+temp.getSafeSymbol()+";");
1854 else if(temp.getType().isTag())
1855 output.println(" struct "+
1856 (new TypeDescriptor(typeutil.getClass(TypeUtil.TagClass))).getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
1858 output.println(" struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+";");
1860 output.println("};\n");
1863 /* Output task declaration */
1864 headersout.print("void " + task.getSafeSymbol()+"(");
1866 boolean printcomma=false;
1867 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
1868 headersout.print("struct "+task.getSafeSymbol()+"_params * "+paramsprefix);
1870 headersout.print("void * parameterarray[]");
1871 headersout.println(");\n");
1875 /***** Generate code for FlatMethod fm. *****/
1877 Hashtable<FlatAtomicEnterNode, AtomicRecord> atomicmethodmap;
1878 static int atomicmethodcount=0;
1881 BranchAnalysis branchanalysis;
1882 private void generateFlatMethod(FlatMethod fm, LocalityBinding lb, PrintWriter output) {
1883 if (State.PRINTFLAT)
1884 System.out.println(fm.printMethod());
1885 MethodDescriptor md=fm.getMethod();
1886 TaskDescriptor task=fm.getTask();
1887 ClassDescriptor cn=md!=null ? md.getClassDesc() : null;
1888 ParamsObject objectparams=(ParamsObject)paramstable.get(lb!=null ? lb : md!=null ? md : task);
1890 HashSet<AtomicRecord> arset=null;
1891 branchanalysis=null;
1893 if (state.DELAYCOMP&&!lb.isAtomic()&&lb.getHasAtomic()) {
1895 if (atomicmethodmap==null)
1896 atomicmethodmap=new Hashtable<FlatAtomicEnterNode, AtomicRecord>();
1898 //fix these so we get right strings for local variables
1899 localsprefixaddr=localsprefix;
1900 localsprefixderef=localsprefix+"->";
1901 arset=new HashSet<AtomicRecord>();
1903 //build branchanalysis
1904 branchanalysis=new BranchAnalysis(locality, lb, delaycomp.getNotReady(lb), delaycomp.livecode(lb), state);
1906 //Generate commit methods here
1907 for(Iterator<FlatNode> fnit=fm.getNodeSet().iterator(); fnit.hasNext(); ) {
1908 FlatNode fn=fnit.next();
1909 if (fn.kind()==FKind.FlatAtomicEnterNode&&
1910 locality.getAtomic(lb).get(fn.getPrev(0)).intValue()==0&&
1911 delaycomp.needsFission(lb, (FlatAtomicEnterNode) fn)) {
1912 //We have an atomic enter
1913 FlatAtomicEnterNode faen=(FlatAtomicEnterNode) fn;
1914 Set<FlatNode> exitset=faen.getExits();
1916 String methodname=md.getSymbol()+(atomicmethodcount++);
1917 AtomicRecord ar=new AtomicRecord();
1921 atomicmethodmap.put(faen, ar);
1923 //build data structure declaration
1924 output.println("struct atomicprimitives_"+methodname+" {");
1926 Set<FlatNode> recordset=delaycomp.livecode(lb);
1927 Set<TempDescriptor> liveinto=delaycomp.liveinto(lb, faen, recordset);
1928 Set<TempDescriptor> liveout=delaycomp.liveout(lb, faen);
1929 Set<TempDescriptor> liveoutvirtualread=delaycomp.liveoutvirtualread(lb, faen);
1931 ar.reallivein=new HashSet(liveinto);
1933 ar.liveoutvirtualread=liveoutvirtualread;
1936 for(Iterator<TempDescriptor> it=liveinto.iterator(); it.hasNext(); ) {
1937 TempDescriptor tmp=it.next();
1938 //remove the pointers
1939 if (tmp.getType().isPtr()) {
1942 //let's print it here
1943 output.println(tmp.getType().getSafeSymbol()+" "+tmp.getSafeSymbol()+";");
1946 for(Iterator<TempDescriptor> it=liveout.iterator(); it.hasNext(); ) {
1947 TempDescriptor tmp=it.next();
1948 //remove the pointers
1949 if (tmp.getType().isPtr()) {
1951 } else if (!liveinto.contains(tmp)) {
1952 //let's print it here
1953 output.println(tmp.getType().getSafeSymbol()+" "+tmp.getSafeSymbol()+";");
1956 output.println("};");
1958 //print out method name
1959 output.println("void "+methodname+"(struct "+ cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * "+paramsprefix+", struct "+ cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals *"+localsprefix+", struct atomicprimitives_"+methodname+" * primitives) {");
1960 //build code for commit method
1962 //first define local primitives
1963 Set<TempDescriptor> alltemps=delaycomp.alltemps(lb, faen, recordset);
1964 for(Iterator<TempDescriptor> tmpit=alltemps.iterator(); tmpit.hasNext(); ) {
1965 TempDescriptor tmp=tmpit.next();
1966 if (!tmp.getType().isPtr()) {
1967 if (liveinto.contains(tmp)||liveoutvirtualread.contains(tmp)) {
1968 //read from live into set
1969 output.println(tmp.getType().getSafeSymbol()+" "+tmp.getSafeSymbol()+"=primitives->"+tmp.getSafeSymbol()+";");
1972 output.println(tmp.getType().getSafeSymbol()+" "+tmp.getSafeSymbol()+";");
1976 //turn off write barrier generation
1978 state.SINGLETM=false;
1979 generateCode(faen, fm, lb, exitset, output, false);
1980 state.SINGLETM=true;
1981 //turn on write barrier generation
1983 output.println("}\n\n");
1987 //redefine these back to normal
1989 localsprefixaddr="&"+localsprefix;
1990 localsprefixderef=localsprefix+".";
1992 generateHeader(fm, lb, md!=null ? md : task,output);
1993 TempObject objecttemp=(TempObject) tempstable.get(lb!=null ? lb : md!=null ? md : task);
1995 if (state.DELAYCOMP&&!lb.isAtomic()&&lb.getHasAtomic()) {
1996 for(Iterator<AtomicRecord> arit=arset.iterator(); arit.hasNext(); ) {
1997 AtomicRecord ar=arit.next();
1998 output.println("struct atomicprimitives_"+ar.name+" primitives_"+ar.name+";");
2002 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
2003 if (md!=null&&(state.DSM||state.SINGLETM))
2004 output.print(" struct "+cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals "+localsprefix+"={");
2005 else if (md!=null&&!(state.DSM||state.SINGLETM))
2006 output.print(" struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_locals "+localsprefix+"={");
2008 output.print(" struct "+task.getSafeSymbol()+"_locals "+localsprefix+"={");
2009 output.print(objecttemp.numPointers()+",");
2010 output.print(paramsprefix);
2011 for(int j=0; j<objecttemp.numPointers(); j++)
2012 output.print(", NULL");
2013 output.println("};");
2016 for(int i=0; i<objecttemp.numPrimitives(); i++) {
2017 TempDescriptor td=objecttemp.getPrimitive(i);
2018 TypeDescriptor type=td.getType();
2019 if (type.isNull() && !type.isArray())
2020 output.println(" void * "+td.getSafeSymbol()+";");
2021 else if (state.MGC && type.isClass() && type.getClassDesc().isEnum()) {
2022 output.println(" int " + td.getSafeSymbol() + ";");
2023 } else if (type.isClass()||type.isArray())
2024 output.println(" struct "+type.getSafeSymbol()+" * "+td.getSafeSymbol()+";");
2026 output.println(" "+type.getSafeSymbol()+" "+td.getSafeSymbol()+";");
2031 additionalCodeAtTopFlatMethodBody(output, fm);
2035 /* Check to see if we need to do a GC if this is a
2036 * multi-threaded program...*/
2038 if (((state.OOOJAVA||state.THREAD||state.DSM||state.SINGLETM)&&GENERATEPRECISEGC)
2039 || this.state.MULTICOREGC) {
2040 //Don't bother if we aren't in recursive methods...The loops case will catch it
2041 if (callgraph.getAllMethods(md).contains(md)) {
2042 if (state.DSM&&lb.isAtomic())
2043 output.println("if (needtocollect) checkcollect2("+localsprefixaddr+");");
2044 else if (this.state.MULTICOREGC) {
2045 output.println("if(gcflag) gc("+localsprefixaddr+");");
2047 output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
2053 // TODO add version for normal Java later
2054 if(fm.getMethod().isStaticBlock()) {
2055 // a static block, check if it has been executed
2056 output.println(" if(global_defs_p->" + cn.getSafeSymbol()+"static_block_exe_flag != 0) {");
2057 output.println(" return;");
2058 output.println(" }");
2061 if((!fm.getMethod().isStaticBlock()) && (fm.getMethod().getReturnType() == null) && (cn != null)) {
2062 // is a constructor, check and output initialization of the static fields
2063 // here does not initialize the static fields of the class, instead it
2064 // redirect the corresponding fields in the object to the global_defs_p
2065 Vector fields=cn.getFieldVec();
2067 for(int i=0; i<fields.size(); i++) {
2068 FieldDescriptor fd=(FieldDescriptor)fields.get(i);
2071 output.println(generateTemp(fm,fm.getParameter(0),lb)+"->"+fd.getSafeSymbol()+"=&(global_defs_p->"+fd.getSafeSymbol()+");");
2077 generateCode(fm.getNext(0), fm, lb, null, output, true);
2079 output.println("}\n\n");
2084 protected void generateCode(FlatNode first,
2087 Set<FlatNode> stopset,
2089 boolean firstpass) {
2091 /* Assign labels to FlatNode's if necessary.*/
2093 Hashtable<FlatNode, Integer> nodetolabel;
2095 if (state.DELAYCOMP&&!firstpass)
2096 nodetolabel=dcassignLabels(first, stopset);
2098 nodetolabel=assignLabels(first, stopset);
2100 Set<FlatNode> storeset=null;
2101 HashSet<FlatNode> genset=null;
2102 HashSet<FlatNode> refset=null;
2103 Set<FlatNode> unionset=null;
2105 if (state.DELAYCOMP&&!lb.isAtomic()&&lb.getHasAtomic()) {
2106 storeset=delaycomp.livecode(lb);
2107 genset=new HashSet<FlatNode>();
2108 if (state.STMARRAY&&!state.DUALVIEW) {
2109 refset=new HashSet<FlatNode>();
2110 refset.addAll(delaycomp.getDeref(lb));
2111 refset.removeAll(delaycomp.getCannotDelay(lb));
2112 refset.removeAll(delaycomp.getOther(lb));
2115 genset.addAll(delaycomp.getCannotDelay(lb));
2116 genset.addAll(delaycomp.getOther(lb));
2118 genset.addAll(delaycomp.getNotReady(lb));
2119 if (state.STMARRAY&&!state.DUALVIEW) {
2120 genset.removeAll(refset);
2123 unionset=new HashSet<FlatNode>();
2124 unionset.addAll(storeset);
2125 unionset.addAll(genset);
2126 if (state.STMARRAY&&!state.DUALVIEW)
2127 unionset.addAll(refset);
2130 /* Do the actual code generation */
2131 FlatNode current_node=null;
2132 HashSet tovisit=new HashSet();
2133 HashSet visited=new HashSet();
2135 tovisit.add(first.getNext(0));
2138 while(current_node!=null||!tovisit.isEmpty()) {
2139 if (current_node==null) {
2140 current_node=(FlatNode)tovisit.iterator().next();
2141 tovisit.remove(current_node);
2142 } else if (tovisit.contains(current_node)) {
2143 tovisit.remove(current_node);
2145 visited.add(current_node);
2146 if (nodetolabel.containsKey(current_node)) {
2147 output.println("L"+nodetolabel.get(current_node)+":");
2149 if (state.INSTRUCTIONFAILURE) {
2150 if (state.THREAD||state.DSM||state.SINGLETM) {
2151 output.println("if ((++instructioncount)>failurecount) {instructioncount=0;injectinstructionfailure();}");
2153 output.println("if ((--instructioncount)==0) injectinstructionfailure();");
2155 if (current_node.numNext()==0||stopset!=null&&stopset.contains(current_node)) {
2157 if (!state.DELAYCOMP||firstpass) {
2158 generateFlatNode(fm, lb, current_node, output);
2160 //store primitive variables in out set
2161 AtomicRecord ar=atomicmethodmap.get((FlatAtomicEnterNode)first);
2162 Set<TempDescriptor> liveout=ar.liveout;
2163 for(Iterator<TempDescriptor> tmpit=liveout.iterator(); tmpit.hasNext(); ) {
2164 TempDescriptor tmp=tmpit.next();
2165 output.println("primitives->"+tmp.getSafeSymbol()+"="+tmp.getSafeSymbol()+";");
2168 if (state.OOOJAVA && stopset!=null) {
2169 assert first.getPrev(0) instanceof FlatSESEEnterNode;
2170 assert current_node instanceof FlatSESEExitNode;
2171 FlatSESEEnterNode fsen = (FlatSESEEnterNode) first.getPrev(0);
2172 FlatSESEExitNode fsxn = (FlatSESEExitNode) current_node;
2173 assert fsen.getFlatExit().equals(fsxn);
2174 assert fsxn.getFlatEnter().equals(fsen);
2176 if (current_node.kind()!=FKind.FlatReturnNode) {
2178 // TODO add version for normal Java later
2179 if((fm.getMethod() != null) && (fm.getMethod().isStaticBlock())) {
2180 // a static block, check if it has been executed
2181 output.println(" global_defs_p->" + fm.getMethod().getClassDesc().getSafeSymbol()+"static_block_exe_flag = 1;");
2185 output.println(" return;");
2188 } else if(current_node.numNext()==1) {
2190 if (state.OOOJAVA &&
2191 current_node.kind()==FKind.FlatSESEEnterNode
2193 FlatSESEEnterNode fsen = (FlatSESEEnterNode)current_node;
2194 generateFlatNode(fm, lb, current_node, output);
2195 nextnode=fsen.getFlatExit().getNext(0);
2196 } else if (state.DELAYCOMP) {
2197 boolean specialprimitive=false;
2198 //skip literals...no need to add extra overhead
2199 if (storeset!=null&&storeset.contains(current_node)&¤t_node.kind()==FKind.FlatLiteralNode) {
2200 TypeDescriptor typedesc=((FlatLiteralNode)current_node).getType();
2201 if (!typedesc.isClass()&&!typedesc.isArray()) {
2202 specialprimitive=true;
2206 if (genset==null||genset.contains(current_node)||specialprimitive)
2207 generateFlatNode(fm, lb, current_node, output);
2208 if (state.STMARRAY&&!state.DUALVIEW&&refset!=null&&refset.contains(current_node)) {
2209 //need to acquire lock
2210 handleArrayDeref(fm, lb, current_node, output, firstpass);
2212 if (storeset!=null&&storeset.contains(current_node)&&!specialprimitive) {
2213 TempDescriptor wrtmp=current_node.writesTemps()[0];
2215 //need to store value written by previous node
2216 if (wrtmp.getType().isPtr()) {
2217 //only lock the objects that may actually need locking
2218 if (recorddc.getNeedTrans(lb, current_node)&&
2219 (!state.STMARRAY||state.DUALVIEW||!wrtmp.getType().isArray()||
2220 wrtmp.getType().getSymbol().equals(TypeUtil.ObjectClass))) {
2221 output.println("STOREPTR("+generateTemp(fm, wrtmp,lb)+");/* "+current_node.nodeid+" */");
2223 output.println("STOREPTRNOLOCK("+generateTemp(fm, wrtmp,lb)+");/* "+current_node.nodeid+" */");
2226 output.println("STORE"+wrtmp.getType().getSafeDescriptor()+"("+generateTemp(fm, wrtmp, lb)+");/* "+current_node.nodeid+" */");
2229 //need to read value read by previous node
2230 if (wrtmp.getType().isPtr()) {
2231 output.println("RESTOREPTR("+generateTemp(fm, wrtmp,lb)+");/* "+current_node.nodeid+" */");
2233 output.println("RESTORE"+wrtmp.getType().getSafeDescriptor()+"("+generateTemp(fm, wrtmp, lb)+"); /* "+current_node.nodeid+" */");
2237 nextnode=current_node.getNext(0);
2240 generateFlatNode(fm, lb, current_node, output);
2241 nextnode=current_node.getNext(0);
2243 if (visited.contains(nextnode)) {
2244 output.println("goto L"+nodetolabel.get(nextnode)+";");
2247 current_node=nextnode;
2248 } else if (current_node.numNext()==2) {
2250 if (state.DELAYCOMP) {
2251 boolean computeside=false;
2253 //need to record which way it should go
2254 if (genset==null||genset.contains(current_node)) {
2255 if (storeset!=null&&storeset.contains(current_node)) {
2256 //need to store which way branch goes
2257 generateStoreFlatCondBranch(fm, lb, (FlatCondBranch)current_node, "L"+nodetolabel.get(current_node.getNext(1)), output);
2259 generateFlatCondBranch(fm, lb, (FlatCondBranch)current_node, "L"+nodetolabel.get(current_node.getNext(1)), output);
2261 //which side to execute
2265 if (genset.contains(current_node)) {
2266 generateFlatCondBranch(fm, lb, (FlatCondBranch)current_node, "L"+nodetolabel.get(current_node.getNext(1)), output);
2267 } else if (storeset.contains(current_node)) {
2269 branchanalysis.generateGroupCode(current_node, output, nodetolabel);
2271 //which side to execute
2276 Set<FlatNode> leftset=DelayComputation.getNext(current_node, 0, unionset, lb,locality, true);
2278 if (leftset.size()==0)
2280 if (visited.contains(current_node.getNext(branch))) {
2281 //already visited -- build jump
2282 output.println("goto L"+nodetolabel.get(current_node.getNext(branch))+";");
2285 current_node=current_node.getNext(branch);
2288 if (!visited.contains(current_node.getNext(1)))
2289 tovisit.add(current_node.getNext(1));
2290 if (visited.contains(current_node.getNext(0))) {
2291 output.println("goto L"+nodetolabel.get(current_node.getNext(0))+";");
2294 current_node=current_node.getNext(0);
2298 generateFlatCondBranch(fm, lb, (FlatCondBranch)current_node, "L"+nodetolabel.get(current_node.getNext(1)), output);
2299 if (!visited.contains(current_node.getNext(1)))
2300 tovisit.add(current_node.getNext(1));
2301 if (visited.contains(current_node.getNext(0))) {
2302 output.println("goto L"+nodetolabel.get(current_node.getNext(0))+";");
2305 current_node=current_node.getNext(0);
2307 } else throw new Error();
2311 protected void handleArrayDeref(FlatMethod fm, LocalityBinding lb, FlatNode fn, PrintWriter output, boolean firstpass) {
2312 if (fn.kind()==FKind.FlatSetElementNode) {
2313 FlatSetElementNode fsen=(FlatSetElementNode) fn;
2314 String dst=generateTemp(fm, fsen.getDst(), lb);
2315 String src=generateTemp(fm, fsen.getSrc(), lb);
2316 String index=generateTemp(fm, fsen.getIndex(), lb);
2317 TypeDescriptor elementtype=fsen.getDst().getType().dereference();
2319 if (elementtype.isArray()||elementtype.isClass())
2322 type=elementtype.getSafeSymbol()+" ";
2324 output.println("STOREARRAY("+dst+","+index+","+type+")");
2326 output.println("{");
2327 output.println(" struct ArrayObject *array;");
2328 output.println(" int index;");
2329 output.println(" RESTOREARRAY(array,index);");
2330 output.println(" (("+type+"*)(((char *)&array->___length___)+sizeof(int)))[index]="+src+";");
2331 output.println("}");
2333 } else if (fn.kind()==FKind.FlatElementNode) {
2334 FlatElementNode fen=(FlatElementNode) fn;
2335 String src=generateTemp(fm, fen.getSrc(), lb);
2336 String index=generateTemp(fm, fen.getIndex(), lb);
2337 TypeDescriptor elementtype=fen.getSrc().getType().dereference();
2338 String dst=generateTemp(fm, fen.getDst(), lb);
2340 if (elementtype.isArray()||elementtype.isClass())
2343 type=elementtype.getSafeSymbol()+" ";
2345 output.println("STOREARRAY("+src+","+index+","+type+")");
2347 output.println("{");
2348 output.println(" struct ArrayObject *array;");
2349 output.println(" int index;");
2350 output.println(" RESTOREARRAY(array,index);");
2351 output.println(" "+dst+"=(("+type+"*)(((char *)&array->___length___)+sizeof(int)))[index];");
2352 output.println("}");
2356 /** Special label assignment for delaycomputation */
2357 protected Hashtable<FlatNode, Integer> dcassignLabels(FlatNode first, Set<FlatNode> lastset) {
2358 HashSet tovisit=new HashSet();
2359 HashSet visited=new HashSet();
2361 Hashtable<FlatNode, Integer> nodetolabel=new Hashtable<FlatNode, Integer>();
2363 //Label targets of branches
2364 Set<FlatNode> targets=branchanalysis.getTargets();
2365 for(Iterator<FlatNode> it=targets.iterator(); it.hasNext(); ) {
2366 nodetolabel.put(it.next(), new Integer(labelindex++));
2371 /*Assign labels first. A node needs a label if the previous
2372 * node has two exits or this node is a join point. */
2374 while(!tovisit.isEmpty()) {
2375 FlatNode fn=(FlatNode)tovisit.iterator().next();
2380 if(lastset!=null&&lastset.contains(fn)) {
2381 // if last is not null and matches, don't go
2382 // any further for assigning labels
2386 for(int i=0; i<fn.numNext(); i++) {
2387 FlatNode nn=fn.getNext(i);
2390 //1) Edge >1 of node
2391 nodetolabel.put(nn,new Integer(labelindex++));
2393 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
2397 nodetolabel.put(nn,new Integer(labelindex++));
2405 protected Hashtable<FlatNode, Integer> assignLabels(FlatNode first) {
2406 return assignLabels(first, null);
2409 protected Hashtable<FlatNode, Integer> assignLabels(FlatNode first, Set<FlatNode> lastset) {
2410 HashSet tovisit=new HashSet();
2411 HashSet visited=new HashSet();
2413 Hashtable<FlatNode, Integer> nodetolabel=new Hashtable<FlatNode, Integer>();
2416 /*Assign labels first. A node needs a label if the previous
2417 * node has two exits or this node is a join point. */
2419 while(!tovisit.isEmpty()) {
2420 FlatNode fn=(FlatNode)tovisit.iterator().next();
2425 if(lastset!=null&&lastset.contains(fn)) {
2426 // if last is not null and matches, don't go
2427 // any further for assigning labels
2431 for(int i=0; i<fn.numNext(); i++) {
2432 FlatNode nn=fn.getNext(i);
2435 //1) Edge >1 of node
2436 nodetolabel.put(nn,new Integer(labelindex++));
2438 if (!visited.contains(nn)&&!tovisit.contains(nn)) {
2442 nodetolabel.put(nn,new Integer(labelindex++));
2450 /** Generate text string that corresponds to the TempDescriptor td. */
2451 protected String generateTemp(FlatMethod fm, TempDescriptor td, LocalityBinding lb) {
2452 MethodDescriptor md=fm.getMethod();
2453 TaskDescriptor task=fm.getTask();
2454 TempObject objecttemps=(TempObject) tempstable.get(lb!=null ? lb : md!=null ? md : task);
2456 if (objecttemps.isLocalPrim(td)||objecttemps.isParamPrim(td)) {
2457 return td.getSafeSymbol();
2460 if (objecttemps.isLocalPtr(td)) {
2461 return localsprefixderef+td.getSafeSymbol();
2464 if (objecttemps.isParamPtr(td)) {
2465 return paramsprefix+"->"+td.getSafeSymbol();
2473 protected void generateFlatNode(FlatMethod fm, LocalityBinding lb, FlatNode fn, PrintWriter output) {
2476 additionalCodePreNode(fm, lb, fn, output);
2480 case FKind.FlatAtomicEnterNode:
2481 generateFlatAtomicEnterNode(fm, lb, (FlatAtomicEnterNode) fn, output);
2484 case FKind.FlatAtomicExitNode:
2485 generateFlatAtomicExitNode(fm, lb, (FlatAtomicExitNode) fn, output);
2488 case FKind.FlatInstanceOfNode:
2489 generateFlatInstanceOfNode(fm, lb, (FlatInstanceOfNode)fn, output);
2492 case FKind.FlatSESEEnterNode:
2493 generateFlatSESEEnterNode(fm, lb, (FlatSESEEnterNode)fn, output);
2496 case FKind.FlatSESEExitNode:
2497 generateFlatSESEExitNode(fm, lb, (FlatSESEExitNode)fn, output);
2500 case FKind.FlatWriteDynamicVarNode:
2501 generateFlatWriteDynamicVarNode(fm, lb, (FlatWriteDynamicVarNode)fn, output);
2504 case FKind.FlatGlobalConvNode:
2505 generateFlatGlobalConvNode(fm, lb, (FlatGlobalConvNode) fn, output);
2508 case FKind.FlatTagDeclaration:
2509 generateFlatTagDeclaration(fm, lb, (FlatTagDeclaration) fn,output);
2512 case FKind.FlatCall:
2513 generateFlatCall(fm, lb, (FlatCall) fn,output);
2516 case FKind.FlatFieldNode:
2517 generateFlatFieldNode(fm, lb, (FlatFieldNode) fn,output);
2520 case FKind.FlatElementNode:
2521 generateFlatElementNode(fm, lb, (FlatElementNode) fn,output);
2524 case FKind.FlatSetElementNode:
2525 generateFlatSetElementNode(fm, lb, (FlatSetElementNode) fn,output);
2528 case FKind.FlatSetFieldNode:
2529 generateFlatSetFieldNode(fm, lb, (FlatSetFieldNode) fn,output);
2533 generateFlatNew(fm, lb, (FlatNew) fn,output);
2536 case FKind.FlatOpNode:
2537 generateFlatOpNode(fm, lb, (FlatOpNode) fn,output);
2540 case FKind.FlatCastNode:
2541 generateFlatCastNode(fm, lb, (FlatCastNode) fn,output);
2544 case FKind.FlatLiteralNode:
2545 generateFlatLiteralNode(fm, lb, (FlatLiteralNode) fn,output);
2548 case FKind.FlatReturnNode:
2549 generateFlatReturnNode(fm, lb, (FlatReturnNode) fn,output);
2553 output.println("/* nop */");
2556 case FKind.FlatGenReachNode:
2557 // this node is just for generating a reach graph
2558 // in disjointness analysis at a particular program point
2561 case FKind.FlatExit:
2562 output.println("/* exit */");
2565 case FKind.FlatBackEdge:
2566 if (state.SINGLETM&&state.SANDBOX&&(locality.getAtomic(lb).get(fn).intValue()>0)) {
2567 output.println("if (unlikely((--transaction_check_counter)<=0)) checkObjects();");
2569 if(state.DSM&&state.SANDBOX&&(locality.getAtomic(lb).get(fn).intValue()>0)) {
2570 output.println("if (unlikely((--transaction_check_counter)<=0)) checkObjects();");
2572 if (((state.OOOJAVA||state.THREAD||state.DSM||state.SINGLETM)&&GENERATEPRECISEGC)
2573 || (this.state.MULTICOREGC)) {
2574 if(state.DSM&&locality.getAtomic(lb).get(fn).intValue()>0) {
2575 output.println("if (needtocollect) checkcollect2("+localsprefixaddr+");");
2576 } else if(this.state.MULTICOREGC) {
2577 output.println("if (gcflag) gc("+localsprefixaddr+");");
2579 output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
2582 output.println("/* nop */");
2585 case FKind.FlatCheckNode:
2586 generateFlatCheckNode(fm, lb, (FlatCheckNode) fn, output);
2589 case FKind.FlatFlagActionNode:
2590 generateFlatFlagActionNode(fm, lb, (FlatFlagActionNode) fn, output);
2593 case FKind.FlatPrefetchNode:
2594 generateFlatPrefetchNode(fm,lb, (FlatPrefetchNode) fn, output);
2597 case FKind.FlatOffsetNode:
2598 generateFlatOffsetNode(fm, lb, (FlatOffsetNode)fn, output);
2606 additionalCodePostNode(fm, lb, fn, output);
2609 public void generateFlatOffsetNode(FlatMethod fm, LocalityBinding lb, FlatOffsetNode fofn, PrintWriter output) {
2610 output.println("/* FlatOffsetNode */");
2611 FieldDescriptor fd=fofn.getField();
2612 output.println(generateTemp(fm, fofn.getDst(),lb)+ " = (short)(int) (&((struct "+fofn.getClassType().getSafeSymbol() +" *)0)->"+
2613 fd.getSafeSymbol()+");");
2614 output.println("/* offset */");
2617 public void generateFlatPrefetchNode(FlatMethod fm, LocalityBinding lb, FlatPrefetchNode fpn, PrintWriter output) {
2618 if (state.PREFETCH) {
2619 Vector oids = new Vector();
2620 Vector fieldoffset = new Vector();
2621 Vector endoffset = new Vector();
2622 int tuplecount = 0; //Keeps track of number of prefetch tuples that need to be generated
2623 for(Iterator it = fpn.hspp.iterator(); it.hasNext(); ) {
2624 PrefetchPair pp = (PrefetchPair) it.next();
2625 Integer statusbase = locality.getNodePreTempInfo(lb,fpn).get(pp.base);
2626 /* Find prefetches that can generate oid */
2627 if(statusbase == LocalityAnalysis.GLOBAL) {
2628 generateTransCode(fm, lb, pp, oids, fieldoffset, endoffset, tuplecount, locality.getAtomic(lb).get(fpn).intValue()>0, false);
2630 } else if (statusbase == LocalityAnalysis.LOCAL) {
2631 generateTransCode(fm,lb,pp,oids,fieldoffset,endoffset,tuplecount,false,true);
2638 System.out.println("Adding prefetch "+fpn+ " to method:" +fm);
2639 output.println("{");
2640 output.println("/* prefetch */");
2641 output.println("/* prefetchid_" + fpn.siteid + " */");
2642 output.println("void * prefptr;");
2643 output.println("int tmpindex;");
2645 output.println("if((evalPrefetch["+fpn.siteid+"].operMode) || (evalPrefetch["+fpn.siteid+"].retrycount <= 0)) {");
2646 /*Create C code for oid array */
2647 output.print(" unsigned int oidarray_[] = {");
2648 boolean needcomma=false;
2649 for (Iterator it = oids.iterator(); it.hasNext(); ) {
2652 output.print(it.next());
2655 output.println("};");
2657 /*Create C code for endoffset values */
2658 output.print(" unsigned short endoffsetarry_[] = {");
2660 for (Iterator it = endoffset.iterator(); it.hasNext(); ) {
2663 output.print(it.next());
2666 output.println("};");
2668 /*Create C code for Field Offset Values */
2669 output.print(" short fieldarry_[] = {");
2671 for (Iterator it = fieldoffset.iterator(); it.hasNext(); ) {
2674 output.print(it.next());
2677 output.println("};");
2678 /* make the prefetch call to Runtime */
2679 output.println(" if(!evalPrefetch["+fpn.siteid+"].operMode) {");
2680 output.println(" evalPrefetch["+fpn.siteid+"].retrycount = RETRYINTERVAL;");
2681 output.println(" }");
2682 output.println(" prefetch("+fpn.siteid+" ,"+tuplecount+", oidarray_, endoffsetarry_, fieldarry_);");
2683 output.println(" } else {");
2684 output.println(" evalPrefetch["+fpn.siteid+"].retrycount--;");
2685 output.println(" }");
2686 output.println("}");
2690 public void generateTransCode(FlatMethod fm, LocalityBinding lb,PrefetchPair pp, Vector oids, Vector fieldoffset, Vector endoffset, int tuplecount, boolean inside, boolean localbase) {
2691 short offsetcount = 0;
2695 } else if (localbase) {
2696 for(; breakindex<pp.desc.size(); breakindex++) {
2697 Descriptor desc=pp.getDescAt(breakindex);
2698 if (desc instanceof FieldDescriptor) {
2699 FieldDescriptor fd=(FieldDescriptor)desc;
2700 if (fd.isGlobal()) {
2708 if (breakindex>pp.desc.size()) //all local
2711 TypeDescriptor lasttype=pp.base.getType();
2712 String basestr=generateTemp(fm, pp.base, lb);
2714 boolean maybenull=fm.getMethod().isStatic()||
2715 !pp.base.equals(fm.getParameter(0));
2717 for(int i=0; i<breakindex; i++) {
2718 String indexcheck="";
2720 Descriptor desc=pp.getDescAt(i);
2721 if (desc instanceof FieldDescriptor) {
2722 FieldDescriptor fd=(FieldDescriptor)desc;
2724 if (!teststr.equals(""))
2726 teststr+="((prefptr="+basestr+")!=NULL)";
2727 basestr="((struct "+lasttype.getSafeSymbol()+" *)prefptr)->"+
2730 basestr=basestr+"->"+
2734 lasttype=fd.getType();
2736 IndexDescriptor id=(IndexDescriptor)desc;
2737 indexcheck="((tmpindex=";
2738 for(int j=0; j<id.tddesc.size(); j++) {
2739 indexcheck+=generateTemp(fm, id.getTempDescAt(j), lb)+"+";
2741 indexcheck+=id.offset+")>=0)&(tmpindex<((struct ArrayObject *)prefptr)->___length___)";
2743 if (!teststr.equals(""))
2745 teststr+="((prefptr="+basestr+")!= NULL) &&"+indexcheck;
2746 basestr="((void **)(((char *) &(((struct ArrayObject *)prefptr)->___length___))+sizeof(int)))[tmpindex]";
2748 lasttype=lasttype.dereference();
2753 if (teststr.equals("")) {
2754 oid="((unsigned int)"+basestr+")";
2756 oid="((unsigned int)(("+teststr+")?"+basestr+":NULL))";
2760 for(int i = breakindex; i < pp.desc.size(); i++) {
2761 String newfieldoffset;
2762 Object desc = pp.getDescAt(i);
2763 if(desc instanceof FieldDescriptor) {
2764 FieldDescriptor fd=(FieldDescriptor)desc;
2765 newfieldoffset = new String("(unsigned int)(&(((struct "+ lasttype.getSafeSymbol()+" *)0)->"+ fd.getSafeSymbol()+ "))");
2766 lasttype=fd.getType();
2768 newfieldoffset = "";
2769 IndexDescriptor id=(IndexDescriptor)desc;
2770 for(int j = 0; j < id.tddesc.size(); j++) {
2771 newfieldoffset += generateTemp(fm, id.getTempDescAt(j), lb) + "+";
2773 newfieldoffset += id.offset.toString();
2774 lasttype=lasttype.dereference();
2776 fieldoffset.add(newfieldoffset);
2779 int base=(tuplecount>0) ? ((Short)endoffset.get(tuplecount-1)).intValue() : 0;
2780 base+=pp.desc.size()-breakindex;
2781 endoffset.add(new Short((short)base));
2786 public void generateFlatGlobalConvNode(FlatMethod fm, LocalityBinding lb, FlatGlobalConvNode fgcn, PrintWriter output) {
2787 if (lb!=fgcn.getLocality())
2789 /* Have to generate flat globalconv */
2790 if (fgcn.getMakePtr()) {
2792 output.println("TRANSREAD("+generateTemp(fm, fgcn.getSrc(),lb)+", (unsigned int) "+generateTemp(fm, fgcn.getSrc(),lb)+");");
2794 if ((dc==null)||!state.READSET&&dc.getNeedTrans(lb, fgcn)||state.READSET&&dc.getNeedWriteTrans(lb, fgcn)) {
2795 //need to do translation
2796 output.println("TRANSREAD("+generateTemp(fm, fgcn.getSrc(),lb)+", "+generateTemp(fm, fgcn.getSrc(),lb)+", (void *)("+localsprefixaddr+"));");
2797 } else if (state.READSET&&dc.getNeedTrans(lb, fgcn)) {
2798 if (state.HYBRID&&delaycomp.getConv(lb).contains(fgcn)) {
2799 output.println("TRANSREADRDFISSION("+generateTemp(fm, fgcn.getSrc(),lb)+", "+generateTemp(fm, fgcn.getSrc(),lb)+");");
2801 output.println("TRANSREADRD("+generateTemp(fm, fgcn.getSrc(),lb)+", "+generateTemp(fm, fgcn.getSrc(),lb)+");");
2805 /* Need to convert to OID */
2806 if ((dc==null)||dc.getNeedSrcTrans(lb,fgcn)) {
2807 if (fgcn.doConvert()||(delaycomp!=null&&delaycomp.needsFission(lb, fgcn.getAtomicEnter())&&atomicmethodmap.get(fgcn.getAtomicEnter()).reallivein.contains(fgcn.getSrc()))) {
2808 output.println(generateTemp(fm, fgcn.getSrc(),lb)+"=(void *)COMPOID("+generateTemp(fm, fgcn.getSrc(),lb)+");");
2810 output.println(generateTemp(fm, fgcn.getSrc(),lb)+"=NULL;");
2816 public void generateFlatInstanceOfNode(FlatMethod fm, LocalityBinding lb, FlatInstanceOfNode fion, PrintWriter output) {
2818 if (fion.getType().isArray()) {
2819 type=state.getArrayNumber(fion.getType())+state.numClasses();
2821 type=fion.getType().getClassDesc().getId();
2824 if (fion.getType().getSymbol().equals(TypeUtil.ObjectClass))
2825 output.println(generateTemp(fm, fion.getDst(), lb)+"=1;");
2827 output.println(generateTemp(fm, fion.getDst(), lb)+"=instanceof("+generateTemp(fm,fion.getSrc(),lb)+","+type+");");
2830 int sandboxcounter=0;
2831 public void generateFlatAtomicEnterNode(FlatMethod fm, LocalityBinding lb, FlatAtomicEnterNode faen, PrintWriter output) {
2832 /* Check to see if we need to generate code for this atomic */
2833 if (locality==null) {
2834 if (GENERATEPRECISEGC) {
2835 output.println("if (pthread_mutex_trylock(&atomiclock)!=0) {");
2836 output.println("stopforgc((struct garbagelist *) &___locals___);");
2837 output.println("pthread_mutex_lock(&atomiclock);");
2838 output.println("restartaftergc();");
2839 output.println("}");
2841 output.println("pthread_mutex_lock(&atomiclock);");
2846 if (locality.getAtomic(lb).get(faen.getPrev(0)).intValue()>0)
2850 if (state.SANDBOX) {
2851 outsandbox.println("int atomiccounter"+sandboxcounter+"=LOW_CHECK_FREQUENCY;");
2852 output.println("counter_reset_pointer=&atomiccounter"+sandboxcounter+";");
2855 if (state.DELAYCOMP&&delaycomp.needsFission(lb, faen)) {
2856 AtomicRecord ar=atomicmethodmap.get(faen);
2858 for(Iterator<TempDescriptor> tmpit=ar.livein.iterator(); tmpit.hasNext(); ) {
2859 TempDescriptor tmp=tmpit.next();
2860 output.println("primitives_"+ar.name+"."+tmp.getSafeSymbol()+"="+tmp.getSafeSymbol()+";");
2863 //copy outs that depend on path
2864 for(Iterator<TempDescriptor> tmpit=ar.liveoutvirtualread.iterator(); tmpit.hasNext(); ) {
2865 TempDescriptor tmp=tmpit.next();
2866 if (!ar.livein.contains(tmp))
2867 output.println("primitives_"+ar.name+"."+tmp.getSafeSymbol()+"="+tmp.getSafeSymbol()+";");
2871 /* Backup the temps. */
2872 for(Iterator<TempDescriptor> tmpit=locality.getTemps(lb).get(faen).iterator(); tmpit.hasNext(); ) {
2873 TempDescriptor tmp=tmpit.next();
2874 output.println(generateTemp(fm, backuptable.get(lb).get(tmp),lb)+"="+generateTemp(fm,tmp,lb)+";");
2877 output.println("goto transstart"+faen.getIdentifier()+";");
2879 /******* Print code to retry aborted transaction *******/
2880 output.println("transretry"+faen.getIdentifier()+":");
2883 for(Iterator<TempDescriptor> tmpit=locality.getTemps(lb).get(faen).iterator(); tmpit.hasNext(); ) {
2884 TempDescriptor tmp=tmpit.next();
2885 output.println(generateTemp(fm, tmp,lb)+"="+generateTemp(fm,backuptable.get(lb).get(tmp),lb)+";");
2889 /********* Need to revert local object store ********/
2890 String revertptr=generateTemp(fm, reverttable.get(lb),lb);
2892 output.println("while ("+revertptr+") {");
2893 output.println("struct ___Object___ * tmpptr;");
2894 output.println("tmpptr="+revertptr+"->"+nextobjstr+";");
2895 output.println("REVERT_OBJ("+revertptr+");");
2896 output.println(revertptr+"=tmpptr;");
2897 output.println("}");
2899 /******* Tell the runtime to start the transaction *******/
2901 output.println("transstart"+faen.getIdentifier()+":");
2902 if (state.SANDBOX) {
2903 output.println("transaction_check_counter=*counter_reset_pointer;");
2906 output.println("transStart();");
2908 if (state.ABORTREADERS||state.SANDBOX) {
2910 output.println("abortenabled=1;");
2911 output.println("if (_setjmp(aborttrans)) {");
2912 output.println(" goto transretry"+faen.getIdentifier()+"; }");
2916 public void generateFlatAtomicExitNode(FlatMethod fm, LocalityBinding lb, FlatAtomicExitNode faen, PrintWriter output) {
2917 /* Check to see if we need to generate code for this atomic */
2918 if (locality==null) {
2919 output.println("pthread_mutex_unlock(&atomiclock);");
2922 if (locality.getAtomic(lb).get(faen).intValue()>0)
2924 //store the revert list before we lose the transaction object
2927 String revertptr=generateTemp(fm, reverttable.get(lb),lb);
2928 output.println(revertptr+"=revertlist;");
2929 output.println("if (transCommit()) {");
2930 output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
2931 output.println("goto transretry"+faen.getAtomicEnter().getIdentifier()+";");
2932 output.println("} else {");
2933 /* Need to commit local object store */
2934 output.println("while ("+revertptr+") {");
2935 output.println("struct ___Object___ * tmpptr;");
2936 output.println("tmpptr="+revertptr+"->"+nextobjstr+";");
2937 output.println("COMMIT_OBJ("+revertptr+");");
2938 output.println(revertptr+"=tmpptr;");
2939 output.println("}");
2940 output.println("}");
2944 if (!state.DELAYCOMP) {
2946 output.println("if (transCommit()) {");
2947 /* Transaction aborts if it returns true */
2948 output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
2949 output.println("goto transretry"+faen.getAtomicEnter().getIdentifier()+";");
2950 output.println("}");
2952 if (delaycomp.optimizeTrans(lb, faen.getAtomicEnter())&&(!state.STMARRAY||state.DUALVIEW)) {
2953 AtomicRecord ar=atomicmethodmap.get(faen.getAtomicEnter());
2954 output.println("LIGHTWEIGHTCOMMIT("+ar.name+", &primitives_"+ar.name+", &"+localsprefix+", "+paramsprefix+", transretry"+faen.getAtomicEnter().getIdentifier()+");");
2956 for(Iterator<TempDescriptor> tmpit=ar.liveout.iterator(); tmpit.hasNext(); ) {
2957 TempDescriptor tmp=tmpit.next();
2958 output.println(tmp.getSafeSymbol()+"=primitives_"+ar.name+"."+tmp.getSafeSymbol()+";");
2960 } else if (delaycomp.needsFission(lb, faen.getAtomicEnter())) {
2961 AtomicRecord ar=atomicmethodmap.get(faen.getAtomicEnter());
2963 output.println("if (transCommit((void (*)(void *, void *, void *))&"+ar.name+", &primitives_"+ar.name+", &"+localsprefix+", "+paramsprefix+")) {");
2964 output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
2965 output.println("goto transretry"+faen.getAtomicEnter().getIdentifier()+";");
2966 output.println("}");
2968 output.println("else {");
2969 for(Iterator<TempDescriptor> tmpit=ar.liveout.iterator(); tmpit.hasNext(); ) {
2970 TempDescriptor tmp=tmpit.next();
2971 output.println(tmp.getSafeSymbol()+"=primitives_"+ar.name+"."+tmp.getSafeSymbol()+";");
2973 output.println("}");
2975 output.println("if (transCommit(NULL, NULL, NULL, NULL)) {");
2976 output.println("if (unlikely(needtocollect)) checkcollect("+localsprefixaddr+");");
2977 output.println("goto transretry"+faen.getAtomicEnter().getIdentifier()+";");
2978 output.println("}");
2983 public void generateFlatSESEEnterNode(FlatMethod fm,
2985 FlatSESEEnterNode fsen,
2986 PrintWriter output) {
2987 // if OOOJAVA flag is off, okay that SESE nodes are in IR graph,
2988 // just skip over them and code generates exactly the same
2991 public void generateFlatSESEExitNode(FlatMethod fm,
2993 FlatSESEExitNode fsexn,
2994 PrintWriter output) {
2995 // if OOOJAVA flag is off, okay that SESE nodes are in IR graph,
2996 // just skip over them and code generates exactly the same
2999 public void generateFlatWriteDynamicVarNode(FlatMethod fm,
3001 FlatWriteDynamicVarNode fwdvn,
3004 if( !state.OOOJAVA ) {
3005 // should node should not be in an IR graph if the
3006 // OOOJAVA flag is not set
3007 throw new Error("Unexpected presence of FlatWriteDynamicVarNode");
3012 private void generateFlatCheckNode(FlatMethod fm, LocalityBinding lb, FlatCheckNode fcn, PrintWriter output) {
3013 if (state.CONSCHECK) {
3014 String specname=fcn.getSpec();
3015 String varname="repairstate___";
3016 output.println("{");
3017 output.println("struct "+specname+"_state * "+varname+"=allocate"+specname+"_state();");
3019 TempDescriptor[] temps=fcn.getTemps();
3020 String[] vars=fcn.getVars();
3021 for(int i=0; i<temps.length; i++) {
3022 output.println(varname+"->"+vars[i]+"=(unsigned int)"+generateTemp(fm, temps[i],lb)+";");
3025 output.println("if (doanalysis"+specname+"("+varname+")) {");
3026 output.println("free"+specname+"_state("+varname+");");
3027 output.println("} else {");
3028 output.println("/* Bad invariant */");
3029 output.println("free"+specname+"_state("+varname+");");
3030 output.println("abort_task();");
3031 output.println("}");
3032 output.println("}");
3036 private void generateFlatCall(FlatMethod fm, LocalityBinding lb, FlatCall fc, PrintWriter output) {
3038 MethodDescriptor md=fc.getMethod();
3039 ParamsObject objectparams=(ParamsObject)paramstable.get(lb!=null ? locality.getBinding(lb, fc) : md);
3040 ClassDescriptor cn=md.getClassDesc();
3042 // if the called method is a static block or a static method or a constructor
3043 // need to check if it can be invoked inside some static block
3045 // TODO add version for normal Java later
3046 if((md.isStatic() || md.isStaticBlock() || md.isConstructor()) &&
3047 ((fm.getMethod().isStaticBlock()) || (fm.getMethod().isInvokedByStatic()))) {
3048 if(!md.isInvokedByStatic()) {
3049 System.err.println("Error: a method that is invoked inside a static block is not tagged!");
3051 // is a static block or is invoked in some static block
3052 ClassDescriptor cd = fm.getMethod().getClassDesc();
3054 // the same class, do nothing
3055 // TODO may want to invoke static field initialization here
3057 if((cn.getNumStaticFields() != 0) || (cn.getNumStaticBlocks() != 0)) {
3058 // need to check if the class' static fields have been initialized and/or
3059 // its static blocks have been executed
3060 output.println("#ifdef MGC_STATIC_INIT_CHECK");
3061 output.println("if(global_defs_p->" + cn.getSafeSymbol()+"static_block_exe_flag == 0) {");
3062 if(cn.getNumStaticBlocks() != 0) {
3063 MethodDescriptor t_md = (MethodDescriptor)cn.getMethodTable().get("staticblocks");
3064 output.println(" "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"();");
3066 output.println(" global_defs_p->" + cn.getSafeSymbol()+"static_block_exe_flag = 1;");
3068 output.println("}");
3069 output.println("#endif // MGC_STATIC_INIT_CHECK");
3073 if((md.getSymbol().equals("MonitorEnter") || md.getSymbol().equals("MonitorExit")) && fc.getThis().getSymbol().equals("classobj")) {
3074 // call MonitorEnter/MonitorExit on a class obj
3075 output.println(" " + cn.getSafeSymbol()+md.getSafeSymbol()+"_"
3076 +md.getSafeMethodDescriptor() + "((struct ___Object___*)(&global_defs_p->"
3077 + fc.getThis().getType().getClassDesc().getSafeSymbol() +"classobj));");
3082 output.println("{");
3083 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
3085 LocalityBinding fclb=locality.getBinding(lb, fc);
3086 output.print(" struct "+cn.getSafeSymbol()+fclb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __parameterlist__={");
3088 output.print(" struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __parameterlist__={");
3089 output.print(objectparams.numPointers());
3090 output.print(", "+localsprefixaddr);
3091 if (md.getThis()!=null) {
3093 output.print("(struct "+md.getThis().getType().getSafeSymbol() +" *)"+ generateTemp(fm,fc.getThis(),lb));
3095 if (fc.getThis()!=null&&md.getThis()==null) {
3096 System.out.println("WARNING!!!!!!!!!!!!");
3097 System.out.println("Source code calls static method "+md+" on an object in "+fm.getMethod()+"!");
3101 for(int i=0; i<fc.numArgs(); i++) {
3102 Descriptor var=md.getParameter(i);
3103 TempDescriptor paramtemp=(TempDescriptor)temptovar.get(var);
3104 if (objectparams.isParamPtr(paramtemp)) {
3105 TempDescriptor targ=fc.getArg(i);
3107 TypeDescriptor td=md.getParamType(i);
3109 output.print("(struct "+(new TypeDescriptor(typeutil.getClass(TypeUtil.TagClass))).getSafeSymbol() +" *)"+generateTemp(fm, targ,lb));
3111 output.print("(struct "+md.getParamType(i).getSafeSymbol() +" *)"+generateTemp(fm, targ,lb));
3114 output.println("};");
3119 if (fc.getReturnTemp()!=null)
3120 output.print(generateTemp(fm,fc.getReturnTemp(),lb)+"=");
3122 /* Do we need to do virtual dispatch? */
3123 if (md.isStatic()||md.getReturnType()==null||singleCall(fc.getThis().getType().getClassDesc(),md)) {
3126 LocalityBinding fclb=locality.getBinding(lb, fc);
3127 output.print(cn.getSafeSymbol()+fclb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor());
3129 output.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor());
3134 if (state.MGC && md.getReturnType().isClass() && md.getReturnType().getClassDesc().isEnum()) {
3135 output.print("int ");
3136 } else if (md.getReturnType().isClass()||md.getReturnType().isArray())
3137 output.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
3139 output.print(md.getReturnType().getSafeSymbol()+" ");
3140 output.print("(*)(");
3142 boolean printcomma=false;
3143 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
3145 LocalityBinding fclb=locality.getBinding(lb, fc);
3146 output.print("struct "+cn.getSafeSymbol()+fclb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * ");
3148 output.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * ");
3152 for(int i=0; i<objectparams.numPrimitives(); i++) {
3153 TempDescriptor temp=objectparams.getPrimitive(i);
3157 if (state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
3158 output.print("int ");
3159 } else if (temp.getType().isClass()||temp.getType().isArray())
3160 output.print("struct " + temp.getType().getSafeSymbol()+" * ");
3162 output.print(temp.getType().getSafeSymbol());
3167 LocalityBinding fclb=locality.getBinding(lb, fc);
3168 output.print("))virtualtable["+generateTemp(fm,fc.getThis(),lb)+"->type*"+maxcount+"+"+virtualcalls.getLocalityNumber(fclb)+"])");
3170 output.print("))virtualtable["+generateTemp(fm,fc.getThis(),lb)+"->type*"+maxcount+"+"+virtualcalls.getMethodNumber(md)+"])");
3174 boolean needcomma=false;
3175 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
3176 output.print("&__parameterlist__");
3180 if (!GENERATEPRECISEGC && !this.state.MULTICOREGC) {
3181 if (fc.getThis()!=null) {
3182 TypeDescriptor ptd=null;
3183 if(md.getThis() != null) {
3184 ptd = md.getThis().getType();
3186 ptd = fc.getThis().getType();
3190 if(state.MGC && ptd.isClass() && ptd.getClassDesc().isEnum()) {
3192 } else if (ptd.isClass()&&!ptd.isArray())
3193 output.print("(struct "+ptd.getSafeSymbol()+" *) ");
3194 output.print(generateTemp(fm,fc.getThis(),lb));
3199 for(int i=0; i<fc.numArgs(); i++) {
3200 Descriptor var=md.getParameter(i);
3201 TempDescriptor paramtemp=(TempDescriptor)temptovar.get(var);
3202 if (objectparams.isParamPrim(paramtemp)) {
3203 TempDescriptor targ=fc.getArg(i);
3207 TypeDescriptor ptd=md.getParamType(i);
3208 if (state.MGC && ptd.isClass() && ptd.getClassDesc().isEnum()) {
3210 } else if (ptd.isClass()&&!ptd.isArray())
3211 output.print("(struct "+ptd.getSafeSymbol()+" *) ");
3212 output.print(generateTemp(fm, targ,lb));
3216 output.println(");");
3217 output.println(" }");
3220 private boolean singleCall(ClassDescriptor thiscd, MethodDescriptor md) {
3221 Set subclasses=typeutil.getSubClasses(thiscd);
3222 if (subclasses==null)
3224 for(Iterator classit=subclasses.iterator(); classit.hasNext(); ) {
3225 ClassDescriptor cd=(ClassDescriptor)classit.next();
3226 Set possiblematches=cd.getMethodTable().getSetFromSameScope(md.getSymbol());
3227 for(Iterator matchit=possiblematches.iterator(); matchit.hasNext(); ) {
3228 MethodDescriptor matchmd=(MethodDescriptor)matchit.next();
3229 if (md.matches(matchmd))
3236 private void generateFlatFieldNode(FlatMethod fm, LocalityBinding lb, FlatFieldNode ffn, PrintWriter output) {
3237 if (state.SINGLETM) {
3238 //single machine transactional memory case
3239 String field=ffn.getField().getSafeSymbol();
3240 String src=generateTemp(fm, ffn.getSrc(),lb);
3241 String dst=generateTemp(fm, ffn.getDst(),lb);
3243 output.println(dst+"="+ src +"->"+field+ ";");
3244 if (ffn.getField().getType().isPtr()&&locality.getAtomic(lb).get(ffn).intValue()>0&&
3245 locality.getNodePreTempInfo(lb, ffn).get(ffn.getSrc())!=LocalityAnalysis.SCRATCH) {
3246 if ((dc==null)||(!state.READSET&&dc.getNeedTrans(lb, ffn))||
3247 (state.READSET&&dc.getNeedWriteTrans(lb, ffn))) {
3248 output.println("TRANSREAD("+dst+", "+dst+", (void *) (" + localsprefixaddr + "));");
3249 } else if (state.READSET&&dc.getNeedTrans(lb, ffn)) {
3250 if (state.HYBRID&&delaycomp.getConv(lb).contains(ffn)) {
3251 output.println("TRANSREADRDFISSION("+dst+", "+dst+");");
3253 output.println("TRANSREADRD("+dst+", "+dst+");");
3256 } else if (state.DSM) {
3257 Integer status=locality.getNodePreTempInfo(lb,ffn).get(ffn.getSrc());
3258 if (status==LocalityAnalysis.GLOBAL) {
3259 String field=ffn.getField().getSafeSymbol();
3260 String src=generateTemp(fm, ffn.getSrc(),lb);
3261 String dst=generateTemp(fm, ffn.getDst(),lb);
3263 if (ffn.getField().getType().isPtr()) {
3264 output.println(dst+"="+ src +"->"+field+ ";");
3265 output.println("TRANSREAD("+dst+", (unsigned int) "+dst+");");
3267 output.println(dst+"="+ src+"->"+field+";");
3269 } else if (status==LocalityAnalysis.LOCAL) {
3270 if (ffn.getField().getType().isPtr()&&
3271 ffn.getField().isGlobal()) {
3272 String field=ffn.getField().getSafeSymbol();
3273 String src=generateTemp(fm, ffn.getSrc(),lb);
3274 String dst=generateTemp(fm, ffn.getDst(),lb);
3275 output.println(dst+"="+ src +"->"+field+ ";");
3276 if (locality.getAtomic(lb).get(ffn).intValue()>0)
3277 output.println("TRANSREAD("+dst+", (unsigned int) "+dst+");");
3279 output.println(generateTemp(fm, ffn.getDst(),lb)+"="+ generateTemp(fm,ffn.getSrc(),lb)+"->"+ ffn.getField().getSafeSymbol()+";");
3280 } else if (status==LocalityAnalysis.EITHER) {
3281 //Code is reading from a null pointer
3282 output.println("if ("+generateTemp(fm, ffn.getSrc(),lb)+") {");
3283 output.println("#ifndef RAW");
3284 output.println("printf(\"BIG ERROR\\n\");exit(-1);}");
3285 output.println("#endif");
3286 //This should throw a suitable null pointer error
3287 output.println(generateTemp(fm, ffn.getDst(),lb)+"="+ generateTemp(fm,ffn.getSrc(),lb)+"->"+ ffn.getField().getSafeSymbol()+";");
3289 throw new Error("Read from non-global/non-local in:"+lb.getExplanation());
3292 // TODO add version for normal Java later
3293 if(ffn.getField().isStatic()) {
3295 if((fm.getMethod().isStaticBlock()) || (fm.getMethod().isInvokedByStatic())) {
3296 // is a static block or is invoked in some static block
3297 ClassDescriptor cd = fm.getMethod().getClassDesc();
3298 ClassDescriptor cn = ffn.getSrc().getType().getClassDesc();
3300 // the same class, do nothing
3301 // TODO may want to invoke static field initialization here
3303 if((cn.getNumStaticFields() != 0) || (cn.getNumStaticBlocks() != 0)) {
3304 // need to check if the class' static fields have been initialized and/or
3305 // its static blocks have been executed
3306 output.println("#ifdef MGC_STATIC_INIT_CHECK");
3307 output.println("if(global_defs_p->" + cn.getSafeSymbol()+"static_block_exe_flag == 0) {");
3308 if(cn.getNumStaticBlocks() != 0) {
3309 MethodDescriptor t_md = (MethodDescriptor)cn.getMethodTable().get("staticblocks");
3310 output.println(" "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"();");
3312 output.println(" global_defs_p->" + cn.getSafeSymbol()+"static_block_exe_flag = 1;");
3314 output.println("}");
3315 output.println("#endif // MGC_STATIC_INIT_CHECK");
3319 // redirect to the global_defs_p structure
3320 if((ffn.getField().isStatic()) || (ffn.getSrc().getType().isClassNameRef())) {
3321 // reference to the static field with Class name
3322 output.println(generateTemp(fm, ffn.getDst(),lb)+"=global_defs_p->"+ffn.getField().getSafeSymbol()+";");
3324 output.println(generateTemp(fm, ffn.getDst(),lb)+"=*"+ generateTemp(fm,ffn.getSrc(),lb)+"->"+ ffn.getField().getSafeSymbol()+";");
3326 } else if (ffn.getField().isEnum()) {
3327 // an Enum value, directly replace the field access as int
3328 output.println(generateTemp(fm, ffn.getDst(), lb) + "=" + ffn.getField().enumValue() + ";");
3330 output.println(generateTemp(fm, ffn.getDst(),lb)+"="+ generateTemp(fm,ffn.getSrc(),lb)+"->"+ ffn.getField().getSafeSymbol()+";");
3333 output.println(generateTemp(fm, ffn.getDst(),lb)+"="+ generateTemp(fm,ffn.getSrc(),lb)+"->"+ ffn.getField().getSafeSymbol()+";");
3339 private void generateFlatSetFieldNode(FlatMethod fm, LocalityBinding lb, FlatSetFieldNode fsfn, PrintWriter output) {
3340 if (fsfn.getField().getSymbol().equals("length")&&fsfn.getDst().getType().isArray())
3341 throw new Error("Can't set array length");
3342 if (state.SINGLETM && locality.getAtomic(lb).get(fsfn).intValue()>0) {
3343 //Single Machine Transaction Case
3344 boolean srcptr=fsfn.getSrc().getType().isPtr();
3345 String src=generateTemp(fm,fsfn.getSrc(),lb);
3346 String dst=generateTemp(fm,fsfn.getDst(),lb);
3347 output.println("//"+srcptr+" "+fsfn.getSrc().getType().isNull());
3348 if (srcptr&&!fsfn.getSrc().getType().isNull()) {
3349 output.println("{");
3350 if ((dc==null)||dc.getNeedSrcTrans(lb, fsfn)&&
3351 locality.getNodePreTempInfo(lb, fsfn).get(fsfn.getSrc())!=LocalityAnalysis.SCRATCH) {
3352 output.println("INTPTR srcoid=("+src+"!=NULL?((INTPTR)"+src+"->"+oidstr+"):0);");
3354 output.println("INTPTR srcoid=(INTPTR)"+src+";");
3357 if (wb.needBarrier(fsfn)&&
3358 locality.getNodePreTempInfo(lb, fsfn).get(fsfn.getDst())!=LocalityAnalysis.SCRATCH) {
3359 if (state.EVENTMONITOR) {
3360 output.println("if ("+dst+"->___objstatus___&DIRTY) EVLOGEVENTOBJ(EV_WRITE,"+dst+"->objuid)");
3362 output.println("*((unsigned int *)&("+dst+"->___objstatus___))|=DIRTY;");
3364 if (srcptr&!fsfn.getSrc().getType().isNull()) {
3365 output.println("*((unsigned INTPTR *)&("+dst+"->"+
3366 fsfn.getField().getSafeSymbol()+"))=srcoid;");
3367 output.println("}");
3369 output.println(dst+"->"+
3370 fsfn.getField().getSafeSymbol()+"="+ src+";");
3372 } else if (state.DSM && locality.getAtomic(lb).get(fsfn).intValue()>0) {
3373 Integer statussrc=locality.getNodePreTempInfo(lb,fsfn).get(fsfn.getSrc());
3374 Integer statusdst=locality.getNodeTempInfo(lb).get(fsfn).get(fsfn.getDst());
3375 boolean srcglobal=statussrc==LocalityAnalysis.GLOBAL;
3377 String src=generateTemp(fm,fsfn.getSrc(),lb);
3378 String dst=generateTemp(fm,fsfn.getDst(),lb);
3380 output.println("{");
3381 output.println("INTPTR srcoid=("+src+"!=NULL?((INTPTR)"+src+"->"+oidstr+"):0);");
3383 if (statusdst.equals(LocalityAnalysis.GLOBAL)) {
3386 if (wb.needBarrier(fsfn))
3387 output.println("*((unsigned int *)&("+dst+"->___localcopy___))|=DIRTY;");
3389 output.println("*((unsigned INTPTR *)&("+glbdst+"->"+
3390 fsfn.getField().getSafeSymbol()+"))=srcoid;");
3392 output.println(glbdst+"->"+
3393 fsfn.getField().getSafeSymbol()+"="+ src+";");
3394 } else if (statusdst.equals(LocalityAnalysis.LOCAL)) {
3395 /** Check if we need to copy */
3396 output.println("if(!"+dst+"->"+localcopystr+") {");
3397 /* Link object into list */
3398 String revertptr=generateTemp(fm, reverttable.get(lb),lb);
3399 output.println(revertptr+"=revertlist;");
3400 if (GENERATEPRECISEGC || this.state.MULTICOREGC)
3401 output.println("COPY_OBJ((struct garbagelist *)"+localsprefixaddr+",(struct ___Object___ *)"+dst+");");
3403 output.println("COPY_OBJ("+dst+");");
3404 output.println(dst+"->"+nextobjstr+"="+revertptr+";");
3405 output.println("revertlist=(struct ___Object___ *)"+dst+";");
3406 output.println("}");
3408 output.println(dst+"->"+
3409 fsfn.getField().getSafeSymbol()+"=(void *) srcoid;");
3411 output.println(dst+"->"+
3412 fsfn.getField().getSafeSymbol()+"="+ src+";");
3413 } else if (statusdst.equals(LocalityAnalysis.EITHER)) {
3414 //writing to a null...bad
3415 output.println("if ("+dst+") {");
3416 output.println("printf(\"BIG ERROR 2\\n\");exit(-1);}");
3418 output.println(dst+"->"+
3419 fsfn.getField().getSafeSymbol()+"=(void *) srcoid;");
3421 output.println(dst+"->"+
3422 fsfn.getField().getSafeSymbol()+"="+ src+";");
3425 output.println("}");
3428 if (state.FASTCHECK) {
3429 String dst=generateTemp(fm, fsfn.getDst(),lb);
3430 output.println("if(!"+dst+"->"+localcopystr+") {");
3431 /* Link object into list */
3432 if (GENERATEPRECISEGC || this.state.MULTICOREGC)
3433 output.println("COPY_OBJ((struct garbagelist *)"+localsprefixaddr+",(struct ___Object___ *)"+dst+");");
3435 output.println("COPY_OBJ("+dst+");");
3436 output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
3437 output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
3438 output.println("}");
3441 // TODO add version for normal Java later
3442 if(fsfn.getField().isStatic()) {
3444 if((fm.getMethod().isStaticBlock()) || (fm.getMethod().isInvokedByStatic())) {
3445 // is a static block or is invoked in some static block
3446 ClassDescriptor cd = fm.getMethod().getClassDesc();
3447 ClassDescriptor cn = fsfn.getDst().getType().getClassDesc();
3449 // the same class, do nothing
3450 // TODO may want to invoke static field initialization here
3452 if((cn.getNumStaticFields() != 0) || (cn.getNumStaticBlocks() != 0)) {
3453 // need to check if the class' static fields have been initialized and/or
3454 // its static blocks have been executed
3455 output.println("#ifdef MGC_STATIC_INIT_CHECK");
3456 output.println("if(global_defs_p->" + cn.getSafeSymbol()+"static_block_exe_flag == 0) {");
3457 if(cn.getNumStaticFields() != 0) {
3458 // TODO add static field initialization here
3460 if(cn.getNumStaticBlocks() != 0) {
3461 MethodDescriptor t_md = (MethodDescriptor)cn.getMethodTable().get("staticblocks");
3462 output.println(" "+cn.getSafeSymbol()+t_md.getSafeSymbol()+"_"+t_md.getSafeMethodDescriptor()+"();");
3464 output.println(" global_defs_p->" + cn.getSafeSymbol()+"static_block_exe_flag = 1;");
3466 output.println("}");
3467 output.println("#endif // MGC_STATIC_INIT_CHECK");
3471 // redirect to the global_defs_p structure
3472 if(fsfn.getDst().getType().isClassNameRef()) {
3473 // reference to the static field with Class name
3474 output.println("global_defs_p->" +
3475 fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
3477 output.println("*"+generateTemp(fm, fsfn.getDst(),lb)+"->"+
3478 fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
3481 output.println(generateTemp(fm, fsfn.getDst(),lb)+"->"+
3482 fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
3485 output.println(generateTemp(fm, fsfn.getDst(),lb)+"->"+
3486 fsfn.getField().getSafeSymbol()+"="+ generateTemp(fm,fsfn.getSrc(),lb)+";");
3491 private void generateFlatElementNode(FlatMethod fm, LocalityBinding lb, FlatElementNode fen, PrintWriter output) {
3492 TypeDescriptor elementtype=fen.getSrc().getType().dereference();
3495 if (state.MGC && elementtype.isClass() && elementtype.getClassDesc().isEnum()) {
3497 } else if (elementtype.isArray()||elementtype.isClass())
3500 type=elementtype.getSafeSymbol()+" ";
3502 if (this.state.ARRAYBOUNDARYCHECK && fen.needsBoundsCheck()) {
3503 output.println("if (unlikely(((unsigned int)"+generateTemp(fm, fen.getIndex(),lb)+") >= "+generateTemp(fm,fen.getSrc(),lb) + "->___length___))");
3504 output.println("failedboundschk();");
3506 if (state.SINGLETM) {
3507 //Single machine transaction case
3508 String dst=generateTemp(fm, fen.getDst(),lb);
3509 if ((!state.STMARRAY)||(!wb.needBarrier(fen))||locality.getNodePreTempInfo(lb, fen).get(fen.getSrc())==LocalityAnalysis.SCRATCH||locality.getAtomic(lb).get(fen).intValue()==0||(state.READSET&&!dc.getNeedGet(lb, fen))) {
3510 output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
3512 output.println("STMGETARRAY("+dst+", "+ generateTemp(fm,fen.getSrc(),lb)+", "+generateTemp(fm, fen.getIndex(),lb)+", "+type+");");
3515 if (elementtype.isPtr()&&locality.getAtomic(lb).get(fen).intValue()>0&&
3516 locality.getNodePreTempInfo(lb, fen).get(fen.getSrc())!=LocalityAnalysis.SCRATCH) {
3517 if ((dc==null)||!state.READSET&&dc.getNeedTrans(lb, fen)||state.READSET&&dc.getNeedWriteTrans(lb, fen)) {
3518 output.println("TRANSREAD("+dst+", "+dst+", (void *)(" + localsprefixaddr+"));");
3519 } else if (state.READSET&&dc.getNeedTrans(lb, fen)) {
3520 if (state.HYBRID&&delaycomp.getConv(lb).contains(fen)) {
3521 output.println("TRANSREADRDFISSION("+dst+", "+dst+");");
3523 output.println("TRANSREADRD("+dst+", "+dst+");");
3526 } else if (state.DSM) {
3527 Integer status=locality.getNodePreTempInfo(lb,fen).get(fen.getSrc());
3528 if (status==LocalityAnalysis.GLOBAL) {
3529 String dst=generateTemp(fm, fen.getDst(),lb);
3530 if (elementtype.isPtr()) {
3531 output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
3532 output.println("TRANSREAD("+dst+", "+dst+");");
3534 output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
3536 } else if (status==LocalityAnalysis.LOCAL) {
3537 output.println(generateTemp(fm, fen.getDst(),lb)+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
3538 } else if (status==LocalityAnalysis.EITHER) {
3539 //Code is reading from a null pointer
3540 output.println("if ("+generateTemp(fm, fen.getSrc(),lb)+") {");
3541 output.println("#ifndef RAW");
3542 output.println("printf(\"BIG ERROR\\n\");exit(-1);}");
3543 output.println("#endif");
3544 //This should throw a suitable null pointer error
3545 output.println(generateTemp(fm, fen.getDst(),lb)+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
3547 throw new Error("Read from non-global/non-local in:"+lb.getExplanation());
3549 output.println(generateTemp(fm, fen.getDst(),lb)+"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
3553 private void generateFlatSetElementNode(FlatMethod fm, LocalityBinding lb, FlatSetElementNode fsen, PrintWriter output) {
3554 //TODO: need dynamic check to make sure this assignment is actually legal
3555 //Because Object[] could actually be something more specific...ie. Integer[]
3557 TypeDescriptor elementtype=fsen.getDst().getType().dereference();
3560 if (state.MGC && elementtype.isClass() && elementtype.getClassDesc().isEnum()) {
3562 } else if (elementtype.isArray()||elementtype.isClass() || (state.MGC && elementtype.isNull()))
3565 type=elementtype.getSafeSymbol()+" ";
3567 if (this.state.ARRAYBOUNDARYCHECK && fsen.needsBoundsCheck()) {
3568 output.println("if (unlikely(((unsigned int)"+generateTemp(fm, fsen.getIndex(),lb)+") >= "+generateTemp(fm,fsen.getDst(),lb) + "->___length___))");
3569 output.println("failedboundschk();");
3572 if (state.SINGLETM && locality.getAtomic(lb).get(fsen).intValue()>0) {
3573 //Transaction set element case
3574 if (wb.needBarrier(fsen)&&
3575 locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH) {
3576 output.println("*((unsigned int *)&("+generateTemp(fm,fsen.getDst(),lb)+"->___objstatus___))|=DIRTY;");
3578 if (fsen.getSrc().getType().isPtr()&&!fsen.getSrc().getType().isNull()) {
3579 output.println("{");
3580 String src=generateTemp(fm, fsen.getSrc(), lb);
3581 if ((dc==null)||dc.getNeedSrcTrans(lb, fsen)&&
3582 locality.getNodePreTempInfo(lb, fsen).get(fsen.getSrc())!=LocalityAnalysis.SCRATCH) {
3583 output.println("INTPTR srcoid=("+src+"!=NULL?((INTPTR)"+src+"->"+oidstr+"):0);");
3585 output.println("INTPTR srcoid=(INTPTR)"+src+";");
3587 if (state.STMARRAY&&locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH&&wb.needBarrier(fsen)&&locality.getAtomic(lb).get(fsen).intValue()>0) {
3588 output.println("STMSETARRAY("+generateTemp(fm, fsen.getDst(),lb)+", "+generateTemp(fm, fsen.getIndex(),lb)+", srcoid, INTPTR);");
3590 output.println("((INTPTR*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]=srcoid;");
3592 output.println("}");
3594 if (state.STMARRAY&&locality.getNodePreTempInfo(lb, fsen).get(fsen.getDst())!=LocalityAnalysis.SCRATCH&&wb.needBarrier(fsen)&&locality.getAtomic(lb).get(fsen).intValue()>0) {
3595 output.println("STMSETARRAY("+generateTemp(fm, fsen.getDst(),lb)+", "+generateTemp(fm, fsen.getIndex(),lb)+", "+ generateTemp(fm, fsen.getSrc(), lb) +", "+type+");");
3597 output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
3600 } else if (state.DSM && locality.getAtomic(lb).get(fsen).intValue()>0) {
3601 Integer statussrc=locality.getNodePreTempInfo(lb,fsen).get(fsen.getSrc());
3602 Integer statusdst=locality.getNodePreTempInfo(lb,fsen).get(fsen.getDst());
3603 boolean srcglobal=statussrc==LocalityAnalysis.GLOBAL;
3604 boolean dstglobal=statusdst==LocalityAnalysis.GLOBAL;
3605 boolean dstlocal=(statusdst==LocalityAnalysis.LOCAL)||(statusdst==LocalityAnalysis.EITHER);
3608 if (wb.needBarrier(fsen))
3609 output.println("*((unsigned int *)&("+generateTemp(fm,fsen.getDst(),lb)+"->___localcopy___))|=DIRTY;");
3610 } else if (dstlocal) {
3611 /** Check if we need to copy */
3612 String dst=generateTemp(fm, fsen.getDst(),lb);
3613 output.println("if(!"+dst+"->"+localcopystr+") {");
3614 /* Link object into list */
3615 String revertptr=generateTemp(fm, reverttable.get(lb),lb);
3616 output.println(revertptr+"=revertlist;");
3617 if ((GENERATEPRECISEGC) || this.state.MULTICOREGC)
3618 output.println("COPY_OBJ((struct garbagelist *)"+localsprefixaddr+",(struct ___Object___ *)"+dst+");");
3620 output.println("COPY_OBJ("+dst+");");
3621 output.println(dst+"->"+nextobjstr+"="+revertptr+";");
3622 output.println("revertlist=(struct ___Object___ *)"+dst+";");
3623 output.println("}");
3625 System.out.println("Node: "+fsen);
3626 System.out.println(lb);
3627 System.out.println("statusdst="+statusdst);
3628 System.out.println(fm.printMethod());
3629 throw new Error("Unknown array type");
3632 output.println("{");
3633 String src=generateTemp(fm, fsen.getSrc(), lb);
3634 output.println("INTPTR srcoid=("+src+"!=NULL?((INTPTR)"+src+"->"+oidstr+"):0);");
3635 output.println("((INTPTR*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]=srcoid;");
3636 output.println("}");
3638 output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
3641 if (state.FASTCHECK) {
3642 String dst=generateTemp(fm, fsen.getDst(),lb);
3643 output.println("if(!"+dst+"->"+localcopystr+") {");
3644 /* Link object into list */
3645 if (GENERATEPRECISEGC || this.state.MULTICOREGC)
3646 output.println("COPY_OBJ((struct garbagelist *)"+localsprefixaddr+",(struct ___Object___ *)"+dst+");");
3648 output.println("COPY_OBJ("+dst+");");
3649 output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
3650 output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
3651 output.println("}");
3653 output.println("(("+type +"*)(((char *) &("+ generateTemp(fm,fsen.getDst(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fsen.getIndex(),lb)+"]="+generateTemp(fm,fsen.getSrc(),lb)+";");
3658 protected void generateFlatNew(FlatMethod fm, LocalityBinding lb, FlatNew fn, PrintWriter output) {
3659 if (state.DSM && locality.getAtomic(lb).get(fn).intValue()>0&&!fn.isGlobal()) {
3660 //Stash pointer in case of GC
3661 String revertptr=generateTemp(fm, reverttable.get(lb),lb);
3662 output.println(revertptr+"=revertlist;");
3664 if (state.SINGLETM) {
3665 if (fn.getType().isArray()) {
3666 int arrayid=state.getArrayNumber(fn.getType())+state.numClasses();
3667 if (locality.getAtomic(lb).get(fn).intValue()>0) {
3668 //inside transaction
3669 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_newarraytrans("+localsprefixaddr+", "+arrayid+", "+generateTemp(fm, fn.getSize(),lb)+");");
3671 //outside transaction
3672 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_newarray("+localsprefixaddr+", "+arrayid+", "+generateTemp(fm, fn.getSize(),lb)+");");
3675 if (locality.getAtomic(lb).get(fn).intValue()>0) {
3676 //inside transaction
3677 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_newtrans("+localsprefixaddr+", "+fn.getType().getClassDesc().getId()+");");
3679 //outside transaction
3680 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_new("+localsprefixaddr+", "+fn.getType().getClassDesc().getId()+");");
3683 } else if (fn.getType().isArray()) {
3684 int arrayid=state.getArrayNumber(fn.getType())+state.numClasses();
3685 if (fn.isGlobal()&&(state.DSM||state.SINGLETM)) {
3686 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_newarrayglobal("+arrayid+", "+generateTemp(fm, fn.getSize(),lb)+");");
3687 } else if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
3688 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_newarray("+localsprefixaddr+", "+arrayid+", "+generateTemp(fm, fn.getSize(),lb)+");");
3690 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_newarray("+arrayid+", "+generateTemp(fm, fn.getSize(),lb)+");");
3693 if (fn.isGlobal()&&(state.DSM||state.SINGLETM)) {
3694 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_newglobal("+fn.getType().getClassDesc().getId()+");");
3695 } else if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
3696 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_new("+localsprefixaddr+", "+fn.getType().getClassDesc().getId()+");");
3698 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_new("+fn.getType().getClassDesc().getId()+");");
3701 if (state.DSM && locality.getAtomic(lb).get(fn).intValue()>0&&!fn.isGlobal()) {
3702 String revertptr=generateTemp(fm, reverttable.get(lb),lb);
3703 String dst=generateTemp(fm,fn.getDst(),lb);
3704 output.println(dst+"->___localcopy___=(struct ___Object___*)1;");
3705 output.println(dst+"->"+nextobjstr+"="+revertptr+";");
3706 output.println("revertlist=(struct ___Object___ *)"+dst+";");
3708 if (state.FASTCHECK) {
3709 String dst=generateTemp(fm,fn.getDst(),lb);
3710 output.println(dst+"->___localcopy___=(struct ___Object___*)1;");
3711 output.println(dst+"->"+nextobjstr+"="+fcrevert+";");
3712 output.println(fcrevert+"=(struct ___Object___ *)"+dst+";");
3716 private void generateFlatTagDeclaration(FlatMethod fm, LocalityBinding lb, FlatTagDeclaration fn, PrintWriter output) {
3717 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
3718 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_tag("+localsprefixaddr+", "+state.getTagId(fn.getType())+");");
3720 output.println(generateTemp(fm,fn.getDst(),lb)+"=allocate_tag("+state.getTagId(fn.getType())+");");
3724 private void generateFlatOpNode(FlatMethod fm, LocalityBinding lb, FlatOpNode fon, PrintWriter output) {
3725 if (fon.getRight()!=null) {
3726 if (fon.getOp().getOp()==Operation.URIGHTSHIFT) {
3727 if (fon.getLeft().getType().isLong())
3728 output.println(generateTemp(fm, fon.getDest(),lb)+" = ((unsigned long long)"+generateTemp(fm, fon.getLeft(),lb)+")>>"+generateTemp(fm,fon.getRight(),lb)+";");
3730 output.println(generateTemp(fm, fon.getDest(),lb)+" = ((unsigned int)"+generateTemp(fm, fon.getLeft(),lb)+")>>"+generateTemp(fm,fon.getRight(),lb)+";");
3732 } else if (dc!=null) {
3733 output.print(generateTemp(fm, fon.getDest(),lb)+" = (");
3734 if (fon.getLeft().getType().isPtr()&&(fon.getOp().getOp()==Operation.EQUAL||fon.getOp().getOp()==Operation.NOTEQUAL))
3735 output.print("(void *)");
3736 if (dc.getNeedLeftSrcTrans(lb, fon))
3737 output.print("("+generateTemp(fm, fon.getLeft(),lb)+"!=NULL?"+generateTemp(fm, fon.getLeft(),lb)+"->"+oidstr+":NULL)");
3739 output.print(generateTemp(fm, fon.getLeft(),lb));
3740 output.print(")"+fon.getOp().toString()+"(");
3741 if (fon.getRight().getType().isPtr()&&(fon.getOp().getOp()==Operation.EQUAL||fon.getOp().getOp()==Operation.NOTEQUAL))
3742 output.print("(void *)");
3743 if (dc.getNeedRightSrcTrans(lb, fon))
3744 output.println("("+generateTemp(fm, fon.getRight(),lb)+"!=NULL?"+generateTemp(fm, fon.getRight(),lb)+"->"+oidstr+":NULL));");
3746 output.println(generateTemp(fm,fon.getRight(),lb)+");");
3748 output.println(generateTemp(fm, fon.getDest(),lb)+" = "+generateTemp(fm, fon.getLeft(),lb)+fon.getOp().toString()+generateTemp(fm,fon.getRight(),lb)+";");
3749 } else if (fon.getOp().getOp()==Operation.ASSIGN)
3750 output.println(generateTemp(fm, fon.getDest(),lb)+" = "+generateTemp(fm, fon.getLeft(),lb)+";");
3751 else if (fon.getOp().getOp()==Operation.UNARYPLUS)
3752 output.println(generateTemp(fm, fon.getDest(),lb)+" = "+generateTemp(fm, fon.getLeft(),lb)+";");
3753 else if (fon.getOp().getOp()==Operation.UNARYMINUS)
3754 output.println(generateTemp(fm, fon.getDest(),lb)+" = -"+generateTemp(fm, fon.getLeft(),lb)+";");
3755 else if (fon.getOp().getOp()==Operation.LOGIC_NOT)
3756 output.println(generateTemp(fm, fon.getDest(),lb)+" = !"+generateTemp(fm, fon.getLeft(),lb)+";");
3757 else if (fon.getOp().getOp()==Operation.COMP)
3758 output.println(generateTemp(fm, fon.getDest(),lb)+" = ~"+generateTemp(fm, fon.getLeft(),lb)+";");
3759 else if (fon.getOp().getOp()==Operation.ISAVAILABLE) {
3760 output.println(generateTemp(fm, fon.getDest(),lb)+" = "+generateTemp(fm, fon.getLeft(),lb)+"->fses==NULL;");
3762 output.println(generateTemp(fm, fon.getDest(),lb)+fon.getOp().toString()+generateTemp(fm, fon.getLeft(),lb)+";");
3765 private void generateFlatCastNode(FlatMethod fm, LocalityBinding lb, FlatCastNode fcn, PrintWriter output) {
3766 /* TODO: Do type check here */
3767 if (fcn.getType().isArray()) {
3768 output.println(generateTemp(fm,fcn.getDst(),lb)+"=(struct ArrayObject *)"+generateTemp(fm,fcn.getSrc(),lb)+";");
3769 } else if (state.MGC && fcn.getType().isClass() && fcn.getType().getClassDesc().isEnum()) {
3770 output.println(generateTemp(fm,fcn.getDst(),lb)+"=(int)"+generateTemp(fm,fcn.getSrc(),lb)+";");
3771 } else if (fcn.getType().isClass())
3772 output.println(generateTemp(fm,fcn.getDst(),lb)+"=(struct "+fcn.getType().getSafeSymbol()+" *)"+generateTemp(fm,fcn.getSrc(),lb)+";");
3774 output.println(generateTemp(fm,fcn.getDst(),lb)+"=("+fcn.getType().getSafeSymbol()+")"+generateTemp(fm,fcn.getSrc(),lb)+";");
3777 private void generateFlatLiteralNode(FlatMethod fm, LocalityBinding lb, FlatLiteralNode fln, PrintWriter output) {
3778 if (fln.getValue()==null)
3779 output.println(generateTemp(fm, fln.getDst(),lb)+"=0;");
3780 else if (fln.getType().getSymbol().equals(TypeUtil.StringClass)) {
3781 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
3782 if (state.DSM && locality.getAtomic(lb).get(fln).intValue()>0) {
3783 //Stash pointer in case of GC
3784 String revertptr=generateTemp(fm, reverttable.get(lb),lb);
3785 output.println(revertptr+"=revertlist;");
3787 output.println(generateTemp(fm, fln.getDst(),lb)+"=NewString("+localsprefixaddr+", \""+FlatLiteralNode.escapeString((String)fln.getValue())+"\","+((String)fln.getValue()).length()+");");
3788 if (state.DSM && locality.getAtomic(lb).get(fln).intValue()>0) {
3789 //Stash pointer in case of GC
3790 String revertptr=generateTemp(fm, reverttable.get(lb),lb);
3791 output.println("revertlist="+revertptr+";");
3794 output.println(generateTemp(fm, fln.getDst(),lb)+"=NewString(\""+FlatLiteralNode.escapeString((String)fln.getValue())+"\","+((String)fln.getValue()).length()+");");
3796 } else if (fln.getType().isBoolean()) {
3797 if (((Boolean)fln.getValue()).booleanValue())
3798 output.println(generateTemp(fm, fln.getDst(),lb)+"=1;");
3800 output.println(generateTemp(fm, fln.getDst(),lb)+"=0;");
3801 } else if (fln.getType().isChar()) {
3802 String st=FlatLiteralNode.escapeString(fln.getValue().toString());
3803 output.println(generateTemp(fm, fln.getDst(),lb)+"='"+st+"';");
3804 } else if (fln.getType().isLong()) {
3805 output.println(generateTemp(fm, fln.getDst(),lb)+"="+fln.getValue()+"LL;");
3807 output.println(generateTemp(fm, fln.getDst(),lb)+"="+fln.getValue()+";");
3810 protected void generateFlatReturnNode(FlatMethod fm, LocalityBinding lb, FlatReturnNode frn, PrintWriter output) {
3812 // TODO add version for normal Java later
3813 if((fm.getMethod() != null) && (fm.getMethod().isStaticBlock())) {
3814 // a static block, check if it has been executed
3815 output.println(" global_defs_p->" + fm.getMethod().getClassDesc().getSafeSymbol()+"static_block_exe_flag = 1;");
3819 if (frn.getReturnTemp()!=null) {
3820 if (frn.getReturnTemp().getType().isPtr())
3821 output.println("return (struct "+fm.getMethod().getReturnType().getSafeSymbol()+"*)"+generateTemp(fm, frn.getReturnTemp(), lb)+";");
3823 output.println("return "+generateTemp(fm, frn.getReturnTemp(), lb)+";");
3825 output.println("return;");
3829 protected void generateStoreFlatCondBranch(FlatMethod fm, LocalityBinding lb, FlatCondBranch fcb, String label, PrintWriter output) {
3832 //only record if this group has more than one exit
3833 if (branchanalysis.numJumps(fcb)>1) {
3834 left=branchanalysis.jumpValue(fcb, 0);
3835 right=branchanalysis.jumpValue(fcb, 1);
3837 output.println("if (!"+generateTemp(fm, fcb.getTest(),lb)+") {");
3839 output.println("STOREBRANCH("+right+");");
3840 output.println("goto "+label+";");
3841 output.println("}");
3843 output.println("STOREBRANCH("+left+");");
3846 protected void generateFlatCondBranch(FlatMethod fm, LocalityBinding lb, FlatCondBranch fcb, String label, PrintWriter output) {
3847 output.println("if (!"+generateTemp(fm, fcb.getTest(),lb)+") goto "+label+";");
3850 /** This method generates header information for the method or
3851 * task referenced by the Descriptor des. */
3852 private void generateHeader(FlatMethod fm, LocalityBinding lb, Descriptor des, PrintWriter output) {
3853 generateHeader(fm, lb, des, output, false);
3856 private void generateHeader(FlatMethod fm, LocalityBinding lb, Descriptor des, PrintWriter output, boolean addSESErecord) {
3858 ParamsObject objectparams=(ParamsObject)paramstable.get(lb!=null ? lb : des);
3859 MethodDescriptor md=null;
3860 TaskDescriptor task=null;
3861 if (des instanceof MethodDescriptor)
3862 md=(MethodDescriptor) des;
3864 task=(TaskDescriptor) des;
3866 ClassDescriptor cn=md!=null ? md.getClassDesc() : null;
3868 if (md!=null&&md.getReturnType()!=null) {
3869 if (state.MGC && md.getReturnType().isClass() && md.getReturnType().getClassDesc().isEnum()) {
3870 output.print("int ");
3871 } else if (md.getReturnType().isClass()||md.getReturnType().isArray())
3872 output.print("struct " + md.getReturnType().getSafeSymbol()+" * ");
3874 output.print(md.getReturnType().getSafeSymbol()+" ");
3876 //catch the constructor case
3877 output.print("void ");
3879 if (state.DSM||state.SINGLETM) {
3880 output.print(cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(");
3882 output.print(cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(");
3884 output.print(task.getSafeSymbol()+"(");
3886 boolean printcomma=false;
3887 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
3889 if (state.DSM||state.SINGLETM) {
3890 output.print("struct "+cn.getSafeSymbol()+lb.getSignature()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * "+paramsprefix);
3892 output.print("struct "+cn.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params * "+paramsprefix);
3894 output.print("struct "+task.getSafeSymbol()+"_params * "+paramsprefix);
3900 for(int i=0; i<objectparams.numPrimitives(); i++) {
3901 TempDescriptor temp=objectparams.getPrimitive(i);
3905 if(state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
3906 output.print("int " + temp.getSafeSymbol());
3907 } else if (temp.getType().isClass()||temp.getType().isArray())
3908 output.print("struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol());
3910 output.print(temp.getType().getSafeSymbol()+" "+temp.getSafeSymbol());
3912 output.println(") {");
3913 } else if (!GENERATEPRECISEGC && !this.state.MULTICOREGC) {
3914 /* Imprecise Task */
3915 output.println("void * parameterarray[]) {");
3916 /* Unpack variables */
3917 for(int i=0; i<objectparams.numPrimitives(); i++) {
3918 TempDescriptor temp=objectparams.getPrimitive(i);
3919 if(state.MGC && temp.getType().isClass() && temp.getType().getClassDesc().isEnum()) {
3920 output.print("int " + temp.getSafeSymbol() + "=parameterarray["+i+"];");
3922 output.println("struct "+temp.getType().getSafeSymbol()+" * "+temp.getSafeSymbol()+"=parameterarray["+i+"];");
3925 for(int i=0; i<fm.numTags(); i++) {
3926 TempDescriptor temp=fm.getTag(i);
3927 int offset=i+objectparams.numPrimitives();
3928 output.println("struct ___TagDescriptor___ * "+temp.getSafeSymbol()+"=parameterarray["+offset+"];");
3931 if ((objectparams.numPrimitives()+fm.numTags())>maxtaskparams)
3932 maxtaskparams=objectparams.numPrimitives()+fm.numTags();
3933 } else output.println(") {");
3936 public void generateFlatFlagActionNode(FlatMethod fm, LocalityBinding lb, FlatFlagActionNode ffan, PrintWriter output) {
3937 output.println("/* FlatFlagActionNode */");
3940 /* Process tag changes */
3941 Relation tagsettable=new Relation();
3942 Relation tagcleartable=new Relation();
3944 Iterator tagsit=ffan.getTempTagPairs();
3945 while (tagsit.hasNext()) {
3946 TempTagPair ttp=(TempTagPair) tagsit.next();
3947 TempDescriptor objtmp=ttp.getTemp();
3948 TagDescriptor tag=ttp.getTag();
3949 TempDescriptor tagtmp=ttp.getTagTemp();
3950 boolean tagstatus=ffan.getTagChange(ttp);
3952 tagsettable.put(objtmp, tagtmp);
3954 tagcleartable.put(objtmp, tagtmp);
3959 Hashtable flagandtable=new Hashtable();
3960 Hashtable flagortable=new Hashtable();
3962 /* Process flag changes */
3963 Iterator flagsit=ffan.getTempFlagPairs();
3964 while(flagsit.hasNext()) {
3965 TempFlagPair tfp=(TempFlagPair)flagsit.next();
3966 TempDescriptor temp=tfp.getTemp();
3967 Hashtable flagtable=(Hashtable)flagorder.get(temp.getType().getClassDesc());
3968 FlagDescriptor flag=tfp.getFlag();
3970 //Newly allocate objects that don't set any flags case
3971 if (flagortable.containsKey(temp)) {
3975 flagortable.put(temp,new Integer(mask));
3977 int flagid=1<<((Integer)flagtable.get(flag)).intValue();
3978 boolean flagstatus=ffan.getFlagChange(tfp);
3981 if (flagortable.containsKey(temp)) {
3982 mask=((Integer)flagortable.get(temp)).intValue();
3985 flagortable.put(temp,new Integer(mask));
3987 int mask=0xFFFFFFFF;
3988 if (flagandtable.containsKey(temp)) {
3989 mask=((Integer)flagandtable.get(temp)).intValue();
3991 mask&=(0xFFFFFFFF^flagid);
3992 flagandtable.put(temp,new Integer(mask));
3998 HashSet flagtagset=new HashSet();
3999 flagtagset.addAll(flagortable.keySet());
4000 flagtagset.addAll(flagandtable.keySet());
4001 flagtagset.addAll(tagsettable.keySet());
4002 flagtagset.addAll(tagcleartable.keySet());
4004 Iterator ftit=flagtagset.iterator();
4005 while(ftit.hasNext()) {
4006 TempDescriptor temp=(TempDescriptor)ftit.next();
4009 Set tagtmps=tagcleartable.get(temp);
4010 if (tagtmps!=null) {
4011 Iterator tagit=tagtmps.iterator();
4012 while(tagit.hasNext()) {
4013 TempDescriptor tagtmp=(TempDescriptor)tagit.next();
4014 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC))
4015 output.println("tagclear("+localsprefixaddr+", (struct ___Object___ *)"+generateTemp(fm, temp,lb)+", "+generateTemp(fm,tagtmp,lb)+");");
4017 output.println("tagclear((struct ___Object___ *)"+generateTemp(fm, temp,lb)+", "+generateTemp(fm,tagtmp,lb)+");");
4021 tagtmps=tagsettable.get(temp);
4022 if (tagtmps!=null) {
4023 Iterator tagit=tagtmps.iterator();
4024 while(tagit.hasNext()) {
4025 TempDescriptor tagtmp=(TempDescriptor)tagit.next();
4026 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC))
4027 output.println("tagset("+localsprefixaddr+", (struct ___Object___ *)"+generateTemp(fm, temp,lb)+", "+generateTemp(fm,tagtmp,lb)+");");
4029 output.println("tagset((struct ___Object___ *)"+generateTemp(fm, temp, lb)+", "+generateTemp(fm,tagtmp, lb)+");");
4034 int andmask=0xFFFFFFF;
4036 if (flagortable.containsKey(temp))
4037 ormask=((Integer)flagortable.get(temp)).intValue();
4038 if (flagandtable.containsKey(temp))
4039 andmask=((Integer)flagandtable.get(temp)).intValue();
4040 generateFlagOrAnd(ffan, fm, lb, temp, output, ormask, andmask);
4041 generateObjectDistribute(ffan, fm, lb, temp, output);
4045 protected void generateFlagOrAnd(FlatFlagActionNode ffan, FlatMethod fm, LocalityBinding lb, TempDescriptor temp,
4046 PrintWriter output, int ormask, int andmask) {
4047 if (ffan.getTaskType()==FlatFlagActionNode.NEWOBJECT) {
4048 output.println("flagorandinit("+generateTemp(fm, temp, lb)+", 0x"+Integer.toHexString(ormask)+", 0x"+Integer.toHexString(andmask)+");");
4050 output.println("flagorand("+generateTemp(fm, temp, lb)+", 0x"+Integer.toHexString(ormask)+", 0x"+Integer.toHexString(andmask)+");");
4054 protected void generateObjectDistribute(FlatFlagActionNode ffan, FlatMethod fm, LocalityBinding lb, TempDescriptor temp, PrintWriter output) {
4055 output.println("enqueueObject("+generateTemp(fm, temp, lb)+");");
4058 void generateOptionalHeader(PrintWriter headers) {
4061 headers.println("#include \"task.h\"\n\n");
4062 headers.println("#ifndef _OPTIONAL_STRUCT_");
4063 headers.println("#define _OPTIONAL_STRUCT_");
4065 //STRUCT PREDICATEMEMBER
4066 headers.println("struct predicatemember{");
4067 headers.println("int type;");
4068 headers.println("int numdnfterms;");
4069 headers.println("int * flags;");
4070 headers.println("int numtags;");
4071 headers.println("int * tags;\n};\n\n");
4073 //STRUCT OPTIONALTASKDESCRIPTOR
4074 headers.println("struct optionaltaskdescriptor{");
4075 headers.println("struct taskdescriptor * task;");
4076 headers.println("int index;");
4077 headers.println("int numenterflags;");
4078 headers.println("int * enterflags;");
4079 headers.println("int numpredicatemembers;");
4080 headers.println("struct predicatemember ** predicatememberarray;");
4081 headers.println("};\n\n");
4083 //STRUCT TASKFAILURE
4084 headers.println("struct taskfailure {");
4085 headers.println("struct taskdescriptor * task;");
4086 headers.println("int index;");
4087 headers.println("int numoptionaltaskdescriptors;");
4088 headers.println("struct optionaltaskdescriptor ** optionaltaskdescriptorarray;\n};\n\n");
4090 //STRUCT FSANALYSISWRAPPER
4091 headers.println("struct fsanalysiswrapper{");
4092 headers.println("int flags;");
4093 headers.println("int numtags;");
4094 headers.println("int * tags;");
4095 headers.println("int numtaskfailures;");
4096 headers.println("struct taskfailure ** taskfailurearray;");
4097 headers.println("int numoptionaltaskdescriptors;");
4098 headers.println("struct optionaltaskdescriptor ** optionaltaskdescriptorarray;\n};\n\n");
4100 //STRUCT CLASSANALYSISWRAPPER
4101 headers.println("struct classanalysiswrapper{");
4102 headers.println("int type;");
4103 headers.println("int numotd;");
4104 headers.println("struct optionaltaskdescriptor ** otdarray;");
4105 headers.println("int numfsanalysiswrappers;");
4106 headers.println("struct fsanalysiswrapper ** fsanalysiswrapperarray;\n};");
4108 headers.println("extern struct classanalysiswrapper * classanalysiswrapperarray[];");
4110 Iterator taskit=state.getTaskSymbolTable().getDescriptorsIterator();
4111 while(taskit.hasNext()) {
4112 TaskDescriptor td=(TaskDescriptor)taskit.next();
4113 headers.println("extern struct taskdescriptor task_"+td.getSafeSymbol()+";");
4118 //CHECK OVER THIS -- THERE COULD BE SOME ERRORS HERE
4119 int generateOptionalPredicate(Predicate predicate, OptionalTaskDescriptor otd, ClassDescriptor cdtemp, PrintWriter output) {
4120 int predicateindex = 0;
4121 //iterate through the classes concerned by the predicate
4122 Set c_vard = predicate.vardescriptors;
4123 Hashtable<TempDescriptor, Integer> slotnumber=new Hashtable<TempDescriptor, Integer>();
4126 for(Iterator vard_it = c_vard.iterator(); vard_it.hasNext(); ) {
4127 VarDescriptor vard = (VarDescriptor)vard_it.next();
4128 TypeDescriptor typed = vard.getType();
4130 //generate for flags
4131 HashSet fen_hashset = predicate.flags.get(vard.getSymbol());
4132 output.println("int predicateflags_"+predicateindex+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"[]={");
4134 if (fen_hashset!=null) {
4135 for (Iterator fen_it = fen_hashset.iterator(); fen_it.hasNext(); ) {
4136 FlagExpressionNode fen = (FlagExpressionNode)fen_it.next();
4138 DNFFlag dflag=fen.getDNF();
4139 numberterms+=dflag.size();
4141 Hashtable flags=(Hashtable)flagorder.get(typed.getClassDesc());
4143 for(int j=0; j<dflag.size(); j++) {
4145 output.println(",");
4146 Vector term=dflag.get(j);
4149 for(int k=0; k<term.size(); k++) {
4150 DNFFlagAtom dfa=(DNFFlagAtom)term.get(k);
4151 FlagDescriptor fd=dfa.getFlag();
4152 boolean negated=dfa.getNegated();
4153 int flagid=1<<((Integer)flags.get(fd)).intValue();
4158 output.print("/*andmask*/0x"+Integer.toHexString(andmask)+", /*checkmask*/0x"+Integer.toHexString(checkmask));
4163 output.println("};\n");
4166 TagExpressionList tagel = predicate.tags.get(vard.getSymbol());
4167 output.println("int predicatetags_"+predicateindex+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"[]={");
4170 for(int j=0; j<tagel.numTags(); j++) {
4172 output.println(",");
4173 TempDescriptor tmp=tagel.getTemp(j);
4174 if (!slotnumber.containsKey(tmp)) {
4175 Integer slotint=new Integer(current_slot++);
4176 slotnumber.put(tmp,slotint);
4178 int slot=slotnumber.get(tmp).intValue();
4179 output.println("/* slot */"+ slot+", /*tagid*/"+state.getTagId(tmp.getTag()));
4181 numtags = tagel.numTags();
4183 output.println("};");
4185 //store the result into a predicatemember struct
4186 output.println("struct predicatemember predicatemember_"+predicateindex+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"={");
4187 output.println("/*type*/"+typed.getClassDesc().getId()+",");
4188 output.println("/* number of dnf terms */"+numberterms+",");
4189 output.println("predicateflags_"+predicateindex+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+",");
4190 output.println("/* number of tag */"+numtags+",");
4191 output.println("predicatetags_"+predicateindex+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+",");
4192 output.println("};\n");
4197 //generate an array that stores the entire predicate
4198 output.println("struct predicatemember * predicatememberarray_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"[]={");
4199 for( int j = 0; j<predicateindex; j++) {
4200 if( j != predicateindex-1) output.println("&predicatemember_"+j+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+",");
4201 else output.println("&predicatemember_"+j+"_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol());
4203 output.println("};\n");
4204 return predicateindex;
4208 void generateOptionalArrays(PrintWriter output, PrintWriter headers, Hashtable<ClassDescriptor, Hashtable<FlagState, Set<OptionalTaskDescriptor>>> safeexecution, Hashtable optionaltaskdescriptors) {
4209 generateOptionalHeader(headers);
4211 output.println("#include \"optionalstruct.h\"\n\n");
4212 output.println("#include \"stdlib.h\"\n");
4214 HashSet processedcd = new HashSet();
4216 Enumeration e = safeexecution.keys();
4217 while (e.hasMoreElements()) {
4220 ClassDescriptor cdtemp=(ClassDescriptor)e.nextElement();
4221 Hashtable flaginfo=(Hashtable)flagorder.get(cdtemp); //will be used several times
4223 //Generate the struct of optionals
4224 Collection c_otd = ((Hashtable)optionaltaskdescriptors.get(cdtemp)).values();
4225 numotd = c_otd.size();
4226 if(maxotd<numotd) maxotd = numotd;
4227 if( !c_otd.isEmpty() ) {
4228 for(Iterator otd_it = c_otd.iterator(); otd_it.hasNext(); ) {
4229 OptionalTaskDescriptor otd = (OptionalTaskDescriptor)otd_it.next();
4231 //generate the int arrays for the predicate
4232 Predicate predicate = otd.predicate;
4233 int predicateindex = generateOptionalPredicate(predicate, otd, cdtemp, output);
4234 TreeSet<Integer> fsset=new TreeSet<Integer>();
4235 //iterate through possible FSes corresponding to
4236 //the state when entering
4238 for(Iterator fses = otd.enterflagstates.iterator(); fses.hasNext(); ) {
4239 FlagState fs = (FlagState)fses.next();
4241 for(Iterator flags = fs.getFlags(); flags.hasNext(); ) {
4242 FlagDescriptor flagd = (FlagDescriptor)flags.next();
4243 int id=1<<((Integer)flaginfo.get(flagd)).intValue();
4246 fsset.add(new Integer(flagid));
4247 //tag information not needed because tag
4248 //changes are not tolerated.
4251 output.println("int enterflag_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"[]={");
4252 boolean needcomma=false;
4253 for(Iterator<Integer> it=fsset.iterator(); it.hasNext(); ) {
4256 output.println(it.next());
4259 output.println("};\n");
4262 //generate optionaltaskdescriptor that actually
4263 //includes exit fses, predicate and the task
4265 output.println("struct optionaltaskdescriptor optionaltaskdescriptor_"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+"={");
4266 output.println("&task_"+otd.td.getSafeSymbol()+",");
4267 output.println("/*index*/"+otd.getIndex()+",");
4268 output.println("/*number of enter flags*/"+fsset.size()+",");
4269 output.println("enterflag_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+",");
4270 output.println("/*number of members */"+predicateindex+",");
4271 output.println("predicatememberarray_OTD"+otd.getuid()+"_"+cdtemp.getSafeSymbol()+",");
4272 output.println("};\n");
4276 // if there are no optionals, there is no need to build the rest of the struct
4278 output.println("struct optionaltaskdescriptor * otdarray"+cdtemp.getSafeSymbol()+"[]={");
4279 c_otd = ((Hashtable)optionaltaskdescriptors.get(cdtemp)).values();
4280 if( !c_otd.isEmpty() ) {
4281 boolean needcomma=false;
4282 for(Iterator otd_it = c_otd.iterator(); otd_it.hasNext(); ) {
4283 OptionalTaskDescriptor otd = (OptionalTaskDescriptor)otd_it.next();
4285 output.println(",");
4287 output.println("&optionaltaskdescriptor_"+otd.getuid()+"_"+cdtemp.getSafeSymbol());
4290 output.println("};\n");
4292 //get all the possible flagstates reachable by an object
4293 Hashtable hashtbtemp = safeexecution.get(cdtemp);
4295 TreeSet fsts=new TreeSet(new FlagComparator(flaginfo));
4296 fsts.addAll(hashtbtemp.keySet());
4297 for(Iterator fsit=fsts.iterator(); fsit.hasNext(); ) {
4298 FlagState fs = (FlagState)fsit.next();
4301 //get the set of OptionalTaskDescriptors corresponding
4302 HashSet<OptionalTaskDescriptor> availabletasks = (HashSet<OptionalTaskDescriptor>)hashtbtemp.get(fs);
4303 //iterate through the OptionalTaskDescriptors and
4304 //store the pointers to the optionals struct (see on
4305 //top) into an array
4307 output.println("struct optionaltaskdescriptor * optionaltaskdescriptorarray_FS"+fscounter+"_"+cdtemp.getSafeSymbol()+"[] = {");
4308 for(Iterator<OptionalTaskDescriptor> mos = ordertd(availabletasks).iterator(); mos.hasNext(); ) {
4309 OptionalTaskDescriptor mm = mos.next();
4311 output.println("&optionaltaskdescriptor_"+mm.getuid()+"_"+cdtemp.getSafeSymbol());
4313 output.println("&optionaltaskdescriptor_"+mm.getuid()+"_"+cdtemp.getSafeSymbol()+",");
4316 output.println("};\n");
4318 //process flag information (what the flag after failure is) so we know what optionaltaskdescriptors to choose.
4321 for(Iterator flags = fs.getFlags(); flags.hasNext(); ) {
4322 FlagDescriptor flagd = (FlagDescriptor)flags.next();
4323 int id=1<<((Integer)flaginfo.get(flagd)).intValue();
4327 //process tag information
4330 boolean first = true;
4331 Enumeration tag_enum = fs.getTags();
4332 output.println("int tags_FS"+fscounter+"_"+cdtemp.getSafeSymbol()+"[]={");
4333 while(tag_enum.hasMoreElements()) {
4335 TagDescriptor tagd = (TagDescriptor)tag_enum.nextElement();
4339 output.println(", ");
4340 output.println("/*tagid*/"+state.getTagId(tagd));
4342 output.println("};");
4344 Set<TaskIndex> tiset=sa.getTaskIndex(fs);
4345 for(Iterator<TaskIndex> itti=tiset.iterator(); itti.hasNext(); ) {
4346 TaskIndex ti=itti.next();
4350 Set<OptionalTaskDescriptor> otdset=sa.getOptions(fs, ti);
4352 output.print("struct optionaltaskdescriptor * optionaltaskfailure_FS"+fscounter+"_"+ti.getTask().getSafeSymbol()+"_"+ti.getIndex()+"_array[] = {");
4353 boolean needcomma=false;
4354 for(Iterator<OptionalTaskDescriptor> otdit=ordertd(otdset).iterator(); otdit.hasNext(); ) {
4355 OptionalTaskDescriptor otd=otdit.next();
4359 output.println("&optionaltaskdescriptor_"+otd.getuid()+"_"+cdtemp.getSafeSymbol());
4361 output.println("};");
4363 output.print("struct taskfailure taskfailure_FS"+fscounter+"_"+ti.getTask().getSafeSymbol()+"_"+ti.getIndex()+" = {");
4364 output.print("&task_"+ti.getTask().getSafeSymbol()+", ");
4365 output.print(ti.getIndex()+", ");
4366 output.print(otdset.size()+", ");
4367 output.print("optionaltaskfailure_FS"+fscounter+"_"+ti.getTask().getSafeSymbol()+"_"+ti.getIndex()+"_array");
4368 output.println("};");
4371 tiset=sa.getTaskIndex(fs);
4372 boolean needcomma=false;
4374 output.println("struct taskfailure * taskfailurearray"+fscounter+"_"+cdtemp.getSafeSymbol()+"[]={");
4375 for(Iterator<TaskIndex> itti=tiset.iterator(); itti.hasNext(); ) {
4376 TaskIndex ti=itti.next();
4377 if (ti.isRuntime()) {
4384 output.print("&taskfailure_FS"+fscounter+"_"+ti.getTask().getSafeSymbol()+"_"+ti.getIndex());
4386 output.println("};\n");
4388 //Store the result in fsanalysiswrapper
4390 output.println("struct fsanalysiswrapper fsanalysiswrapper_FS"+fscounter+"_"+cdtemp.getSafeSymbol()+"={");
4391 output.println("/*flag*/"+flagid+",");
4392 output.println("/* number of tags*/"+tagcounter+",");
4393 output.println("tags_FS"+fscounter+"_"+cdtemp.getSafeSymbol()+",");
4394 output.println("/* numtask failures */"+(tiset.size()-runtimeti)+",");
4395 output.println("taskfailurearray"+fscounter+"_"+cdtemp.getSafeSymbol()+",");
4396 output.println("/* number of optionaltaskdescriptors */"+availabletasks.size()+",");
4397 output.println("optionaltaskdescriptorarray_FS"+fscounter+"_"+cdtemp.getSafeSymbol());
4398 output.println("};\n");
4402 //Build the array of fsanalysiswrappers
4403 output.println("struct fsanalysiswrapper * fsanalysiswrapperarray_"+cdtemp.getSafeSymbol()+"[] = {");
4404 boolean needcomma=false;
4405 for(int i = 0; i<fscounter; i++) {
4406 if (needcomma) output.print(",");
4407 output.println("&fsanalysiswrapper_FS"+(i+1)+"_"+cdtemp.getSafeSymbol());
4410 output.println("};");
4412 //Build the classanalysiswrapper referring to the previous array
4413 output.println("struct classanalysiswrapper classanalysiswrapper_"+cdtemp.getSafeSymbol()+"={");
4414 output.println("/*type*/"+cdtemp.getId()+",");
4415 output.println("/*numotd*/"+numotd+",");
4416 output.println("otdarray"+cdtemp.getSafeSymbol()+",");
4417 output.println("/* number of fsanalysiswrappers */"+fscounter+",");
4418 output.println("fsanalysiswrapperarray_"+cdtemp.getSafeSymbol()+"};\n");
4419 processedcd.add(cdtemp);
4422 //build an array containing every classes for which code has been build
4423 output.println("struct classanalysiswrapper * classanalysiswrapperarray[]={");
4424 for(int i=0; i<state.numClasses(); i++) {
4425 ClassDescriptor cn=cdarray[i];
4428 if ((cn != null) && (processedcd.contains(cn)))
4429 output.print("&classanalysiswrapper_"+cn.getSafeSymbol());
4431 output.print("NULL");
4433 output.println("};");
4435 output.println("#define MAXOTD "+maxotd);
4436 headers.println("#endif");
4439 public List<OptionalTaskDescriptor> ordertd(Set<OptionalTaskDescriptor> otdset) {
4440 Relation r=new Relation();
4441 for(Iterator<OptionalTaskDescriptor>otdit=otdset.iterator(); otdit.hasNext(); ) {
4442 OptionalTaskDescriptor otd=otdit.next();
4443 TaskIndex ti=new TaskIndex(otd.td, otd.getIndex());
4447 LinkedList<OptionalTaskDescriptor> l=new LinkedList<OptionalTaskDescriptor>();
4448 for(Iterator it=r.keySet().iterator(); it.hasNext(); ) {
4449 Set s=r.get(it.next());
4450 for(Iterator it2=s.iterator(); it2.hasNext(); ) {
4451 OptionalTaskDescriptor otd=(OptionalTaskDescriptor)it2.next();
4459 protected void outputTransCode(PrintWriter output) {
4464 // override these methods in a subclass of BuildCode
4465 // to generate code for additional systems
4466 protected void additionalIncludesMethodsHeader(PrintWriter outmethodheader) {
4468 protected void preCodeGenInitialization() {
4470 protected void postCodeGenCleanUp() {
4472 protected void additionalCodeGen(PrintWriter outmethodheader,
4473 PrintWriter outstructs,
4474 PrintWriter outmethod) {
4476 protected void additionalCodeAtTopOfMain(PrintWriter outmethod) {
4478 protected void additionalCodeAtBottomOfMain(PrintWriter outmethod) {
4480 protected void additionalIncludesMethodsImplementation(PrintWriter outmethod) {
4482 protected void additionalIncludesStructsHeader(PrintWriter outstructs) {
4484 protected void additionalClassObjectFields(PrintWriter outclassdefs) {
4486 protected void additionalCodeAtTopMethodsImplementation(PrintWriter outmethod) {
4488 protected void additionalCodeAtTopFlatMethodBody(PrintWriter output, FlatMethod fm) {
4490 protected void additionalCodePreNode(FlatMethod fm, LocalityBinding lb, FlatNode fn, PrintWriter output) {
4492 protected void additionalCodePostNode(FlatMethod fm, LocalityBinding lb, FlatNode fn, PrintWriter output) {