From b5c372efb2b331cef9a547f2d7152553b6fa3769 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Sat, 7 Mar 2026 17:41:02 +0000 Subject: [PATCH] implements PR-O1.1 --- .../stages/EmitBytecodePipelineStage.java | 9 ++++-- .../stages/LowerToIRVMPipelineStage.java | 14 ++++++--- .../stages/OptimizeIRVMPipelineStage.java | 11 +++++-- .../stages/EmitBytecodePipelineStageTest.java | 6 +++- .../stages/LowerToIRVMPipelineStageTest.java | 4 ++- .../stages/OptimizeIRVMPipelineStageTest.java | 4 ++- .../compiler/messages/BuildingIssue.java | 29 +++++++++++++++++-- 7 files changed, 63 insertions(+), 14 deletions(-) diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStage.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStage.java index cf76ed11..494cd7ac 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStage.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStage.java @@ -26,12 +26,16 @@ public class EmitBytecodePipelineStage implements PipelineStage { return BuildingIssueSink.empty() .report(builder -> builder .error(true) + .phase("BACKEND_EMIT_BYTECODE") + .code("MARSHAL_FORMAT_STAGE_INPUT_MISSING") .message("[BUILD]: optimized IRVM is missing before EmitBytecode stage")); } if (ctx.optimizedIrvm.hasInternalOpcodes()) { return BuildingIssueSink.empty() .report(builder -> builder .error(true) + .phase("BACKEND_EMIT_BYTECODE") + .code("MARSHAL_VERIFY_PRECHECK_INTERNAL_OPCODE_RESIDUAL") .message("[BUILD]: optimized IRVM still contains internal opcodes")); } try { @@ -41,8 +45,9 @@ public class EmitBytecodePipelineStage implements PipelineStage { return BuildingIssueSink.empty() .report(builder -> builder .error(true) - .message("[BUILD]: bytecode marshaling failed (%s): %s" - .formatted(e.code().name(), e.getMessage())) + .phase("BACKEND_EMIT_BYTECODE") + .code(e.code().name()) + .message("[BUILD]: bytecode marshaling failed: " + e.getMessage()) .exception(e)); } return BuildingIssueSink.empty(); diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LowerToIRVMPipelineStage.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LowerToIRVMPipelineStage.java index 0f936f81..2b05550b 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LowerToIRVMPipelineStage.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LowerToIRVMPipelineStage.java @@ -27,6 +27,8 @@ public class LowerToIRVMPipelineStage implements PipelineStage { return BuildingIssueSink.empty() .report(builder -> builder .error(true) + .phase("BACKEND_LOWER_TO_IRVM") + .code("MARSHAL_FORMAT_STAGE_INPUT_MISSING") .message("[BUILD]: IRBackend is missing before LowerToIRVM stage")); } try { @@ -35,15 +37,19 @@ public class LowerToIRVMPipelineStage implements PipelineStage { return BuildingIssueSink.empty() .report(builder -> builder .error(true) - .message("[BUILD]: lower to irvm failed (%s): %s" - .formatted(e.code().name(), e.getMessage())) + .phase("BACKEND_LOWER_TO_IRVM") + .code(e.code().name()) + .message("[BUILD]: lower to irvm failed: " + e.getMessage()) .exception(e)); } catch (IRVMValidationException e) { return BuildingIssueSink.empty() .report(builder -> builder .error(true) - .message("[BUILD]: lower to irvm validation failed (%s): %s" - .formatted(e.code().name(), e.getMessage())) + .phase("BACKEND_LOWER_TO_IRVM") + .code(e.code().name()) + .functionIndex(e.functionIndex()) + .pc(e.pc()) + .message("[BUILD]: lower to irvm validation failed: " + e.getMessage()) .exception(e)); } return BuildingIssueSink.empty(); diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/OptimizeIRVMPipelineStage.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/OptimizeIRVMPipelineStage.java index a615fc3e..f3682e0a 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/OptimizeIRVMPipelineStage.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/OptimizeIRVMPipelineStage.java @@ -26,6 +26,8 @@ public class OptimizeIRVMPipelineStage implements PipelineStage { return BuildingIssueSink.empty() .report(builder -> builder .error(true) + .phase("BACKEND_OPTIMIZE_IRVM") + .code("MARSHAL_FORMAT_STAGE_INPUT_MISSING") .message("[BUILD]: IRVM is missing before OptimizeIRVM stage")); } try { @@ -34,13 +36,18 @@ public class OptimizeIRVMPipelineStage implements PipelineStage { return BuildingIssueSink.empty() .report(builder -> builder .error(true) - .message("[BUILD]: optimize irvm validation failed (%s): %s" - .formatted(e.code().name(), e.getMessage())) + .phase("BACKEND_OPTIMIZE_IRVM") + .code(e.code().name()) + .functionIndex(e.functionIndex()) + .pc(e.pc()) + .message("[BUILD]: optimize irvm validation failed: " + e.getMessage()) .exception(e)); } catch (RuntimeException e) { return BuildingIssueSink.empty() .report(builder -> builder .error(true) + .phase("BACKEND_OPTIMIZE_IRVM") + .code("MARSHAL_VERIFY_PRECHECK_OPTIMIZE_RUNTIME_FAILURE") .message("[BUILD]: optimize irvm failed: " + e.getMessage()) .exception(e)); } diff --git a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStageTest.java b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStageTest.java index 43683432..4298dc0a 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStageTest.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStageTest.java @@ -21,9 +21,12 @@ class EmitBytecodePipelineStageTest { final var stage = new EmitBytecodePipelineStage(); final var issues = stage.run(ctx, LogAggregator.empty()); + final var firstIssue = issues.asCollection().iterator().next(); assertTrue(issues.hasErrors()); assertEquals(1, issues.size()); + assertEquals("BACKEND_EMIT_BYTECODE", firstIssue.getPhase()); + assertEquals("MARSHAL_FORMAT_STAGE_INPUT_MISSING", firstIssue.getCode()); } @Test @@ -33,9 +36,11 @@ class EmitBytecodePipelineStageTest { final var stage = new EmitBytecodePipelineStage(); final var issues = stage.run(ctx, LogAggregator.empty()); + final var firstIssue = issues.asCollection().iterator().next(); assertTrue(issues.hasErrors()); assertEquals(1, issues.size()); + assertEquals("MARSHAL_VERIFY_PRECHECK_INTERNAL_OPCODE_RESIDUAL", firstIssue.getCode()); } @Test @@ -66,4 +71,3 @@ class EmitBytecodePipelineStageTest { assertEquals(0, ctx.bytecodeModule.syscalls().size()); } } - diff --git a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/LowerToIRVMPipelineStageTest.java b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/LowerToIRVMPipelineStageTest.java index b93df5a0..4a0ae461 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/LowerToIRVMPipelineStageTest.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/LowerToIRVMPipelineStageTest.java @@ -22,9 +22,12 @@ class LowerToIRVMPipelineStageTest { final var stage = new LowerToIRVMPipelineStage(); final var issues = stage.run(ctx, LogAggregator.empty()); + final var firstIssue = issues.asCollection().iterator().next(); assertTrue(issues.hasErrors()); assertEquals(1, issues.size()); + assertEquals("BACKEND_LOWER_TO_IRVM", firstIssue.getPhase()); + assertEquals("MARSHAL_FORMAT_STAGE_INPUT_MISSING", firstIssue.getCode()); } @Test @@ -59,4 +62,3 @@ class LowerToIRVMPipelineStageTest { assertEquals(1, ctx.irvm.module().functions().size()); } } - diff --git a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/OptimizeIRVMPipelineStageTest.java b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/OptimizeIRVMPipelineStageTest.java index 4b94e0cc..d0a7cb32 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/OptimizeIRVMPipelineStageTest.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/workspaces/stages/OptimizeIRVMPipelineStageTest.java @@ -24,9 +24,12 @@ class OptimizeIRVMPipelineStageTest { final var stage = new OptimizeIRVMPipelineStage(); final var issues = stage.run(ctx, LogAggregator.empty()); + final var firstIssue = issues.asCollection().iterator().next(); assertTrue(issues.hasErrors()); assertEquals(1, issues.size()); + assertEquals("BACKEND_OPTIMIZE_IRVM", firstIssue.getPhase()); + assertEquals("MARSHAL_FORMAT_STAGE_INPUT_MISSING", firstIssue.getCode()); } @Test @@ -72,4 +75,3 @@ class OptimizeIRVMPipelineStageTest { assertEquals(1, issues.size()); } } - diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/messages/BuildingIssue.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/messages/BuildingIssue.java index 03932ebb..3d3256af 100644 --- a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/messages/BuildingIssue.java +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/messages/BuildingIssue.java @@ -10,16 +10,39 @@ public class BuildingIssue { private final boolean error; private final String message; private final Throwable exception; + private final String phase; + private final String code; + private final Integer functionIndex; + private final Integer pc; public void print(LogAggregator logs) { + final var composed = composeMessage(); if (error) { if (exception != null) { - logs.error(message, exception); + logs.error(composed, exception); } else { - logs.error(message); + logs.error(composed); } } else { - logs.warn(message); + logs.warn(composed); } } + + private String composeMessage() { + final var sb = new StringBuilder(); + if (phase != null && !phase.isBlank()) { + sb.append('[').append(phase).append(']').append(' '); + } + if (code != null && !code.isBlank()) { + sb.append('(').append(code).append(')').append(' '); + } + sb.append(message == null ? "" : message); + if (functionIndex != null && functionIndex >= 0) { + sb.append(" [fn=").append(functionIndex).append(']'); + } + if (pc != null && pc >= 0) { + sb.append(" [pc=").append(pc).append(']'); + } + return sb.toString().trim(); + } }