@jhlagado/azm 0.2.1 → 0.2.3
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 +16 -9
- package/dist/src/api-compile.d.ts +0 -2
- package/dist/src/api-compile.js +1 -8
- package/dist/src/assembly/address-planning.js +19 -1
- 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 +176 -9
- package/dist/src/expansion/op-expansion.js +1 -0
- package/dist/src/model/expression.d.ts +4 -0
- package/dist/src/model/source-item.d.ts +5 -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 +84 -0
- package/dist/src/semantics/expression-evaluation.d.ts +7 -3
- package/dist/src/semantics/expression-evaluation.js +57 -0
- package/dist/src/syntax/directive-aliases.js +9 -10
- package/dist/src/syntax/parse-expression.js +34 -9
- package/dist/src/syntax/parse-line.js +80 -44
- package/dist/src/tooling/case-style.js +3 -0
- package/docs/reference/cli.md +6 -4
- package/docs/reference/tooling-api.md +1 -4
- package/package.json +2 -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/annotate.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/annotate.js +0 -76
- 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/sourceText.d.ts +0 -8
- package/dist/legacy-root-azm/src/registerCare/sourceText.js +0 -15
- package/dist/legacy-root-azm/src/registerCare/summary.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/summary.js +0 -492
- 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
|
@@ -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,11 +0,0 @@
|
|
|
1
|
-
import type { RegisterCareRoutine, RoutineSummary } from './types.js';
|
|
2
|
-
export interface RegisterCareAnnotatedFile {
|
|
3
|
-
path: string;
|
|
4
|
-
text: string;
|
|
5
|
-
}
|
|
6
|
-
interface RegisterCareAnnotationInput {
|
|
7
|
-
routine: RegisterCareRoutine;
|
|
8
|
-
summary: RoutineSummary;
|
|
9
|
-
}
|
|
10
|
-
export declare function annotateRegisterCareContracts(sourceTexts: ReadonlyMap<string, string>, routines: RegisterCareAnnotationInput[]): RegisterCareAnnotatedFile[];
|
|
11
|
-
export {};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import { renderRegisterCareSourceBlock } from './report.js';
|
|
2
|
-
import { joinSourceLines, splitSourceLines } from './sourceText.js';
|
|
3
|
-
const GENERATED_COMPACT_LINE_RE = /^\s*;\s*!\s*(?:in|out|maybe-out|clobbers|preserves)(?:\s|$)/i;
|
|
4
|
-
function isCommentLine(line) {
|
|
5
|
-
return /^\s*;/.test(line);
|
|
6
|
-
}
|
|
7
|
-
function isGeneratedCompactLine(line) {
|
|
8
|
-
return GENERATED_COMPACT_LINE_RE.test(line);
|
|
9
|
-
}
|
|
10
|
-
function precedingCommentBlockStart(lines, labelIndex) {
|
|
11
|
-
let index = labelIndex - 1;
|
|
12
|
-
if (index < 0 || !isCommentLine(lines[index] ?? ''))
|
|
13
|
-
return undefined;
|
|
14
|
-
while (index >= 0 && isCommentLine(lines[index] ?? ''))
|
|
15
|
-
index -= 1;
|
|
16
|
-
return index + 1;
|
|
17
|
-
}
|
|
18
|
-
function generatedBlockBeforeLabel(lines, labelIndex) {
|
|
19
|
-
let compactStart = labelIndex;
|
|
20
|
-
while (compactStart > 0 && isGeneratedCompactLine(lines[compactStart - 1] ?? '')) {
|
|
21
|
-
compactStart -= 1;
|
|
22
|
-
}
|
|
23
|
-
if (compactStart < labelIndex)
|
|
24
|
-
return { start: compactStart, end: labelIndex - 1 };
|
|
25
|
-
return undefined;
|
|
26
|
-
}
|
|
27
|
-
function hasPrecedingCommentBlock(lines, labelIndex) {
|
|
28
|
-
return precedingCommentBlockStart(lines, labelIndex) !== undefined;
|
|
29
|
-
}
|
|
30
|
-
function isExplicitEntryRoutine(routine) {
|
|
31
|
-
return routine.entryLabels?.includes(routine.name) === true;
|
|
32
|
-
}
|
|
33
|
-
function annotateFile(source, routines) {
|
|
34
|
-
const sourceLines = splitSourceLines(source);
|
|
35
|
-
const { lines } = sourceLines;
|
|
36
|
-
const sorted = [...routines].sort((a, b) => b.routine.span.start.line - a.routine.span.start.line);
|
|
37
|
-
for (const item of sorted) {
|
|
38
|
-
const labelIndex = item.routine.span.start.line - 1;
|
|
39
|
-
if (labelIndex < 0 || labelIndex > lines.length)
|
|
40
|
-
continue;
|
|
41
|
-
const block = renderRegisterCareSourceBlock(item.summary);
|
|
42
|
-
const hasContractContent = block.length > 0;
|
|
43
|
-
const existing = generatedBlockBeforeLabel(lines, labelIndex);
|
|
44
|
-
if (existing) {
|
|
45
|
-
lines.splice(existing.start, existing.end - existing.start + 1, ...(hasContractContent ? block : []));
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
if (!hasContractContent)
|
|
49
|
-
continue;
|
|
50
|
-
if (!isExplicitEntryRoutine(item.routine) && !hasPrecedingCommentBlock(lines, labelIndex)) {
|
|
51
|
-
continue;
|
|
52
|
-
}
|
|
53
|
-
lines.splice(labelIndex, 0, ...block);
|
|
54
|
-
}
|
|
55
|
-
return joinSourceLines(sourceLines);
|
|
56
|
-
}
|
|
57
|
-
export function annotateRegisterCareContracts(sourceTexts, routines) {
|
|
58
|
-
const byFile = new Map();
|
|
59
|
-
for (const item of routines) {
|
|
60
|
-
if (!sourceTexts.has(item.routine.span.file))
|
|
61
|
-
continue;
|
|
62
|
-
const items = byFile.get(item.routine.span.file) ?? [];
|
|
63
|
-
items.push(item);
|
|
64
|
-
byFile.set(item.routine.span.file, items);
|
|
65
|
-
}
|
|
66
|
-
const out = [];
|
|
67
|
-
for (const [file, items] of [...byFile].sort(([a], [b]) => a.localeCompare(b))) {
|
|
68
|
-
const source = sourceTexts.get(file);
|
|
69
|
-
if (source === undefined)
|
|
70
|
-
continue;
|
|
71
|
-
const text = annotateFile(source, items);
|
|
72
|
-
if (text !== source)
|
|
73
|
-
out.push({ path: file, text });
|
|
74
|
-
}
|
|
75
|
-
return out;
|
|
76
|
-
}
|
|
@@ -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 {};
|