3 import java.io.FileOutputStream;
4 import java.io.PrintWriter;
5 import java.util.Hashtable;
6 import java.util.Iterator;
8 import Analysis.TaskStateAnalysis.SafetyAnalysis;
9 import IR.ClassDescriptor;
10 import IR.MethodDescriptor;
12 import IR.SymbolTable;
15 public class BuildCodeMGC extends BuildCode {
19 int startupcorenum; // record the core containing startup task, s
20 // uppose only one core can have startup object
22 public BuildCodeMGC(State st,
29 super(st, temptovar, typeutil, sa);
30 this.coreNum = coreNum; // # of the active cores
31 this.tcoreNum = tcoreNum; // # of the total number of cores
32 this.gcoreNum = gcoreNum; // # of the cores for gc if any
33 this.startupcorenum = 0;
36 public void buildCode() {
37 /* Create output streams to write to */
38 PrintWriter outclassdefs=null;
39 PrintWriter outglobaldefs=null;
40 PrintWriter outglobaldefsprim=null;
41 PrintWriter outstructs=null;
42 PrintWriter outmethodheader=null;
43 PrintWriter outmethod=null;
44 PrintWriter outvirtual=null;
47 outstructs=new PrintWriter(new FileOutputStream(PREFIX+"structdefs.h"), true);
48 outmethodheader=new PrintWriter(new FileOutputStream(PREFIX+"methodheaders.h"), true);
49 outclassdefs=new PrintWriter(new FileOutputStream(PREFIX+"classdefs.h"), true);
50 outglobaldefs=new PrintWriter(new FileOutputStream(PREFIX+"globaldefs.h"), true);
51 outglobaldefsprim=new PrintWriter(new FileOutputStream(PREFIX+"globaldefsprim.h"), true);
52 outvirtual=new PrintWriter(new FileOutputStream(PREFIX+"virtualtable.h"), true);
53 outmethod=new PrintWriter(new FileOutputStream(PREFIX+"methods.c"), true);
54 } catch (Exception e) {
59 /* Fix field safe symbols due to shadowing */
60 FieldShadow.handleFieldShadow(state);
62 /* Build the virtual dispatch tables */
63 super.buildVirtualTables(outvirtual);
65 /* Tag the methods that are invoked by static blocks */
66 super.tagMethodInvokedByStaticBlock();
69 outmethodheader.println("#ifndef METHODHEADERS_H");
70 outmethodheader.println("#define METHODHEADERS_H");
71 outmethodheader.println("#include \"structdefs.h\"");
73 /* Output Structures */
74 super.outputStructs(outstructs);
76 outglobaldefs.println("#ifndef __GLOBALDEF_H_");
77 outglobaldefs.println("#define __GLOBALDEF_H_");
78 outglobaldefs.println("");
79 outglobaldefs.println("struct global_defs_t {");
80 outglobaldefs.println(" int size;");
81 outglobaldefs.println(" void * next;");
83 outglobaldefsprim.println("#ifndef __GLOBALDEFPRIM_H_");
84 outglobaldefsprim.println("#define __GLOBALDEFPRIM_H_");
85 outglobaldefsprim.println("");
86 outglobaldefsprim.println("struct global_defsprim_t {");
88 // Output the C class declarations
89 // These could mutually reference each other
90 outclassdefs.println("#ifndef __CLASSDEF_H_");
91 outclassdefs.println("#define __CLASSDEF_H_");
92 super.outputClassDeclarations(outclassdefs, outglobaldefs, outglobaldefsprim);
94 // Output function prototypes and structures for parameters
95 Iterator it=state.getClassSymbolTable().getDescriptorsIterator();
97 ClassDescriptor cn=(ClassDescriptor)it.next();
98 super.generateCallStructs(cn, outclassdefs, outstructs, outmethodheader, outglobaldefs, outglobaldefsprim);
100 // TODO add version for normal Java later
101 outclassdefs.println("#include \"globaldefs.h\"");
102 outclassdefs.println("#include \"globaldefsprim.h\"");
103 outclassdefs.println("#endif");
104 outclassdefs.close();
105 outglobaldefs.println("};");
106 outglobaldefs.println("");
107 outglobaldefs.println("extern struct global_defs_t * global_defs_p;");
108 outglobaldefs.println("#endif");
109 outglobaldefs.flush();
110 outglobaldefs.close();
112 outglobaldefsprim.println("};");
113 outglobaldefsprim.println("");
114 outglobaldefsprim.println("extern struct global_defsprim_t * global_defsprim_p;");
115 outglobaldefsprim.println("#endif");
116 outglobaldefsprim.flush();
117 outglobaldefsprim.close();
119 /* Build the actual methods */
120 super.outputMethods(outmethod);
122 /* Record maximum number of task parameters */
123 //outstructs.println("#define MAXTASKPARAMS "+maxtaskparams);
124 /* Record maximum number of all types, i.e. length of classsize[] */
125 outstructs.println("#define NUMTYPES "+(state.numClasses() + state.numArrays() + state.numInterfaces()));
126 /* Record number of total cores */
127 outstructs.println("#define NUMCORES "+this.tcoreNum);
128 /* Record number of active cores */
129 outstructs.println("#define NUMCORESACTIVE "+this.coreNum); // this.coreNum
130 // can be reset by the scheduling analysis
131 /* Record number of garbage collection cores */
132 outstructs.println("#ifdef MULTICORE_GC");
133 outstructs.println("#define NUMCORES4GC "+this.gcoreNum);
134 outstructs.println("#endif");
135 /* Record number of core containing startup task */
136 outstructs.println("#define STARTUPCORE "+this.startupcorenum);
138 if (state.main!=null) {
139 /* Generate main method */
140 outputMainMethod(outmethod);
144 outmethodheader.println("#endif");
145 outmethodheader.close();
147 outstructs.println("#endif");
151 protected void outputMainMethod(PrintWriter outmethod) {
152 outmethod.println("int mgc_main(int argc, const char *argv[]) {");
153 outmethod.println(" int i;");
155 if (state.MULTICOREGC) {
156 outmethod.println(" global_defs_p->size="+globaldefscount+";");
157 outmethod.println(" global_defs_p->next=NULL;");
158 outmethod.println(" for(i=0;i<"+globaldefscount+";i++) {");
159 outmethod.println(" ((struct garbagelist *)global_defs_p)->array[i]=NULL;");
160 outmethod.println(" }");
163 outputStaticBlocks(outmethod);
164 outputClassObjects(outmethod);
166 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
167 outmethod.println(" struct ArrayObject * stringarray=allocate_newarray(NULL, STRINGARRAYTYPE, argc-1);");
169 outmethod.println(" struct ArrayObject * stringarray=allocate_newarray(STRINGARRAYTYPE, argc-1);");
171 outmethod.println(" for(i=1;i<argc;i++) {");
172 outmethod.println(" int length=strlen(argv[i]);");
173 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
174 outmethod.println(" struct ___String___ *newstring=NewString(NULL, argv[i], length);");
176 outmethod.println(" struct ___String___ *newstring=NewString(argv[i], length);");
178 outmethod.println(" ((void **)(((char *)& stringarray->___length___)+sizeof(int)))[i-1]=newstring;");
179 outmethod.println(" }");
181 MethodDescriptor md=typeutil.getMain();
182 ClassDescriptor cd=typeutil.getMainClass();
184 outmethod.println(" {");
185 if ((GENERATEPRECISEGC) || (this.state.MULTICOREGC)) {
186 outmethod.print(" struct "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"_params __parameterlist__={");
187 outmethod.println("1, NULL,"+"stringarray};");
188 outmethod.println(" "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(& __parameterlist__);");
190 outmethod.println(" "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"(stringarray);");
192 outmethod.println(" }");
194 outmethod.println("}");