X-Git-Url: http://plrg.eecs.uci.edu/git/?p=cdsspec-compiler.git;a=blobdiff_plain;f=src%2Fedu%2Fuci%2Feecs%2FspecCompiler%2FcodeGenerator%2FCodeGenerator.java;h=d38bba7f645c6191ff6b73bed4cf477477cda73e;hp=b53b482f582570f7608b388c6fda5e17bba769cc;hb=0a6651b877d4303c94fb0a2a9c5632acbd574f32;hpb=18609d4482268ee61246f182a6a5cb1144e34573 diff --git a/src/edu/uci/eecs/specCompiler/codeGenerator/CodeGenerator.java b/src/edu/uci/eecs/specCompiler/codeGenerator/CodeGenerator.java index b53b482..d38bba7 100644 --- a/src/edu/uci/eecs/specCompiler/codeGenerator/CodeGenerator.java +++ b/src/edu/uci/eecs/specCompiler/codeGenerator/CodeGenerator.java @@ -6,17 +6,25 @@ import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; +import java.util.Iterator; import edu.uci.eecs.specCompiler.specExtraction.CPDefineCheckConstruct; import edu.uci.eecs.specCompiler.specExtraction.CPDefineConstruct; +import edu.uci.eecs.specCompiler.specExtraction.ClassEndConstruct; +import edu.uci.eecs.specCompiler.specExtraction.ConditionalInterface; import edu.uci.eecs.specCompiler.specExtraction.Construct; +import edu.uci.eecs.specCompiler.specExtraction.EntryPointConstruct; import edu.uci.eecs.specCompiler.specExtraction.GlobalConstruct; +import edu.uci.eecs.specCompiler.specExtraction.IDExtractor; import edu.uci.eecs.specCompiler.specExtraction.InterfaceConstruct; +import edu.uci.eecs.specCompiler.specExtraction.InterfaceDefineConstruct; +import edu.uci.eecs.specCompiler.specExtraction.ParserUtils; import edu.uci.eecs.specCompiler.specExtraction.PotentialCPDefineConstruct; -import edu.uci.eecs.specCompiler.specExtraction.SpecConstruct; +import edu.uci.eecs.specCompiler.specExtraction.SequentialDefineSubConstruct; +import edu.uci.eecs.specCompiler.specExtraction.SourceFileInfo; import edu.uci.eecs.specCompiler.specExtraction.SpecExtractor; -import edu.uci.eecs.specCompiler.specExtraction.SpecNotMatchException; /** *

@@ -33,25 +41,20 @@ public class CodeGenerator { private File[] srcFiles; - private HashMap> contents; + private HashMap srcFilesInfo; private HashMap> codeAdditions; public CodeGenerator(File[] srcFiles) { this.srcFiles = srcFiles; - this.contents = new HashMap>(); - readSrcFiles(); - this.codeAdditions = new HashMap>(); - _extractor = new SpecExtractor(); + _extractor.extract(srcFiles); - try { - _extractor.extract(srcFiles); - } catch (SpecNotMatchException e1) { - e1.printStackTrace(); - } + this.srcFilesInfo = _extractor.srcFilesInfo; - _semantics = new SemanticsChecker(_extractor.getConstructs()); + this.codeAdditions = new HashMap>(); + + _semantics = new SemanticsChecker(_extractor); try { _semantics.check(); System.out.println(_semantics); @@ -60,140 +63,156 @@ public class CodeGenerator { } } - private ArrayList readSrcFile(File f) throws IOException { - BufferedReader bf = new BufferedReader(new FileReader(f)); - ArrayList content = new ArrayList(); - String curLine; - while ((curLine = bf.readLine()) != null) { - content.add(curLine); - } - return content; - } - - private void readSrcFiles() { - for (int i = 0; i < srcFiles.length; i++) { - File f = srcFiles[i]; - if (!contents.containsKey(f)) { - try { - contents.put(f, readSrcFile(f)); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - /** *

* Generate all the global code, including the "@DefineVar" in each * "@Interface" define *

*/ - private void globalConstruct2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; - ArrayList newCode = new ArrayList(); - - // Generate the code in global construct first - String globalCode = construct.code; - int begin = 0, end = 0; - while (end < globalCode.length()) { - if (globalCode.charAt(end) == '\n') { - String line = globalCode.substring(begin, end); - newCode.add(line); - begin = end + 1; - } - end++; + private void globalConstruct2Code(GlobalConstruct construct) { + ArrayList newCode = CodeVariables.generateGlobalVarDeclaration( + _semantics, construct); + // Add it to the codeAdditions + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); + } + CodeAddition addition = new CodeAddition(construct.beginLineNum, + newCode); + codeAdditions.get(construct.file).add(addition); + newCode = CodeVariables.generateStaticVarDefine(_semantics, construct); + if (newCode.size() > 0) { + addition = new CodeAddition( + _semantics.getClassEndConstruct().beginLineNum, newCode); + codeAdditions.get(construct.file).add(addition); } - - // Generate code from the DefineVar and __COND_SAT__ - - + } + + // Mainly rename and wrap the interface + private void interface2Code(InterfaceConstruct construct) { + ArrayList newCode = CodeVariables.generateInterfaceWrapper( + _semantics, construct); + int lineNum = construct.beginLineNum; + // Add it to the codeAdditions CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - codeAdditions.get(inst.file).add(addition); + codeAdditions.get(construct.file).add(addition); } - private void interface2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; - ArrayList newCode = new ArrayList(); - - + private void potentialCPDefine2Code(PotentialCPDefineConstruct construct) { + int lineNum = construct.beginLineNum; + ArrayList newCode = CodeVariables.generatePotentialCPDefine( + _semantics, construct); + CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - codeAdditions.get(inst.file).add(addition); + codeAdditions.get(construct.file).add(addition); } - private void potentialCP2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; - ArrayList newCode = new ArrayList(); - - + private void CPDefine2Code(CPDefineConstruct construct) { + int lineNum = construct.beginLineNum; + ArrayList newCode = CodeVariables.generateCPDefine(_semantics, + construct); + CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - codeAdditions.get(inst.file).add(addition); + codeAdditions.get(construct.file).add(addition); } - private void CPDefine2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; - ArrayList newCode = new ArrayList(); - - + private void CPDefineCheck2Code(CPDefineCheckConstruct construct) { + int lineNum = construct.beginLineNum; + ArrayList newCode = CodeVariables.generateCPDefineCheck( + _semantics, construct); + CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); } - codeAdditions.get(inst.file).add(addition); + codeAdditions.get(construct.file).add(addition); } - private void CPDefineCheck2Code(SpecConstruct inst) { - int lineNum = inst.endLineNum + 1; - GlobalConstruct construct = (GlobalConstruct) inst.construct; + private void EntryPoint2Code(EntryPointConstruct construct) { + int lineNum = construct.beginLineNum; ArrayList newCode = new ArrayList(); - - + newCode.addAll(CodeVariables.generateEntryPointInitCall()); + CodeAddition addition = new CodeAddition(lineNum, newCode); - if (!codeAdditions.containsKey(inst.file)) { - codeAdditions.put(inst.file, new ArrayList()); + if (!codeAdditions.containsKey(construct.file)) { + codeAdditions.put(construct.file, new ArrayList()); + } + codeAdditions.get(construct.file).add(addition); + } + + private ArrayList insertAnnotation2Src( + ArrayList additions, ArrayList content) { + int totalSize = content.size(); + for (int i = 0; i < additions.size(); i++) { + totalSize += additions.size(); } - codeAdditions.get(inst.file).add(addition); + ArrayList newContent = new ArrayList(totalSize); + int curSrcLine = 0; + for (int i = 0; i < additions.size(); i++) { + CodeAddition addition = additions.get(i); + if (curSrcLine < addition.lineNum) { + // Be careful, subList is the interval [begin, end) + newContent.addAll(content.subList(curSrcLine, addition.lineNum)); + curSrcLine = addition.lineNum; + } + newContent.addAll(addition.newCode); + } + newContent.addAll(content.subList(curSrcLine, content.size())); + return newContent; } public void generateCode() { for (int i = 0; i < _semantics.constructs.size(); i++) { - SpecConstruct inst = _semantics.constructs.get(i); - Construct construct = inst.construct; + Construct construct = _semantics.constructs.get(i); if (construct instanceof GlobalConstruct) { - globalConstruct2Code(inst); + globalConstruct2Code((GlobalConstruct) construct); } else if (construct instanceof InterfaceConstruct) { - interface2Code(inst); + interface2Code((InterfaceConstruct) construct); } else if (construct instanceof PotentialCPDefineConstruct) { - potentialCP2Code(inst); + potentialCPDefine2Code((PotentialCPDefineConstruct) construct); } else if (construct instanceof CPDefineConstruct) { - CPDefine2Code(inst); + CPDefine2Code((CPDefineConstruct) construct); } else if (construct instanceof CPDefineCheckConstruct) { - CPDefineCheck2Code(inst); + CPDefineCheck2Code((CPDefineCheckConstruct) construct); + } else if (construct instanceof EntryPointConstruct) { + EntryPoint2Code((EntryPointConstruct) construct); } } + // Sort code additions + for (File file : codeAdditions.keySet()) { + ArrayList additions = codeAdditions.get(file); + if (additions.size() == 0) // Simply do nothing, already written + // once + continue; + ArrayList content = _semantics.srcFilesInfo.get(file).content; + Collections.sort(additions, CodeAddition.lineNumComparator); + // Insert generated annotation to the source files + ArrayList newContent = insertAnnotation2Src(additions, + content); + // Write it back to file + ParserUtils.write2File(file, newContent); + } + } public static void main(String[] argvs) { String homeDir = Environment.HOME_DIRECTORY; File[] srcFiles = { - // new File(homeDir + "/benchmark/linuxrwlocks/linuxrwlocks.c"), +// new File(Environment.MODEL_CHECKER_TEST_DIR + "/backup_linuxrwlocks.c") }; +// new File(homeDir + "/benchmark/linuxrwlocks/linuxrwlocks.c") }; new File(homeDir - + "/benchmark/cliffc-hashtable/simplified_cliffc_hashtable.h"), - // new File(homeDir + "/benchmark/ms-queue/my_queue.c") - }; + + "/benchmark/cliffc-hashtable/simplified_cliffc_hashtable.h"), }; +// new File(homeDir + "/benchmark/ms-queue/my_queue.c"), +// new File(homeDir + "/benchmark/ms-queue/my_queue.c") }; +// new File(homeDir + "/benchmark/test/test.c") }; CodeGenerator gen = new CodeGenerator(srcFiles); gen.generateCode(); }