mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-06-03 07:29:37 +00:00
137053f093
- Activate with option -rrig or -reportrig.
69 lines
2.7 KiB
Java
69 lines
2.7 KiB
Java
package dk.camelot64.kickc.passes.reports;
|
|
|
|
import dk.camelot64.kickc.model.*;
|
|
import dk.camelot64.kickc.model.statements.Statement;
|
|
import dk.camelot64.kickc.model.symbols.Procedure;
|
|
import dk.camelot64.kickc.model.values.VariableRef;
|
|
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Creates a reference interference graph from the liveliness analysis and coalesce actions.
|
|
*/
|
|
public class ReportRIG extends Report {
|
|
|
|
public MermaidGraph mermaidGraph;
|
|
|
|
public ReportRIG(Program program, String pass, String extension) {
|
|
super(program, pass, extension);
|
|
}
|
|
|
|
public void mermaidRIGBlock(Graph.Block block, LiveRangeVariables liveRanges) {
|
|
if(!block.getStatements().isEmpty()) {
|
|
for (Statement statement : block.getStatements()) {
|
|
List<VariableRef> aliveVariables = liveRanges.getAlive(statement.getIndex());
|
|
int size = aliveVariables.size();
|
|
if(size > 2) {
|
|
for (int i = 0; i < size - 1; i++) {
|
|
VariableRef varInner = aliveVariables.get(i);
|
|
MermaidNode innerNode = mermaidGraph.addNode(varInner.getFullName());
|
|
for (int o = i+1; o < size; o++) {
|
|
VariableRef varOuter = aliveVariables.get(o);
|
|
MermaidNode outerNode = mermaidGraph.addNode(varOuter.getFullName());
|
|
mermaidGraph.addFlow(innerNode, outerNode, null, MermaidFlow.Type.FULL, MermaidFlow.Direction.BI);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public String mermaidLiveRanges(Procedure procedure, Graph graph, LiveRangeVariables liveRanges) {
|
|
|
|
for(Graph.Block block : graph.getAllBlocks()) {
|
|
mermaidRIGBlock(block, liveRanges);
|
|
}
|
|
|
|
return mermaidGraph.getText(program);
|
|
}
|
|
|
|
@Override
|
|
public String generateReport(Program program) {
|
|
StringBuilder report = new StringBuilder();
|
|
LiveRangeVariables liveRanges = program.getLiveRangeVariables();
|
|
for(ProcedureCompilation procedureCompilation : program.getProcedureCompilations()) {
|
|
Procedure procedure = program.getScope().getProcedure(procedureCompilation.getProcedureRef());
|
|
Graph graph = procedureCompilation.getGraph();
|
|
if(graph != null) {
|
|
report.append("Procedure " + procedure.getFullName() + "\n");
|
|
report.append("```mermaid\n");
|
|
mermaidGraph = new MermaidGraph(MermaidGraph.Direction.TOP_DOWN);
|
|
report.append(configureReport());
|
|
report.append(mermaidLiveRanges(procedure, graph, liveRanges));
|
|
report.append("```\n\n");
|
|
}
|
|
}
|
|
return report.toString();
|
|
}
|
|
}
|