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";
}
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;
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));
.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));
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));
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";
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";