From 579524b6cd8994427d50cf604ee130493f59b4d3 Mon Sep 17 00:00:00 2001 From: Peizhao Ou Date: Fri, 19 Feb 2016 15:19:05 -0800 Subject: [PATCH] minor fix --- grammer/util.jj | 5 +- .../uci/eecs/codeGenerator/CodeGenerator.java | 10 +- .../codeGenerator/CodeGeneratorUtils.java | 19 +++- .../uci/eecs/codeGenerator/Environment.java | 1 + .../eecs/specExtraction/GlobalConstruct.java | 103 +++++++++++++++++- .../specExtraction/InterfaceConstruct.java | 33 ++++++ .../eecs/specExtraction/SpecExtractor.java | 9 +- .../uci/eecs/specExtraction/SpecNaming.java | 2 + .../uci/eecs/specExtraction/SpecUtils.java | 84 ++++++++++++-- 9 files changed, 240 insertions(+), 26 deletions(-) diff --git a/grammer/util.jj b/grammer/util.jj index 901e2e6..5b5446b 100644 --- a/grammer/util.jj +++ b/grammer/util.jj @@ -280,7 +280,10 @@ String Type() : ( { type = "const"; } )? - (((str = .image | str = .image | str = .image) { type = type + " " + str; })? + ( + ((str = .image | str = .image | str = .image) { + type = type.equals("") ? type + str : type + " " + str; + })? ( name = ParseQualifiedName() { if (!type.equals("")) diff --git a/src/edu/uci/eecs/codeGenerator/CodeGenerator.java b/src/edu/uci/eecs/codeGenerator/CodeGenerator.java index 02c6067..2543d5c 100644 --- a/src/edu/uci/eecs/codeGenerator/CodeGenerator.java +++ b/src/edu/uci/eecs/codeGenerator/CodeGenerator.java @@ -318,12 +318,12 @@ public class CodeGenerator { } static public void main(String[] args) { -// String[] dirNames = { Environment.REGISTER, Environment.MS_QUEUE, -// Environment.LINUXRWLOCKS, Environment.MCS_LOCK, -// Environment.DEQUE }; - String[] dirNames = args; + String[] dirNames = { Environment.REGISTER, Environment.MS_QUEUE, + Environment.LINUXRWLOCKS, Environment.MCS_LOCK, + Environment.DEQUE, Environment.TREIBER_STACK }; +// String[] dirNames = args; - for (int i = 0; i < dirNames.length; i++) { + for (int i = 5; i < dirNames.length; i++) { String dirName = dirNames[i]; System.out.println("/********** Processing " + dirName + " **********/"); diff --git a/src/edu/uci/eecs/codeGenerator/CodeGeneratorUtils.java b/src/edu/uci/eecs/codeGenerator/CodeGeneratorUtils.java index 2914d49..08b9f7a 100644 --- a/src/edu/uci/eecs/codeGenerator/CodeGeneratorUtils.java +++ b/src/edu/uci/eecs/codeGenerator/CodeGeneratorUtils.java @@ -529,7 +529,11 @@ public class CodeGeneratorUtils { code.addLine(TabbedLine("#define " + decl.name + " " + SpecNaming.StateInst + "->" + decl.name)); } - code.addLine(TabbedLine(ShortComment("User-defined intial state code"))); + if (!globalConstruct.autoGenInitial) + code.addLine(TabbedLine(ShortComment("User-defined state intialization code"))); + else + // Auto-generated the initialization function + code.addLine(TabbedLine(ShortComment("Auto-generated state intialization code"))); // Align the code with one tab globalConstruct.initState.align(1); code.addLines(globalConstruct.initState); @@ -580,7 +584,12 @@ public class CodeGeneratorUtils { fieldsInit.align(1); code.addLines(fieldsInit); code.addLine(""); - code.addLine(TabbedLine(ShortComment("Execute the print-out"))); + if (!globalConstruct.autoGenPrint) + code.addLine(TabbedLine(ShortComment("Execute user-defined state printing code"))); + else + // Auto-generated the copy function + code.addLine(TabbedLine(ShortComment("Execute auto-generated state printing code"))); + // Align the code with one tab globalConstruct.printState.align(1); code.addLines(globalConstruct.printState); @@ -726,7 +735,11 @@ public class CodeGeneratorUtils { code.addLines(fieldsInit); construct.print.align(1); - code.addLine(TabbedLine(ShortComment("Execute Print"))); + if (!construct.autoGenPrint) + code.addLine(TabbedLine(ShortComment("Execute user-defined value printing code"))); + else + // Auto-generated the value printing function + code.addLine(TabbedLine(ShortComment("Execute auto-generated value printing code"))); code.addLines(construct.print); code.addLine("}"); diff --git a/src/edu/uci/eecs/codeGenerator/Environment.java b/src/edu/uci/eecs/codeGenerator/Environment.java index 9640ffe..84fc4ee 100644 --- a/src/edu/uci/eecs/codeGenerator/Environment.java +++ b/src/edu/uci/eecs/codeGenerator/Environment.java @@ -25,5 +25,6 @@ public class Environment { public final static String LINUXRWLOCKS = "linuxrwlocks"; public final static String MCS_LOCK = "mcs-lock"; public final static String DEQUE = "chase-lev-deque-bugfix"; + public final static String TREIBER_STACK = "treiber-stack"; } diff --git a/src/edu/uci/eecs/specExtraction/GlobalConstruct.java b/src/edu/uci/eecs/specExtraction/GlobalConstruct.java index f49911b..b2e52a0 100644 --- a/src/edu/uci/eecs/specExtraction/GlobalConstruct.java +++ b/src/edu/uci/eecs/specExtraction/GlobalConstruct.java @@ -25,7 +25,14 @@ public class GlobalConstruct extends Construct { public final Code printState; public final ArrayList commutativityRules; + // Whether the state declaration is empty + public final boolean emptyState; + // Whether we have auto-gen the state initialization code + public final boolean autoGenInitial; + // Whether we have auto-gen the state copying code public final boolean autoGenCopy; + // Whether we have auto-gen the state printing code + public final boolean autoGenPrint; public GlobalConstruct(File file, int beginLineNum, ArrayList annotations) throws WrongAnnotationException { @@ -39,13 +46,75 @@ public class GlobalConstruct extends Construct { processAnnotations(annotations); - if (copyState.isEmpty()) { + emptyState = declState.isEmpty(); + if (emptyState) { + WrongAnnotationException.warning(file, beginLineNum, + "The state is empty. Make sure that's what you want!"); + } + + autoGenInitial = initState.isEmpty(); + if (autoGenInitial) { + Code code = generateAutoInitalFunction(); + initState.addLines(code); + } + + autoGenCopy = copyState.isEmpty(); + if (autoGenCopy) { Code code = generateAutoCopyFunction(); copyState.addLines(code); - autoGenCopy = true; - } else { - autoGenCopy = false; } + + autoGenPrint = printState.isEmpty(); + if (autoGenPrint) { + Code code = generateAutoPrintFunction(); + printState.addLines(code); + } + } + + /** + *

+ * This function will automatically generate the initial statements for + * supported types if the user has not defined the "@Initial" primitive + *

+ * + * @return The auto-generated state intialization statements + * @throws WrongAnnotationException + */ + private Code generateAutoInitalFunction() throws WrongAnnotationException { + Code code = new Code(); + if (emptyState) // Empty state should have empty initial function + return code; + for (VariableDeclaration decl : declState) { + String type = decl.type; + String name = decl.name; + // Primitive types + if (type.equals("int") || type.equals("unsigned") + || type.equals("unsigned int") + || type.equals("int unsigned") || type.equals("double") + || type.equals("double") || type.equals("bool")) { + // x = 0; + code.addLine(name + " = 0;"); + } else if (type.equals("IntList") || type.equals("IntSet") + || type.equals("IntMap")) { + // Supported types + // q = IntList(); + code.addLine(name + " = " + type + "();"); + } else if (type.equals("IntList *") || type.equals("IntSet *") + || type.equals("IntMap *")) { + // Supported pointer types + // q = new IntList; + String originalType = SpecUtils.trimSpace(type + .replace('*', ' ')); + code.addLine(name + " = new " + originalType + "();"); + } else { + WrongAnnotationException + .err(file, + beginLineNum, + "You have types in the state declaration that we do not support auto-gen initial function."); + } + } + + return code; } /** @@ -54,11 +123,13 @@ public class GlobalConstruct extends Construct { * supported types if the user has not defined the "@Copy" primitive *

* - * @return The auto-generated copy statements + * @return The auto-generated state copy statements * @throws WrongAnnotationException */ private Code generateAutoCopyFunction() throws WrongAnnotationException { Code code = new Code(); + if (emptyState) // Empty state should have empty copy function + return code; for (VariableDeclaration decl : declState) { String type = decl.type; String name = decl.name; @@ -97,6 +168,28 @@ public class GlobalConstruct extends Construct { return code; } + /** + *

+ * This function will automatically generate the printing statements for + * supported types if the user has not defined the "@Print" primitive + *

+ * + * @return The auto-generated state printing statements + * @throws WrongAnnotationException + */ + private Code generateAutoPrintFunction() throws WrongAnnotationException { + Code code = new Code(); + if (emptyState) // Empty state should have empty printing function + return code; + for (VariableDeclaration decl : declState) { + String type = decl.type; + String name = decl.name; + code.addLines(SpecUtils.generatePrintStatement(type, name)); + } + + return code; + } + /** *

* Assert that the global state primitive is valid; if not, throws an diff --git a/src/edu/uci/eecs/specExtraction/InterfaceConstruct.java b/src/edu/uci/eecs/specExtraction/InterfaceConstruct.java index 2ed5367..6afd5f1 100644 --- a/src/edu/uci/eecs/specExtraction/InterfaceConstruct.java +++ b/src/edu/uci/eecs/specExtraction/InterfaceConstruct.java @@ -38,6 +38,8 @@ public class InterfaceConstruct extends Construct { // arguments of the interface private FunctionHeader funcHeader; + public final boolean autoGenPrint; + public InterfaceConstruct(File file, int beginLineNum, int endLineNum, ArrayList annotations) throws WrongAnnotationException { super(file, beginLineNum); @@ -50,6 +52,8 @@ public class InterfaceConstruct extends Construct { this.print = new Code(); processAnnotations(annotations); + + autoGenPrint = print.isEmpty(); } public FunctionHeader getFunctionHeader() { @@ -71,6 +75,29 @@ public class InterfaceConstruct extends Construct { return this.name; } + /** + *

+ * This function will automatically generate the printing statements for + * supported types if the user has not defined the "@Print" primitive + *

+ * + * @return The auto-generated state printing statements + * @throws WrongAnnotationException + */ + private Code generateAutoPrintFunction() { + Code code = new Code(); + // For RET + code.addLines(SpecUtils.generatePrintStatement(funcHeader.returnType, + SpecNaming.RET)); + // For arguments + for (VariableDeclaration decl : funcHeader.args) { + String type = decl.type; + String name = decl.name; + code.addLines(SpecUtils.generatePrintStatement(type, name)); + } + return code; + } + /** *

* Assert that the interface primitive is valid; if not, throws an exception @@ -171,6 +198,12 @@ public class InterfaceConstruct extends Construct { funcHeader = UtilParser.parseFuncHeader(line); // Record the original declaration line funcHeader.setHeaderLine(line); + + // Once we have the compelte function declaration, we can auto-gen the + // print-out statements if it's not defined + if (autoGenPrint) { + print.addLines(generateAutoPrintFunction()); + } } public String toString() { diff --git a/src/edu/uci/eecs/specExtraction/SpecExtractor.java b/src/edu/uci/eecs/specExtraction/SpecExtractor.java index 959e51f..d3a2521 100644 --- a/src/edu/uci/eecs/specExtraction/SpecExtractor.java +++ b/src/edu/uci/eecs/specExtraction/SpecExtractor.java @@ -268,11 +268,12 @@ public class SpecExtractor { annotations.add(curLine); // System.out.println(curLine); // Initial settings for matching lines - // "\*/( |\t)*$" - Pattern regexpEnd = Pattern.compile("\\*/( |\\t)*$"); + // "\*/\s*$" + Pattern regexpEnd = Pattern.compile("\\*/\\s*$"); Matcher matcher = regexpEnd.matcher(curLine); - if (matcher.find()) { // The beginning line is also the end line - annotations.add(curLine); + if (matcher.find()) { + // The beginning line is also the end line + // In this case, we have already add the curLine return annotations; } else { try { diff --git a/src/edu/uci/eecs/specExtraction/SpecNaming.java b/src/edu/uci/eecs/specExtraction/SpecNaming.java index aa021af..d60bf96 100644 --- a/src/edu/uci/eecs/specExtraction/SpecNaming.java +++ b/src/edu/uci/eecs/specExtraction/SpecNaming.java @@ -176,6 +176,8 @@ public class SpecNaming { // Other CDSSpec functions public static final String AddInterfaceFunctions = "addInterfaceFunctions"; public static final String CDSAnnotateFunc = "cdsannotate"; + public static final String PRINT = "PRINT"; + public static final String PrintContainer = "printContainer"; // Special instances public static final String Method1 = "_M"; diff --git a/src/edu/uci/eecs/specExtraction/SpecUtils.java b/src/edu/uci/eecs/specExtraction/SpecUtils.java index 869b9ff..71512d8 100644 --- a/src/edu/uci/eecs/specExtraction/SpecUtils.java +++ b/src/edu/uci/eecs/specExtraction/SpecUtils.java @@ -123,7 +123,8 @@ public class SpecUtils { * annotations or the beginning line of the next primitive * @throws WrongAnnotationException */ - public static Primitive extractPrimitive(File file, int beginLineNum, ArrayList annotations, IntObj curIdx) + public static Primitive extractPrimitive(File file, int beginLineNum, + ArrayList annotations, IntObj curIdx) throws WrongAnnotationException { if (curIdx.getVal() == annotations.size()) // The current index points // to the end @@ -146,8 +147,9 @@ public class SpecUtils { } // Assert that we must have found one primitive if (primitive == null) { - WrongAnnotationException.err(file, curLineNum, - "Something is wrong! We must have found one primitve here!\n"); + WrongAnnotationException + .err(file, curLineNum, + "Something is wrong! We must have found one primitve here!\n"); } // Process the current "primitive" @@ -161,8 +163,9 @@ public class SpecUtils { primitive.addLine(trimmedCode); } } else { - WrongAnnotationException.err(file, curLineNum, - "The state annotation should have correct primitive syntax (sub-annotations)"); + WrongAnnotationException + .err(file, curLineNum, + "The state annotation should have correct primitive syntax (sub-annotations)"); } // Deal with other normal line. E.g. y = 1; @@ -184,7 +187,8 @@ public class SpecUtils { if (primitive.contents.size() == 0) { // The content of the primitive is // empty - WrongAnnotationException.warning(file, curLineNum, "Primitive " + primitive.name + " is empty."); + WrongAnnotationException.warning(file, curLineNum, "Primitive " + + primitive.name + " is empty."); } return primitive; } @@ -229,8 +233,9 @@ public class SpecUtils { // FIXME: We only consider the type is either a one-level pointer or a // struct String bareType = trimSpace(type.replace('*', ' ')); - return !bareType.equals("int") && !bareType.matches("unsigned\\s+int") && !bareType.equals("unsigned") - && !bareType.equals("bool") && !bareType.equals("double") && !bareType.equals("float") + return !bareType.equals("int") && !bareType.matches("unsigned\\s+int") + && !bareType.equals("unsigned") && !bareType.equals("bool") + && !bareType.equals("double") && !bareType.equals("float") && !bareType.equals("void"); } @@ -240,4 +245,67 @@ public class SpecUtils { String bareType = trimSpace(type.replace('*', ' ')); return bareType; } + + /** + *

+ * This function will automatically generate the printing statements for + * supported types when given a type and a name of the declaration. + *

+ * + * @return The auto-generated state printing statements + */ + public static Code generatePrintStatement(String type, String name) { + Code code = new Code(); + // Primitive types + if (type.equals("int") || type.equals("unsigned") + || type.equals("unsigned int") || type.equals("int unsigned") + || type.equals("double") || type.equals("double") + || type.equals("bool")) { + // PRINT("\tx=%d\n", x); + code.addLine(SpecNaming.PRINT + "(\"\\t" + name + "=%d\\n\", " + + name + ");"); + } else if (type.equals("int *") || type.equals("unsigned *") + || type.equals("unsigned int *") + || type.equals("int unsigned *") || type.equals("double *") + || type.equals("double *") || type.equals("bool *")) { + // Supported pointer types for primitive types + // PRINT("\t*x=%d\n", *x); + code.addLine(SpecNaming.PRINT + "(\"\\t*" + name + "=%d\\n\", *" + + name + ");"); + } else if (type.equals("IntList") || type.equals("IntSet") + || type.equals("IntMap")) { + // Supported types + // PRINT("\tq: "); + // printContainer(&q); + // model_print("\n"); + code.addLine(SpecNaming.PRINT + "(\"\\t" + name + ": \");"); + code.addLine(SpecNaming.PrintContainer + "(&" + name + ");"); + code.addLine(SpecNaming.PRINT + "(\"\\n\");"); + } else if (type.equals("IntList *") || type.equals("IntSet *") + || type.equals("IntMap *")) { + // Supported pointer types + // PRINT("\tq: "); + // printContainer(q); + // model_print("\n"); + code.addLine(SpecNaming.PRINT + "(\"\\t" + name + ": \");"); + code.addLine(SpecNaming.PrintContainer + "(" + name + ");"); + code.addLine(SpecNaming.PRINT + "(\"\\n\");"); + } else if (type.equals("void")) { + // Just do nothing! + } else { + if (type.endsWith("*")) { // If it's an obvious pointer (with a STAR) + // Weak support pointer types (just print out the address) + // PRINT("\tmutex=%p\n", mutex); + code.addLine(SpecNaming.PRINT + "(\"\\t" + name + "=%p\\n\", " + + name + ");"); + } else { + code.addLine("// We do not support auto-gen print-out for type: " + + type + "."); + } + + } + + return code; + } + } -- 2.34.1