+ newCode.add("");
+ newCode.add(COMMENT("Define function for sequential code initialization"));
+ 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*) * "
+ + semantics.interface2Num.size() + " * 2)"));
+ for (String interfaceName : semantics.interfaceName2Construct.keySet()) {
+ String interfaceNum = Integer.toString(semantics.interface2Num
+ .get(interfaceName));
+ newCode.add(ASSIGN("func_ptr_table[2 * " + interfaceNum + "]",
+ "(void*) &" + interfaceName + "_id"));
+ 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);
+
+ newCode.add("}");
+ newCode.add(COMMENT("End of Global construct generation in class"));
+
+ printCode(newCode);
+ return newCode;
+ }
+
+ public static ArrayList<String> generateStaticVarDefine(
+ SemanticsChecker semantics, GlobalConstruct construct) {
+ ArrayList<String> newCode = new ArrayList<String>();
+ String className = semantics.getClassName();
+ if (className == null)
+ return newCode; // No need to define any static variables
+ String templateList = semantics.getTemplateStr();
+ String varPrefix;
+ if (templateList == null) {
+ varPrefix = className + "::";
+ } else {
+ varPrefix = className + templateList + "::";
+ }
+ String templateDecl = semantics.getTemplateFullStr();
+ if (templateList == null) {
+ newCode.add(DECLARE("void**", varPrefix + "func_ptr_table"));
+ newCode.add(DECLARE("anno_hb_init**", 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));
+ }
+ } else {
+ newCode.add(templateDecl);
+ newCode.add(DECLARE("void**", varPrefix + "func_ptr_table"));
+ newCode.add(templateDecl);
+ newCode.add(DECLARE("anno_hb_init**", varPrefix + "hb_init_table"));
+ for (int i = 0; i < construct.code.declareVar.size(); i++) {
+ VariableDeclaration varDecl = construct.code.declareVar.get(i);
+ newCode.add(templateDecl);
+ newCode.add(DECLARE(varDecl.type, varPrefix + varDecl.name));
+ }
+ }