From fd483811b9d9d65badd1fa5b232356724555d708 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Thu, 28 Jan 2021 11:49:15 +0100 Subject: [PATCH] First flowgraph? --- .../codegen/analysis/flowgraph/FlowGraph.java | 39 +++++++++++++++++++ .../analysis/flowgraph/FlowGraphBlock.java | 25 ++++++++++++ .../analysis/flowgraph/FlowGraphHead.java | 37 ++++++++++++++++++ .../analysis/flowgraph/FlowGraphLine.java | 19 +++++++++ .../analysis/flowgraph/FlowGraphTail.java | 10 +++++ 5 files changed, 130 insertions(+) create mode 100644 src/main/java/codegen/analysis/flowgraph/FlowGraph.java create mode 100644 src/main/java/codegen/analysis/flowgraph/FlowGraphBlock.java create mode 100644 src/main/java/codegen/analysis/flowgraph/FlowGraphHead.java create mode 100644 src/main/java/codegen/analysis/flowgraph/FlowGraphLine.java create mode 100644 src/main/java/codegen/analysis/flowgraph/FlowGraphTail.java diff --git a/src/main/java/codegen/analysis/flowgraph/FlowGraph.java b/src/main/java/codegen/analysis/flowgraph/FlowGraph.java new file mode 100644 index 0000000..bb410d5 --- /dev/null +++ b/src/main/java/codegen/analysis/flowgraph/FlowGraph.java @@ -0,0 +1,39 @@ +package codegen.analysis.flowgraph; + +import java.util.List; +import java.util.stream.Collectors; + +public class FlowGraph { + + private final FlowGraphHead head; + private final List blocks; + private final FlowGraphTail tail; + + public FlowGraph(FlowGraphHead head, List blocks, FlowGraphTail tail) { + this.head = head; + this.blocks = blocks; + this.tail = tail; + } + + public void print() { + final String blocksString = this.blocks.stream() + .map(FlowGraphBlock::toString) + .map(string -> string + "-".repeat(50)) + .collect(Collectors.joining()); + + System.out.println(this.head + "-".repeat(100) + + blocksString + "-".repeat(100) + + this.tail); + } + + @Override + public String toString() { + final String blocksString = this.blocks.stream() + .map(FlowGraphBlock::toString) + .collect(Collectors.joining()); + + return this.head + + blocksString + + this.tail; + } +} diff --git a/src/main/java/codegen/analysis/flowgraph/FlowGraphBlock.java b/src/main/java/codegen/analysis/flowgraph/FlowGraphBlock.java new file mode 100644 index 0000000..93561a6 --- /dev/null +++ b/src/main/java/codegen/analysis/flowgraph/FlowGraphBlock.java @@ -0,0 +1,25 @@ +package codegen.analysis.flowgraph; + +import java.util.List; +import java.util.stream.Collectors; + +public class FlowGraphBlock { + + private final String label; + private final List lines; + + public FlowGraphBlock(String label, List lines) { + this.label = label; + this.lines = lines; + } + + @Override + public String toString() { + final String linesString = this.lines.stream() + .map(FlowGraphLine::toString) + .collect(Collectors.joining()); + + return this.label + ":\n" + + linesString; + } +} diff --git a/src/main/java/codegen/analysis/flowgraph/FlowGraphHead.java b/src/main/java/codegen/analysis/flowgraph/FlowGraphHead.java new file mode 100644 index 0000000..c6f084b --- /dev/null +++ b/src/main/java/codegen/analysis/flowgraph/FlowGraphHead.java @@ -0,0 +1,37 @@ +package codegen.analysis.flowgraph; + +public class FlowGraphHead { + + private final String bytecodeVersion; + private final String source; + private final String clazz; + private final int stackSize; + private final int localCount; + + public FlowGraphHead(String bytecodeVersion, String source, String clazz, int stackSize, int localCount) { + this.bytecodeVersion = bytecodeVersion; + this.source = source; + this.clazz = clazz; + this.stackSize = stackSize; + this.localCount = localCount; + } + + @Override + public String toString() { + return ".bytecode " + this.bytecodeVersion + "\n" + + ".source " + this.source + "\n" + + ".class public" + this.clazz + "\n" + + ".super java/lang/Object\n" + + ".method public ()V\n" + + "\t.limit stack 1\n" + + "\t.limit locals 1\n" + + "\t\taload_0\n" + + "\t\tinvokespecial java/lang/Object/()V\n" + + "\t\treturn\n" + + ".end method\n\n" + + + ".method public static main([Ljava/lang/String;)V\n" + + "\t.limit stack " + this.stackSize + "\n" + + "\t.limit locals " + this.localCount + "\n"; + } +} diff --git a/src/main/java/codegen/analysis/flowgraph/FlowGraphLine.java b/src/main/java/codegen/analysis/flowgraph/FlowGraphLine.java new file mode 100644 index 0000000..80da8b7 --- /dev/null +++ b/src/main/java/codegen/analysis/flowgraph/FlowGraphLine.java @@ -0,0 +1,19 @@ +package codegen.analysis.flowgraph; + +public class FlowGraphLine { + + private final String instruction; + private final String[] args; + + public FlowGraphLine(String instruction, String... args) { + this.instruction = instruction; + this.args = args; + } + + @Override + public String toString() { + final String argsString = String.join(" ", this.args); + + return "\t\t" + this.instruction + " " + argsString; + } +} diff --git a/src/main/java/codegen/analysis/flowgraph/FlowGraphTail.java b/src/main/java/codegen/analysis/flowgraph/FlowGraphTail.java new file mode 100644 index 0000000..6f1680f --- /dev/null +++ b/src/main/java/codegen/analysis/flowgraph/FlowGraphTail.java @@ -0,0 +1,10 @@ +package codegen.analysis.flowgraph; + +public class FlowGraphTail { + + @Override + public String toString() { + return "\t\treturn\n" + + ".end method"; + } +}