From 58c206cef45ef0805fb02e7f37fd6b4a2ad89d9c Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sat, 30 Dec 2017 17:31:22 +0100 Subject: [PATCH] Added more options to CompileLog for controlling verbosity. --- .../java/dk/camelot64/kickc/CompileLog.java | 72 +++++++++++++++++-- .../java/dk/camelot64/kickc/Compiler.java | 50 +++++++------ .../kickc/fragment/AsmFragmentManager.java | 12 ++-- 3 files changed, 98 insertions(+), 36 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/CompileLog.java b/src/main/java/dk/camelot64/kickc/CompileLog.java index 777e82bd2..579113205 100644 --- a/src/main/java/dk/camelot64/kickc/CompileLog.java +++ b/src/main/java/dk/camelot64/kickc/CompileLog.java @@ -1,15 +1,41 @@ package dk.camelot64.kickc; -/** Log of actions & results during compile*/ +/** + * Log of actions & results during compile + */ public class CompileLog { private StringBuilder log; - /** Should register uplift analysis be verbose. */ - private boolean verboseUplift; + /** + * Should register uplift analysis be verbose. + */ + private boolean verboseUplift = false; - /** Should live range analysis be verbose. */ - private boolean verboseLiveRanges; + /** + * Should live range analysis be verbose. + */ + private boolean verboseLiveRanges = false; + + /** + * Should fragment synthesis be verbose. + */ + private boolean verboseFragmentLog = false; + + /** + * Should ASM optimization be verbose. + */ + private boolean verboseAsmOptimize = false; + + /** + * Should SSA optimization be verbose. + */ + private boolean verboseSSAOptimize = false; + + /** + * Should the log be output to System.out while being built + */ + private boolean sysOut = false; public CompileLog() { this.log = new StringBuilder(); @@ -18,7 +44,9 @@ public class CompileLog { public void append(String msg) { log.append(msg); log.append("\n"); - //System.out.append(msg+"\n"); + if(sysOut) { + System.out.append(msg + "\n"); + } } public StringBuilder getLog() { @@ -41,6 +69,38 @@ public class CompileLog { this.verboseLiveRanges = verboseLiveRanges; } + public boolean isVerboseFragmentLog() { + return verboseFragmentLog; + } + + public void setVerboseFragmentLog(boolean verboseFragmentLog) { + this.verboseFragmentLog = verboseFragmentLog; + } + + public boolean isVerboseAsmOptimize() { + return verboseAsmOptimize; + } + + public void setVerboseAsmOptimize(boolean verboseAsmOptimize) { + this.verboseAsmOptimize = verboseAsmOptimize; + } + + public boolean isVerboseSSAOptimize() { + return verboseSSAOptimize; + } + + public void setVerboseSSAOptimize(boolean verboseSSAOptimize) { + this.verboseSSAOptimize = verboseSSAOptimize; + } + + public boolean isSysOut() { + return sysOut; + } + + public void setSysOut(boolean sysOut) { + this.sysOut = sysOut; + } + @Override public String toString() { return log.toString(); diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index 975d6cc8b..5d94d6a1a 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -43,8 +43,8 @@ public class Compiler { pass4RegisterAllocation(); pass5GenerateAndOptimizeAsm(); return program; - } catch (Exception e) { - System.out.println("EXCEPTION DURING COMPILE "+e.getMessage()); + } catch(Exception e) { + System.out.println("EXCEPTION DURING COMPILE " + e.getMessage()); System.out.println(getLog().toString()); throw e; } @@ -54,12 +54,12 @@ public class Compiler { try { File file = loadFile(fileName, program); List imported = program.getImported(); - if (imported.contains(file.getAbsolutePath())) { + if(imported.contains(file.getAbsolutePath())) { return; } final CharStream fileStream = CharStreams.fromPath(file.toPath()); imported.add(file.getAbsolutePath()); - program.getLog().append("PARSING "+file.getPath()); + program.getLog().append("PARSING " + file.getPath()); program.getLog().append(fileStream.toString()); KickCLexer lexer = new KickCLexer(fileStream); KickCParser parser = new KickCParser(new CommonTokenStream(lexer)); @@ -77,23 +77,23 @@ public class Compiler { } }); pass0GenerateStatementSequence.generate(parser.file()); - } catch (IOException e) { + } catch(IOException e) { throw new CompileError("Error loading file " + fileName, e); } } private static File loadFile(String fileName, Program program) { - if (!fileName.endsWith(".kc")) { + if(!fileName.endsWith(".kc")) { fileName += ".kc"; } List importPaths = program.getImportPaths(); - for (String importPath : importPaths) { - if (!importPath.endsWith("/")) { + for(String importPath : importPaths) { + if(!importPath.endsWith("/")) { importPath += "/"; } String filePath = importPath + fileName; File file = new File(filePath); - if (file.exists()) { + if(file.exists()) { return file; } } @@ -163,7 +163,7 @@ public class Compiler { assertions.add(new Pass2AssertNoProcs(program)); assertions.add(new Pass2AssertNoLabels(program)); assertions.add(new Pass2AssertSingleAssignment(program)); - for (Pass2SsaAssertion assertion : assertions) { + for(Pass2SsaAssertion assertion : assertions) { assertion.check(); } } @@ -192,18 +192,20 @@ public class Compiler { private void pass2OptimizeSSA(List optimizations) { getLog().append("OPTIMIZING CONTROL FLOW GRAPH"); boolean ssaOptimized = true; - while (ssaOptimized) { + while(ssaOptimized) { pass2AssertSSA(); ssaOptimized = false; - for (Pass2SsaOptimization optimization : optimizations) { + for(Pass2SsaOptimization optimization : optimizations) { boolean stepOptimized = true; - while (stepOptimized) { + while(stepOptimized) { stepOptimized = optimization.step(); - if (stepOptimized) { + if(stepOptimized) { getLog().append("Succesful SSA optimization " + optimization.getClass().getSimpleName() + ""); ssaOptimized = true; - //getLog().append("CONTROL FLOW GRAPH"); - //getLog().append(program.getGraph().toString(program)); + if(getLog().isVerboseSSAOptimize()) { + getLog().append("CONTROL FLOW GRAPH"); + getLog().append(program.getGraph().toString(program)); + } } } } @@ -294,7 +296,7 @@ public class Compiler { boolean change; do { change = new Pass4RegisterUpliftPotentialRegisterAnalysis(program).findPotentialRegisters(); - } while (change); + } while(change); getLog().append(program.getRegisterPotentials().toString()); // Find register uplift scopes @@ -338,15 +340,17 @@ public class Compiler { pass5Optimizations.add(new Pass5UnreachableCodeElimination(program)); pass5Optimizations.add(new Pass5RelabelLongLabels(program)); boolean asmOptimized = true; - while (asmOptimized) { + while(asmOptimized) { asmOptimized = false; - for (Pass5AsmOptimization optimization : pass5Optimizations) { + for(Pass5AsmOptimization optimization : pass5Optimizations) { boolean stepOptimized = optimization.optimize(); - if (stepOptimized) { + if(stepOptimized) { getLog().append("Succesful ASM optimization " + optimization.getClass().getSimpleName()); asmOptimized = true; - //getLog().append("ASSEMBLER"); - //getLog().append(program.getAsm().toString()); + if(getLog().isVerboseAsmOptimize()) { + getLog().append("ASSEMBLER"); + getLog().append(program.getAsm().toString()); + } } } } @@ -355,7 +359,7 @@ public class Compiler { getLog().append(program.getScope().getSymbolTableContents(program)); getLog().append("\nFINAL ASSEMBLER"); - getLog().append("Score: "+Pass4RegisterUpliftCombinations.getAsmScore(program)+"\n"); + getLog().append("Score: " + Pass4RegisterUpliftCombinations.getAsmScore(program) + "\n"); getLog().append(program.getAsm().toString()); } diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentManager.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentManager.java index 3cc3470e1..d8a9ebb7a 100644 --- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentManager.java +++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragmentManager.java @@ -21,8 +21,6 @@ import java.util.regex.Pattern; */ public class AsmFragmentManager { - static boolean verboseFragmentLog = false; - /** * Cache for fragment files. Maps signature to the parsed file. */ @@ -44,7 +42,7 @@ public class AsmFragmentManager { private static KickCParser.AsmFileContext getFragmentFile(AsmFragmentSignature signature, CompileLog log) { KickCParser.AsmFileContext fragmentCtx = fragmentFileCache.get(signature.getSignature()); if(fragmentCtx == UNKNOWN) { - if(verboseFragmentLog) { + if(log.isVerboseFragmentLog()) { log.append("Unknown fragment " + signature.getSignature()); } throw new UnknownFragmentException(signature.toString()); @@ -53,7 +51,7 @@ public class AsmFragmentManager { FragmentSynthesizer synthesizer = new FragmentSynthesizer(signature, log); List candidates = synthesizer.loadOrSynthesizeFragment(signature.getSignature()); if(candidates.size() == 0) { - if(verboseFragmentLog) { + if(log.isVerboseFragmentLog()) { log.append("Unknown fragment " + signature.toString()); } fragmentFileCache.put(signature.getSignature(), UNKNOWN); @@ -78,7 +76,7 @@ public class AsmFragmentManager { fragmentCtx = candidateCtx; } } - if(verboseFragmentLog) { + if(log.isVerboseFragmentLog()) { log.append("Found fragment " + signature + " score: " + minScore + " from " + candidates.size() + " candidates"); } fragmentFileCache.put(signature.getSignature(), fragmentCtx); @@ -114,7 +112,7 @@ public class AsmFragmentManager { CharStream fragmentCharStream = loadFragment(signature); if(fragmentCharStream != null) { candidates.add(fragmentCharStream); - if(verboseFragmentLog) { + if(log.isVerboseFragmentLog()) { log.append("Finding fragment "+this.signature.getSignature()+" - Successfully loaded fragment " + signature); } } @@ -123,7 +121,7 @@ public class AsmFragmentManager { for(FragmentSynthesis synth : synths) { List synthesized = synth.synthesize(signature, this); if(synthesized != null) { - if(verboseFragmentLog && synthesized.size() > 0) { + if(log.isVerboseFragmentLog() && synthesized.size() > 0) { log.append("Finding fragment "+this.signature.getSignature()+" - Successfully synthesized " + synthesized.size() + " fragments " + signature + " (from " + synth.getSubSignature() + ")"); } candidates.addAll(synthesized);