X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=src%2Fedu%2Fuci%2Feecs%2FspecCompiler%2FcodeGenerator%2FCodeVariables.java;h=aeace485b78e6c8453c9a7bfee3d1d9d3f07010f;hb=c9d0845c129ac0c7d8ced2e04677006c333b2c73;hp=0e4a712e4c75e23c9794f11baa5a9b5057d44c02;hpb=9715bde2a0d400f34e601b5f5d8589a73eb46010;p=cdsspec-compiler.git diff --git a/src/edu/uci/eecs/specCompiler/codeGenerator/CodeVariables.java b/src/edu/uci/eecs/specCompiler/codeGenerator/CodeVariables.java index 0e4a712..aeace48 100644 --- a/src/edu/uci/eecs/specCompiler/codeGenerator/CodeVariables.java +++ b/src/edu/uci/eecs/specCompiler/codeGenerator/CodeVariables.java @@ -1,6 +1,7 @@ package edu.uci.eecs.specCompiler.codeGenerator; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.io.File; @@ -26,6 +27,7 @@ public class CodeVariables { public static final String HEADER_STDLIB = ""; public static final String HEADER_THREADS = ""; public static final String HEADER_STDINT = ""; + public static final String HEADER_MODELMEMORY = ""; public static final String ThreadIDType = "thrd_t"; public static final String GET_THREAD_ID = "thrd_current"; public static final String BOOLEAN = "bool"; @@ -36,13 +38,14 @@ public class CodeVariables { public static final String HEADER_COMMON = ""; public static final String HEADER_SPECANNOTATION = ""; public static final String HEADER_CDSTRACE = ""; + public static final String CDSAnnotate = "cdsannotate"; + public static final String C_CDSAnnotate = "_Z11cdsannotatemPv"; // public static final String CDSAnnotate = "cdsannotate"; - public static final String CDSAnnotate = "_Z11cdsannotatemPv"; public static final String CDSAnnotateType = "SPEC_ANALYSIS"; public static final String IDType = "call_id_t"; public static final String SPEC_ANNO_TYPE = "spec_anno_type"; - public static final String SPEC_ANNO_TYPE_FUNC_TABLE_INIT = "FUNC_TABLE_INIT"; + public static final String SPEC_ANNO_TYPE_INIT = "INIT"; public static final String SPEC_ANNO_TYPE_HB_INIT = "HB_INIT"; public static final String SPEC_ANNO_TYPE_INTERFACE_BEGIN = "INTERFACE_BEGIN"; public static final String SPEC_ANNO_TYPE_HB_CONDITION = "HB_CONDITION"; @@ -54,11 +57,11 @@ public class CodeVariables { public static final String SPEC_ANNOTATION_FIELD_TYPE = "type"; public static final String SPEC_ANNOTATION_FIELD_ANNO = "annotation"; - public static final String ANNO_FUNC_TABLE_INIT = "anno_func_table_init"; + public static final String ANNO_INIT = "anno_init"; public static final String ANNO_HB_INIT = "anno_hb_init"; public static final String ANNO_INTERFACE_BEGIN = "anno_interface_begin"; public static final String ANNO_INTERFACE_END = "anno_interface_end"; - public static final String ANNO_POTENTIAL_CP_DEFINE = "anno_potentail_cp_define"; + public static final String ANNO_POTENTIAL_CP_DEFINE = "anno_potential_cp_define"; public static final String ANNO_CP_DEFINE = "anno_cp_define"; public static final String ANNO_CP_DEFINE_CHECK = "anno_cp_define_check"; public static final String ANNO_HB_CONDITION = "anno_hb_condition"; @@ -78,11 +81,22 @@ public class CodeVariables { public static final String SPEC_TAG_CURRENT = "current"; public static final String SPEC_TAG_NEXT = "next"; + // Macro public static final String MACRO_ID = "__ID__"; public static final String MACRO_COND = "__COND_SAT__"; public static final String MACRO_RETURN = "__RET__"; public static final String MACRO_ATOMIC_RETURN = "__ATOMIC_RET__"; + + public static String CDSAnnotate(SemanticsChecker semantics) { + String LANG = semantics.getOption("LANG"); + boolean isCPP = LANG == null || !LANG.equals("C"); + if (isCPP) { + return CDSAnnotate; + } else { + return C_CDSAnnotate; + } + } public static void printCode(ArrayList code) { for (int i = 0; i < code.size(); i++) { @@ -158,8 +172,8 @@ public class CodeVariables { return type + " " + var + " = " + val + ";"; } - private static String ANNOTATE(String structName) { - return CDSAnnotate + "(" + CDSAnnotateType + ", " + structName + ");"; + private static String ANNOTATE(SemanticsChecker semantics, String structName) { + return CDSAnnotate(semantics) + "(" + CDSAnnotateType + ", " + structName + ");"; } private static ArrayList DEFINE_INFO_STRUCT(String interfaceName, @@ -179,7 +193,7 @@ public class CodeVariables { private static ArrayList DEFINE_ID_FUNC(String interfaceName, String idCode) { ArrayList code = new ArrayList(); - code.add("static " + IDType + " " + interfaceName + "_id() {"); + code.add("inline static " + IDType + " " + interfaceName + "_id() {"); if (!idCode.equals("")) { code.add(DECLARE_DEFINE(IDType, MACRO_ID, idCode)); } else { @@ -194,8 +208,9 @@ public class CodeVariables { InterfaceConstruct construct, FunctionHeader header) { String interfaceName = construct.name; ArrayList code = new ArrayList(); - code.add("static bool " + interfaceName + "_check_action(void *info, " - + IDType + " " + MACRO_ID + ") {"); + code.add("inline static bool " + interfaceName + + "_check_action(void *info, " + IDType + " " + MACRO_ID + + ") {"); code.add(DECLARE("bool", "check_passed")); // Read info struct if (!header.returnType.equals("void") || header.args.size() != 0) { @@ -243,18 +258,26 @@ public class CodeVariables { return code; } - private static HashSet getAllHeaders(SemanticsChecker semantics) { + public static HashSet getAllHeaders(SemanticsChecker semantics) { HashSet headers = new HashSet(); for (String interfaceName : semantics.interfaceName2Construct.keySet()) { File f = semantics.interfaceName2Construct.get(interfaceName).file; headers.addAll(semantics.srcFilesInfo.get(f).headers); } + headers.add(HEADER_STDLIB); + headers.add(HEADER_STDINT); + headers.add(HEADER_MODELMEMORY); + headers.add(HEADER_STDINT); + headers.add(HEADER_CDSANNOTATE); + headers.add(HEADER_COMMON); + headers.add(HEADER_SPEC_LIB); + headers.add(HEADER_SPECANNOTATION); return headers; } private static void makeFunctionStatic(ArrayList funcDefine) { String headLine = funcDefine.get(0); - headLine = "static " + headLine; + headLine = "inline static " + headLine; funcDefine.set(0, headLine); } @@ -291,20 +314,6 @@ public class CodeVariables { ArrayList newCode = new ArrayList(); HashSet allHeaders = getAllHeaders(semantics); - // All headers needed by the interface decalration - newCode.add(COMMENT("Include all the header files that contains the interface declaration")); - for (String header : allHeaders) { - newCode.add(INCLUDE(header)); - } - newCode.add(""); - // Other necessary headers - newCode.add(INCLUDE(HEADER_STDLIB)); - newCode.add(INCLUDE(HEADER_STDINT)); - newCode.add(INCLUDE(HEADER_CDSANNOTATE)); - newCode.add(INCLUDE(HEADER_COMMON)); - newCode.add(INCLUDE(HEADER_SPEC_LIB)); - newCode.add(INCLUDE(HEADER_SPECANNOTATION)); - newCode.add(""); SequentialDefineSubConstruct code = construct.code; // User-defined structs first @@ -366,10 +375,12 @@ public class CodeVariables { .toString(semantics.interfaceName2Construct.size()); newCode.add(DEFINE("INTERFACE_SIZE", interfaceSize)); newCode.add(DECLARE("void**", "func_ptr_table")); + // Happens-before initialization rules + newCode.add(DECLARE(ANNO_HB_INIT + "**", "hb_init_table")); newCode.add(""); newCode.add(COMMENT("Define function for sequential code initialization")); - newCode.add("static void __sequential_init() {"); + newCode.add("inline static void __sequential_init() {"); // Init func_ptr_table newCode.add(COMMENT("Init func_ptr_table")); newCode.add(ASSIGN("func_ptr_table", "(void**) malloc(sizeof(void*) * " @@ -382,22 +393,28 @@ public class CodeVariables { newCode.add(ASSIGN("func_ptr_table[2 * " + interfaceNum + " + 1]", "(void*) &" + interfaceName + "_check_action")); } + // Init Happens-before rules table + newCode.addAll(generateHBInitAnnotation(semantics)); + + // Pass init info, including function table info & HB rules + newCode.add(COMMENT("Pass init info, including function table info & HB rules")); + String structName = "anno_init", anno = "init"; + newCode.add(STRUCT_NEW_DECLARE_DEFINE(ANNO_INIT, structName)); + newCode.add(ASSIGN_TO_PTR(structName, "func_table", "func_ptr_table")); + newCode.add(ASSIGN_TO_PTR(structName, "func_table_size", + "INTERFACE_SIZE")); + newCode.add(ASSIGN_TO_PTR(structName, "hb_init_table", "hb_init_table")); + newCode.add(ASSIGN_TO_PTR(structName, "hb_init_table_size", + "HB_INIT_TABLE_SIZE")); + newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); + newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_INIT)); + newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); + newCode.add(ANNOTATE(semantics, anno)); + newCode.add(""); // Init user-defined variables newCode.addAll(construct.code.initVar); - // Pass function table info - newCode.add(COMMENT("Pass function table info")); - String structName = "anno_func_table_init", anno = "func_init"; - newCode.add(STRUCT_NEW_DECLARE_DEFINE(ANNO_FUNC_TABLE_INIT, structName)); - newCode.add(ASSIGN_TO_PTR(structName, "size", "INTERFACE_SIZE")); - newCode.add(ASSIGN_TO_PTR(structName, "table", "func_ptr_table")); - newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); - newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_FUNC_TABLE_INIT)); - newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); - newCode.add(ANNOTATE(anno)); - // Pass Happens-before relationship - newCode.addAll(generateHBInitAnnotation(semantics)); newCode.add("}"); newCode.add(COMMENT("End of Global construct generation in class")); @@ -421,6 +438,7 @@ public class CodeVariables { String templateDecl = semantics.getTemplateFullStr(); if (templateList == null) { newCode.add(DECLARE("void**", varPrefix + "func_ptr_table")); + newCode.add(DECLARE("void**", varPrefix + "hb_init_table")); for (int i = 0; i < construct.code.declareVar.size(); i++) { VariableDeclaration varDecl = construct.code.declareVar.get(i); newCode.add(DECLARE(varDecl.type, varPrefix + varDecl.name)); @@ -428,6 +446,8 @@ public class CodeVariables { } else { newCode.add(templateDecl); newCode.add(DECLARE("void**", varPrefix + "func_ptr_table")); + newCode.add(templateDecl); + newCode.add(DECLARE("void**", varPrefix + "hb_init_table")); for (int i = 0; i < construct.code.declareVar.size(); i++) { VariableDeclaration varDecl = construct.code.declareVar.get(i); newCode.add(templateDecl); @@ -440,12 +460,13 @@ public class CodeVariables { private static ArrayList generateHBInitAnnotation( SemanticsChecker semantics) { ArrayList newCode = new ArrayList(); + int hbConditionInitIdx = 0; for (ConditionalInterface left : semantics.getHBConditions().keySet()) { for (ConditionalInterface right : semantics.getHBConditions().get( left)) { String structVarName = "hbConditionInit" + hbConditionInitIdx; - String annotationVarName = "hb_init" + hbConditionInitIdx; + // String annotationVarName = "hb_init" + hbConditionInitIdx; hbConditionInitIdx++; String interfaceNumBefore = Integer .toString(semantics.interface2Num @@ -469,36 +490,55 @@ public class CodeVariables { newCode.add(ASSIGN_TO_PTR(structVarName, "hb_condition_num_after", hbLabelNumAfter)); - newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, - annotationVarName)); - newCode.add(ASSIGN_TO_PTR(annotationVarName, - SPEC_ANNOTATION_FIELD_TYPE, SPEC_ANNO_TYPE_HB_INIT)); - newCode.add(ASSIGN_TO_PTR(annotationVarName, - SPEC_ANNOTATION_FIELD_ANNO, structVarName)); - newCode.add(ANNOTATE(annotationVarName)); + // newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, + // annotationVarName)); + // newCode.add(ASSIGN_TO_PTR(annotationVarName, + // SPEC_ANNOTATION_FIELD_TYPE, SPEC_ANNO_TYPE_HB_INIT)); + // newCode.add(ASSIGN_TO_PTR(annotationVarName, + // SPEC_ANNOTATION_FIELD_ANNO, structVarName)); + // newCode.add(ANNOTATE(annotationVarName)); } } + // Init hb_init_table + newCode.add(COMMENT("Init hb_init_table")); + newCode.add(ASSIGN("hb_init_table", "(" + ANNO_HB_INIT + + "**) malloc(sizeof(" + ANNO_HB_INIT + "*) * " + + hbConditionInitIdx + ")")); + // Define HB_INIT_TABLE_SIZE + newCode.add(DEFINE("HB_INIT_TABLE_SIZE", + Integer.toString(hbConditionInitIdx))); + for (int i = 0; i < hbConditionInitIdx; i++) { + newCode.add(ASSIGN("hb_init_table[" + i + "]", "hbConditionInit" + + i)); + } return newCode; } public static ArrayList generateEntryPointInitCall() { - ArrayList newCode = new ArrayList(1); + ArrayList newCode = new ArrayList(); newCode.add("__sequential_init();"); return newCode; } // Only generate the declaration of the wrapper, don't do any renaming - public static ArrayList generateInterfaceWrapperDeclaration( - SemanticsChecker semantics, InterfaceConstruct construct) { - ArrayList newCode = new ArrayList(); +// public static ArrayList generateInterfaceWrapperDeclaration( +// SemanticsChecker semantics, InterfaceConstruct construct) { +// ArrayList newCode = new ArrayList(); +// FunctionHeader header = getFunctionHeader(semantics, construct); +// newCode.add(COMMENT("Declaration of the wrapper")); +// String templateStr = header.getTemplateFullStr(); +// newCode.add(templateStr); +// newCode.add(header.getFuncStr() + ";"); +// newCode.add(""); +// +// return newCode; +// } + + public static ArrayList generateInterfaceWrapperDeclaration(SemanticsChecker semantics, InterfaceConstruct construct) { FunctionHeader header = getFunctionHeader(semantics, construct); - newCode.add(COMMENT("Declaration of the wrapper")); - String templateStr = header.getTemplateFullStr(); - newCode.add(templateStr); - newCode.add(header.getFuncStr() + ";"); - newCode.add(""); - - return newCode; + ArrayList declaration = new ArrayList(); + declaration.add(header.getRenamedHeader(SPEC_INTERFACE_WRAPPER).getDeclaration() + ";"); + return declaration; } // Only generate the definition of the wrapper, don't do any renaming @@ -506,16 +546,11 @@ public class CodeVariables { SemanticsChecker semantics, InterfaceConstruct construct) { ArrayList newCode = new ArrayList(); String interfaceName = construct.name; - // Generate necessary header file (might be redundant but never mind) - newCode.add(INCLUDE(HEADER_STDLIB)); - newCode.add(INCLUDE(HEADER_CDSANNOTATE)); - newCode.add(INCLUDE(HEADER_SPECANNOTATION)); - newCode.add(INCLUDE(HEADER_SPEC_LIB)); FunctionHeader header = getFunctionHeader(semantics, construct); String interfaceNum = Integer.toString(semantics.interface2Num .get(construct.name)); - + newCode.add(header.getTemplateFullStr()); newCode.add(header.getFuncStr() + " {"); // Wrapper function body @@ -529,7 +564,7 @@ public class CodeVariables { newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_INTERFACE_BEGIN)); newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); - newCode.add(ANNOTATE(anno)); + newCode.add(ANNOTATE(semantics, anno)); // Call original renamed function if (header.returnType.equals("void")) { newCode.add(header.getRenamedCall(SPEC_INTERFACE_WRAPPER) + ";"); @@ -552,7 +587,7 @@ public class CodeVariables { newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_HB_CONDITION)); newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); - newCode.add(ANNOTATE(anno)); + newCode.add(ANNOTATE(semantics, anno)); newCode.add("}"); newCode.add(""); } @@ -567,7 +602,7 @@ public class CodeVariables { newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_HB_CONDITION)); newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); - newCode.add(ANNOTATE(anno)); + newCode.add(ANNOTATE(semantics, anno)); newCode.add(""); } // Interface end @@ -596,7 +631,7 @@ public class CodeVariables { newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_INTERFACE_END)); newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); - newCode.add(ANNOTATE(anno)); + newCode.add(ANNOTATE(semantics, anno)); // Return __RET__ if it's not void if (!header.returnType.equals("void")) { newCode.add("return " + MACRO_RETURN + ";"); @@ -657,10 +692,6 @@ public class CodeVariables { // Generate redundant header files newCode.add(COMMENT("Automatically generated code for potential commit point: " + construct.label)); - newCode.add(COMMENT("Include redundant headers")); - newCode.add(INCLUDE(HEADER_STDINT)); - newCode.add(INCLUDE(HEADER_CDSANNOTATE)); - newCode.add(INCLUDE(HEADER_SPECANNOTATION)); newCode.add(""); // Add annotation newCode.add("if (" + construct.condition + ") {"); @@ -674,7 +705,7 @@ public class CodeVariables { newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_POTENTIAL_CP_DEFINE)); newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); - newCode.add(ANNOTATE(anno)); + newCode.add(ANNOTATE(semantics, anno)); newCode.add("}"); return newCode; } @@ -689,9 +720,6 @@ public class CodeVariables { // Generate redundant header files newCode.add(COMMENT("Automatically generated code for commit point define check: " + construct.label)); - newCode.add(COMMENT("Include redundant headers")); - newCode.add(INCLUDE(HEADER_STDINT)); - newCode.add(INCLUDE(HEADER_CDSANNOTATE)); newCode.add(""); // Add annotation newCode.add("if (" + construct.condition + ") {"); @@ -703,7 +731,7 @@ public class CodeVariables { newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_CP_DEFINE_CHECK)); newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); - newCode.add(ANNOTATE(anno)); + newCode.add(ANNOTATE(semantics, anno)); newCode.add("}"); return newCode; } @@ -725,7 +753,7 @@ public class CodeVariables { newCode.add(STRUCT_NEW_DECLARE_DEFINE(SPEC_ANNOTATION, anno)); newCode.add(ASSIGN_TO_PTR(anno, "type", SPEC_ANNO_TYPE_CP_DEFINE)); newCode.add(ASSIGN_TO_PTR(anno, "annotation", structName)); - newCode.add(ANNOTATE(anno)); + newCode.add(ANNOTATE(semantics, anno)); newCode.add("}"); return newCode; }