more bug fix
[cdsspec-compiler.git] / src / edu / uci / eecs / specCompiler / codeGenerator / CodeVariables.java
index 8e87cd5c4a1b1534c1904f742cd6d125283c75eb..980e42064d74cb09dd1533fbeff413e5ab5591d1 100644 (file)
@@ -23,6 +23,7 @@ import edu.uci.eecs.specCompiler.specExtraction.VariableDeclaration;
 
 public class CodeVariables {
        // C++ code or library
+       public static final String HEADER_STDLIB = "<stdlib.h>";
        public static final String HEADER_THREADS = "<threads.h>";
        public static final String HEADER_STDINT = "<stdint.h>";
        public static final String ThreadIDType = "thrd_t";
@@ -148,12 +149,14 @@ public class CodeVariables {
        }
 
        private static ArrayList<String> DEFINE_INFO_STRUCT(String interfaceName,
-                       FunctionHeader funcDecl) {
+                       FunctionHeader header) {
                ArrayList<String> code = new ArrayList<String>();
                code.add("typedef struct " + interfaceName + "_info {");
-               code.add(DECLARE(funcDecl.returnType, MACRO_RETURN));
-               for (int i = 0; i < funcDecl.args.size(); i++) {
-                       code.add(DECLARE(funcDecl.args.get(i)));
+               if (!header.returnType.equals("void")) {
+                       code.add(DECLARE(header.returnType, MACRO_RETURN));
+               }
+               for (int i = 0; i < header.args.size(); i++) {
+                       code.add(DECLARE(header.args.get(i)));
                }
                code.add("} " + interfaceName + "_info {");
                return code;
@@ -180,17 +183,22 @@ public class CodeVariables {
                code.add("static bool " + interfaceName + "_check_action(void *info, "
                                + IDType + " " + MACRO_ID + ") {");
                code.add(DECLARE("bool", "check_passed"));
-               String infoStructType = interfaceName + "_info", infoStructName = "theInfo";
-               code.add(DECLARE_DEFINE(infoStructType + "*", infoStructName,
-                               BRACE(infoStructType) + "info"));
-               code.add((DECLARE_DEFINE(header.returnType, MACRO_RETURN,
-                               GET_FIELD_BY_PTR(infoStructName, MACRO_RETURN))));
-               for (int i = 0; i < header.args.size(); i++) {
-                       String type = header.args.get(i).type, var = header.args.get(i).name;
-                       code.add((DECLARE_DEFINE(type, var,
-                                       GET_FIELD_BY_PTR(infoStructName, var))));
+               // Read info struct
+               if (!header.returnType.equals("void") || header.args.size() != 0) {
+                       String infoStructType = interfaceName + "_info", infoStructName = "theInfo";
+                       code.add(DECLARE_DEFINE(infoStructType + "*", infoStructName,
+                                       BRACE(infoStructType) + "info"));
+                       if (!header.returnType.equals("void")) {
+                               code.add((DECLARE_DEFINE(header.returnType, MACRO_RETURN,
+                                               GET_FIELD_BY_PTR(infoStructName, MACRO_RETURN))));
+                       }
+                       for (int i = 0; i < header.args.size(); i++) {
+                               String type = header.args.get(i).type, var = header.args.get(i).name;
+                               code.add((DECLARE_DEFINE(type, var,
+                                               GET_FIELD_BY_PTR(infoStructName, var))));
+                       }
+                       code.add("");
                }
-               code.add("");
                // __COND_SAT
                if (!construct.condition.equals("")) {
                        code.add(DECLARE_DEFINE("bool", MACRO_COND, construct.condition));
@@ -296,12 +304,14 @@ public class CodeVariables {
                                        .get(interfaceName);
                        FunctionHeader funcHeader = getFunctionHeader(semantics, iConstruct);
                        // Define necessary info structure
-                       newCode.add(COMMENT("Definition of interface info struct: "
-                                       + interfaceName));
-                       newCode.addAll(DEFINE_INFO_STRUCT(interfaceName, funcHeader));
-                       newCode.add(COMMENT("End of info struct definition: "
-                                       + interfaceName));
-                       newCode.add("");
+                       if (!funcHeader.returnType.equals("void") || funcHeader.args.size() > 0) {
+                               newCode.add(COMMENT("Definition of interface info struct: "
+                                               + interfaceName));
+                               newCode.addAll(DEFINE_INFO_STRUCT(interfaceName, funcHeader));
+                               newCode.add(COMMENT("End of info struct definition: "
+                                               + interfaceName));
+                               newCode.add("");
+                       }
 
                        // Define ID function
                        newCode.add(COMMENT("ID function of interface: " + interfaceName));
@@ -442,6 +452,7 @@ public class CodeVariables {
                ArrayList<String> newCode = new ArrayList<String>();
                String interfaceName = construct.name;
                // Generate necessary header file (might be redundant but never mind)
+               newCode.add(INCLUDE(HEADER_STDLIB));
                newCode.add(INCLUDE(HEADER_THREADS));
                newCode.add(INCLUDE(HEADER_CDSANNOTATE));
                newCode.add(INCLUDE(HEADER_SPECANNOTATION));
@@ -472,12 +483,16 @@ public class CodeVariables {
                newCode.add(ASSIGN_PTR(structName, "annotation", structName));
                newCode.add(ANNOTATE(anno));
                // Call original renamed function
-               newCode.add(DECLARE_DEFINE(header.returnType, MACRO_RETURN,
-                               header.getRenamedCall(SPEC_INTERFACE_WRAPPER)));
+               if (header.returnType.equals("void")) {
+                       newCode.add(header.getRenamedCall(SPEC_INTERFACE_WRAPPER));
+               } else {
+                       newCode.add(DECLARE_DEFINE(header.returnType, MACRO_RETURN,
+                                       header.getRenamedCall(SPEC_INTERFACE_WRAPPER)));
+               }
                // HB conditions
                for (String label : construct.hbConditions.keySet()) {
                        String condition = construct.hbConditions.get(label);
-                       String hbCondNum = Integer.toString(semantics.interface2Num
+                       String hbCondNum = Integer.toString(semantics.hbLabel2Num
                                        .get(label));
                        newCode.add("if " + BRACE(condition) + " {");
                        structName = "hb_condition";
@@ -490,16 +505,26 @@ public class CodeVariables {
                        newCode.add(ASSIGN(anno, "type", SPEC_ANNO_TYPE_HB_CONDITION));
                        newCode.add(ASSIGN_PTR(anno, "annotation", structName));
                        newCode.add(ANNOTATE(anno));
+                       newCode.add("}");
+                       newCode.add("");
                }
                // Interface end
-               String infoStructType = interfaceName + "_info", infoName = "info";
-               newCode.add(DECLARE_DEFINE(infoStructType, infoName,
-                               BRACE(infoStructType + "*") + " malloc(sizeof("
-                                               + infoStructType + "))"));
-               newCode.add(ASSIGN_TO_PTR(infoName, MACRO_RETURN, MACRO_RETURN));
-               for (int i = 0; i < header.args.size(); i++) {
-                       String argName = header.args.get(i).name;
-                       newCode.add(ASSIGN_TO_PTR(infoName, argName, argName));
+               String infoStructType = null, infoName = null;
+               if (!header.returnType.equals("void") || header.args.size() > 0) {
+                       infoStructType = interfaceName + "_info";
+                       infoName = "info";
+                       newCode.add(DECLARE_DEFINE(infoStructType, infoName,
+                                       BRACE(infoStructType + "*") + " malloc(sizeof("
+                                                       + infoStructType + "))"));
+                       if (!header.returnType.equals("void")) {
+                               newCode.add(ASSIGN_TO_PTR(infoName, MACRO_RETURN, MACRO_RETURN));
+                       }
+                       for (int i = 0; i < header.args.size(); i++) {
+                               String argName = header.args.get(i).name;
+                               newCode.add(ASSIGN_TO_PTR(infoName, argName, argName));
+                       }
+               } else {
+                       infoName = "NULL";
                }
                structName = "interface_end";
                anno = "annoation_interface_end";