@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,5 +1,5 @@
|
|
|
1
1
|
import { getRegisterCareProfile } from './profiles.js';
|
|
2
|
-
import {
|
|
2
|
+
import { inferRoutineSummariesToFixedPoint, summariesWithExternalContracts, } from './routine-summaries.js';
|
|
3
3
|
function unique(values) {
|
|
4
4
|
const out = [];
|
|
5
5
|
for (const value of values) {
|
|
@@ -8,22 +8,16 @@ function unique(values) {
|
|
|
8
8
|
}
|
|
9
9
|
return out;
|
|
10
10
|
}
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return {
|
|
22
|
-
name: routine.name,
|
|
23
|
-
mayRead: Array.from(reads),
|
|
24
|
-
mayWrite: Array.from(writes),
|
|
25
|
-
preserved: [],
|
|
26
|
-
};
|
|
11
|
+
function isLocalLabel(name) {
|
|
12
|
+
return name.startsWith('.');
|
|
13
|
+
}
|
|
14
|
+
function boundaryLabels(routine) {
|
|
15
|
+
return routine.entryLabels.length > 0
|
|
16
|
+
? routine.entryLabels
|
|
17
|
+
: routine.labels.filter((label) => !isLocalLabel(label));
|
|
18
|
+
}
|
|
19
|
+
function routineNameSet(routines) {
|
|
20
|
+
return new Set(routines.flatMap((routine) => boundaryLabels(routine)));
|
|
27
21
|
}
|
|
28
22
|
export function buildProfileSummaries(profileName) {
|
|
29
23
|
const profile = getRegisterCareProfile(profileName);
|
|
@@ -46,48 +40,13 @@ export function buildProfileSummaryLookup(profileName) {
|
|
|
46
40
|
return out;
|
|
47
41
|
}
|
|
48
42
|
export function routineNames(routines) {
|
|
49
|
-
return routines.flatMap((routine) => routine
|
|
43
|
+
return routines.flatMap((routine) => boundaryLabels(routine));
|
|
50
44
|
}
|
|
51
|
-
function
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
return contractMap.get(routine.name);
|
|
58
|
-
}
|
|
59
|
-
export function buildSummaries(routines, contractMap) {
|
|
60
|
-
const out = [];
|
|
61
|
-
const written = new Set();
|
|
62
|
-
for (const routine of routines) {
|
|
63
|
-
const inferred = inferRoutineSummary(routine);
|
|
64
|
-
const contract = entryContract(routine, contractMap);
|
|
65
|
-
out.push({
|
|
66
|
-
name: routine.name,
|
|
67
|
-
mayRead: unique([...inferred.mayRead, ...(contract?.in ?? [])]),
|
|
68
|
-
mayWrite: unique([
|
|
69
|
-
...inferred.mayWrite,
|
|
70
|
-
...(contract?.out ?? []),
|
|
71
|
-
...(contract?.clobbers ?? []),
|
|
72
|
-
]),
|
|
73
|
-
preserved: unique([...inferred.preserved, ...(contract?.preserves ?? [])]),
|
|
74
|
-
});
|
|
75
|
-
written.add(routine.name);
|
|
76
|
-
for (const alias of routine.entryLabels)
|
|
77
|
-
written.add(alias);
|
|
78
|
-
}
|
|
79
|
-
for (const [name, contract] of contractMap) {
|
|
80
|
-
if (written.has(name))
|
|
81
|
-
continue;
|
|
82
|
-
out.push({
|
|
83
|
-
name,
|
|
84
|
-
mayRead: [...contract.in],
|
|
85
|
-
mayWrite: [...contract.out, ...contract.clobbers],
|
|
86
|
-
preserved: [...contract.preserves],
|
|
87
|
-
});
|
|
88
|
-
written.add(name);
|
|
89
|
-
}
|
|
90
|
-
return out;
|
|
45
|
+
export function buildSummaries(routines, contractMap, profileSummaries = []) {
|
|
46
|
+
const names = routineNameSet(routines);
|
|
47
|
+
const routineSummaries = inferRoutineSummariesToFixedPoint([...routines], contractMap, names, [...profileSummaries]);
|
|
48
|
+
const summaries = routineSummaries.map((item) => item.summary);
|
|
49
|
+
return summariesWithExternalContracts(summaries, contractMap, names);
|
|
91
50
|
}
|
|
92
51
|
export function buildSummaryByName(routines, summaries, profileSummaries = []) {
|
|
93
52
|
const out = new Map();
|
|
@@ -103,7 +62,7 @@ export function buildSummaryByName(routines, summaries, profileSummaries = []) {
|
|
|
103
62
|
const routineSummary = byRoutine.get(routine.name);
|
|
104
63
|
if (routineSummary === undefined)
|
|
105
64
|
continue;
|
|
106
|
-
for (const alias of routine
|
|
65
|
+
for (const alias of boundaryLabels(routine)) {
|
|
107
66
|
out.set(alias, routineSummary);
|
|
108
67
|
}
|
|
109
68
|
}
|
|
@@ -118,28 +77,36 @@ export function withAcceptedOutputs(summaries, acceptedOutputCandidates) {
|
|
|
118
77
|
if (!accepted || accepted.length === 0) {
|
|
119
78
|
return summary;
|
|
120
79
|
}
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
80
|
+
const written = new Set(summary.mayWrite);
|
|
81
|
+
const promoted = accepted.filter((unit) => written.has(unit));
|
|
82
|
+
if (promoted.length === 0) {
|
|
83
|
+
return summary;
|
|
84
|
+
}
|
|
85
|
+
const valueRelations = [...summary.valueRelations];
|
|
86
|
+
for (const unit of promoted) {
|
|
87
|
+
if (!valueRelations.some((relation) => relation.out.includes(unit))) {
|
|
88
|
+
valueRelations.push({ out: [unit], from: [] });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return { ...summary, valueRelations };
|
|
127
92
|
});
|
|
128
93
|
}
|
|
129
|
-
export function unknownBoundaryDiagnostics(
|
|
130
|
-
return
|
|
131
|
-
.filter((
|
|
132
|
-
.map((
|
|
94
|
+
export function unknownBoundaryDiagnostics(directBoundaries, knownRoutines) {
|
|
95
|
+
return directBoundaries
|
|
96
|
+
.filter((boundary) => !knownRoutines.has(boundary.target))
|
|
97
|
+
.map((boundary) => ({
|
|
133
98
|
severity: 'warning',
|
|
134
99
|
code: 'AZMN_REGISTER_CARE',
|
|
135
|
-
message: `Register-care cannot prove ${
|
|
136
|
-
sourceName:
|
|
137
|
-
line:
|
|
138
|
-
column:
|
|
100
|
+
message: `Register-care cannot prove ${boundary.subject}; add a routine body or .asmi extern contract.`,
|
|
101
|
+
sourceName: boundary.file,
|
|
102
|
+
line: boundary.line,
|
|
103
|
+
column: boundary.column,
|
|
139
104
|
}));
|
|
140
105
|
}
|
|
141
|
-
export function unknownCallList(
|
|
142
|
-
return unique(
|
|
106
|
+
export function unknownCallList(directBoundaries, knownRoutines) {
|
|
107
|
+
return unique(directBoundaries
|
|
108
|
+
.filter((boundary) => !knownRoutines.has(boundary.target))
|
|
109
|
+
.map((boundary) => boundary.target)).sort();
|
|
143
110
|
}
|
|
144
111
|
export function buildOutputCandidateFixability(routines, outputCandidates, autoFixableCandidateKeys) {
|
|
145
112
|
const autoFixable = autoFixableCandidateKeys([...routines], [...outputCandidates]);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { getZ80InstructionEffect } from '../z80/effects.js';
|
|
2
|
+
import { instructionHead, instructionOperand, instructionOperandCount, isAccumulatorSelfOperand, isImmediateZeroOperand, isPureTokenTransferInstruction, isRegisterOperand, isUnconditionalReturnInstruction, regName, } from './instruction-shape.js';
|
|
2
3
|
import { precedingCServiceName } from './boundaryHints.js';
|
|
3
|
-
import {
|
|
4
|
+
import { expandCarrierList } from './carriers.js';
|
|
4
5
|
import { rstServiceTargetName, rstTargetName } from './profiles.js';
|
|
5
6
|
const FLAG_UNIT_LIST = ['carry', 'zero', 'sign', 'parity', 'halfCarry'];
|
|
6
7
|
const TRACKED_UNITS = [
|
|
@@ -32,7 +33,7 @@ function isTrackedUnit(unit) {
|
|
|
32
33
|
return TRACKED_UNITS.includes(unit);
|
|
33
34
|
}
|
|
34
35
|
function getRegisterUnits(name) {
|
|
35
|
-
return
|
|
36
|
+
return expandCarrierList([name]);
|
|
36
37
|
}
|
|
37
38
|
function readToken(tokens, unit) {
|
|
38
39
|
return tokens.get(unit) ?? { origin: 'unknown' };
|
|
@@ -54,7 +55,7 @@ function markProducedReadsConsumed(tokens, consumedProduced, reads, writes, item
|
|
|
54
55
|
for (const unit of reads) {
|
|
55
56
|
if (!isTrackedUnit(unit) || writes.has(unit))
|
|
56
57
|
continue;
|
|
57
|
-
if (item
|
|
58
|
+
if (item !== undefined && instructionHead(item) === 'cp' && unit === 'A')
|
|
58
59
|
continue;
|
|
59
60
|
if (readToken(tokens, unit).origin === 'produced')
|
|
60
61
|
consumedProduced.add(unit);
|
|
@@ -67,7 +68,7 @@ function isOpaqueBoundary(item, effect) {
|
|
|
67
68
|
if (effect.control.kind === 'call' || effect.control.kind === 'rst')
|
|
68
69
|
return true;
|
|
69
70
|
return (effect.control.kind === 'jump' &&
|
|
70
|
-
item
|
|
71
|
+
(instructionHead(item) === 'jp' || instructionHead(item) === 'jp-cc') &&
|
|
71
72
|
!effect.control.conditional &&
|
|
72
73
|
Boolean(effect.control.target) &&
|
|
73
74
|
!effect.control.target?.startsWith('.'));
|
|
@@ -81,7 +82,7 @@ function boundarySummary(routine, index, summaries) {
|
|
|
81
82
|
return summaries.get(effect.control.target);
|
|
82
83
|
}
|
|
83
84
|
if (effect.control.kind === 'jump' &&
|
|
84
|
-
item
|
|
85
|
+
(instructionHead(item) === 'jp' || instructionHead(item) === 'jp-cc') &&
|
|
85
86
|
effect.control.target &&
|
|
86
87
|
!effect.control.target.startsWith('.') &&
|
|
87
88
|
!routine.labels.includes(effect.control.target)) {
|
|
@@ -147,46 +148,23 @@ function contractOutRelation(contractIn, contractOut) {
|
|
|
147
148
|
};
|
|
148
149
|
}
|
|
149
150
|
function isUnconditionalReturn(item) {
|
|
150
|
-
|
|
151
|
-
if (head === 'ret')
|
|
152
|
-
return item.instruction.operands.length === 0;
|
|
153
|
-
return head === 'retn' || head === 'reti';
|
|
151
|
+
return isUnconditionalReturnInstruction(item);
|
|
154
152
|
}
|
|
155
153
|
function isPureTokenTransfer(item) {
|
|
156
|
-
|
|
157
|
-
const head = item.head.toLowerCase();
|
|
158
|
-
if (head === 'ex')
|
|
159
|
-
return true;
|
|
160
|
-
if (head !== 'ld' || inst.operands.length !== 2)
|
|
161
|
-
return false;
|
|
162
|
-
const dst = inst.operands[0];
|
|
163
|
-
const src = inst.operands[1];
|
|
164
|
-
if (dst?.kind !== 'Reg')
|
|
165
|
-
return false;
|
|
166
|
-
return src?.kind === 'Reg' || src?.kind === 'Imm';
|
|
167
|
-
}
|
|
168
|
-
function isAccumulatorSelfOperand(item) {
|
|
169
|
-
const operand = item.instruction.operands[0];
|
|
170
|
-
return operand?.kind === 'Reg' && operand.name.toUpperCase() === 'A';
|
|
171
|
-
}
|
|
172
|
-
function isImmediateZeroOperand(item) {
|
|
173
|
-
const operand = item.instruction.operands[0];
|
|
174
|
-
return operand?.kind === 'Imm' && operand.expr.kind === 'ImmLiteral' && operand.expr.value === 0;
|
|
175
|
-
}
|
|
176
|
-
function isRegisterOperand(item, index, name) {
|
|
177
|
-
const operand = item?.instruction.operands[index];
|
|
178
|
-
return operand?.kind === 'Reg' && operand.name.toUpperCase() === name;
|
|
154
|
+
return isPureTokenTransferInstruction(item);
|
|
179
155
|
}
|
|
180
156
|
function isCarryClearBeforeSbcHl(item, next) {
|
|
181
|
-
const head = item.
|
|
157
|
+
const head = instructionHead(item).toLowerCase();
|
|
182
158
|
if (head !== 'or' && head !== 'and')
|
|
183
159
|
return false;
|
|
184
160
|
if (!isAccumulatorSelfOperand(item))
|
|
185
161
|
return false;
|
|
186
|
-
return next
|
|
162
|
+
return (next !== undefined &&
|
|
163
|
+
instructionHead(next) === 'sbc' &&
|
|
164
|
+
isRegisterOperand(next, 0, 'HL'));
|
|
187
165
|
}
|
|
188
166
|
function intentOutputUnits(item) {
|
|
189
|
-
const head = item.
|
|
167
|
+
const head = instructionHead(item).toLowerCase();
|
|
190
168
|
if (head === 'scf' || head === 'ccf')
|
|
191
169
|
return ['carry'];
|
|
192
170
|
if (head === 'cp')
|
|
@@ -197,7 +175,7 @@ function intentOutputUnits(item) {
|
|
|
197
175
|
return [];
|
|
198
176
|
}
|
|
199
177
|
function isMechanicalResidueWrite(item, unit) {
|
|
200
|
-
const head = item.
|
|
178
|
+
const head = instructionHead(item).toLowerCase();
|
|
201
179
|
if (head === 'djnz')
|
|
202
180
|
return unit === 'B';
|
|
203
181
|
if (head === 'ldi' || head === 'ldir' || head === 'ldd' || head === 'lddr') {
|
|
@@ -207,16 +185,18 @@ function isMechanicalResidueWrite(item, unit) {
|
|
|
207
185
|
}
|
|
208
186
|
function applyPureTokenTransfer(tokens, consumedProduced, item) {
|
|
209
187
|
const inst = item.instruction;
|
|
210
|
-
const head = item.
|
|
211
|
-
if (head === 'ld' && inst
|
|
212
|
-
const dst = inst
|
|
213
|
-
const src = inst
|
|
214
|
-
|
|
188
|
+
const head = instructionHead(item).toLowerCase();
|
|
189
|
+
if (head === 'ld' && instructionOperandCount(inst) === 2) {
|
|
190
|
+
const dst = instructionOperand(inst, 0);
|
|
191
|
+
const src = instructionOperand(inst, 1);
|
|
192
|
+
const dstName = regName(dst);
|
|
193
|
+
if (dstName === undefined)
|
|
215
194
|
return [];
|
|
216
|
-
const dstUnits =
|
|
195
|
+
const dstUnits = getRegisterUnits(dstName);
|
|
217
196
|
if (!dstUnits)
|
|
218
197
|
return [];
|
|
219
|
-
const
|
|
198
|
+
const srcName = regName(src);
|
|
199
|
+
const srcUnits = srcName ? getRegisterUnits(srcName) : undefined;
|
|
220
200
|
if (srcUnits && srcUnits.length === dstUnits.length) {
|
|
221
201
|
dstUnits.forEach((unit, index) => {
|
|
222
202
|
tokens.set(unit, readToken(tokens, srcUnits[index]));
|
|
@@ -234,13 +214,15 @@ function applyPureTokenTransfer(tokens, consumedProduced, item) {
|
|
|
234
214
|
}
|
|
235
215
|
return dstUnits;
|
|
236
216
|
}
|
|
237
|
-
if (head === 'ex' && inst
|
|
238
|
-
const left = inst
|
|
239
|
-
const right = inst
|
|
240
|
-
|
|
217
|
+
if (head === 'ex' && instructionOperandCount(inst) === 2) {
|
|
218
|
+
const left = instructionOperand(inst, 0);
|
|
219
|
+
const right = instructionOperand(inst, 1);
|
|
220
|
+
const leftName = regName(left);
|
|
221
|
+
const rightName = regName(right);
|
|
222
|
+
if (leftName === undefined || rightName === undefined)
|
|
241
223
|
return [];
|
|
242
|
-
const leftUnits = getRegisterUnits(
|
|
243
|
-
const rightUnits = getRegisterUnits(
|
|
224
|
+
const leftUnits = getRegisterUnits(leftName);
|
|
225
|
+
const rightUnits = getRegisterUnits(rightName);
|
|
244
226
|
if (!leftUnits || !rightUnits || leftUnits.length !== rightUnits.length)
|
|
245
227
|
return [];
|
|
246
228
|
const leftTokens = leftUnits.map((unit) => readToken(tokens, unit));
|
|
@@ -308,7 +290,7 @@ export function inferRoutineSummary(routine, boundarySummaries = new Map()) {
|
|
|
308
290
|
mayRead.push(...semanticReadOrigins(tokens, semanticReads));
|
|
309
291
|
markProducedReadsConsumed(tokens, consumedProduced, semanticReads, effectWrites, item);
|
|
310
292
|
}
|
|
311
|
-
if (item.
|
|
293
|
+
if (instructionHead(item).toLowerCase() === 'djnz') {
|
|
312
294
|
for (const unit of TRACKED_UNITS) {
|
|
313
295
|
if (readToken(tokens, unit).origin === 'produced')
|
|
314
296
|
consumedProduced.add(unit);
|
|
@@ -379,7 +361,7 @@ export function inferRoutineSummary(routine, boundarySummaries = new Map()) {
|
|
|
379
361
|
if (transferWrites.has(unit) && isTrackedUnit(unit))
|
|
380
362
|
continue;
|
|
381
363
|
if (unit === 'A' &&
|
|
382
|
-
(item.
|
|
364
|
+
(instructionHead(item).toLowerCase() === 'or' || instructionHead(item).toLowerCase() === 'and') &&
|
|
383
365
|
isAccumulatorSelfOperand(item)) {
|
|
384
366
|
if (!carryClearBeforeSbcHl)
|
|
385
367
|
intendedProduced.add(unit);
|
|
@@ -64,6 +64,7 @@ export interface RegisterCareRoutine {
|
|
|
64
64
|
}
|
|
65
65
|
export interface RegisterCareDirectCall {
|
|
66
66
|
target: string;
|
|
67
|
+
subject: string;
|
|
67
68
|
file: string;
|
|
68
69
|
line: number;
|
|
69
70
|
column: number;
|
|
@@ -71,6 +72,7 @@ export interface RegisterCareDirectCall {
|
|
|
71
72
|
export interface RegisterCareProgramModel {
|
|
72
73
|
routines: RegisterCareRoutine[];
|
|
73
74
|
directCalls: RegisterCareDirectCall[];
|
|
75
|
+
directBoundaries: RegisterCareDirectCall[];
|
|
74
76
|
}
|
|
75
77
|
export type StackEffect = {
|
|
76
78
|
kind: 'none';
|
|
@@ -121,7 +123,10 @@ export interface RoutineSummary {
|
|
|
121
123
|
mayWrite: RegisterCareUnit[];
|
|
122
124
|
mayOutput?: RegisterCareUnit[];
|
|
123
125
|
preserved: RegisterCareUnit[];
|
|
124
|
-
valueRelations
|
|
126
|
+
valueRelations: ValueRelation[];
|
|
127
|
+
stackBalanced: boolean;
|
|
128
|
+
hasUnknownStackEffect?: boolean;
|
|
129
|
+
outputCandidates?: RegisterCareUnit[];
|
|
125
130
|
}
|
|
126
131
|
export interface RegisterCareOutputCandidate {
|
|
127
132
|
file: string;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Diagnostic } from '../model/diagnostic.js';
|
|
2
|
-
import type { Expression } from '../model/expression.js';
|
|
2
|
+
import type { Expression, TypeExpr } from '../model/expression.js';
|
|
3
3
|
import type { LayoutField } from '../model/source-item.js';
|
|
4
4
|
import type { SourceSpan } from '../source/source-span.js';
|
|
5
5
|
export interface EquateRecord {
|
|
@@ -9,11 +9,15 @@ export interface EquateRecord {
|
|
|
9
9
|
readonly enumMember?: boolean;
|
|
10
10
|
readonly stringValue?: string;
|
|
11
11
|
}
|
|
12
|
-
export
|
|
12
|
+
export type LayoutRecord = {
|
|
13
13
|
readonly kind: 'record' | 'union';
|
|
14
14
|
readonly fields: readonly LayoutField[];
|
|
15
15
|
readonly span: SourceSpan;
|
|
16
|
-
}
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: 'alias';
|
|
18
|
+
readonly typeExpr: TypeExpr;
|
|
19
|
+
readonly span: SourceSpan;
|
|
20
|
+
};
|
|
17
21
|
export declare function lookupEquateRecord(equates: ReadonlyMap<string, EquateRecord>, name: string): {
|
|
18
22
|
readonly key: string;
|
|
19
23
|
readonly record: EquateRecord;
|
|
@@ -39,6 +39,8 @@ export function evaluateExpression(expression, labels, equates, span, diagnostic
|
|
|
39
39
|
return evaluateTypeSize(expression.typeExpr, labels, equates, span, diagnostics, options);
|
|
40
40
|
case 'sizeof':
|
|
41
41
|
return evaluateSizeof(expression.typeExpr, options.layouts, span, diagnostics);
|
|
42
|
+
case 'byte-function':
|
|
43
|
+
return evaluateByteFunction(expression, labels, equates, span, diagnostics, options);
|
|
42
44
|
case 'offset':
|
|
43
45
|
return evaluateOffset(expression.typeExpr, expression.path, options.layouts, span, diagnostics);
|
|
44
46
|
case 'layout-cast':
|
|
@@ -51,6 +53,13 @@ export function evaluateExpression(expression, labels, equates, span, diagnostic
|
|
|
51
53
|
return evaluateBinary(expression, labels, equates, span, diagnostics, options);
|
|
52
54
|
}
|
|
53
55
|
}
|
|
56
|
+
function evaluateByteFunction(expression, labels, equates, span, diagnostics, options) {
|
|
57
|
+
const value = evaluateExpression(expression.expression, labels, equates, span, diagnostics, options);
|
|
58
|
+
if (value === undefined) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
return expression.function === 'LSB' ? value & 0xff : (value >> 8) & 0xff;
|
|
62
|
+
}
|
|
54
63
|
function evaluateTypeSize(typeExpr, labels, equates, span, diagnostics, options) {
|
|
55
64
|
if (options.layouts) {
|
|
56
65
|
const sizeDiagnostics = [];
|
|
@@ -146,6 +155,13 @@ function evaluateOffset(typeExpr, path, layouts, span, diagnostics) {
|
|
|
146
155
|
return undefined;
|
|
147
156
|
}
|
|
148
157
|
function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
|
|
158
|
+
const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, visiting);
|
|
159
|
+
if (!resolvedTypeExpr) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
if (resolvedTypeExpr !== typeExpr) {
|
|
163
|
+
return typeExprSize(resolvedTypeExpr, layouts, span, diagnostics, visiting);
|
|
164
|
+
}
|
|
149
165
|
const scalar = scalarSize(typeExpr.name);
|
|
150
166
|
const baseSize = scalar ??
|
|
151
167
|
(() => {
|
|
@@ -162,6 +178,9 @@ function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
|
|
|
162
178
|
return typeExpr.length === undefined ? baseSize : baseSize * typeExpr.length;
|
|
163
179
|
}
|
|
164
180
|
function layoutSize(typeName, layout, layouts, span, diagnostics, visiting) {
|
|
181
|
+
if (layout.kind === 'alias') {
|
|
182
|
+
return typeExprSize(layout.typeExpr, layouts, span, diagnostics, visiting);
|
|
183
|
+
}
|
|
165
184
|
const fieldSizes = [];
|
|
166
185
|
for (const field of layout.fields) {
|
|
167
186
|
const size = fieldSize(field, layouts, span, diagnostics, visiting);
|
|
@@ -187,6 +206,13 @@ function fieldSize(field, layouts, span, diagnostics, visiting) {
|
|
|
187
206
|
return typeExprSize(field.typeExpr, layouts, span, diagnostics, new Set([...visiting, field.typeExpr.name]));
|
|
188
207
|
}
|
|
189
208
|
function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
|
|
209
|
+
const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
|
|
210
|
+
if (!resolvedTypeExpr) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
if (resolvedTypeExpr !== typeExpr) {
|
|
214
|
+
return offsetPath(resolvedTypeExpr, parts, layouts, span, diagnostics);
|
|
215
|
+
}
|
|
190
216
|
const [head, ...tail] = parts;
|
|
191
217
|
if (head === undefined) {
|
|
192
218
|
return undefined;
|
|
@@ -218,6 +244,9 @@ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
|
|
|
218
244
|
diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
|
|
219
245
|
return undefined;
|
|
220
246
|
}
|
|
247
|
+
if (layout.kind === 'alias') {
|
|
248
|
+
return offsetPath(layout.typeExpr, parts, layouts, span, diagnostics);
|
|
249
|
+
}
|
|
221
250
|
let currentOffset = 0;
|
|
222
251
|
for (const field of layout.fields) {
|
|
223
252
|
const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
|
|
@@ -246,6 +275,13 @@ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
|
|
|
246
275
|
return undefined;
|
|
247
276
|
}
|
|
248
277
|
function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagnostics, options) {
|
|
278
|
+
const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
|
|
279
|
+
if (!resolvedTypeExpr) {
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
if (resolvedTypeExpr !== typeExpr) {
|
|
283
|
+
return layoutCastOffset(resolvedTypeExpr, parts, labels, equates, layouts, span, diagnostics, options);
|
|
284
|
+
}
|
|
249
285
|
const [head, ...tail] = parts;
|
|
250
286
|
if (head === undefined) {
|
|
251
287
|
return 0;
|
|
@@ -286,6 +322,9 @@ function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagn
|
|
|
286
322
|
diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
|
|
287
323
|
return undefined;
|
|
288
324
|
}
|
|
325
|
+
if (layout.kind === 'alias') {
|
|
326
|
+
return layoutCastOffset(layout.typeExpr, parts, labels, equates, layouts, span, diagnostics, options);
|
|
327
|
+
}
|
|
289
328
|
let currentOffset = 0;
|
|
290
329
|
for (const field of layout.fields) {
|
|
291
330
|
const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
|
|
@@ -330,6 +369,24 @@ function registerIndexName(expression) {
|
|
|
330
369
|
function formatTypeExpr(typeExpr) {
|
|
331
370
|
return typeExpr.length === undefined ? typeExpr.name : `${typeExpr.name}[${typeExpr.length}]`;
|
|
332
371
|
}
|
|
372
|
+
function resolveLayoutAlias(typeExpr, layouts, span, diagnostics, visiting) {
|
|
373
|
+
const layout = layouts.get(typeExpr.name);
|
|
374
|
+
if (!layout || layout.kind !== 'alias') {
|
|
375
|
+
return typeExpr;
|
|
376
|
+
}
|
|
377
|
+
if (visiting.has(layout.typeExpr.name)) {
|
|
378
|
+
diagnostics.push(diagnostic(span, `recursive type: ${typeExpr.name}`));
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
const target = resolveLayoutAlias(layout.typeExpr, layouts, span, diagnostics, new Set([...visiting, layout.typeExpr.name]));
|
|
382
|
+
if (!target) {
|
|
383
|
+
return undefined;
|
|
384
|
+
}
|
|
385
|
+
const length = typeExpr.length === undefined
|
|
386
|
+
? target.length
|
|
387
|
+
: (target.length ?? 1) * typeExpr.length;
|
|
388
|
+
return length === undefined ? { name: target.name } : { name: target.name, length };
|
|
389
|
+
}
|
|
333
390
|
function formatOffsetPath(path) {
|
|
334
391
|
return path.map((part) => (part.kind === 'field' ? part.name : `[${part.index}]`)).join('.');
|
|
335
392
|
}
|
|
@@ -2,3 +2,5 @@
|
|
|
2
2
|
* Remove an ASM80-style end-of-line comment (`;`), respecting quoted strings.
|
|
3
3
|
*/
|
|
4
4
|
export declare function stripLineComment(text: string): string;
|
|
5
|
+
/** Trailing `;` comment text, or undefined when absent or whitespace-only. */
|
|
6
|
+
export declare function extractLineComment(text: string): string | undefined;
|
|
@@ -25,3 +25,29 @@ export function stripLineComment(text) {
|
|
|
25
25
|
}
|
|
26
26
|
return text;
|
|
27
27
|
}
|
|
28
|
+
/** Trailing `;` comment text, or undefined when absent or whitespace-only. */
|
|
29
|
+
export function extractLineComment(text) {
|
|
30
|
+
let quote;
|
|
31
|
+
let escaped = false;
|
|
32
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
33
|
+
const char = text[index];
|
|
34
|
+
if (escaped) {
|
|
35
|
+
escaped = false;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (char === '\\' && quote) {
|
|
39
|
+
escaped = true;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if ((char === '"' || char === "'") &&
|
|
43
|
+
!(char === "'" && quote === undefined && /[A-Za-z0-9_]/.test(text[index - 1] ?? ''))) {
|
|
44
|
+
quote = quote === char ? undefined : (quote ?? char);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (char === ';' && !quote) {
|
|
48
|
+
const comment = text.slice(index + 1).trim();
|
|
49
|
+
return comment.length > 0 ? comment : undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
@@ -160,14 +160,14 @@ export function normalizeDirectiveAlias(text, policy = DEFAULT_DIRECTIVE_ALIAS_P
|
|
|
160
160
|
if (label) {
|
|
161
161
|
return `${leading}${label[1]} ${normalizeHead(label[2] ?? '', policy)}`;
|
|
162
162
|
}
|
|
163
|
-
const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+([A-Za-z]
|
|
163
|
+
const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+([A-Za-z][A-Za-z0-9_]*)\b(.*)$/.exec(trimmed);
|
|
164
164
|
if (equ && resolveDirectiveAlias(equ[2] ?? '', policy) === '.equ') {
|
|
165
165
|
return `${leading}${equ[1]} .equ${equ[3] ?? ''}`;
|
|
166
166
|
}
|
|
167
167
|
return `${leading}${normalizeHead(trimmed, policy)}`;
|
|
168
168
|
}
|
|
169
169
|
function normalizeHead(text, policy) {
|
|
170
|
-
const head = /^([A-Za-z]
|
|
170
|
+
const head = /^([A-Za-z][A-Za-z0-9_]*)\b(.*)$/.exec(text);
|
|
171
171
|
if (!head) {
|
|
172
172
|
return text;
|
|
173
173
|
}
|
|
@@ -181,7 +181,7 @@ function normalizeAliasKey(key) {
|
|
|
181
181
|
const trimmed = key.trim();
|
|
182
182
|
if (!/^[.]?[A-Za-z][A-Za-z0-9_]*$/.test(trimmed))
|
|
183
183
|
return undefined;
|
|
184
|
-
return trimmed.replace(/^\./, '')
|
|
184
|
+
return trimmed.replace(/^\./, '');
|
|
185
185
|
}
|
|
186
186
|
function normalizeAliasTarget(value) {
|
|
187
187
|
const trimmed = value.trim().toLowerCase();
|
|
@@ -189,11 +189,10 @@ function normalizeAliasTarget(value) {
|
|
|
189
189
|
return CANONICAL_DIRECTIVES.has(dotted) ? dotted : undefined;
|
|
190
190
|
}
|
|
191
191
|
function resolveDirectiveAlias(head, policy) {
|
|
192
|
-
const
|
|
193
|
-
if (
|
|
194
|
-
return undefined;
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return policy.directiveAliases.get(key);
|
|
192
|
+
const trimmed = head.trim();
|
|
193
|
+
if (trimmed.startsWith('.')) {
|
|
194
|
+
return CANONICAL_DIRECTIVES.has(trimmed) ? trimmed : undefined;
|
|
195
|
+
}
|
|
196
|
+
const key = head.trim();
|
|
197
|
+
return /^[A-Za-z][A-Za-z0-9_]*$/.test(key) ? policy.directiveAliases.get(key) : undefined;
|
|
199
198
|
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Diagnostic, DiagnosticId, DiagnosticSeverity } from '../model/diagnostic.js';
|
|
2
|
+
type ParseDiagLocation = {
|
|
3
|
+
line: number;
|
|
4
|
+
column: number;
|
|
5
|
+
};
|
|
6
|
+
/** Push a parse diagnostic with Next default code/severity (`AZMN_PARSE` / error). */
|
|
7
|
+
export declare function parseDiag(diagnostics: Diagnostic[], sourceName: string, message: string, where?: ParseDiagLocation): void;
|
|
8
|
+
/** Push a parse diagnostic at an explicit 1-based line/column. */
|
|
9
|
+
export declare function parseDiagAt(diagnostics: Diagnostic[], sourceName: string, message: string, line: number, column: number): void;
|
|
10
|
+
/** Push a diagnostic with explicit code, severity, and optional location. */
|
|
11
|
+
export declare function parseDiagAtWithId(diagnostics: Diagnostic[], sourceName: string, code: DiagnosticId | string, severity: DiagnosticSeverity, message: string, where?: ParseDiagLocation): void;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Push a parse diagnostic with Next default code/severity (`AZMN_PARSE` / error). */
|
|
2
|
+
export function parseDiag(diagnostics, sourceName, message, where) {
|
|
3
|
+
parseDiagAtWithId(diagnostics, sourceName, 'AZMN_PARSE', 'error', message, where);
|
|
4
|
+
}
|
|
5
|
+
/** Push a parse diagnostic at an explicit 1-based line/column. */
|
|
6
|
+
export function parseDiagAt(diagnostics, sourceName, message, line, column) {
|
|
7
|
+
parseDiag(diagnostics, sourceName, message, { line, column });
|
|
8
|
+
}
|
|
9
|
+
/** Push a diagnostic with explicit code, severity, and optional location. */
|
|
10
|
+
export function parseDiagAtWithId(diagnostics, sourceName, code, severity, message, where) {
|
|
11
|
+
diagnostics.push({
|
|
12
|
+
code,
|
|
13
|
+
severity,
|
|
14
|
+
message,
|
|
15
|
+
sourceName,
|
|
16
|
+
...(where ? { line: where.line, column: where.column } : {}),
|
|
17
|
+
});
|
|
18
|
+
}
|