diff --git a/.gitignore b/.gitignore index b2fe398..38a9bb8 100644 --- a/.gitignore +++ b/.gitignore @@ -42,7 +42,8 @@ hs_err_pid* **/*.imclin.xml **/*.asmgen.html **/*.asmgen.xml - +**/*.livean.html +**/*.livean.xml # antlr **/PrevLexer.tokens diff --git a/prev23/lib/xsl/livean.xsl b/prev23/lib/xsl/livean.xsl new file mode 100644 index 0000000..99277c7 --- /dev/null +++ b/prev23/lib/xsl/livean.xsl @@ -0,0 +1,132 @@ + + + + + + + + + +
+ + +
+ + + + + + + + + + + +
+ +
+ + entryLabel= + exitLabel= + temps= + +
+ +
+ + + + + + + + + + + + + + + + + + + : + + + + + + + + + + + + + + + + + + + + + +
+ + FRAME + label= + +
+ + depth= + size= + locs= + args= + +
+ + FP= + RV= + +
+
+ + + + + + + + + + + + +
+ + FRAME + label= + +
+ + depth= + size= + locs= + args= + +
+ + FP= + RV= + +
+
+ +
diff --git a/prev23/src/prev23/Compiler.java b/prev23/src/prev23/Compiler.java index b132b6d..ec1ed49 100644 --- a/prev23/src/prev23/Compiler.java +++ b/prev23/src/prev23/Compiler.java @@ -11,6 +11,7 @@ import prev23.phase.imcgen.*; import prev23.phase.imclin.*; import prev23.phase.asmgen.*; +import prev23.phase.livean.*; /** * The compiler. @@ -45,7 +46,7 @@ private Compiler() { // COMMAND LINE ARGUMENTS /** All valid phases of the compiler. */ - private static final String phases = "none|lexan|synan|abstr|seman|memory|imcgen|imclin|asmgen"; + private static final String phases = "none|lexan|synan|abstr|seman|memory|imcgen|imclin|asmgen|livean"; /** Values of command line arguments indexed by their command line switch. */ private static HashMap cmdLineArgs = new HashMap(); @@ -186,6 +187,14 @@ public static void main(String[] args) { } if (Compiler.cmdLineArgValue("--target-phase").equals("asmgen")) break; + + // Liveness analysis. + try (LiveAn livean = new LiveAn()) { + livean.analysis(); + livean.log(); + } + if (Compiler.cmdLineArgValue("--target-phase").equals("livean")) + break; } Report.info("Done."); diff --git a/prev23/src/prev23/phase/livean/LiveAn.java b/prev23/src/prev23/phase/livean/LiveAn.java new file mode 100644 index 0000000..c9f995a --- /dev/null +++ b/prev23/src/prev23/phase/livean/LiveAn.java @@ -0,0 +1,73 @@ +package prev23.phase.livean; + +import prev23.data.mem.*; +import prev23.data.asm.*; +import prev23.phase.*; +import prev23.phase.asmgen.*; + +/** + * Liveness analysis. + */ +public class LiveAn extends Phase { + + public LiveAn() { + super("livean"); + } + + public void analysis() { + // TODO + } + + public void log() { + if (logger == null) + return; + for (Code code : AsmGen.codes) { + logger.begElement("code"); + logger.addAttribute("entrylabel", code.entryLabel.name); + logger.addAttribute("exitlabel", code.exitLabel.name); + logger.addAttribute("tempsize", Long.toString(code.tempSize)); + code.frame.log(logger); + logger.begElement("instructions"); + for (AsmInstr instr : code.instrs) { + logger.begElement("instruction"); + logger.addAttribute("code", instr.toString()); + logger.begElement("temps"); + logger.addAttribute("name", "use"); + for (MemTemp temp : instr.uses()) { + logger.begElement("temp"); + logger.addAttribute("name", temp.toString()); + logger.endElement(); + } + logger.endElement(); + logger.begElement("temps"); + logger.addAttribute("name", "def"); + for (MemTemp temp : instr.defs()) { + logger.begElement("temp"); + logger.addAttribute("name", temp.toString()); + logger.endElement(); + } + logger.endElement(); + logger.begElement("temps"); + logger.addAttribute("name", "in"); + for (MemTemp temp : instr.in()) { + logger.begElement("temp"); + logger.addAttribute("name", temp.toString()); + logger.endElement(); + } + logger.endElement(); + logger.begElement("temps"); + logger.addAttribute("name", "out"); + for (MemTemp temp : instr.out()) { + logger.begElement("temp"); + logger.addAttribute("name", temp.toString()); + logger.endElement(); + } + logger.endElement(); + logger.endElement(); + } + logger.endElement(); + logger.endElement(); + } + } + +} diff --git a/prev23/src/prev23/phase/livean/package-info.java b/prev23/src/prev23/phase/livean/package-info.java new file mode 100644 index 0000000..d3e5caf --- /dev/null +++ b/prev23/src/prev23/phase/livean/package-info.java @@ -0,0 +1,4 @@ +/** + * Liveness analysis. + */ +package prev23.phase.livean; \ No newline at end of file