public static final String HEADER_THREADS = "<threads.h>";
public static final String HEADER_STDINT = "<stdint.h>";
public static final String HEADER_MODELMEMORY = "<model_memory.h>";
- public static final String ThreadIDType = "thrd_t";
- public static final String GET_THREAD_ID = "thrd_current";
+ public static final String HEADER_MODELTYPES = "<modeltypes.h>";
+ public static final String ThreadIDType = "thread_id_t";
public static final String BOOLEAN = "bool";
public static final String UINT64 = "uint64_t";
public static final String HEADER_COMMON = "<common.h>";
public static final String HEADER_SPECANNOTATION = "<specannotation.h>";
public static final String HEADER_CDSTRACE = "<cdstrace.h>";
- // public static final String CDSAnnotate = "cdsannotate";
- public static final String CDSAnnotate = "_Z11cdsannotatemPv";
+ public static final String CDSAnnotate = "cdsannotate";
// public static final String CDSAnnotate = "cdsannotate";
public static final String CDSAnnotateType = "SPEC_ANALYSIS";
public static final String IDType = "call_id_t";
public static final String SPEC_TAG_CURRENT = "current";
public static final String SPEC_TAG_NEXT = "next";
- public static final String MODEL_MALLOC = "model_malloc";
-
// 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 final String MACRO_THREAD_ID = "__TID__";
public static void printCode(ArrayList<String> code) {
for (int i = 0; i < code.size(); i++) {
return type + " " + var + " = " + val + ";";
}
- private static String ANNOTATE(String structName) {
+ private static String ANNOTATE(SemanticsChecker semantics, String structName) {
return CDSAnnotate + "(" + CDSAnnotateType + ", " + structName + ");";
}
return code;
}
- private static ArrayList<String> DEFINE_ID_FUNC(String interfaceName,
- String idCode) {
+ private static ArrayList<String> DEFINE_ID_FUNC(
+ InterfaceConstruct construct, FunctionHeader header) {
+ String interfaceName = construct.name;
ArrayList<String> code = new ArrayList<String>();
- code.add("inline static " + IDType + " " + interfaceName + "_id() {");
+ String idCode = construct.idCode;
+ code.add("inline static " + IDType + " " + interfaceName + "_id("
+ + "void *info, " + ThreadIDType + " " + MACRO_THREAD_ID + ") {");
+
+ // 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("");
+ }
+
if (!idCode.equals("")) {
code.add(DECLARE_DEFINE(IDType, MACRO_ID, idCode));
} else {
String interfaceName = construct.name;
ArrayList<String> code = new ArrayList<String>();
code.add("inline static bool " + interfaceName
- + "_check_action(void *info, " + IDType + " " + MACRO_ID
- + ") {");
+ + "_check_action(void *info, " + IDType + " " + MACRO_ID + ", "
+ + ThreadIDType + " " + MACRO_THREAD_ID + ") {");
code.add(DECLARE("bool", "check_passed"));
// Read info struct
if (!header.returnType.equals("void") || header.args.size() != 0) {
headers.add(HEADER_STDLIB);
headers.add(HEADER_STDINT);
headers.add(HEADER_MODELMEMORY);
+ headers.add(HEADER_MODELTYPES);
+ headers.add(HEADER_SPEC_LIB);
headers.add(HEADER_STDINT);
headers.add(HEADER_CDSANNOTATE);
- headers.add(HEADER_COMMON);
- headers.add(HEADER_SPEC_LIB);
+ // headers.add(HEADER_COMMON);
headers.add(HEADER_SPECANNOTATION);
return headers;
}
ArrayList<String> newCode = new ArrayList<String>();
HashSet<String> allHeaders = getAllHeaders(semantics);
-
SequentialDefineSubConstruct code = construct.code;
// User-defined structs first
newCode.add(COMMENT("All other user-defined structs"));
// Define ID function
newCode.add(COMMENT("ID function of interface: " + interfaceName));
- newCode.addAll(DEFINE_ID_FUNC(interfaceName, iConstruct.idCode));
+ newCode.addAll(DEFINE_ID_FUNC(iConstruct, funcHeader));
newCode.add(COMMENT("End of ID function: " + interfaceName));
newCode.add("");
String interfaceSize = Integer
.toString(semantics.interfaceName2Construct.size());
newCode.add(DEFINE("INTERFACE_SIZE", interfaceSize));
- newCode.add(DECLARE("void**", "func_ptr_table"));
+ // Make it static
+ newCode.add("static " + DECLARE("void**", "func_ptr_table"));
// Happens-before initialization rules
- newCode.add(DECLARE(ANNO_HB_INIT + "**", "hb_init_table"));
+ // Should make it static
+ newCode.add("static " + DECLARE(ANNO_HB_INIT + "**", "hb_init_table"));
newCode.add("");
newCode.add(COMMENT("Define function for sequential code initialization"));
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(anno));
+ newCode.add(ANNOTATE(semantics, anno));
newCode.add("");
// Init user-defined variables
String templateDecl = semantics.getTemplateFullStr();
if (templateList == null) {
newCode.add(DECLARE("void**", varPrefix + "func_ptr_table"));
- newCode.add(DECLARE("void**", varPrefix + "hb_init_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));
newCode.add(templateDecl);
newCode.add(DECLARE("void**", varPrefix + "func_ptr_table"));
newCode.add(templateDecl);
- newCode.add(DECLARE("void**", varPrefix + "hb_init_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(templateDecl);
}
// Only generate the declaration of the wrapper, don't do any renaming
+ // public static ArrayList<String> generateInterfaceWrapperDeclaration(
+ // SemanticsChecker semantics, InterfaceConstruct construct) {
+ // ArrayList<String> newCode = new ArrayList<String>();
+ // 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<String> generateInterfaceWrapperDeclaration(
SemanticsChecker semantics, InterfaceConstruct construct) {
- ArrayList<String> newCode = new ArrayList<String>();
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<String> declaration = new ArrayList<String>();
+ declaration.add(header.getRenamedHeader(SPEC_INTERFACE_WRAPPER)
+ .getDeclaration() + ";");
+ return declaration;
}
// Only generate the definition of the wrapper, don't do any renaming
newCode.add(STRUCT_NEW_DECLARE_DEFINE(ANNO_INTERFACE_BEGIN,
"interface_begin"));
newCode.add(ASSIGN_TO_PTR(structName, "interface_num", interfaceNum));
+
String anno = "annotation_interface_begin";
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) + ";");
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("");
}
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
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 + ";");
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;
}
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;
}
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;
}