From f891f0082c4e3bb28944918f56ca8eca67a411f6 Mon Sep 17 00:00:00 2001 From: avishek-sen-gupta Date: Sun, 17 Nov 2024 19:40:53 +0530 Subject: [PATCH] Integrating SLIFO task in BuildzTranspilerFlowgraphTask, but it does not influence CFG building yet --- .../transpiler/TranspilerFlowgraph.java | 5 +- .../BuildTranspilerFlowgraphTask.java | 13 ++++- ...dTranspilerInstructionsFromRawASTTask.java | 35 ------------- .../toolkit/examples/SLIFORangeMain.java | 10 ++-- .../examples/qa/SLIFORangeMainForQA.java | 52 +++++++++++++++++++ 5 files changed, 70 insertions(+), 45 deletions(-) delete mode 100644 smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/BuildTranspilerInstructionsFromRawASTTask.java create mode 100644 smojol-toolkit/src/main/java/org/smojol/toolkit/examples/qa/SLIFORangeMainForQA.java diff --git a/smojol-core/src/main/java/org/smojol/common/transpiler/TranspilerFlowgraph.java b/smojol-core/src/main/java/org/smojol/common/transpiler/TranspilerFlowgraph.java index c3309617..6cf04cc9 100644 --- a/smojol-core/src/main/java/org/smojol/common/transpiler/TranspilerFlowgraph.java +++ b/smojol-core/src/main/java/org/smojol/common/transpiler/TranspilerFlowgraph.java @@ -1,13 +1,16 @@ package org.smojol.common.transpiler; +import org.apache.commons.lang3.tuple.Pair; import org.jgrapht.Graph; import org.jgrapht.graph.DefaultEdge; import org.smojol.common.pseudocode.BasicBlock; import java.util.List; +import java.util.Set; public record TranspilerFlowgraph(Graph, DefaultEdge> basicBlockFlowgraph, Graph instructionFlowgraph, TranspilerNode transpilerTree, List instructions, - List> basicBlocks) { + List> basicBlocks, + Pair, Set> categorisedRanges) { } diff --git a/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/BuildTranspilerFlowgraphTask.java b/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/BuildTranspilerFlowgraphTask.java index 3ed98d60..390de20b 100644 --- a/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/BuildTranspilerFlowgraphTask.java +++ b/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/BuildTranspilerFlowgraphTask.java @@ -1,5 +1,6 @@ package org.smojol.toolkit.analysis.task.transpiler; +import com.google.common.collect.ImmutableList; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.mojo.woof.GraphSDK; @@ -25,6 +26,7 @@ import org.smojol.toolkit.transpiler.TranspilerLoopUpdate; import java.util.List; +import java.util.Set; public class BuildTranspilerFlowgraphTask { private final ParseTree rawAST; @@ -51,13 +53,20 @@ public BuildTranspilerFlowgraphTask(ParseTree rawAST, CobolDataStructure dataStr public TranspilerFlowgraph run() { TranspilerNode transpilerTree = new BuildTranspilerASTTask(rawAST, dataStructures, symbolTable).run(); - List instructions = new BuildTranspilerInstructionsFromRawASTTask(rawAST, dataStructures, symbolTable).run(); + +// TranspilerNode mainNode = transpilerTree.findAllRecursive(t -> t instanceof LabelledTranspilerCodeBlockNode l && l.getName().equals("S-STEUERUNGS")).stream().findFirst().get(); + List instructions = new BuildTranspilerInstructionsFromIntermediateTreeTask(transpilerTree, new IncrementingIdProvider()).run(); + Graph implicitCFG = new BuildImplicitInstructionControlFlowgraphTask(instructions, ImmutableList.of()).run(); + Set rangesWithChildren = new ProcedureBodyTask(transpilerTree, instructions, implicitCFG).run(); + SLIFORangeCriterionTask task = new SLIFORangeCriterionTask(rangesWithChildren); + Pair, Set> categorisedRanges = task.run(); + Graph instructionFlowgraph = new BuildInstructionFlowgraphTask(instructions, flowHints).run(); Pair, DefaultEdge>, List>> basicBlockModel = new BuildBasicBlocksTask(instructions, instructionFlowgraph, new BasicBlockFactory<>(new IncrementingIdProvider()), neo4JDriverBuilder).run(); Graph, DefaultEdge> basicBlockGraph = basicBlockModel.getLeft(); MermaidGraph mermaid = new MermaidGraph<>(); String draw = mermaid.draw(instructionFlowgraph); - return new TranspilerFlowgraph(basicBlockGraph, instructionFlowgraph, transpilerTree, instructions, basicBlockModel.getRight()); + return new TranspilerFlowgraph(basicBlockGraph, instructionFlowgraph, transpilerTree, instructions, basicBlockModel.getRight(), categorisedRanges); // try { // resourceOperations.createDirectories(transpilerModelOutputConfig.outputDir()); diff --git a/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/BuildTranspilerInstructionsFromRawASTTask.java b/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/BuildTranspilerInstructionsFromRawASTTask.java deleted file mode 100644 index 1231b4a3..00000000 --- a/smojol-toolkit/src/main/java/org/smojol/toolkit/analysis/task/transpiler/BuildTranspilerInstructionsFromRawASTTask.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.smojol.toolkit.analysis.task.transpiler; - -import org.antlr.v4.runtime.tree.ParseTree; -import org.smojol.common.ast.FlowNode; -import org.smojol.common.ast.TranspilerInstructionGeneratorVisitor; -import org.smojol.common.id.IncrementingIdProvider; -import org.smojol.common.navigation.AggregatingTranspilerNodeTraversal; -import org.smojol.common.pseudocode.SmojolSymbolTable; -import org.smojol.common.transpiler.TranspilerInstruction; -import org.smojol.common.transpiler.TranspilerNode; -import org.smojol.common.vm.structure.CobolDataStructure; -import org.smojol.toolkit.intermediate.IntermediateASTNodeBuilder; -import org.smojol.toolkit.transpiler.TranspilerTreeBuilder; - -import java.util.List; - -public class BuildTranspilerInstructionsFromRawASTTask { - private final ParseTree rawAST; - private final CobolDataStructure dataStructures; - private final SmojolSymbolTable symbolTable; - private final IncrementingIdProvider idProvider; - - public BuildTranspilerInstructionsFromRawASTTask(ParseTree rawAST, CobolDataStructure dataStructures, SmojolSymbolTable symbolTable) { - this.rawAST = rawAST; - this.dataStructures = dataStructures; - this.symbolTable = symbolTable; - idProvider = new IncrementingIdProvider(); - } - - public List run() { - FlowNode flowRoot = new IntermediateASTNodeBuilder(rawAST, dataStructures, symbolTable).build(); - TranspilerNode transpilerTree = TranspilerTreeBuilder.flowToTranspiler(flowRoot, dataStructures); - return new BuildTranspilerInstructionsFromIntermediateTreeTask(transpilerTree, idProvider).run(); - } -} diff --git a/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/SLIFORangeMain.java b/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/SLIFORangeMain.java index 2b9e476a..6741360f 100644 --- a/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/SLIFORangeMain.java +++ b/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/SLIFORangeMain.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Set; +import static org.smojol.toolkit.task.CommandLineAnalysisTask.*; import static org.smojol.toolkit.task.CommandLineAnalysisTask.BUILD_BASE_ANALYSIS; public class SLIFORangeMain { @@ -37,15 +38,10 @@ public static void main(String[] args) throws IOException, InterruptedException ImmutableList.of(new File("/Users/asgupta/code/smojol/smojol-test-code")), "/Users/asgupta/code/smojol/che-che4z-lsp-for-cobol-integration/server/dialect-idms/target/dialect-idms.jar", LanguageDialect.IDMS, new FullProgram(FlowchartOutputFormat.MERMAID, idProvider), idProvider, new OccursIgnoringFormat1DataStructureBuilder(), new ProgramSearch(), new LocalFilesystemOperations()) - .runForPrograms(ImmutableList.of(BUILD_BASE_ANALYSIS, CommandLineAnalysisTask.BUILD_TRANSPILER_FLOWGRAPH), ImmutableList.of(programName)); + .runForPrograms(ImmutableList.of(BUILD_BASE_ANALYSIS, BUILD_TRANSPILER_FLOWGRAPH), ImmutableList.of(programName)); List results = result.get(programName); TranspilerFlowgraph transpilerFlowgraph = ((AnalysisTaskResultOK) results.get(1)).getDetail(); - TranspilerNode tree = transpilerFlowgraph.transpilerTree(); - List instructions = new BuildTranspilerInstructionsFromIntermediateTreeTask(tree, new IncrementingIdProvider()).run(); - Graph implicitCFG = new BuildImplicitInstructionControlFlowgraphTask(instructions, ImmutableList.of()).run(); - Set rangesWithChildren = new ProcedureBodyTask(tree, instructions, implicitCFG).run(); - SLIFORangeCriterionTask task = new SLIFORangeCriterionTask(rangesWithChildren); - Pair, Set> categorisedRanges = task.run(); + Pair, Set> categorisedRanges = transpilerFlowgraph.categorisedRanges(); categorisedRanges.getLeft().forEach(range -> System.out.println(range.range())); categorisedRanges.getRight().forEach(range -> System.out.println(range.range())); diff --git a/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/qa/SLIFORangeMainForQA.java b/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/qa/SLIFORangeMainForQA.java new file mode 100644 index 00000000..e33dd89f --- /dev/null +++ b/smojol-toolkit/src/main/java/org/smojol/toolkit/examples/qa/SLIFORangeMainForQA.java @@ -0,0 +1,52 @@ +package org.smojol.toolkit.examples.qa; + +import com.google.common.collect.ImmutableList; +import org.apache.commons.lang3.tuple.Pair; +import org.smojol.common.dialect.LanguageDialect; +import org.smojol.common.flowchart.FlowchartOutputFormat; +import org.smojol.common.id.UUIDProvider; +import org.smojol.common.resource.LocalFilesystemOperations; +import org.smojol.common.transpiler.InvokingProcedureRange; +import org.smojol.common.transpiler.TranspilerFlowgraph; +import org.smojol.toolkit.analysis.pipeline.ProgramSearch; +import org.smojol.toolkit.analysis.task.analysis.CodeTaskRunner; +import org.smojol.toolkit.interpreter.FullProgram; +import org.smojol.toolkit.interpreter.structure.OccursIgnoringFormat1DataStructureBuilder; +import org.smojol.toolkit.task.AnalysisTaskResult; +import org.smojol.toolkit.task.AnalysisTaskResultOK; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.smojol.toolkit.task.CommandLineAnalysisTask.BUILD_BASE_ANALYSIS; +import static org.smojol.toolkit.task.CommandLineAnalysisTask.BUILD_TRANSPILER_FLOWGRAPH; + +public class SLIFORangeMainForQA { + public static void main(String[] args) throws IOException, InterruptedException { + String programName = "test-irreducible-simplified.cbl"; + UUIDProvider idProvider = new UUIDProvider(); + Map> result = new CodeTaskRunner("/Users/asgupta/code/qa-codebase/Missing Programs", + "/Users/asgupta/code/smojol/out/report", + ImmutableList.of(new File("/Users/asgupta/code/qa-codebase/Missing Programs")), + "/Users/asgupta/code/smojol/che-che4z-lsp-for-cobol-integration/server/dialect-idms/target/dialect-idms.jar", + LanguageDialect.COBOL, new FullProgram(FlowchartOutputFormat.MERMAID, idProvider), idProvider, new OccursIgnoringFormat1DataStructureBuilder(), new ProgramSearch(), new LocalFilesystemOperations()) + .runForPrograms(ImmutableList.of(BUILD_BASE_ANALYSIS, BUILD_TRANSPILER_FLOWGRAPH), ImmutableList.of(programName)); + List results = result.get(programName); + TranspilerFlowgraph transpilerFlowgraph = ((AnalysisTaskResultOK) results.get(1)).getDetail(); + Pair, Set> categorisedRanges = transpilerFlowgraph.categorisedRanges(); + Set allSLIFORanges = categorisedRanges.getLeft(); + System.out.println("SLIFO Ranges\n----------------------"); + allSLIFORanges.forEach(range -> System.out.println(range.range())); + Set nonSLIFORanges = categorisedRanges.getRight(); + System.out.println("Non-SLIFO Ranges\n----------------------"); + nonSLIFORanges.forEach(range -> System.out.println(range.range())); + System.out.println("Total ranges = " + (categorisedRanges.getLeft().size() + categorisedRanges.getRight().size())); + System.out.println("SLIFO ranges = " + allSLIFORanges.size()); + System.out.println("Non-SLIFO ranges = " + nonSLIFORanges.size()); + + System.out.println("DONE"); + } +}