@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.
Files changed (334) hide show
  1. package/README.md +110 -78
  2. package/dist/src/api-compile.d.ts +0 -2
  3. package/dist/src/api-compile.js +2 -9
  4. package/dist/src/assembly/address-planning.js +21 -1
  5. package/dist/src/assembly/program-emission.js +1 -0
  6. package/dist/src/cli/parse-args.d.ts +0 -1
  7. package/dist/src/cli/parse-args.js +0 -7
  8. package/dist/src/cli/write-artifacts.js +0 -11
  9. package/dist/src/core/compile.js +192 -9
  10. package/dist/src/expansion/op-expansion.js +2 -0
  11. package/dist/src/model/expression.d.ts +4 -0
  12. package/dist/src/model/source-item.d.ts +11 -0
  13. package/dist/src/outputs/index.js +0 -2
  14. package/dist/src/outputs/types.d.ts +3 -16
  15. package/dist/src/outputs/write-asm80.js +206 -5
  16. package/dist/src/register-care/analyze.js +36 -8
  17. package/dist/src/register-care/annotations.js +33 -146
  18. package/dist/src/register-care/fix.d.ts +2 -0
  19. package/dist/src/register-care/fix.js +52 -0
  20. package/dist/src/register-care/instruction-shape.d.ts +11 -0
  21. package/dist/src/register-care/instruction-shape.js +129 -0
  22. package/dist/src/register-care/liveness.js +15 -7
  23. package/dist/src/register-care/profiles.js +4 -0
  24. package/dist/src/register-care/programModel.js +79 -13
  25. package/dist/src/register-care/report.d.ts +2 -1
  26. package/dist/src/register-care/report.js +91 -34
  27. package/dist/src/register-care/routine-summaries.d.ts +6 -0
  28. package/dist/src/register-care/routine-summaries.js +89 -0
  29. package/dist/src/register-care/summaries.d.ts +3 -3
  30. package/dist/src/register-care/summaries.js +42 -75
  31. package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.js +33 -51
  32. package/dist/src/register-care/types.d.ts +6 -1
  33. package/dist/src/semantics/expression-evaluation.d.ts +7 -3
  34. package/dist/src/semantics/expression-evaluation.js +57 -0
  35. package/dist/src/source/strip-line-comment.d.ts +2 -0
  36. package/dist/src/source/strip-line-comment.js +26 -0
  37. package/dist/src/syntax/directive-aliases.js +9 -10
  38. package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
  39. package/dist/src/syntax/parse-diagnostics.js +18 -0
  40. package/dist/src/syntax/parse-expression.js +34 -9
  41. package/dist/src/syntax/parse-line.js +150 -54
  42. package/dist/src/tooling/case-style.js +3 -0
  43. package/docs/reference/cli.md +6 -4
  44. package/docs/reference/tooling-api.md +13 -9
  45. package/package.json +4 -6
  46. package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
  47. package/dist/legacy-root-azm/src/analysis.js +0 -41
  48. package/dist/legacy-root-azm/src/compile.d.ts +0 -10
  49. package/dist/legacy-root-azm/src/compile.js +0 -186
  50. package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
  51. package/dist/legacy-root-azm/src/compileShared.js +0 -7
  52. package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
  53. package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
  54. package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
  55. package/dist/legacy-root-azm/src/formats/index.js +0 -17
  56. package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
  57. package/dist/legacy-root-azm/src/formats/range.js +0 -45
  58. package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
  59. package/dist/legacy-root-azm/src/formats/types.js +0 -1
  60. package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
  61. package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
  62. package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
  63. package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
  64. package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
  65. package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
  66. package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
  67. package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
  68. package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
  69. package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
  70. package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
  71. package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
  72. package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
  73. package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
  74. package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
  75. package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
  76. package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
  77. package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
  78. package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
  79. package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
  80. package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
  81. package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
  82. package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
  83. package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
  84. package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
  85. package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
  86. package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
  87. package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
  88. package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
  89. package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
  90. package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
  91. package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
  92. package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
  93. package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
  94. package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
  95. package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
  96. package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
  97. package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
  98. package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
  99. package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
  100. package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
  101. package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
  102. package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
  103. package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
  104. package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
  105. package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
  106. package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
  107. package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
  108. package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
  109. package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
  110. package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
  111. package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
  112. package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
  113. package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
  114. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
  115. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
  116. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
  117. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
  118. package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
  119. package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
  120. package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
  121. package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
  122. package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
  123. package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
  124. package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
  125. package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
  126. package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
  127. package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
  128. package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
  129. package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
  130. package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
  131. package/dist/legacy-root-azm/src/frontend/source.js +0 -58
  132. package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
  133. package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
  134. package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
  135. package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
  136. package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
  137. package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
  138. package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
  139. package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
  140. package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
  141. package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
  142. package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
  143. package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
  144. package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
  145. package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
  146. package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
  147. package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
  148. package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
  149. package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
  150. package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
  151. package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
  152. package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
  153. package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
  154. package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
  155. package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
  156. package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
  157. package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
  158. package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
  159. package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
  160. package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
  161. package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
  162. package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
  163. package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
  164. package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
  165. package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
  166. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
  167. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
  168. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
  169. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
  170. package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
  171. package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
  172. package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
  173. package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
  174. package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
  175. package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
  176. package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
  177. package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
  178. package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
  179. package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
  180. package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
  181. package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
  182. package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
  183. package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
  184. package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
  185. package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
  186. package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
  187. package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
  188. package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
  189. package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
  190. package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
  191. package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
  192. package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
  193. package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
  194. package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
  195. package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
  196. package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
  197. package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
  198. package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
  199. package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
  200. package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
  201. package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
  202. package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
  203. package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
  204. package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
  205. package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
  206. package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
  207. package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
  208. package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
  209. package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
  210. package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
  211. package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
  212. package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
  213. package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
  214. package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
  215. package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
  216. package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
  217. package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
  218. package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
  219. package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
  220. package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
  221. package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
  222. package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
  223. package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
  224. package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
  225. package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
  226. package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
  227. package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
  228. package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
  229. package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
  230. package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
  231. package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
  232. package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
  233. package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
  234. package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
  235. package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
  236. package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
  237. package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
  238. package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
  239. package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
  240. package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
  241. package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
  242. package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
  243. package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
  244. package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
  245. package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
  246. package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
  247. package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
  248. package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
  249. package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
  250. package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
  251. package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
  252. package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
  253. package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
  254. package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
  255. package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
  256. package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
  257. package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
  258. package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
  259. package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
  260. package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
  261. package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
  262. package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
  263. package/dist/legacy-root-azm/src/packageInfo.js +0 -15
  264. package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
  265. package/dist/legacy-root-azm/src/pathCompare.js +0 -26
  266. package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
  267. package/dist/legacy-root-azm/src/pipeline.js +0 -1
  268. package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
  269. package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
  270. package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
  271. package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
  272. package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
  273. package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
  274. package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
  275. package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
  276. package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
  277. package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
  278. package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
  279. package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
  280. package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
  281. package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
  282. package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
  283. package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
  284. package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
  285. package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
  286. package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
  287. package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
  288. package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
  289. package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
  290. package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
  291. package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
  292. package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
  293. package/dist/legacy-root-azm/src/semantics/env.js +0 -432
  294. package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
  295. package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
  296. package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
  297. package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
  298. package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
  299. package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
  300. package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
  301. package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
  302. package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
  303. package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
  304. package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
  305. package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
  306. package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
  307. package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
  308. package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
  309. package/dist/legacy-root-azm/src/z80/effects.js +0 -516
  310. package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
  311. package/dist/legacy-root-azm/src/z80/encode.js +0 -412
  312. package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
  313. package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
  314. package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
  315. package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
  316. package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
  317. package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
  318. package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
  319. package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
  320. package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
  321. package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
  322. package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
  323. package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
  324. package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
  325. package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
  326. package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
  327. package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
  328. package/dist/src/outputs/write-listing.d.ts +0 -2
  329. package/dist/src/outputs/write-listing.js +0 -79
  330. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.d.ts +0 -0
  331. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.js +0 -0
  332. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.d.ts +0 -0
  333. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.js +0 -0
  334. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.d.ts +0 -0
@@ -1,432 +0,0 @@
1
- import { DiagnosticIds } from '../diagnosticTypes.js';
2
- import { containsCurrentLocation } from '../frontend/immExprUtils.js';
3
- import { offsetPathInTypeExpr, sizeOfTypeExpr } from './layout.js';
4
- import { visitDeclTree } from './declVisitor.js';
5
- import { diagSemanticsError } from './semanticsDiagnostics.js';
6
- function reportImmArithmeticError(diagnostics, expr, id, message) {
7
- diagnostics?.push({
8
- id,
9
- severity: 'error',
10
- message,
11
- file: expr.span.file,
12
- line: expr.span.start.line,
13
- column: expr.span.start.column,
14
- });
15
- }
16
- const diag = diagSemanticsError;
17
- export function evalImmExpr(expr, env, diagnostics, options) {
18
- const hasUnqualifiedEnumMember = (name) => {
19
- if (name.includes('.'))
20
- return false;
21
- const suffix = `.${name}`;
22
- for (const key of env.enums.keys()) {
23
- if (key.endsWith(suffix))
24
- return true;
25
- }
26
- return false;
27
- };
28
- switch (expr.kind) {
29
- case 'ImmLiteral':
30
- return expr.value;
31
- case 'ImmCurrentLocation':
32
- return options?.currentLocation;
33
- case 'ImmName': {
34
- const fromConst = env.equates.get(expr.name) ?? env.equates.get(expr.name.toLowerCase());
35
- if (fromConst !== undefined)
36
- return fromConst;
37
- const fromEnum = env.enums.get(expr.name);
38
- if (fromEnum !== undefined)
39
- return fromEnum;
40
- if (diagnostics && hasUnqualifiedEnumMember(expr.name)) {
41
- diagnostics.push({
42
- id: DiagnosticIds.SemanticsError,
43
- severity: 'error',
44
- message: `Enum member "${expr.name}" must be qualified.`,
45
- file: expr.span.file,
46
- line: expr.span.start.line,
47
- column: expr.span.start.column,
48
- });
49
- }
50
- return undefined;
51
- }
52
- case 'ImmSizeof': {
53
- return sizeOfTypeExpr(expr.typeExpr, env, diagnostics);
54
- }
55
- case 'ImmOffset': {
56
- return offsetPathInTypeExpr(expr.typeExpr, expr.path, env, (inner) => evalImmExpr(inner, env, diagnostics, options), diagnostics);
57
- }
58
- case 'ImmUnary': {
59
- const v = evalImmExpr(expr.expr, env, diagnostics, options);
60
- if (v === undefined)
61
- return undefined;
62
- switch (expr.op) {
63
- case '+':
64
- return +v;
65
- case '-':
66
- return -v;
67
- case '~':
68
- return ~v;
69
- }
70
- return undefined;
71
- }
72
- case 'ImmBinary': {
73
- const l = evalImmExpr(expr.left, env, diagnostics, options);
74
- const r = evalImmExpr(expr.right, env, diagnostics, options);
75
- if (l === undefined || r === undefined)
76
- return undefined;
77
- switch (expr.op) {
78
- case '*':
79
- return l * r;
80
- case '/':
81
- if (r === 0) {
82
- reportImmArithmeticError(diagnostics, expr, DiagnosticIds.ImmDivideByZero, 'Divide by zero in imm expression.');
83
- return undefined;
84
- }
85
- return (l / r) | 0;
86
- case '%':
87
- if (r === 0) {
88
- reportImmArithmeticError(diagnostics, expr, DiagnosticIds.ImmModuloByZero, 'Modulo by zero in imm expression.');
89
- return undefined;
90
- }
91
- return l % r;
92
- case '+':
93
- return l + r;
94
- case '-':
95
- return l - r;
96
- case '&':
97
- return l & r;
98
- case '^':
99
- return l ^ r;
100
- case '|':
101
- return l | r;
102
- case '<<':
103
- return l << r;
104
- case '>>':
105
- return l >> r;
106
- }
107
- return undefined;
108
- }
109
- }
110
- }
111
- function isAsmEquNode(item) {
112
- return (item.kind === 'AsmEqu' &&
113
- typeof item.name === 'string' &&
114
- item.value?.kind !== undefined);
115
- }
116
- function constValueExpr(item) {
117
- const expr = item.value;
118
- if (!expr)
119
- throw new Error('ASM equ directive is missing an expression.');
120
- return expr;
121
- }
122
- function isAsmDirectiveItem(item) {
123
- return (item.kind === 'AsmOrg' ||
124
- item.kind === 'AsmEqu' ||
125
- item.kind === 'AsmRawData' ||
126
- item.kind === 'AsmLabel' ||
127
- item.kind === 'AsmInstruction');
128
- }
129
- function isIndexedOperand(op) {
130
- if (!op)
131
- return false;
132
- const expr = op.kind === 'Mem' ? op.expr : op.kind === 'Ea' ? op.expr : undefined;
133
- return expr?.kind === 'EaIndex' && expr.index.kind === 'IndexMemIxIy';
134
- }
135
- function reg(op) {
136
- if (!op)
137
- return undefined;
138
- if (op.kind === 'Reg')
139
- return op.name.toUpperCase();
140
- if (op.kind === 'Imm' && op.expr.kind === 'ImmName')
141
- return op.expr.name.toUpperCase();
142
- return undefined;
143
- }
144
- function asmInstructionSize(item) {
145
- const head = item.head.toLowerCase();
146
- const ops = item.operands;
147
- const r0 = reg(ops[0]);
148
- const r1 = reg(ops[1]);
149
- const indexed = isIndexedOperand(ops[0]) || isIndexedOperand(ops[1]);
150
- const ixiyReg = (name) => name === 'IX' ||
151
- name === 'IY' ||
152
- name === 'IXH' ||
153
- name === 'IXL' ||
154
- name === 'IYH' ||
155
- name === 'IYL';
156
- if (['cpi', 'cpir', 'ldi', 'ldir', 'lddr', 'ini', 'outi', 'neg', 'reti', 'retn', 'rld'].includes(head)) {
157
- return 2;
158
- }
159
- if (['nop', 'ccf', 'cpl', 'daa', 'exx', 'rlca', 'rrca', 'rla', 'rra', 'scf'].includes(head)) {
160
- return 1;
161
- }
162
- if (head === 'jr' || head === 'djnz')
163
- return 2;
164
- if (head === 'call')
165
- return 3;
166
- if (head === 'jp')
167
- return ops[0]?.kind === 'Mem' && ixiyReg(regFromMem(ops[0]))
168
- ? 2
169
- : ops[0]?.kind === 'Mem'
170
- ? 1
171
- : 3;
172
- if (head === 'ret')
173
- return 1;
174
- if (head === 'rst')
175
- return 1;
176
- if (head === 'push' || head === 'pop')
177
- return ixiyReg(r0) ? 2 : 1;
178
- if (head === 'ex')
179
- return ixiyReg(r1) || indexed ? 2 : 1;
180
- if (head === 'in' || head === 'out')
181
- return 2;
182
- if (['bit', 'res', 'set', 'rl', 'rr', 'rlc', 'rrc', 'sla', 'srl'].includes(head))
183
- return indexed ? 4 : 2;
184
- if (head === 'inc' || head === 'dec')
185
- return indexed ? 3 : ixiyReg(r0) ? 2 : 1;
186
- if (['add', 'adc', 'sbc'].includes(head)) {
187
- if (r0 === 'HL' && r1)
188
- return 1;
189
- if ((r0 === 'IX' || r0 === 'IY') && r1)
190
- return 2;
191
- if (r0 === 'HL')
192
- return 2;
193
- if (indexed)
194
- return 3;
195
- return ops[1]?.kind === 'Imm' || (ops.length === 1 && ops[0]?.kind === 'Imm') ? 2 : 1;
196
- }
197
- if (['sub', 'and', 'or', 'xor', 'cp'].includes(head))
198
- return indexed ? 3 : ops[0]?.kind === 'Imm' ? 2 : 1;
199
- if (head === 'ld') {
200
- if (indexed)
201
- return ops[0]?.kind === 'Imm' || ops[1]?.kind === 'Imm' ? 4 : 3;
202
- if (ops[0]?.kind === 'Mem' || ops[1]?.kind === 'Mem') {
203
- const memOp = ops[0]?.kind === 'Mem' ? ops[0] : ops[1];
204
- const memReg = ops[0]?.kind === 'Mem' ? r1 : r0;
205
- const indirectReg = regFromMem(memOp);
206
- if (indirectReg) {
207
- if (memReg === 'A' && (indirectReg === 'BC' || indirectReg === 'DE'))
208
- return 1;
209
- if (indirectReg === 'HL')
210
- return 1;
211
- }
212
- return memReg && ['BC', 'DE', 'SP', 'IX', 'IY'].includes(memReg) ? 4 : 3;
213
- }
214
- if (ixiyReg(r0) || ixiyReg(r1))
215
- return ops[1]?.kind === 'Imm' ? 4 : 2;
216
- if (ops[1]?.kind === 'Imm')
217
- return r0 && ['BC', 'DE', 'HL', 'SP'].includes(r0) ? 3 : 2;
218
- return 1;
219
- }
220
- return 1;
221
- }
222
- function regFromMem(op) {
223
- if (!op || op.kind !== 'Mem')
224
- return undefined;
225
- if (op.expr.kind === 'EaName')
226
- return op.expr.name.toUpperCase();
227
- if (op.expr.kind === 'EaIndex' && op.expr.index.kind === 'IndexMemIxIy')
228
- return op.expr.index.base;
229
- return undefined;
230
- }
231
- function asmRawDataSize(item, env) {
232
- const values = item.values ?? [];
233
- if (item.directive === 'ds') {
234
- if (!item.size)
235
- return 0;
236
- if (item.size.kind === 'ImmName') {
237
- const constValue = env.equates.get(item.size.name) ?? env.equates.get(item.size.name.toLowerCase());
238
- const enumValue = env.enums.get(item.size.name);
239
- if (constValue === undefined && enumValue === undefined) {
240
- const typeSize = sizeOfTypeExpr({ kind: 'TypeName', span: item.size.span, name: item.size.name }, env, undefined);
241
- if (typeSize !== undefined)
242
- return typeSize;
243
- }
244
- }
245
- return evalImmExpr(item.size, env) ?? 0;
246
- }
247
- if (item.directive === 'dw')
248
- return values.length * 2;
249
- if (item.directive === 'cstr')
250
- return asmStringLength(values[0]) + 1;
251
- if (item.directive === 'pstr')
252
- return asmStringLength(values[0]) + 1;
253
- if (item.directive === 'istr')
254
- return asmStringLength(values[0]);
255
- return values.reduce((size, value) => size + asmStringLength(value, 1), 0);
256
- }
257
- function asmStringLength(value, fallback = 0) {
258
- if (typeof value === 'string')
259
- return value.length;
260
- if (value && typeof value === 'object' && 'kind' in value && value.kind === 'AsmString') {
261
- return 'value' in value && typeof value.value === 'string' ? value.value.length : fallback;
262
- }
263
- return fallback;
264
- }
265
- function seedAsmCurrentLocationEquates(program, env) {
266
- for (const mf of program.files) {
267
- if (!mf.items.some((item) => isAsmDirectiveItem(item)))
268
- continue;
269
- const scratchEnv = { ...env, equates: new Map(env.equates) };
270
- let current = 0;
271
- for (const item of mf.items) {
272
- const kind = item.kind;
273
- switch (kind) {
274
- case 'AsmOrg': {
275
- const expr = item.value;
276
- const value = expr ? evalImmExpr(expr, scratchEnv) : undefined;
277
- if (value !== undefined)
278
- current = value;
279
- break;
280
- }
281
- case 'AsmLabel': {
282
- const label = item;
283
- scratchEnv.equates.set(label.name, current);
284
- scratchEnv.equates.set(label.name.toLowerCase(), current);
285
- break;
286
- }
287
- case 'AsmEqu': {
288
- const equ = item;
289
- if (env.types.has(equ.name))
290
- break;
291
- const expr = equ.value;
292
- if (expr) {
293
- env.asmEquExprs?.set(equ.name, { expr, currentLocation: current });
294
- env.asmEquExprs?.set(equ.name.toLowerCase(), { expr, currentLocation: current });
295
- const value = containsCurrentLocation(expr)
296
- ? evalImmExpr(expr, scratchEnv, undefined, { currentLocation: current })
297
- : evalImmExpr(expr, scratchEnv);
298
- if (value !== undefined) {
299
- env.equates.set(equ.name, value);
300
- env.equates.set(equ.name.toLowerCase(), value);
301
- scratchEnv.equates.set(equ.name, value);
302
- scratchEnv.equates.set(equ.name.toLowerCase(), value);
303
- }
304
- }
305
- break;
306
- }
307
- case 'AsmRawData':
308
- {
309
- const raw = item;
310
- if (raw.name) {
311
- scratchEnv.equates.set(raw.name, current);
312
- scratchEnv.equates.set(raw.name.toLowerCase(), current);
313
- }
314
- current += asmRawDataSize(raw, scratchEnv);
315
- }
316
- break;
317
- case 'AsmInstruction':
318
- current += asmInstructionSize(item);
319
- break;
320
- }
321
- }
322
- }
323
- }
324
- export function buildEnv(program, diagnostics) {
325
- const equates = new Map();
326
- const asmEquExprs = new Map();
327
- const enums = new Map();
328
- const types = new Map();
329
- if (program.files.length === 0) {
330
- diag(diagnostics, program.entryFile, 'No source files to compile.');
331
- return {
332
- equates,
333
- enums,
334
- types,
335
- };
336
- }
337
- const collectedByFile = new Map();
338
- for (const mf of program.files) {
339
- const collected = {
340
- types: [],
341
- enums: [],
342
- equates: [],
343
- };
344
- visitDeclTree(mf.items, (item) => {
345
- if (item.kind === 'TypeDecl' || item.kind === 'UnionDecl') {
346
- collected.types.push(item);
347
- return;
348
- }
349
- if (item.kind === 'EnumDecl') {
350
- collected.enums.push(item);
351
- return;
352
- }
353
- if (isAsmEquNode(item)) {
354
- collected.equates.push(item);
355
- }
356
- });
357
- collectedByFile.set(mf.path, collected);
358
- }
359
- const globalLower = new Map();
360
- const claim = (kind, name, file) => {
361
- const k = name.toLowerCase();
362
- const prev = globalLower.get(k);
363
- if (prev) {
364
- diag(diagnostics, file, `Name "${name}" collides with ${prev.kind} "${prev.name}".`);
365
- return false;
366
- }
367
- globalLower.set(k, { kind, name, file });
368
- return true;
369
- };
370
- for (const mf of program.files) {
371
- const collected = collectedByFile.get(mf.path);
372
- if (!collected)
373
- continue;
374
- for (const item of collected.types) {
375
- const kind = item.kind === 'TypeDecl' ? 'type' : 'union';
376
- const name = item.name;
377
- if (!claim(kind, name, item.span.file))
378
- continue;
379
- types.set(name, item);
380
- }
381
- }
382
- for (const mf of program.files) {
383
- const collected = collectedByFile.get(mf.path);
384
- if (!collected)
385
- continue;
386
- for (const e of collected.enums) {
387
- claim('enum', e.name, e.span.file);
388
- for (let idx = 0; idx < e.members.length; idx++) {
389
- const name = e.members[idx];
390
- const qualifiedName = `${e.name}.${name}`;
391
- if (!claim('enum member', qualifiedName, e.span.file))
392
- continue;
393
- enums.set(qualifiedName, idx);
394
- }
395
- }
396
- }
397
- const env = {
398
- equates,
399
- enums,
400
- types,
401
- asmEquExprs,
402
- };
403
- seedAsmCurrentLocationEquates(program, env);
404
- for (const mf of program.files) {
405
- const collected = collectedByFile.get(mf.path);
406
- if (!collected)
407
- continue;
408
- for (const item of collected.equates) {
409
- if (types.has(item.name)) {
410
- diag(diagnostics, item.span.file, `Equate name "${item.name}" collides with a type name.`);
411
- continue;
412
- }
413
- if (!claim('equate', item.name, item.span.file))
414
- continue;
415
- if (equates.has(item.name.toLowerCase()))
416
- continue;
417
- const expr = constValueExpr(item);
418
- if (!asmEquExprs.has(item.name))
419
- asmEquExprs.set(item.name, { expr });
420
- if (!asmEquExprs.has(item.name.toLowerCase())) {
421
- asmEquExprs.set(item.name.toLowerCase(), { expr });
422
- }
423
- const v = evalImmExpr(expr, env, diagnostics);
424
- if (v === undefined) {
425
- continue;
426
- }
427
- equates.set(item.name, v);
428
- equates.set(item.name.toLowerCase(), v);
429
- }
430
- }
431
- return env;
432
- }
@@ -1,21 +0,0 @@
1
- import type { Diagnostic } from '../diagnosticTypes.js';
2
- import type { ImmExprNode, OffsetPathNode, TypeExprNode } from '../frontend/ast.js';
3
- import type { CompileEnv } from './env.js';
4
- interface TypeLayoutInfo {
5
- size: number;
6
- }
7
- export declare function layoutInfoForTypeExpr(typeExpr: TypeExprNode, env: CompileEnv, diagnostics?: Diagnostic[]): TypeLayoutInfo | undefined;
8
- /**
9
- * Compute the exact semantic size in bytes of a type expression.
10
- */
11
- export declare function sizeOfTypeExpr(typeExpr: TypeExprNode, env: CompileEnv, diagnostics?: Diagnostic[]): number | undefined;
12
- /**
13
- * Compute the byte offset of a field path inside a type expression.
14
- *
15
- * Rules:
16
- * - Record fields contribute exact sizes of preceding fields.
17
- * - Union field offsets are always 0.
18
- * - Array indices must be compile-time constants and contribute index * element exact size.
19
- */
20
- export declare function offsetPathInTypeExpr(typeExpr: TypeExprNode, path: OffsetPathNode, env: CompileEnv, evalImm: (expr: ImmExprNode) => number | undefined, diagnostics?: Diagnostic[]): number | undefined;
21
- export {};
@@ -1,226 +0,0 @@
1
- import { DiagnosticIds } from '../diagnosticTypes.js';
2
- function scalarSize(name) {
3
- switch (name) {
4
- case 'byte':
5
- return 1;
6
- case 'word':
7
- case 'addr':
8
- return 2;
9
- default:
10
- return undefined;
11
- }
12
- }
13
- function reportTypeError(diagnostics) {
14
- return (file, message) => {
15
- diagnostics?.push({ id: DiagnosticIds.TypeError, severity: 'error', message, file });
16
- };
17
- }
18
- function reportMissingArrayLength(te, diag) {
19
- diag(te.span.file, `Array length is required here; write T[N].`);
20
- }
21
- function resolveNamedType(te, env, visiting, diag, onResolve) {
22
- const s = scalarSize(te.name);
23
- if (s !== undefined)
24
- return onResolve({ kind: 'Scalar', name: te.name, size: s });
25
- if (visiting.has(te.name)) {
26
- diag(te.span.file, `Recursive type definition detected for "${te.name}".`);
27
- return undefined;
28
- }
29
- const decl = env.types.get(te.name);
30
- if (!decl) {
31
- diag(te.span.file, `Unknown type "${te.name}".`);
32
- return undefined;
33
- }
34
- visiting.add(te.name);
35
- try {
36
- return onResolve({ kind: 'Decl', decl });
37
- }
38
- finally {
39
- visiting.delete(te.name);
40
- }
41
- }
42
- function sumFieldSizes(fields, resolveTypeExpr) {
43
- let sum = 0;
44
- for (const f of fields) {
45
- const fs = resolveTypeExpr(f.typeExpr);
46
- if (!fs)
47
- return undefined;
48
- sum += fs.size;
49
- }
50
- return { size: sum };
51
- }
52
- function maxFieldSize(fields, resolveTypeExpr) {
53
- let maxLayout = 0;
54
- for (const f of fields) {
55
- const fs = resolveTypeExpr(f.typeExpr);
56
- if (!fs)
57
- return undefined;
58
- if (fs.size > maxLayout)
59
- maxLayout = fs.size;
60
- }
61
- return { size: maxLayout };
62
- }
63
- function typeLayoutInfoForDecl(decl, resolveTypeExpr) {
64
- if (decl.kind === 'UnionDecl') {
65
- return maxFieldSize(decl.fields, resolveTypeExpr);
66
- }
67
- const te = decl.typeExpr;
68
- if (te.kind === 'RecordType') {
69
- return sumFieldSizes(te.fields, resolveTypeExpr);
70
- }
71
- return resolveTypeExpr(te);
72
- }
73
- export function layoutInfoForTypeExpr(typeExpr, env, diagnostics) {
74
- const visiting = new Set();
75
- const memo = new Map();
76
- const diag = reportTypeError(diagnostics);
77
- const sizeOf = (te) => {
78
- switch (te.kind) {
79
- case 'TypeName': {
80
- const cached = memo.get(te.name);
81
- if (cached !== undefined)
82
- return cached;
83
- return resolveNamedType(te, env, visiting, diag, (resolved) => {
84
- if (resolved.kind === 'Scalar') {
85
- return { size: resolved.size };
86
- }
87
- const info = typeLayoutInfoForDecl(resolved.decl, sizeOf);
88
- if (info)
89
- memo.set(te.name, info);
90
- return info;
91
- });
92
- }
93
- case 'ArrayType': {
94
- const es = sizeOf(te.element);
95
- if (!es)
96
- return undefined;
97
- if (te.length === undefined) {
98
- reportMissingArrayLength(te, diag);
99
- return undefined;
100
- }
101
- return { size: es.size * te.length };
102
- }
103
- case 'RecordType':
104
- return sumFieldSizes(te.fields, sizeOf);
105
- }
106
- };
107
- return sizeOf(typeExpr);
108
- }
109
- /**
110
- * Compute the exact semantic size in bytes of a type expression.
111
- */
112
- export function sizeOfTypeExpr(typeExpr, env, diagnostics) {
113
- const info = layoutInfoForTypeExpr(typeExpr, env, diagnostics);
114
- return info?.size;
115
- }
116
- /**
117
- * Compute the byte offset of a field path inside a type expression.
118
- *
119
- * Rules:
120
- * - Record fields contribute exact sizes of preceding fields.
121
- * - Union field offsets are always 0.
122
- * - Array indices must be compile-time constants and contribute index * element exact size.
123
- */
124
- export function offsetPathInTypeExpr(typeExpr, path, env, evalImm, diagnostics) {
125
- const diag = reportTypeError(diagnostics);
126
- const resolveType = (te, visiting = new Set()) => {
127
- switch (te.kind) {
128
- case 'TypeName':
129
- return resolveNamedType(te, env, visiting, diag, (resolved) => {
130
- if (resolved.kind === 'Scalar')
131
- return { kind: 'Scalar', name: resolved.name };
132
- if (resolved.decl.kind === 'UnionDecl')
133
- return { kind: 'Union', fields: resolved.decl.fields };
134
- return resolveType(resolved.decl.typeExpr, visiting);
135
- });
136
- case 'ArrayType': {
137
- if (te.length === undefined) {
138
- reportMissingArrayLength(te, diag);
139
- return undefined;
140
- }
141
- return { kind: 'Array', element: te.element, length: te.length };
142
- }
143
- case 'RecordType':
144
- return { kind: 'Record', fields: te.fields };
145
- }
146
- };
147
- const findField = (fields, fieldName, file) => {
148
- let offsetBefore = 0;
149
- for (const f of fields) {
150
- if (f.name === fieldName)
151
- return { field: f, offsetBefore };
152
- const fs = sizeOfTypeExpr(f.typeExpr, env, diagnostics);
153
- if (fs === undefined)
154
- return undefined;
155
- offsetBefore += fs;
156
- }
157
- diag(file, `Unknown field "${fieldName}".`);
158
- return undefined;
159
- };
160
- const initial = resolveType(typeExpr);
161
- if (!initial)
162
- return undefined;
163
- let cur = initial;
164
- let total = 0;
165
- const file = path.span.file;
166
- const selectField = (name) => {
167
- if (cur.kind === 'Record') {
168
- const found = findField(cur.fields, name, file);
169
- if (!found)
170
- return false;
171
- total += found.offsetBefore;
172
- const next = resolveType(found.field.typeExpr);
173
- if (!next)
174
- return false;
175
- cur = next;
176
- return true;
177
- }
178
- if (cur.kind === 'Union') {
179
- const found = findField(cur.fields, name, file);
180
- if (!found)
181
- return false;
182
- const next = resolveType(found.field.typeExpr);
183
- if (!next)
184
- return false;
185
- cur = next;
186
- return true;
187
- }
188
- diag(file, `Cannot select field "${name}" from non-record/union type.`);
189
- return false;
190
- };
191
- if (path.base !== undefined && !selectField(path.base))
192
- return undefined;
193
- for (const step of path.steps) {
194
- if (step.kind === 'OffsetField') {
195
- if (!selectField(step.name))
196
- return undefined;
197
- continue;
198
- }
199
- if (cur.kind !== 'Array') {
200
- diag(file, `Cannot index into non-array type in offset path.`);
201
- return undefined;
202
- }
203
- const idx = evalImm(step.expr);
204
- if (idx === undefined) {
205
- diag(file, `Failed to evaluate offset index expression.`);
206
- return undefined;
207
- }
208
- if (!Number.isInteger(idx)) {
209
- diag(file, `offset index must evaluate to an integer.`);
210
- return undefined;
211
- }
212
- if (idx < 0 || idx >= cur.length) {
213
- diag(file, `offset index ${idx} out of bounds for length ${cur.length}.`);
214
- return undefined;
215
- }
216
- const elemSize = sizeOfTypeExpr(cur.element, env, diagnostics);
217
- if (elemSize === undefined)
218
- return undefined;
219
- total += idx * elemSize;
220
- const next = resolveType(cur.element);
221
- if (!next)
222
- return undefined;
223
- cur = next;
224
- }
225
- return total;
226
- }
@@ -1,22 +0,0 @@
1
- import type { Diagnostic } from '../diagnosticTypes.js';
2
- import type { EaExprNode, ImmExprNode, SourceSpan } from '../frontend/ast.js';
3
- import type { CompileEnv } from './env.js';
4
- type LayoutCastAbsFold = {
5
- baseLower: string;
6
- addend: number;
7
- };
8
- export declare function isConstantLayoutCastEa(ea: EaExprNode): boolean;
9
- /** Label or label +/- imm base for `<Type>base[path]`. */
10
- export declare function isLayoutCastLabelBase(ea: EaExprNode): boolean;
11
- /**
12
- * Fold `<Type>label[path]` to a label fixup addend when the cast uses a label base
13
- * and compile-time indexes only.
14
- */
15
- export declare function foldLayoutCastAbsEa(ea: EaExprNode, params: {
16
- env: CompileEnv;
17
- evalImm: (expr: ImmExprNode) => number | undefined;
18
- resolveAbsBase: (baseEa: EaExprNode) => LayoutCastAbsFold | undefined;
19
- diagnostics?: Diagnostic[];
20
- }): LayoutCastAbsFold | undefined;
21
- export declare function diagLayoutCastRuntimeIndex(diagnostics: Diagnostic[], span: SourceSpan, ea: EaExprNode): boolean;
22
- export {};