code.addLine("#endif");
code.addLine("");
+ // Declare _createOPDefineUnattached
+ code.addLine(ShortComment("Declare _createOPDefineUnattached"));
+ // void _createOPDefineUnattached();
+ code.addLine("void _createOPDefineUnattached();");
+ code.addLine("");
+
+ // Declare _createOPClearDefineUnattached
+ code.addLine(ShortComment("Declare _createOPClearDefineUnattached"));
+ // void _createOPClearDefineUnattached();
+ code.addLine("void _createOPClearDefineUnattached();");
+ code.addLine("");
+
code.addLine(ShortComment("Declaration of some c-strings (CSTR)"));
// Interface name strings
code.addLine("");
code.addLine("");
+ // Define the fake ordering point operation
+ code.addLine(ShortComment("Define the fake ordering point operation"));
+ // atomic_int _FAKE_OP_;
+ code.addLine("atomic_int " + SpecNaming.FakeOP + ";");
+ code.addLine("");
+
+ // Define _createOPDefineUnattached
+ code.addLine(ShortComment("Define _createOPDefineUnattached"));
+ code.addLine("void " + SpecNaming.CreateOPDefineUnattachedFunc + "() {");
+ code.addLine(TabbedLine(ShortComment("A load acting as the fake OP")));
+ code.addLine(TabbedLine(SpecNaming.FakeOP
+ + ".load(memory_order_relaxed);"));
+ code.addLine(TabbedLine(SpecNaming.CreateOPDefineAnnoFunc + "();"));
+ code.addLine("}");
+
+ // Define _createOPClearDefineUnattached
+ code.addLine(ShortComment("Define _createOPClearDefineUnattached"));
+ code.addLine("void " + SpecNaming.CreateOPClearDefineUnattachedFunc
+ + "() {");
+ code.addLine(TabbedLine(ShortComment("A load acting as the fake OP")));
+ code.addLine(TabbedLine(SpecNaming.FakeOP
+ + ".load(memory_order_relaxed);"));
+ code.addLine(TabbedLine(SpecNaming.CreateOPClearDefineAnnoFunc + "();"));
+ code.addLine("}");
+
code.addLine(ShortComment("Definition of some c-strings (CSTR)"));
code.addLine(ShortComment("A special empty string"));
code.addLine(DeclareDefine(SpecNaming.CString, SpecNaming.EmptyCString,
construct.preCondition.align(1);
code.addLine(TabbedLine(ShortComment("Execute PreCondition")));
code.addLines(construct.preCondition);
-
+
// By default, we will return true for @PreCondition
code.addLine(TabbedLine(ShortComment("By default @PreCondition returns true")));
code.addLine(TabbedLine("return true;"));
-
+
code.addLine("}");
code.addLine("");
// By default, we will return true for @PostCondition
code.addLine(TabbedLine(ShortComment("By default @PostCondition returns true")));
code.addLine(TabbedLine("return true;"));
-
+
code.addLine("}");
code.addLine("");
}
code.addLine(ShortComment("Define INIT annotation instrumentation function"));
code.addLine("void _createInitAnnotation() {");
+ // Init the fake ordering point place holder
+ code.addLine(TabbedLine(ShortComment("Init the fake ordering point place holder")));
+ code.addLine(TabbedLine(SpecNaming.FakeOP
+ + ".store(1, memory_order_relaxed);"));
+
// Init commutativity rules
code.addLine(TabbedLine(ShortComment("Init commutativity rules")));
code.addLine(TabbedLine(DeclareDefine("int",
case OPDefine:
code.addLine(prefixTabs + SpecNaming.CreateOPDefineAnnoFunc + "();");
break;
+ case OPDefineUnattached:
+ code.addLine(prefixTabs + SpecNaming.CreateOPDefineUnattachedFunc
+ + "();");
+ break;
case PotentialOP:
code.addLine(prefixTabs + SpecNaming.CreatePotentialOPAnnoFunc
+ "(" + SpecNaming.AppendStr(label) + ");");
code.addLine(prefixTabs + SpecNaming.CreateOPClearDefineAnnoFunc
+ "();");
break;
+ case OPClearDefineUnattached:
+ code.addLine(prefixTabs
+ + SpecNaming.CreateOPClearDefineUnattachedFunc + "();");
+ break;
default:
break;
}
*
*/
public enum OPType {
- OPDefine, PotentialOP, OPCheck, OPClear, OPClearDefine
+ OPDefine, PotentialOP, OPCheck, OPClear, OPClearDefine, OPDefineUnattached, OPClearDefineUnattached
}
public final HashMap<File, EntryConstruct> entryMap;
public final HashSet<String> headerFiles;
-
- // In the generated header file, we need to forward the user-defined
+
+ // In the generated header file, we need to forward the user-defined
public final HashSet<String> forwardClass;
private GlobalConstruct globalConstruct;
forwardClass = new HashSet<String>();
globalConstruct = null;
}
-
+
private void addDefineConstruct(DefineConstruct construct) {
- ArrayList<DefineConstruct> list = defineListMap
- .get(construct.file);
+ ArrayList<DefineConstruct> list = defineListMap.get(construct.file);
if (list == null) {
list = new ArrayList<DefineConstruct>();
defineListMap.put(construct.file, list);
// -1 means the curl symbols in the interface do not match
return -1;
}
-
+
/**
* <p>
* A sub-routine to extract the define construct. When called, we have
* @throws IOException
* @throws ParseException
*/
- private void extractDefineConstruct(File file,
- LineNumberReader lineReader, String curLine, int beginLineNum)
- throws WrongAnnotationException, IOException, ParseException {
+ private void extractDefineConstruct(File file, LineNumberReader lineReader,
+ String curLine, int beginLineNum) throws WrongAnnotationException,
+ IOException, ParseException {
ArrayList<String> annotations = extractTillConstructEnd(file,
lineReader, curLine, beginLineNum);
int endLineNum = lineReader.getLineNumber();
- DefineConstruct construct = new DefineConstruct(file,
- beginLineNum, endLineNum, annotations);
+ DefineConstruct construct = new DefineConstruct(file, beginLineNum,
+ endLineNum, annotations);
addDefineConstruct(construct);
}
-
/**
* <p>
line = lineReader.readLine();
lineNum = lineReader.getLineNumber();
construct.processFunctionDeclaration(line);
-
+
// Record those user-defined struct
// RET
String returnType = construct.getFunctionHeader().returnType;
if (SpecUtils.isUserDefinedStruct(decl.type))
forwardClass.add(SpecUtils.getPlainType(decl.type));
}
-
+
} catch (IOException e) {
errMsg = "Spec error in file \""
+ file.getName()
extractEntryConstruct(file, beginLineNum, curLine);
else if (name.equals("OPDefine") || name.equals("PotentialOP")
|| name.equals("OPCheck") || name.equals("OPClear")
- || name.equals("OPClearDefine"))
+ || name.equals("OPClearDefine")
+ || name.equals("OPDefineUnattached")
+ || name.equals("OPClearDefineUnattached"))
extractOPConstruct(file, beginLineNum, curLine,
OPType.valueOf(name));
}
public static final String CreateInterfaceBeginAnnoFunc = "_createInterfaceBeginAnnotation";
public static final String SetInterfaceBeginAnnoValueFunc = "_setInterfaceBeginAnnotationValue";
public static final String CreateOPDefineAnnoFunc = "_createOPDefineAnnotation";
+ public static final String CreateOPDefineUnattachedFunc = "_createOPDefineUnattached";
+ public static final String CreateOPClearDefineUnattachedFunc = "_createOPClearDefineUnattached";
public static final String CreatePotentialOPAnnoFunc = "_createPotentialOPAnnotation";
public static final String CreateOPCheckAnnoFunc = "_createOPCheckAnnotation";
public static final String CreateOPClearAnnoFunc = "_createOPClearAnnotation";
public static final String RET = "RET";
public static final String InterfaceValueInst = "__value";
+ // The fake ordering point operation
+ public static final String FakeOP = "_FAKE_OP_";
+
// The wrapper prefix that we want to attach to the function name
public static final String WrapperPrefix = "Wrapper";