@jhlagado/azm 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -78
- package/dist/src/api-compile.d.ts +0 -2
- package/dist/src/api-compile.js +2 -9
- package/dist/src/assembly/address-planning.js +21 -1
- package/dist/src/assembly/program-emission.js +1 -0
- package/dist/src/cli/parse-args.d.ts +0 -1
- package/dist/src/cli/parse-args.js +0 -7
- package/dist/src/cli/write-artifacts.js +0 -11
- package/dist/src/core/compile.js +192 -9
- package/dist/src/expansion/op-expansion.js +2 -0
- package/dist/src/model/expression.d.ts +4 -0
- package/dist/src/model/source-item.d.ts +11 -0
- package/dist/src/outputs/index.js +0 -2
- package/dist/src/outputs/types.d.ts +3 -16
- package/dist/src/outputs/write-asm80.js +206 -5
- package/dist/src/register-care/analyze.js +36 -8
- package/dist/src/register-care/annotations.js +33 -146
- package/dist/src/register-care/fix.d.ts +2 -0
- package/dist/src/register-care/fix.js +52 -0
- package/dist/src/register-care/instruction-shape.d.ts +11 -0
- package/dist/src/register-care/instruction-shape.js +129 -0
- package/dist/src/register-care/liveness.js +15 -7
- package/dist/src/register-care/profiles.js +4 -0
- package/dist/src/register-care/programModel.js +79 -13
- package/dist/src/register-care/report.d.ts +2 -1
- package/dist/src/register-care/report.js +91 -34
- package/dist/src/register-care/routine-summaries.d.ts +6 -0
- package/dist/src/register-care/routine-summaries.js +89 -0
- package/dist/src/register-care/summaries.d.ts +3 -3
- package/dist/src/register-care/summaries.js +42 -75
- package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.js +33 -51
- package/dist/src/register-care/types.d.ts +6 -1
- package/dist/src/semantics/expression-evaluation.d.ts +7 -3
- package/dist/src/semantics/expression-evaluation.js +57 -0
- package/dist/src/source/strip-line-comment.d.ts +2 -0
- package/dist/src/source/strip-line-comment.js +26 -0
- package/dist/src/syntax/directive-aliases.js +9 -10
- package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
- package/dist/src/syntax/parse-diagnostics.js +18 -0
- package/dist/src/syntax/parse-expression.js +34 -9
- package/dist/src/syntax/parse-line.js +150 -54
- package/dist/src/tooling/case-style.js +3 -0
- package/docs/reference/cli.md +6 -4
- package/docs/reference/tooling-api.md +13 -9
- package/package.json +4 -6
- package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
- package/dist/legacy-root-azm/src/analysis.js +0 -41
- package/dist/legacy-root-azm/src/compile.d.ts +0 -10
- package/dist/legacy-root-azm/src/compile.js +0 -186
- package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
- package/dist/legacy-root-azm/src/compileShared.js +0 -7
- package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
- package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
- package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/index.js +0 -17
- package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
- package/dist/legacy-root-azm/src/formats/range.js +0 -45
- package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
- package/dist/legacy-root-azm/src/formats/types.js +0 -1
- package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
- package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
- package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
- package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
- package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
- package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
- package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
- package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
- package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
- package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
- package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
- package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
- package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
- package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
- package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
- package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
- package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
- package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
- package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
- package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
- package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
- package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
- package/dist/legacy-root-azm/src/frontend/source.js +0 -58
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
- package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
- package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
- package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
- package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
- package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
- package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
- package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
- package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
- package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
- package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
- package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
- package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
- package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
- package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
- package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
- package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
- package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
- package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
- package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
- package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
- package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
- package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
- package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
- package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
- package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
- package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
- package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
- package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
- package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
- package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
- package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
- package/dist/legacy-root-azm/src/packageInfo.js +0 -15
- package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
- package/dist/legacy-root-azm/src/pathCompare.js +0 -26
- package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
- package/dist/legacy-root-azm/src/pipeline.js +0 -1
- package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
- package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
- package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
- package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
- package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
- package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
- package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
- package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
- package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
- package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
- package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
- package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
- package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
- package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
- package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
- package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
- package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
- package/dist/legacy-root-azm/src/semantics/env.js +0 -432
- package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
- package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
- package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
- package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
- package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
- package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
- package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
- package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
- package/dist/legacy-root-azm/src/z80/effects.js +0 -516
- package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
- package/dist/legacy-root-azm/src/z80/encode.js +0 -412
- package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
- package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
- package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
- package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
- package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
- package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
- package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
- package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
- package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
- package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
- package/dist/src/outputs/write-listing.d.ts +0 -2
- package/dist/src/outputs/write-listing.js +0 -79
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.d.ts +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.js +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.d.ts +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.js +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.d.ts +0 -0
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
import { DiagnosticIds } from '../diagnosticTypes.js';
|
|
2
|
-
import { annotateRegisterCareContracts } from './annotate.js';
|
|
3
|
-
import { expandCarrierList } from './carriers.js';
|
|
4
|
-
import { diagnosticsForRegisterCareConflicts, findAcceptedOutputCandidatesFromHints, findCallerOutputCandidates, findCallerOutputCandidateObservations, findRegisterCareConflicts, } from './liveness.js';
|
|
5
|
-
import { applyExpectOutFixesToSource, findExpectOutFixes } from './fix.js';
|
|
6
|
-
import { getRegisterCareProfile } from './profiles.js';
|
|
7
|
-
import { buildRegisterCareProgramModel } from './programModel.js';
|
|
8
|
-
import { renderRegisterCareInterface, renderRegisterCareReport } from './report.js';
|
|
9
|
-
import { buildRoutineContracts, parseSmartComments } from './smartComments.js';
|
|
10
|
-
import { applyRoutineContract, inferRoutineSummary } from './summary.js';
|
|
11
|
-
function emptyRoutineSummary(name) {
|
|
12
|
-
return {
|
|
13
|
-
name,
|
|
14
|
-
mayRead: [],
|
|
15
|
-
mayWrite: [],
|
|
16
|
-
preserved: [],
|
|
17
|
-
valueRelations: [],
|
|
18
|
-
stackBalanced: true,
|
|
19
|
-
hasUnknownStackEffect: false,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function unknownBoundaryForCall(call) {
|
|
23
|
-
return {
|
|
24
|
-
...call,
|
|
25
|
-
message: `Register-care cannot prove ${call.subject}; add a routine body or .asmi extern contract.`,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
function uniqueSortedTargets(boundaries) {
|
|
29
|
-
return Array.from(new Set(boundaries.map((boundary) => boundary.target))).sort();
|
|
30
|
-
}
|
|
31
|
-
function diagnosticsForUnknownBoundaries(boundaries) {
|
|
32
|
-
return boundaries.map((boundary) => ({
|
|
33
|
-
id: DiagnosticIds.RegisterCareUnknownBoundary,
|
|
34
|
-
severity: 'warning',
|
|
35
|
-
message: boundary.message,
|
|
36
|
-
file: boundary.file,
|
|
37
|
-
line: boundary.line,
|
|
38
|
-
column: boundary.column,
|
|
39
|
-
}));
|
|
40
|
-
}
|
|
41
|
-
function isLocalLabel(name) {
|
|
42
|
-
return name.startsWith('.');
|
|
43
|
-
}
|
|
44
|
-
function nonLocalLabels(labels) {
|
|
45
|
-
return labels.filter((label) => !isLocalLabel(label));
|
|
46
|
-
}
|
|
47
|
-
function boundaryLabels(routine) {
|
|
48
|
-
return routine.entryLabels ?? nonLocalLabels(routine.labels);
|
|
49
|
-
}
|
|
50
|
-
function contractForRoutine(routine, contracts) {
|
|
51
|
-
return boundaryLabels(routine)
|
|
52
|
-
.map((label) => contracts.get(label))
|
|
53
|
-
.find((contract) => contract !== undefined);
|
|
54
|
-
}
|
|
55
|
-
function summariesWithExternalContracts(summaries, contracts, routineNames) {
|
|
56
|
-
const out = [...summaries];
|
|
57
|
-
for (const contract of contracts.values()) {
|
|
58
|
-
if (!routineNames.has(contract.name)) {
|
|
59
|
-
out.push(applyRoutineContract(emptyRoutineSummary(contract.name), contract));
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return out;
|
|
63
|
-
}
|
|
64
|
-
function externalContractsOnly(contracts, routineNames) {
|
|
65
|
-
return new Map([...contracts].filter(([name]) => !routineNames.has(name)));
|
|
66
|
-
}
|
|
67
|
-
function buildBoundarySummaryMap(summaries, routineSummaries, profileSummaries) {
|
|
68
|
-
const boundarySummaryMap = new Map(profileSummaries.map((summary) => [summary.name, summary]));
|
|
69
|
-
for (const summary of summaries) {
|
|
70
|
-
boundarySummaryMap.set(summary.name, summary);
|
|
71
|
-
}
|
|
72
|
-
for (const { routine, summary } of routineSummaries) {
|
|
73
|
-
for (const label of boundaryLabels(routine)) {
|
|
74
|
-
boundarySummaryMap.set(label, summary);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return boundarySummaryMap;
|
|
78
|
-
}
|
|
79
|
-
function summarizeRoutines(routines, contracts, boundarySummaryMap = new Map()) {
|
|
80
|
-
return routines.map((routine) => {
|
|
81
|
-
const inferred = inferRoutineSummary(routine, boundarySummaryMap);
|
|
82
|
-
const contract = contractForRoutine(routine, contracts);
|
|
83
|
-
return { routine, summary: contract ? applyRoutineContract(inferred, contract) : inferred };
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
function sortedUnique(values) {
|
|
87
|
-
return Array.from(new Set(values)).sort();
|
|
88
|
-
}
|
|
89
|
-
function appendUniqueUnits(target, units) {
|
|
90
|
-
for (const unit of units) {
|
|
91
|
-
if (!target.includes(unit))
|
|
92
|
-
target.push(unit);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function summaryFingerprint(summary) {
|
|
96
|
-
const relations = summary.valueRelations
|
|
97
|
-
.map((relation) => `${relation.out.join(',')}<-${relation.from.join(',')}`)
|
|
98
|
-
.sort();
|
|
99
|
-
return JSON.stringify({
|
|
100
|
-
name: summary.name,
|
|
101
|
-
mayRead: sortedUnique(summary.mayRead),
|
|
102
|
-
mayWrite: sortedUnique(summary.mayWrite),
|
|
103
|
-
preserved: sortedUnique(summary.preserved),
|
|
104
|
-
relations,
|
|
105
|
-
stackBalanced: summary.stackBalanced,
|
|
106
|
-
hasUnknownStackEffect: summary.hasUnknownStackEffect,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
function routineSummariesFingerprint(routineSummaries) {
|
|
110
|
-
return routineSummaries.map((item) => summaryFingerprint(item.summary)).join('\n');
|
|
111
|
-
}
|
|
112
|
-
function inferRoutineSummariesToFixedPoint(routines, contracts, routineNames, profileSummaries) {
|
|
113
|
-
let routineSummaries = summarizeRoutines(routines, contracts);
|
|
114
|
-
const maxPasses = Math.max(2, routines.length + 2);
|
|
115
|
-
for (let pass = 0; pass < maxPasses; pass += 1) {
|
|
116
|
-
const summaries = summariesWithExternalContracts(routineSummaries.map((item) => item.summary), contracts, routineNames);
|
|
117
|
-
const boundarySummaryMap = buildBoundarySummaryMap(summaries, routineSummaries, profileSummaries);
|
|
118
|
-
const nextRoutineSummaries = summarizeRoutines(routines, contracts, boundarySummaryMap);
|
|
119
|
-
if (routineSummariesFingerprint(nextRoutineSummaries) ===
|
|
120
|
-
routineSummariesFingerprint(routineSummaries)) {
|
|
121
|
-
return nextRoutineSummaries;
|
|
122
|
-
}
|
|
123
|
-
routineSummaries = nextRoutineSummaries;
|
|
124
|
-
}
|
|
125
|
-
return routineSummaries;
|
|
126
|
-
}
|
|
127
|
-
function withCallerOutputCandidates(routineSummaries, boundarySummaryMap, acceptOutputCandidates = new Map()) {
|
|
128
|
-
const candidates = findCallerOutputCandidates(routineSummaries.map((item) => item.routine), new Map(boundarySummaryMap));
|
|
129
|
-
return routineSummaries.map((item) => {
|
|
130
|
-
const outputCandidates = candidates.get(item.summary.name);
|
|
131
|
-
const written = new Set(item.summary.mayWrite);
|
|
132
|
-
const accepted = (acceptOutputCandidates.get(item.summary.name) ?? []).filter((unit) => written.has(unit));
|
|
133
|
-
const acceptedSet = new Set(accepted);
|
|
134
|
-
const valueRelations = [...item.summary.valueRelations];
|
|
135
|
-
for (const unit of accepted) {
|
|
136
|
-
if (!valueRelations.some((relation) => relation.out.includes(unit))) {
|
|
137
|
-
valueRelations.push({ out: [unit], from: [] });
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const remainingCandidates = outputCandidates?.filter((unit) => !acceptedSet.has(unit));
|
|
141
|
-
return outputCandidates && outputCandidates.length > 0
|
|
142
|
-
? {
|
|
143
|
-
...item,
|
|
144
|
-
summary: {
|
|
145
|
-
...item.summary,
|
|
146
|
-
valueRelations,
|
|
147
|
-
...(remainingCandidates && remainingCandidates.length > 0
|
|
148
|
-
? { outputCandidates: remainingCandidates }
|
|
149
|
-
: {}),
|
|
150
|
-
},
|
|
151
|
-
}
|
|
152
|
-
: item;
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
function autoAcceptedOutputCandidates(fixes) {
|
|
156
|
-
const out = new Map();
|
|
157
|
-
for (const fix of fixes) {
|
|
158
|
-
const existing = out.get(fix.routine) ?? [];
|
|
159
|
-
appendUniqueUnits(existing, fix.carriers);
|
|
160
|
-
out.set(fix.routine, existing);
|
|
161
|
-
}
|
|
162
|
-
return out;
|
|
163
|
-
}
|
|
164
|
-
function parseAcceptedOutputCandidates(items = []) {
|
|
165
|
-
const out = new Map();
|
|
166
|
-
for (const item of items) {
|
|
167
|
-
const sep = item.indexOf(':');
|
|
168
|
-
if (sep <= 0 || sep === item.length - 1) {
|
|
169
|
-
throw new Error(`Invalid --accept-out value "${item}" (expected ROUTINE:carriers)`);
|
|
170
|
-
}
|
|
171
|
-
const name = item.slice(0, sep).trim();
|
|
172
|
-
if (!name)
|
|
173
|
-
throw new Error(`Invalid --accept-out value "${item}" (missing routine name)`);
|
|
174
|
-
const carrierParts = item.slice(sep + 1).split(',');
|
|
175
|
-
const rawCarriers = carrierParts.map((part) => part.trim());
|
|
176
|
-
if (rawCarriers.length === 0 || rawCarriers.some((part) => part.length === 0)) {
|
|
177
|
-
throw new Error(`Invalid --accept-out value "${item}" (missing carriers)`);
|
|
178
|
-
}
|
|
179
|
-
const carriers = expandCarrierList(rawCarriers);
|
|
180
|
-
if (!carriers) {
|
|
181
|
-
throw new Error(`Invalid --accept-out value "${item}" (unknown carrier)`);
|
|
182
|
-
}
|
|
183
|
-
const existing = out.get(name) ?? [];
|
|
184
|
-
appendUniqueUnits(existing, carriers);
|
|
185
|
-
out.set(name, existing);
|
|
186
|
-
}
|
|
187
|
-
return out;
|
|
188
|
-
}
|
|
189
|
-
function mergeAcceptedOutputCandidates(...maps) {
|
|
190
|
-
const out = new Map();
|
|
191
|
-
for (const map of maps) {
|
|
192
|
-
for (const [name, units] of map) {
|
|
193
|
-
const existing = out.get(name) ?? [];
|
|
194
|
-
appendUniqueUnits(existing, units);
|
|
195
|
-
out.set(name, existing);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
return out;
|
|
199
|
-
}
|
|
200
|
-
function fixedSourceTexts(referenceSourceTexts, workingSourceTexts, fixes) {
|
|
201
|
-
const byFile = new Map();
|
|
202
|
-
for (const fix of fixes) {
|
|
203
|
-
const items = byFile.get(fix.file) ?? [];
|
|
204
|
-
items.push(fix);
|
|
205
|
-
byFile.set(fix.file, items);
|
|
206
|
-
}
|
|
207
|
-
const out = new Map(workingSourceTexts);
|
|
208
|
-
for (const [file, items] of byFile) {
|
|
209
|
-
const source = workingSourceTexts.get(file);
|
|
210
|
-
const referenceSource = referenceSourceTexts.get(file);
|
|
211
|
-
if (source === undefined)
|
|
212
|
-
continue;
|
|
213
|
-
out.set(file, applyExpectOutFixesToSource(source, items, referenceSource));
|
|
214
|
-
}
|
|
215
|
-
return out;
|
|
216
|
-
}
|
|
217
|
-
function annotateAndFixRegisterCareContracts(sourceTexts, routines, fixes) {
|
|
218
|
-
const annotated = annotateRegisterCareContracts(sourceTexts, routines);
|
|
219
|
-
if (fixes.length === 0)
|
|
220
|
-
return annotated;
|
|
221
|
-
const workingTexts = new Map(sourceTexts);
|
|
222
|
-
for (const file of annotated) {
|
|
223
|
-
workingTexts.set(file.path, file.text);
|
|
224
|
-
}
|
|
225
|
-
const fixedTexts = fixedSourceTexts(sourceTexts, workingTexts, fixes);
|
|
226
|
-
const out = [];
|
|
227
|
-
for (const [path, text] of fixedTexts) {
|
|
228
|
-
if (text !== sourceTexts.get(path))
|
|
229
|
-
out.push({ path, text });
|
|
230
|
-
}
|
|
231
|
-
return out.sort((a, b) => a.path.localeCompare(b.path));
|
|
232
|
-
}
|
|
233
|
-
function candidateKey(item) {
|
|
234
|
-
return `${item.file}:${item.line}:${item.column}:${item.routine}`;
|
|
235
|
-
}
|
|
236
|
-
function candidateExpectation(units) {
|
|
237
|
-
const carriers = units.join(',');
|
|
238
|
-
return units.length === 1 ? units[0] : `{${carriers}}`;
|
|
239
|
-
}
|
|
240
|
-
function candidateMessageWithFixability(candidate, autoFixable) {
|
|
241
|
-
const carriers = candidate.carriers.join(',');
|
|
242
|
-
const expectation = candidateExpectation(candidate.carriers);
|
|
243
|
-
const base = `CALL ${candidate.routine} writes ${carriers} and caller reads it later`;
|
|
244
|
-
return autoFixable
|
|
245
|
-
? `${base}; generated contracts promote this to \`out ${expectation}\` automatically.`
|
|
246
|
-
: `${base}; manual review required before adding \`; expects out ${expectation}\` because the later read is not a simple direct continuation.`;
|
|
247
|
-
}
|
|
248
|
-
function withCandidateFixability(candidates, fixes) {
|
|
249
|
-
const fixable = new Map(fixes.map((fix) => [candidateKey(fix), new Set(fix.carriers)]));
|
|
250
|
-
return candidates.map((candidate) => {
|
|
251
|
-
const fixableCarriers = fixable.get(candidateKey(candidate));
|
|
252
|
-
const autoFixable = fixableCarriers !== undefined &&
|
|
253
|
-
candidate.carriers.every((carrier) => fixableCarriers.has(carrier));
|
|
254
|
-
return {
|
|
255
|
-
...candidate,
|
|
256
|
-
autoFixable,
|
|
257
|
-
message: candidateMessageWithFixability(candidate, autoFixable),
|
|
258
|
-
};
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
function inferenceOnlyOutputFixes(programRoutines, routineSummaries, profileSummaries) {
|
|
262
|
-
const summaries = routineSummaries.map((item) => item.summary);
|
|
263
|
-
const boundarySummaryMap = buildBoundarySummaryMap(summaries, routineSummaries, profileSummaries);
|
|
264
|
-
const candidates = findCallerOutputCandidateObservations(programRoutines, boundarySummaryMap);
|
|
265
|
-
return findExpectOutFixes(programRoutines, candidates);
|
|
266
|
-
}
|
|
267
|
-
export function analyzeRegisterCare(loaded, options) {
|
|
268
|
-
const profile = getRegisterCareProfile(options.profile);
|
|
269
|
-
const programModel = buildRegisterCareProgramModel(loaded.program);
|
|
270
|
-
const smartComments = parseSmartComments(loaded.sourceLineComments);
|
|
271
|
-
const contracts = buildRoutineContracts(smartComments, programModel.routines, loaded.sourceTexts);
|
|
272
|
-
const cliAcceptedOutputCandidates = parseAcceptedOutputCandidates(options.acceptOutputCandidates);
|
|
273
|
-
for (const contract of options.interfaceContracts ?? []) {
|
|
274
|
-
contracts.set(contract.name, contract);
|
|
275
|
-
}
|
|
276
|
-
const routineNames = new Set(programModel.routines.flatMap((routine) => boundaryLabels(routine)));
|
|
277
|
-
const profileSummaries = profile
|
|
278
|
-
? [...Array.from(profile.rst.values()), ...Array.from(profile.rstServices.values())]
|
|
279
|
-
: [];
|
|
280
|
-
const routineSummaries = inferRoutineSummariesToFixedPoint(programModel.routines, contracts, routineNames, profileSummaries);
|
|
281
|
-
const summaries = routineSummaries.map((item) => item.summary);
|
|
282
|
-
summaries.push(...summariesWithExternalContracts([], contracts, routineNames));
|
|
283
|
-
const boundarySummaryMap = buildBoundarySummaryMap(summaries, routineSummaries, profileSummaries);
|
|
284
|
-
const unknownBoundaries = programModel.directBoundaries
|
|
285
|
-
.filter((boundary) => !boundarySummaryMap.has(boundary.target))
|
|
286
|
-
.map(unknownBoundaryForCall);
|
|
287
|
-
const conflicts = programModel.routines.flatMap((routine) => findRegisterCareConflicts(routine, boundarySummaryMap, smartComments));
|
|
288
|
-
const rawOutputCandidates = findCallerOutputCandidateObservations(programModel.routines, boundarySummaryMap);
|
|
289
|
-
const possibleExpectOutFixes = findExpectOutFixes(programModel.routines, rawOutputCandidates);
|
|
290
|
-
const outputCandidates = withCandidateFixability(rawOutputCandidates, possibleExpectOutFixes);
|
|
291
|
-
const conflictDiagnostics = options.mode === 'warn' || options.mode === 'strict'
|
|
292
|
-
? diagnosticsForRegisterCareConflicts(conflicts, 'warning')
|
|
293
|
-
: options.mode === 'error'
|
|
294
|
-
? diagnosticsForRegisterCareConflicts(conflicts, 'error')
|
|
295
|
-
: [];
|
|
296
|
-
const diagnostics = options.mode === 'strict'
|
|
297
|
-
? [...conflictDiagnostics, ...diagnosticsForUnknownBoundaries(unknownBoundaries)]
|
|
298
|
-
: conflictDiagnostics;
|
|
299
|
-
const reportModel = {
|
|
300
|
-
entryFile: loaded.program.entryFile,
|
|
301
|
-
mode: options.mode,
|
|
302
|
-
...(profile ? { profile: profile.name } : {}),
|
|
303
|
-
summaries,
|
|
304
|
-
conflicts,
|
|
305
|
-
outputCandidates,
|
|
306
|
-
unknownCalls: uniqueSortedTargets(unknownBoundaries),
|
|
307
|
-
};
|
|
308
|
-
return {
|
|
309
|
-
diagnostics,
|
|
310
|
-
outputCandidates,
|
|
311
|
-
...(options.emitReport ? { reportText: renderRegisterCareReport(reportModel) } : {}),
|
|
312
|
-
...(options.emitInterface ? { interfaceText: renderRegisterCareInterface(summaries) } : {}),
|
|
313
|
-
...(options.emitAnnotations
|
|
314
|
-
? (() => {
|
|
315
|
-
const annotationRoutineSummaries = inferRoutineSummariesToFixedPoint(programModel.routines, externalContractsOnly(contracts, routineNames), routineNames, profileSummaries);
|
|
316
|
-
const annotationSummaries = annotationRoutineSummaries.map((item) => item.summary);
|
|
317
|
-
const annotationBoundarySummaryMap = buildBoundarySummaryMap(annotationSummaries, annotationRoutineSummaries, profileSummaries);
|
|
318
|
-
const expectOutFixes = options.fixRegisterContracts === true
|
|
319
|
-
? inferenceOnlyOutputFixes(programModel.routines, annotationRoutineSummaries, profileSummaries)
|
|
320
|
-
: [];
|
|
321
|
-
return {
|
|
322
|
-
annotatedFiles: annotateAndFixRegisterCareContracts(loaded.sourceTexts, withCallerOutputCandidates(annotationRoutineSummaries, annotationBoundarySummaryMap, mergeAcceptedOutputCandidates(cliAcceptedOutputCandidates, findAcceptedOutputCandidatesFromHints(programModel.routines, annotationBoundarySummaryMap, smartComments), autoAcceptedOutputCandidates(expectOutFixes))), []),
|
|
323
|
-
};
|
|
324
|
-
})()
|
|
325
|
-
: {}),
|
|
326
|
-
};
|
|
327
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export function precedingCServiceName(item) {
|
|
2
|
-
const inst = item?.instruction;
|
|
3
|
-
if (!inst || inst.head.toLowerCase() !== 'ld' || inst.operands.length !== 2)
|
|
4
|
-
return undefined;
|
|
5
|
-
const dst = inst.operands[0];
|
|
6
|
-
const src = inst.operands[1];
|
|
7
|
-
if (dst?.kind !== 'Reg' || dst.name.toUpperCase() !== 'C')
|
|
8
|
-
return undefined;
|
|
9
|
-
return src?.kind === 'Imm' && src.expr.kind === 'ImmName' ? src.expr.name : undefined;
|
|
10
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { RegisterCareUnit } from './types.js';
|
|
2
|
-
export declare function normalizeCarrierName(raw: string): RegisterCareUnit | undefined;
|
|
3
|
-
export declare function expandCarrier(raw: string): RegisterCareUnit[] | undefined;
|
|
4
|
-
export declare function expandCarrierList(raw: string[]): RegisterCareUnit[] | undefined;
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
const FLAG_UNITS = ['carry', 'zero', 'sign', 'parity', 'halfCarry'];
|
|
2
|
-
const SINGLE_UNITS = new Set([
|
|
3
|
-
'A',
|
|
4
|
-
'B',
|
|
5
|
-
'C',
|
|
6
|
-
'D',
|
|
7
|
-
'E',
|
|
8
|
-
'H',
|
|
9
|
-
'L',
|
|
10
|
-
'IXH',
|
|
11
|
-
'IXL',
|
|
12
|
-
'IYH',
|
|
13
|
-
'IYL',
|
|
14
|
-
'SPH',
|
|
15
|
-
'SPL',
|
|
16
|
-
'carry',
|
|
17
|
-
'zero',
|
|
18
|
-
'sign',
|
|
19
|
-
'parity',
|
|
20
|
-
'halfCarry',
|
|
21
|
-
]);
|
|
22
|
-
const PAIRS = {
|
|
23
|
-
AF: ['A', ...FLAG_UNITS],
|
|
24
|
-
BC: ['B', 'C'],
|
|
25
|
-
DE: ['D', 'E'],
|
|
26
|
-
HL: ['H', 'L'],
|
|
27
|
-
IX: ['IXH', 'IXL'],
|
|
28
|
-
IY: ['IYH', 'IYL'],
|
|
29
|
-
SP: ['SPH', 'SPL'],
|
|
30
|
-
};
|
|
31
|
-
const FLAG_ALIASES = {
|
|
32
|
-
CARRY: 'carry',
|
|
33
|
-
ZERO: 'zero',
|
|
34
|
-
Z: 'zero',
|
|
35
|
-
SIGN: 'sign',
|
|
36
|
-
S: 'sign',
|
|
37
|
-
PARITY: 'parity',
|
|
38
|
-
PV: 'parity',
|
|
39
|
-
'P/V': 'parity',
|
|
40
|
-
HALFCARRY: 'halfCarry',
|
|
41
|
-
HFLAG: 'halfCarry',
|
|
42
|
-
};
|
|
43
|
-
export function normalizeCarrierName(raw) {
|
|
44
|
-
const trimmed = raw.trim();
|
|
45
|
-
const upper = trimmed.toUpperCase();
|
|
46
|
-
const flag = FLAG_ALIASES[upper];
|
|
47
|
-
if (flag)
|
|
48
|
-
return flag;
|
|
49
|
-
if (SINGLE_UNITS.has(upper))
|
|
50
|
-
return upper;
|
|
51
|
-
return undefined;
|
|
52
|
-
}
|
|
53
|
-
export function expandCarrier(raw) {
|
|
54
|
-
const upper = raw.trim().toUpperCase();
|
|
55
|
-
if (upper === 'F')
|
|
56
|
-
return FLAG_UNITS;
|
|
57
|
-
const pair = PAIRS[upper];
|
|
58
|
-
if (pair)
|
|
59
|
-
return pair;
|
|
60
|
-
const single = normalizeCarrierName(raw);
|
|
61
|
-
return single ? [single] : undefined;
|
|
62
|
-
}
|
|
63
|
-
export function expandCarrierList(raw) {
|
|
64
|
-
const out = [];
|
|
65
|
-
const seen = new Set();
|
|
66
|
-
for (const item of raw) {
|
|
67
|
-
const expanded = expandCarrier(item);
|
|
68
|
-
if (!expanded)
|
|
69
|
-
return undefined;
|
|
70
|
-
for (const unit of expanded) {
|
|
71
|
-
if (seen.has(unit))
|
|
72
|
-
continue;
|
|
73
|
-
seen.add(unit);
|
|
74
|
-
out.push(unit);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return out;
|
|
78
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { InstructionEffect, RegisterCareRoutine } from './types.js';
|
|
2
|
-
export declare function labelIndex(routine: RegisterCareRoutine): Map<string, number>;
|
|
3
|
-
export declare function instructionSuccessors(routine: RegisterCareRoutine, index: number, effect: InstructionEffect, labels: ReadonlyMap<string, number>, options?: {
|
|
4
|
-
boundaryFallthrough?: boolean;
|
|
5
|
-
}): number[];
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
function unique(items) {
|
|
2
|
-
return [...new Set(items)];
|
|
3
|
-
}
|
|
4
|
-
export function labelIndex(routine) {
|
|
5
|
-
const out = new Map();
|
|
6
|
-
routine.instructions.forEach((item, index) => {
|
|
7
|
-
for (const label of item.labels)
|
|
8
|
-
out.set(label, index);
|
|
9
|
-
});
|
|
10
|
-
return out;
|
|
11
|
-
}
|
|
12
|
-
function localTargetIndex(labels, target) {
|
|
13
|
-
if (!target)
|
|
14
|
-
return undefined;
|
|
15
|
-
return labels.get(target);
|
|
16
|
-
}
|
|
17
|
-
export function instructionSuccessors(routine, index, effect, labels, options = {}) {
|
|
18
|
-
const next = index + 1 < routine.instructions.length ? index + 1 : undefined;
|
|
19
|
-
if (effect.control.kind === 'fallthrough' ||
|
|
20
|
-
(options.boundaryFallthrough &&
|
|
21
|
-
(effect.control.kind === 'call' || effect.control.kind === 'rst'))) {
|
|
22
|
-
return next === undefined ? [] : [next];
|
|
23
|
-
}
|
|
24
|
-
if (effect.control.kind === 'jump') {
|
|
25
|
-
const target = localTargetIndex(labels, effect.control.target);
|
|
26
|
-
if (effect.control.conditional) {
|
|
27
|
-
return unique([
|
|
28
|
-
...(target === undefined ? [] : [target]),
|
|
29
|
-
...(next === undefined ? [] : [next]),
|
|
30
|
-
]);
|
|
31
|
-
}
|
|
32
|
-
return target === undefined ? [] : [target];
|
|
33
|
-
}
|
|
34
|
-
return [];
|
|
35
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { RegisterCareOutputCandidate, RegisterCareRoutine, RegisterCareUnit } from './types.js';
|
|
2
|
-
interface RegisterCareExpectOutFix {
|
|
3
|
-
file: string;
|
|
4
|
-
line: number;
|
|
5
|
-
column: number;
|
|
6
|
-
routine: string;
|
|
7
|
-
carriers: RegisterCareUnit[];
|
|
8
|
-
}
|
|
9
|
-
export declare function findExpectOutFixes(routines: RegisterCareRoutine[], candidates: RegisterCareOutputCandidate[]): RegisterCareExpectOutFix[];
|
|
10
|
-
export declare function applyExpectOutFixesToSource(source: string, fixes: RegisterCareExpectOutFix[], referenceSource?: string): string;
|
|
11
|
-
export {};
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import { getZ80InstructionEffect } from '../z80/effects.js';
|
|
2
|
-
import { instructionSuccessors, labelIndex } from './controlFlow.js';
|
|
3
|
-
import { contractCarrierList } from './report.js';
|
|
4
|
-
import { joinSourceLines, splitSourceLines } from './sourceText.js';
|
|
5
|
-
function sameLocation(a, b) {
|
|
6
|
-
return a.file === b.file && a.line === b.line && a.column === b.column;
|
|
7
|
-
}
|
|
8
|
-
function isUnconditionalDirectCall(item) {
|
|
9
|
-
const effect = getZ80InstructionEffect(item.instruction);
|
|
10
|
-
return (effect.control.kind === 'call' &&
|
|
11
|
-
effect.control.target !== undefined &&
|
|
12
|
-
!effect.control.conditional);
|
|
13
|
-
}
|
|
14
|
-
function continuationReads(routine, callIndex, carriers) {
|
|
15
|
-
const labels = labelIndex(routine);
|
|
16
|
-
const confirmed = new Set();
|
|
17
|
-
const work = callIndex + 1 < routine.instructions.length
|
|
18
|
-
? [{ index: callIndex + 1, pending: [...new Set(carriers)] }]
|
|
19
|
-
: [];
|
|
20
|
-
const seen = new Set();
|
|
21
|
-
let steps = 0;
|
|
22
|
-
while (work.length > 0 && steps < 512) {
|
|
23
|
-
steps += 1;
|
|
24
|
-
const state = work.pop();
|
|
25
|
-
const pending = state.pending.filter((unit) => !confirmed.has(unit));
|
|
26
|
-
if (pending.length === 0)
|
|
27
|
-
continue;
|
|
28
|
-
const key = `${state.index}:${pending.join(',')}`;
|
|
29
|
-
if (seen.has(key))
|
|
30
|
-
continue;
|
|
31
|
-
seen.add(key);
|
|
32
|
-
const item = routine.instructions[state.index];
|
|
33
|
-
if (!item)
|
|
34
|
-
continue;
|
|
35
|
-
const effect = getZ80InstructionEffect(item.instruction);
|
|
36
|
-
const reads = new Set(effect.reads);
|
|
37
|
-
const writes = new Set(effect.writes);
|
|
38
|
-
const remaining = [];
|
|
39
|
-
for (const unit of pending) {
|
|
40
|
-
if (reads.has(unit)) {
|
|
41
|
-
confirmed.add(unit);
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
if (!writes.has(unit))
|
|
45
|
-
remaining.push(unit);
|
|
46
|
-
}
|
|
47
|
-
if (remaining.length === 0)
|
|
48
|
-
continue;
|
|
49
|
-
for (const next of instructionSuccessors(routine, state.index, effect, labels)) {
|
|
50
|
-
work.push({ index: next, pending: remaining });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return carriers.filter((unit) => confirmed.has(unit));
|
|
54
|
-
}
|
|
55
|
-
export function findExpectOutFixes(routines, candidates) {
|
|
56
|
-
const out = [];
|
|
57
|
-
for (const routine of routines) {
|
|
58
|
-
for (let index = 0; index < routine.instructions.length; index += 1) {
|
|
59
|
-
const item = routine.instructions[index];
|
|
60
|
-
if (!isUnconditionalDirectCall(item))
|
|
61
|
-
continue;
|
|
62
|
-
const candidate = candidates.find((entry) => sameLocation(item, entry));
|
|
63
|
-
if (!candidate)
|
|
64
|
-
continue;
|
|
65
|
-
const carriers = continuationReads(routine, index, candidate.carriers);
|
|
66
|
-
if (carriers.length === 0)
|
|
67
|
-
continue;
|
|
68
|
-
out.push({ ...candidate, carriers });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return out;
|
|
72
|
-
}
|
|
73
|
-
function isExpectOutLine(line) {
|
|
74
|
-
return /^\s*;\s*expects\s+out\b/i.test(line);
|
|
75
|
-
}
|
|
76
|
-
function expectedCallLine(originalLines, fix) {
|
|
77
|
-
return originalLines[fix.line - 1]?.trim();
|
|
78
|
-
}
|
|
79
|
-
function findCallLineIndex(lines, originalLines, fix) {
|
|
80
|
-
const expected = expectedCallLine(originalLines, fix);
|
|
81
|
-
if (!expected)
|
|
82
|
-
return undefined;
|
|
83
|
-
const preferred = fix.line - 1;
|
|
84
|
-
if (lines[preferred]?.trim() === expected)
|
|
85
|
-
return preferred;
|
|
86
|
-
let best;
|
|
87
|
-
let bestDistance = Number.POSITIVE_INFINITY;
|
|
88
|
-
for (let index = 0; index < lines.length; index += 1) {
|
|
89
|
-
if (lines[index]?.trim() !== expected)
|
|
90
|
-
continue;
|
|
91
|
-
const distance = Math.abs(index - preferred);
|
|
92
|
-
if (distance < bestDistance) {
|
|
93
|
-
best = index;
|
|
94
|
-
bestDistance = distance;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return best;
|
|
98
|
-
}
|
|
99
|
-
function indentation(line) {
|
|
100
|
-
return line.match(/^\s*/)?.[0] ?? '';
|
|
101
|
-
}
|
|
102
|
-
export function applyExpectOutFixesToSource(source, fixes, referenceSource = source) {
|
|
103
|
-
if (fixes.length === 0)
|
|
104
|
-
return source;
|
|
105
|
-
const originalLines = referenceSource.split(/\r?\n/);
|
|
106
|
-
const sourceLines = splitSourceLines(source);
|
|
107
|
-
const { lines } = sourceLines;
|
|
108
|
-
const sorted = [...fixes].sort((a, b) => b.line - a.line || b.column - a.column);
|
|
109
|
-
for (const fix of sorted) {
|
|
110
|
-
const index = findCallLineIndex(lines, originalLines, fix);
|
|
111
|
-
if (index === undefined)
|
|
112
|
-
continue;
|
|
113
|
-
if (index > 0 && isExpectOutLine(lines[index - 1] ?? ''))
|
|
114
|
-
continue;
|
|
115
|
-
const prefix = indentation(lines[index] ?? '');
|
|
116
|
-
lines.splice(index, 0, `${prefix}; expects out ${contractCarrierList(fix.carriers)}`);
|
|
117
|
-
}
|
|
118
|
-
return joinSourceLines(sourceLines);
|
|
119
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { LocatedSmartComment, RegisterCareConflict, RegisterCareOutputCandidate, RegisterCareRoutine, RegisterCareUnit, RoutineSummary } from './types.js';
|
|
3
|
-
export declare function findRegisterCareConflicts(routine: RegisterCareRoutine, summaries: Map<string, RoutineSummary>, hints: LocatedSmartComment[]): RegisterCareConflict[];
|
|
4
|
-
export declare function findCallerOutputCandidateObservations(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>): RegisterCareOutputCandidate[];
|
|
5
|
-
export declare function findCallerOutputCandidates(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>): Map<string, RegisterCareUnit[]>;
|
|
6
|
-
export declare function findAcceptedOutputCandidatesFromHints(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>, hints: LocatedSmartComment[]): Map<string, RegisterCareUnit[]>;
|
|
7
|
-
export declare function diagnosticsForRegisterCareConflicts(conflicts: RegisterCareConflict[], severity: 'warning' | 'error'): Diagnostic[];
|