From cce379fb8757cb3f431dc7b7570f2bd4ac47cc82 Mon Sep 17 00:00:00 2001 From: bdemsky Date: Wed, 2 Aug 2006 08:32:20 +0000 Subject: [PATCH] This update generates partial code for tasks... --- Robust/src/IR/Flat/BuildCode.java | 178 +++++++++++++++++++++++---- Robust/src/IR/Flat/BuildFlat.java | 1 - Robust/src/IR/Flat/FlatMethod.java | 4 + Robust/src/IR/Flat/ParamsObject.java | 11 ++ Robust/src/IR/Flat/TempObject.java | 12 ++ Robust/src/IR/State.java | 8 ++ Robust/src/IR/Tree/BuildIR.java | 7 +- 7 files changed, 194 insertions(+), 27 deletions(-) diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index ccebda63..c4c2ac05 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -62,7 +62,7 @@ public class BuildCode { outstructs.println("#define CHARARRAYTYPE "+ (state.getArrayNumber((new TypeDescriptor(TypeDescriptor.CHAR)).makeArray(state))+state.numClasses())); - // Output the C declarations + // Output the C class declarations // These could mutually reference each other outclassdefs.println("struct "+arraytype+";"); while(it.hasNext()) { @@ -78,17 +78,19 @@ public class BuildCode { outclassdefs.println(" int ___length___;"); outclassdefs.println("};\n"); } + + // Output function prototypes and structures for parameters it=state.getClassSymbolTable().getDescriptorsIterator(); while(it.hasNext()) { ClassDescriptor cn=(ClassDescriptor)it.next(); generateCallStructs(cn, outclassdefs, outstructs, outmethodheader); } - - - outstructs.close(); outmethodheader.close(); + if (state.TASK) + generateTaskStructs(outstructs, outmethodheader); + /* Build the actual methods */ outmethod.println("#include \"methodheaders.h\""); outmethod.println("#include \"virtualtable.h\""); @@ -110,7 +112,17 @@ public class BuildCode { generateFlatMethod(fm,outmethod); } } - if (state.main!=null) { + + if (state.TASK) { + /* Compile task based program */ + Iterator taskit=state.getTaskSymbolTable().getDescriptorsIterator(); + while(taskit.hasNext()) { + TaskDescriptor td=(TaskDescriptor)taskit.next(); + FlatMethod fm=state.getMethodFlat(td); + generateFlatMethod(fm, outmethod); + } + } else if (state.main!=null) { + /* Compile method based program */ outmethod.println("int main(int argc, const char *argv[]) {"); ClassDescriptor cd=typeutil.getClass(state.main); Set mainset=cd.getMethodTable().getSet("main"); @@ -188,6 +200,10 @@ public class BuildCode { } } + /** Generate array that contains the sizes of class objects. The + * object allocation functions in the runtime use this + * information. */ + private void generateSizeArray(PrintWriter outclassdefs) { outclassdefs.print("int classsize[]={"); Iterator it=state.getClassSymbolTable().getDescriptorsIterator(); @@ -227,10 +243,20 @@ public class BuildCode { outclassdefs.println("};"); } + /** Constructs params and temp objects for each method or task. + * These objects tell the compiler which temps need to be + * allocated. */ + private void generateTempStructs(FlatMethod fm) { MethodDescriptor md=fm.getMethod(); - ParamsObject objectparams=new ParamsObject(md,tag++); - paramstable.put(md, objectparams); + TaskDescriptor task=fm.getTask(); + + ParamsObject objectparams=md!=null?new ParamsObject(md,tag++):new ParamsObject(task, tag++); + if (md!=null) + paramstable.put(md, objectparams); + else + paramstable.put(task, objectparams); + for(int i=0;i