psyq-asm 0.0.1

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 (117) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/LICENSE +56 -0
  3. package/README.md +220 -0
  4. package/bin/psyq-asm.mjs +149 -0
  5. package/dist/asm/assemble.d.ts +10 -0
  6. package/dist/asm/assemble.d.ts.map +1 -0
  7. package/dist/asm/assemble.js +42 -0
  8. package/dist/asm/assemble.js.map +1 -0
  9. package/dist/asm/diagnostics.d.ts +22 -0
  10. package/dist/asm/diagnostics.d.ts.map +1 -0
  11. package/dist/asm/diagnostics.js +40 -0
  12. package/dist/asm/diagnostics.js.map +1 -0
  13. package/dist/asm/directives.d.ts +67 -0
  14. package/dist/asm/directives.d.ts.map +1 -0
  15. package/dist/asm/directives.js +254 -0
  16. package/dist/asm/directives.js.map +1 -0
  17. package/dist/asm/expand.d.ts +21 -0
  18. package/dist/asm/expand.d.ts.map +1 -0
  19. package/dist/asm/expand.js +540 -0
  20. package/dist/asm/expand.js.map +1 -0
  21. package/dist/asm/hazards.d.ts +10 -0
  22. package/dist/asm/hazards.d.ts.map +1 -0
  23. package/dist/asm/hazards.js +196 -0
  24. package/dist/asm/hazards.js.map +1 -0
  25. package/dist/asm/layout.d.ts +17 -0
  26. package/dist/asm/layout.d.ts.map +1 -0
  27. package/dist/asm/layout.js +257 -0
  28. package/dist/asm/layout.js.map +1 -0
  29. package/dist/asm/lexer.d.ts +23 -0
  30. package/dist/asm/lexer.d.ts.map +1 -0
  31. package/dist/asm/lexer.js +81 -0
  32. package/dist/asm/lexer.js.map +1 -0
  33. package/dist/asm/object.d.ts +6 -0
  34. package/dist/asm/object.d.ts.map +1 -0
  35. package/dist/asm/object.js +46 -0
  36. package/dist/asm/object.js.map +1 -0
  37. package/dist/asm/operands.d.ts +49 -0
  38. package/dist/asm/operands.d.ts.map +1 -0
  39. package/dist/asm/operands.js +114 -0
  40. package/dist/asm/operands.js.map +1 -0
  41. package/dist/asm/parser.d.ts +28 -0
  42. package/dist/asm/parser.d.ts.map +1 -0
  43. package/dist/asm/parser.js +60 -0
  44. package/dist/asm/parser.js.map +1 -0
  45. package/dist/asm/relocations.d.ts +42 -0
  46. package/dist/asm/relocations.d.ts.map +1 -0
  47. package/dist/asm/relocations.js +214 -0
  48. package/dist/asm/relocations.js.map +1 -0
  49. package/dist/asm/sections.d.ts +23 -0
  50. package/dist/asm/sections.d.ts.map +1 -0
  51. package/dist/asm/sections.js +81 -0
  52. package/dist/asm/sections.js.map +1 -0
  53. package/dist/asm/stream.d.ts +77 -0
  54. package/dist/asm/stream.d.ts.map +1 -0
  55. package/dist/asm/stream.js +2 -0
  56. package/dist/asm/stream.js.map +1 -0
  57. package/dist/asm/symbols.d.ts +42 -0
  58. package/dist/asm/symbols.d.ts.map +1 -0
  59. package/dist/asm/symbols.js +122 -0
  60. package/dist/asm/symbols.js.map +1 -0
  61. package/dist/errors.d.ts +27 -0
  62. package/dist/errors.d.ts.map +1 -0
  63. package/dist/errors.js +34 -0
  64. package/dist/errors.js.map +1 -0
  65. package/dist/index.d.ts +14 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +10 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/isa/decode.d.ts +8 -0
  70. package/dist/isa/decode.d.ts.map +1 -0
  71. package/dist/isa/decode.js +92 -0
  72. package/dist/isa/decode.js.map +1 -0
  73. package/dist/isa/encode.d.ts +9 -0
  74. package/dist/isa/encode.d.ts.map +1 -0
  75. package/dist/isa/encode.js +124 -0
  76. package/dist/isa/encode.js.map +1 -0
  77. package/dist/isa/fields.d.ts +27 -0
  78. package/dist/isa/fields.d.ts.map +1 -0
  79. package/dist/isa/fields.js +49 -0
  80. package/dist/isa/fields.js.map +1 -0
  81. package/dist/isa/format.d.ts +14 -0
  82. package/dist/isa/format.d.ts.map +1 -0
  83. package/dist/isa/format.js +98 -0
  84. package/dist/isa/format.js.map +1 -0
  85. package/dist/isa/instruction.d.ts +15 -0
  86. package/dist/isa/instruction.d.ts.map +1 -0
  87. package/dist/isa/instruction.js +47 -0
  88. package/dist/isa/instruction.js.map +1 -0
  89. package/dist/isa/registers.d.ts +8 -0
  90. package/dist/isa/registers.d.ts.map +1 -0
  91. package/dist/isa/registers.js +55 -0
  92. package/dist/isa/registers.js.map +1 -0
  93. package/dist/isa/table.d.ts +179 -0
  94. package/dist/isa/table.d.ts.map +1 -0
  95. package/dist/isa/table.js +128 -0
  96. package/dist/isa/table.js.map +1 -0
  97. package/dist/options.d.ts +29 -0
  98. package/dist/options.d.ts.map +1 -0
  99. package/dist/options.js +0 -0
  100. package/dist/options.js.map +1 -0
  101. package/dist/program/decode-words.d.ts +9 -0
  102. package/dist/program/decode-words.d.ts.map +1 -0
  103. package/dist/program/decode-words.js +87 -0
  104. package/dist/program/decode-words.js.map +1 -0
  105. package/dist/program/format-program.d.ts +12 -0
  106. package/dist/program/format-program.d.ts.map +1 -0
  107. package/dist/program/format-program.js +37 -0
  108. package/dist/program/format-program.js.map +1 -0
  109. package/dist/public-types.d.ts +253 -0
  110. package/dist/public-types.d.ts.map +1 -0
  111. package/dist/public-types.js +2 -0
  112. package/dist/public-types.js.map +1 -0
  113. package/dist/util.d.ts +3 -0
  114. package/dist/util.d.ts.map +1 -0
  115. package/dist/util.js +11 -0
  116. package/dist/util.js.map +1 -0
  117. package/package.json +82 -0
@@ -0,0 +1,46 @@
1
+ import { isLocalLabel } from './symbols.js';
2
+ function symbolEntries(table, laidOut) {
3
+ const entries = [];
4
+ for (const name of table.order) {
5
+ if (isLocalLabel(name))
6
+ continue;
7
+ const location = laidOut.labels.get(name);
8
+ const common = table.commons.get(name);
9
+ if (location === undefined) {
10
+ const size = table.externs.get(name);
11
+ entries.push({ name, binding: 'extern', ...(size === undefined ? {} : { size }) });
12
+ }
13
+ else if (common !== undefined && !table.labels.has(name)) {
14
+ entries.push({
15
+ name,
16
+ binding: common.local ? 'local' : 'common',
17
+ section: location.section,
18
+ offset: location.offset,
19
+ size: common.size,
20
+ });
21
+ }
22
+ else {
23
+ entries.push({
24
+ name,
25
+ binding: table.globals.has(name) ? 'global' : 'local',
26
+ section: location.section,
27
+ offset: location.offset,
28
+ });
29
+ }
30
+ }
31
+ return entries;
32
+ }
33
+ export function buildObject(options, laidOut, table, smallData) {
34
+ return {
35
+ info: {
36
+ aspsxVersion: options.aspsxVersion,
37
+ gpSize: options.gpSize,
38
+ partialDivExpansion: options.partialDivExpansion,
39
+ },
40
+ sections: laidOut.sections,
41
+ symbols: symbolEntries(table, laidOut),
42
+ functions: laidOut.functions,
43
+ smallData: [...smallData.values()],
44
+ };
45
+ }
46
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../src/asm/object.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAoB,MAAM,cAAc,CAAC;AAE9D,SAAS,aAAa,CAAC,KAAkB,EAAE,OAAe;IACxD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,YAAY,CAAC,IAAI,CAAC;YAAE,SAAS;QACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;aAAM,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;gBAC1C,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;gBACrD,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAkC,EAClC,OAAe,EACf,KAAkB,EAClB,SAA8C;IAE9C,OAAO;QACL,IAAI,EAAE;YACJ,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;SACjD;QACD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ export type RelocFunction = 'hi' | 'lo' | 'gp_rel';
2
+ export interface NumberExpr {
3
+ readonly kind: 'number';
4
+ readonly value: number;
5
+ }
6
+ export interface SymbolExpr {
7
+ readonly kind: 'symbol';
8
+ readonly name: string;
9
+ readonly addend: number;
10
+ }
11
+ export type Expr = NumberExpr | SymbolExpr | {
12
+ readonly kind: 'reloc';
13
+ readonly fn: RelocFunction;
14
+ readonly inner: NumberExpr | SymbolExpr;
15
+ }
16
+ /** `.` plus a byte offset: a position relative to the current instruction. */
17
+ | {
18
+ readonly kind: 'dot';
19
+ readonly offset: number;
20
+ };
21
+ export type SourceOperand = {
22
+ readonly kind: 'reg';
23
+ readonly number: number;
24
+ } | {
25
+ readonly kind: 'mem';
26
+ readonly base: number;
27
+ readonly offset: Expr;
28
+ } | {
29
+ readonly kind: 'expr';
30
+ readonly expr: Expr;
31
+ } | {
32
+ readonly kind: 'float';
33
+ readonly value: number;
34
+ };
35
+ export type ParseFailureCode = 'invalid-operand' | 'immediate-out-of-range';
36
+ export type Parsed<T> = {
37
+ readonly ok: true;
38
+ readonly value: T;
39
+ } | {
40
+ readonly ok: false;
41
+ readonly code: ParseFailureCode;
42
+ readonly message: string;
43
+ };
44
+ /** Parse an integer that must fit in 32 bits; the result is a signed 32-bit value. */
45
+ export declare function parseInteger(text: string): Parsed<number>;
46
+ /** Parse an expression: a number, `symbol[+-n]`, `%hi/%lo/%gp_rel(...)`, or `.[+-n]`. */
47
+ export declare function parseExpr(text: string): Parsed<Expr>;
48
+ export declare function parseOperand(text: string): Parsed<SourceOperand>;
49
+ //# sourceMappingURL=operands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operands.d.ts","sourceRoot":"","sources":["../../src/asm/operands.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,IAAI,GACZ,UAAU,GACV,UAAU,GACV;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAAA;CAAE;AACjG,8EAA8E;GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GACtE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG,wBAAwB,CAAC;AAE5E,MAAM,MAAM,MAAM,CAAC,CAAC,IAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAiBtF,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAUzD;AAiBD,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAiBpD;AAYD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAmBhE"}
@@ -0,0 +1,114 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * The operand grammar:
4
+ *
5
+ * operand := register | memory | float | expr
6
+ * register := '$' (digits | abi-name)
7
+ * memory := [expr] '(' register ')'
8
+ * expr := '%hi(' simple ')' | '%lo(' simple ')' | '%gp_rel(' simple ')'
9
+ * | '.' [('+'|'-') integer] | simple
10
+ * simple := integer | symbol [('+'|'-') integer]
11
+ * integer := ['-'|'+'] ('0x' hex+ | digits) 32-bit, two's complement
12
+ */
13
+ import { parseRegister } from '../isa/registers.js';
14
+ const INTEGER = /^([-+]?)\s*(0x[0-9a-f]+|\d+)$/i;
15
+ const SYMBOL_EXPR = /^([A-Za-z_.$][A-Za-z0-9_.$]*)\s*(?:([-+])\s*(0x[0-9a-f]+|\d+))?$/i;
16
+ const FLOAT = /^[-+]?(?:(?:\d+\.\d*|\.\d+)(?:e[-+]?\d+)?|\d+e[-+]?\d+)$/i;
17
+ const RELOC = /^%(hi|lo|gp_rel)\s*\((.*)\)$/;
18
+ const DOT = /^\.\s*(?:([-+])\s*(0x[0-9a-f]+|\d+))?$/i;
19
+ const REGISTER_LIKE = /^\$[a-z0-9]+$/;
20
+ function ok(value) {
21
+ return { ok: true, value };
22
+ }
23
+ function fail(message, code = 'invalid-operand') {
24
+ return { ok: false, code, message };
25
+ }
26
+ /** Parse an integer that must fit in 32 bits; the result is a signed 32-bit value. */
27
+ export function parseInteger(text) {
28
+ const match = INTEGER.exec(text.trim());
29
+ if (match === null)
30
+ return fail(`${JSON.stringify(text.trim())} is not an integer.`);
31
+ const digits = String(match[2]);
32
+ const magnitude = Number.parseInt(digits, /^0x/i.test(digits) ? 16 : 10);
33
+ const value = match[1] === '-' ? -magnitude : magnitude;
34
+ if (value < -0x80000000 || value > 0xffffffff) {
35
+ return fail(`${text.trim()} does not fit in 32 bits.`, 'immediate-out-of-range');
36
+ }
37
+ return ok(value | 0);
38
+ }
39
+ function parseSimple(text) {
40
+ if (INTEGER.test(text)) {
41
+ const n = parseInteger(text);
42
+ return n.ok ? ok({ kind: 'number', value: n.value }) : n;
43
+ }
44
+ const match = SYMBOL_EXPR.exec(text);
45
+ if (match === null)
46
+ return fail(`cannot parse ${JSON.stringify(text)}.`);
47
+ const name = String(match[1]);
48
+ if (parseRegister(name) !== undefined)
49
+ return fail(`register ${name} cannot be used here.`);
50
+ if (match[2] === undefined)
51
+ return ok({ kind: 'symbol', name, addend: 0 });
52
+ const addend = parseInteger(String(match[3]));
53
+ if (!addend.ok)
54
+ return addend;
55
+ return ok({ kind: 'symbol', name, addend: match[2] === '-' ? -addend.value | 0 : addend.value });
56
+ }
57
+ /** Parse an expression: a number, `symbol[+-n]`, `%hi/%lo/%gp_rel(...)`, or `.[+-n]`. */
58
+ export function parseExpr(text) {
59
+ const t = text.trim();
60
+ const reloc = RELOC.exec(t);
61
+ if (reloc !== null) {
62
+ const inner = parseSimple(String(reloc[2]).trim());
63
+ return inner.ok
64
+ ? ok({ kind: 'reloc', fn: reloc[1], inner: inner.value })
65
+ : inner;
66
+ }
67
+ const dot = DOT.exec(t);
68
+ if (dot !== null) {
69
+ if (dot[1] === undefined)
70
+ return ok({ kind: 'dot', offset: 0 });
71
+ const n = parseInteger(String(dot[2]));
72
+ if (!n.ok)
73
+ return n;
74
+ return ok({ kind: 'dot', offset: dot[1] === '-' ? -n.value : n.value });
75
+ }
76
+ return parseSimple(t);
77
+ }
78
+ /** Index of the `(` matching the final `)`, or -1. */
79
+ function matchingOpen(text) {
80
+ let depth = 0;
81
+ for (let i = text.length - 1; i >= 0; i--) {
82
+ if (text[i] === ')')
83
+ depth++;
84
+ else if (text[i] === '(' && --depth === 0)
85
+ return i;
86
+ }
87
+ return -1;
88
+ }
89
+ export function parseOperand(text) {
90
+ const t = text.trim();
91
+ if (t === '')
92
+ return fail('missing operand.');
93
+ const register = parseRegister(t);
94
+ if (register !== undefined)
95
+ return ok({ kind: 'reg', number: register });
96
+ if (REGISTER_LIKE.test(t))
97
+ return fail(`unknown register ${t}.`);
98
+ if (t.endsWith(')')) {
99
+ const open = matchingOpen(t);
100
+ const base = open < 0 ? undefined : parseRegister(t.slice(open + 1, -1).trim());
101
+ if (base !== undefined) {
102
+ const offsetText = t.slice(0, open).trim();
103
+ if (offsetText === '')
104
+ return ok({ kind: 'mem', base, offset: { kind: 'number', value: 0 } });
105
+ const offset = parseExpr(offsetText);
106
+ return offset.ok ? ok({ kind: 'mem', base, offset: offset.value }) : offset;
107
+ }
108
+ }
109
+ if (FLOAT.test(t))
110
+ return ok({ kind: 'float', value: Number(t) });
111
+ const expr = parseExpr(t);
112
+ return expr.ok ? ok({ kind: 'expr', expr: expr.value }) : expr;
113
+ }
114
+ //# sourceMappingURL=operands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operands.js","sourceRoot":"","sources":["../../src/asm/operands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { Diagnostics } from './diagnostics.js';
2
+ import { type Directive } from './directives.js';
3
+ import { type SourceOperand } from './operands.js';
4
+ export type Statement = {
5
+ readonly kind: 'label';
6
+ readonly name: string;
7
+ readonly line: number;
8
+ readonly column: number;
9
+ } | {
10
+ readonly kind: 'directive';
11
+ readonly name: string;
12
+ readonly directive: Directive;
13
+ readonly line: number;
14
+ readonly column: number;
15
+ } | {
16
+ readonly kind: 'instruction';
17
+ readonly mnemonic: string;
18
+ readonly operands: readonly SourceOperand[];
19
+ readonly inlineAsm: boolean;
20
+ readonly line: number;
21
+ readonly column: number;
22
+ };
23
+ /**
24
+ * Parse assembly text into statements. Every line that cannot be parsed
25
+ * produces a diagnostic; nothing is dropped silently.
26
+ */
27
+ export declare function parse(source: string, diagnostics: Diagnostics): Statement[];
28
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/asm/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAErE,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,MAAM,SAAS,GACjB;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAKN;;;GAGG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,SAAS,EAAE,CAkD3E"}
@@ -0,0 +1,60 @@
1
+ import { interpretDirective } from './directives.js';
2
+ import { lex, splitTopLevel } from './lexer.js';
3
+ import { parseOperand } from './operands.js';
4
+ const LABEL = /^([A-Za-z_.$][A-Za-z0-9_.$]*)\s*:/;
5
+ const MNEMONIC = /^[a-z][a-z0-9_]*(?:\.[sd])?$/;
6
+ /**
7
+ * Parse assembly text into statements. Every line that cannot be parsed
8
+ * produces a diagnostic; nothing is dropped silently.
9
+ */
10
+ export function parse(source, diagnostics) {
11
+ const statements = [];
12
+ for (const piece of lex(source)) {
13
+ let text = piece.text;
14
+ let column = piece.column;
15
+ for (let label = LABEL.exec(text); label !== null; label = LABEL.exec(text)) {
16
+ statements.push({ kind: 'label', name: String(label[1]), line: piece.line, column });
17
+ const rest = text.slice(label[0].length);
18
+ column += label[0].length + rest.length - rest.trimStart().length;
19
+ text = rest.trim();
20
+ }
21
+ if (text === '')
22
+ continue;
23
+ const at = { line: piece.line, column };
24
+ const space = text.search(/\s/);
25
+ const head = space === -1 ? text : text.slice(0, space);
26
+ const rest = space === -1 ? '' : text.slice(space).trim();
27
+ if (head.startsWith('.')) {
28
+ const directive = interpretDirective(head, rest, at, diagnostics);
29
+ if (directive !== undefined)
30
+ statements.push({ kind: 'directive', name: head, directive, ...at });
31
+ continue;
32
+ }
33
+ if (!MNEMONIC.test(head)) {
34
+ diagnostics.error(at, 'unknown-mnemonic', `${JSON.stringify(head)} is not a mnemonic.`);
35
+ continue;
36
+ }
37
+ const operands = [];
38
+ let failed = false;
39
+ for (const part of rest === '' ? [] : splitTopLevel(rest, ',')) {
40
+ const parsed = parseOperand(part.text);
41
+ if (!parsed.ok) {
42
+ diagnostics.error(at, parsed.code, `${head}: ${parsed.message}`);
43
+ failed = true;
44
+ break;
45
+ }
46
+ operands.push(parsed.value);
47
+ }
48
+ if (!failed) {
49
+ statements.push({
50
+ kind: 'instruction',
51
+ mnemonic: head,
52
+ operands,
53
+ inlineAsm: piece.inlineAsm,
54
+ ...at,
55
+ });
56
+ }
57
+ }
58
+ return statements;
59
+ }
60
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/asm/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Operand resolution at layout time: labels become displacements, symbols
3
+ * become relocation records, and every value is range-checked before it
4
+ * reaches the encoder.
5
+ *
6
+ * A relocated field holds 0, whether the target is a symbol or a local label:
7
+ * ASPSX 2.81 leaves the target and its addend to the relocation. Consumers
8
+ * compare words under `fieldMask`.
9
+ */
10
+ import { type Slot } from '../isa/fields.js';
11
+ import type { DiagnosticCode, Operand, Relocation } from '../public-types.js';
12
+ import type { Expr } from './operands.js';
13
+ import type { Pending } from './stream.js';
14
+ export interface LabelLocation {
15
+ readonly section: string;
16
+ readonly offset: number;
17
+ }
18
+ export interface ResolveContext {
19
+ readonly labels: ReadonlyMap<string, LabelLocation>;
20
+ readonly section: string;
21
+ /** Byte offset of the word being resolved. */
22
+ readonly offset: number;
23
+ }
24
+ export type RelocationDraft = Omit<Relocation, 'offset'>;
25
+ export interface ResolveError {
26
+ readonly code: DiagnosticCode;
27
+ readonly message: string;
28
+ }
29
+ export interface Resolved<T> {
30
+ readonly value: T;
31
+ readonly relocation?: RelocationDraft;
32
+ }
33
+ type Resolution<T> = Resolved<T> | ResolveError;
34
+ export declare function isError<T>(resolution: Resolution<T>): resolution is ResolveError;
35
+ /** A 16-bit immediate or offset field. */
36
+ export declare function resolveField(expr: Expr, signed: boolean, ctx: ResolveContext): Resolution<number>;
37
+ /** Resolve one bound operand to its final value and any relocation. */
38
+ export declare function resolveArg(slot: Slot, pending: Pending, ctx: ResolveContext): Resolution<Operand>;
39
+ /** A `.word`, `.half`, or `.byte` value. */
40
+ export declare function resolveData(unit: 1 | 2 | 4, expr: Expr, ctx: ResolveContext): Resolution<number>;
41
+ export {};
42
+ //# sourceMappingURL=relocations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocations.d.ts","sourceRoot":"","sources":["../../src/asm/relocations.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AACH,OAAO,EAA4B,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAChG,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;CACvC;AAED,KAAK,UAAU,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC;AAMhD,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,YAAY,CAEhF;AA4BD,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAoCjG;AAoED,uEAAuE;AACvE,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,CA6DjG;AAED,4CAA4C;AAC5C,wBAAgB,WAAW,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CA0BhG"}
@@ -0,0 +1,214 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Operand resolution at layout time: labels become displacements, symbols
4
+ * become relocation records, and every value is range-checked before it
5
+ * reaches the encoder.
6
+ *
7
+ * A relocated field holds 0, whether the target is a symbol or a local label:
8
+ * ASPSX 2.81 leaves the target and its addend to the relocation. Consumers
9
+ * compare words under `fieldMask`.
10
+ */
11
+ import { hi16, lo16, signExtend16 } from '../isa/fields.js';
12
+ import { isLocalLabel } from './symbols.js';
13
+ function failure(code, message) {
14
+ return { code, message };
15
+ }
16
+ export function isError(resolution) {
17
+ return 'code' in resolution;
18
+ }
19
+ function withRelocation(value, relocation) {
20
+ return relocation === undefined ? { value } : { value, relocation };
21
+ }
22
+ /** A symbol's relocation target, and the value its field starts from. */
23
+ function targetOf(symbol, ctx) {
24
+ if (!isLocalLabel(symbol.name)) {
25
+ // The addend lives in the relocation and the field holds 0 (lwlw.yaml:
26
+ // `lw $2,Savemap+2944` is 0x8C420000).
27
+ return {
28
+ target: { kind: 'symbol', name: symbol.name, addend: symbol.addend },
29
+ base: 0,
30
+ };
31
+ }
32
+ const label = ctx.labels.get(symbol.name);
33
+ if (label === undefined)
34
+ return failure('undefined-label', `${symbol.name} is not defined.`);
35
+ const offset = label.offset + symbol.addend;
36
+ return {
37
+ target: { kind: 'section', section: label.section, offset, label: symbol.name },
38
+ base: offset,
39
+ };
40
+ }
41
+ /** A 16-bit immediate or offset field. */
42
+ export function resolveField(expr, signed, ctx) {
43
+ switch (expr.kind) {
44
+ case 'number': {
45
+ const [min, max] = signed ? [-0x8000, 0x7fff] : [0, 0xffff];
46
+ if (expr.value < min || expr.value > max) {
47
+ return failure('immediate-out-of-range', `${String(expr.value)} does not fit in ${signed ? 'a signed' : 'an unsigned'} 16-bit field.`);
48
+ }
49
+ return { value: expr.value };
50
+ }
51
+ case 'symbol':
52
+ return failure('unsupported-syntax', `${expr.name} needs %hi, %lo, or %gp_rel in a 16-bit field.`);
53
+ case 'dot':
54
+ return failure('unsupported-syntax', '"." is valid only as a branch target.');
55
+ case 'reloc': {
56
+ const { fn, inner } = expr;
57
+ const toValue = (field) => (signed ? signExtend16(field) : field);
58
+ if (inner.kind === 'number') {
59
+ if (fn === 'gp_rel')
60
+ return failure('unsupported-syntax', '%gp_rel needs a symbol.');
61
+ return { value: toValue(fn === 'hi' ? hi16(inner.value) : lo16(inner.value)) };
62
+ }
63
+ const resolved = targetOf(inner, ctx);
64
+ if ('code' in resolved)
65
+ return resolved;
66
+ const field = 0;
67
+ const kind = fn === 'hi' ? 'HI16' : fn === 'lo' ? 'LO16' : 'GPREL16';
68
+ return {
69
+ value: toValue(field),
70
+ relocation: { kind, fieldMask: 0xffff, target: resolved.target, fieldValue: field },
71
+ };
72
+ }
73
+ }
74
+ }
75
+ function resolveBranch(expr, ctx) {
76
+ let bytes;
77
+ if (expr.kind === 'dot') {
78
+ bytes = expr.offset;
79
+ }
80
+ else if (expr.kind === 'symbol') {
81
+ const label = ctx.labels.get(expr.name);
82
+ if (label === undefined)
83
+ return failure('undefined-label', `${expr.name} is not defined.`);
84
+ if (label.section !== ctx.section) {
85
+ return failure('unsupported-syntax', `${expr.name} is in ${label.section}, not ${ctx.section}.`);
86
+ }
87
+ bytes = label.offset + expr.addend - ctx.offset;
88
+ }
89
+ else {
90
+ return failure('unsupported-syntax', 'a branch target must be a label.');
91
+ }
92
+ if (bytes % 4 !== 0)
93
+ return failure('unsupported-syntax', 'a branch target must be word-aligned.');
94
+ const displacement = (bytes - 4) / 4;
95
+ if (displacement < -0x8000 || displacement > 0x7fff) {
96
+ return failure('branch-out-of-range', `the target is ${String(displacement)} instructions away.`);
97
+ }
98
+ return { value: { kind: 'branch', displacement } };
99
+ }
100
+ function resolveTarget(expr, ctx) {
101
+ if (expr.kind === 'number') {
102
+ if (expr.value % 4 !== 0)
103
+ return failure('unsupported-syntax', 'a jump target must be word-aligned.');
104
+ return { value: { kind: 'target', index: (expr.value >>> 2) & 0x03ffffff } };
105
+ }
106
+ if (expr.kind !== 'symbol')
107
+ return failure('unsupported-syntax', 'a jump target must be a symbol or an address.');
108
+ const resolved = targetOf(expr, ctx);
109
+ if ('code' in resolved)
110
+ return resolved;
111
+ return {
112
+ value: { kind: 'target', index: 0 },
113
+ relocation: {
114
+ kind: 'MIPS26',
115
+ fieldMask: 0x03ffffff,
116
+ target: resolved.target,
117
+ fieldValue: 0,
118
+ },
119
+ };
120
+ }
121
+ function plainNumber(expr, max, what, make) {
122
+ if (expr.kind !== 'number')
123
+ return failure('unsupported-syntax', `the ${what} must be a number.`);
124
+ if (expr.value < 0 || expr.value > max) {
125
+ return failure('immediate-out-of-range', `the ${what} ${String(expr.value)} is outside 0 to ${String(max)}.`);
126
+ }
127
+ return { value: make(expr.value) };
128
+ }
129
+ /** Resolve one bound operand to its final value and any relocation. */
130
+ export function resolveArg(slot, pending, ctx) {
131
+ switch (pending.kind) {
132
+ case 'gpr':
133
+ return { value: { kind: 'gpr', number: pending.number } };
134
+ case 'cop':
135
+ return {
136
+ value: { kind: 'cop', number: pending.number, unit: pending.unit, space: pending.space },
137
+ };
138
+ case 'mem': {
139
+ const offset = resolveField(pending.offset, true, ctx);
140
+ if (isError(offset))
141
+ return offset;
142
+ return withRelocation({ kind: 'mem', base: pending.base, offset: offset.value }, offset.relocation);
143
+ }
144
+ case 'branch':
145
+ return resolveBranch(pending.target, ctx);
146
+ case 'value':
147
+ switch (slot) {
148
+ case 'imm16s':
149
+ case 'imm16u': {
150
+ const signed = slot === 'imm16s';
151
+ const field = resolveField(pending.expr, signed, ctx);
152
+ if (isError(field))
153
+ return field;
154
+ return withRelocation({ kind: 'imm', value: field.value, bits: 16, signed }, field.relocation);
155
+ }
156
+ case 'target':
157
+ return resolveTarget(pending.expr, ctx);
158
+ case 'sa':
159
+ return plainNumber(pending.expr, 31, 'shift amount', (value) => ({
160
+ kind: 'shamt',
161
+ value,
162
+ }));
163
+ case 'code10':
164
+ case 'code10hi':
165
+ return plainNumber(pending.expr, 0x3ff, 'code', (value) => ({
166
+ kind: 'imm',
167
+ value,
168
+ bits: 10,
169
+ signed: false,
170
+ }));
171
+ case 'code20':
172
+ return plainNumber(pending.expr, 0xfffff, 'code', (value) => ({
173
+ kind: 'imm',
174
+ value,
175
+ bits: 20,
176
+ signed: false,
177
+ }));
178
+ default:
179
+ return plainNumber(pending.expr, 0x01ffffff, 'command', (value) => ({
180
+ kind: 'imm',
181
+ value,
182
+ bits: 25,
183
+ signed: false,
184
+ }));
185
+ }
186
+ }
187
+ }
188
+ /** A `.word`, `.half`, or `.byte` value. */
189
+ export function resolveData(unit, expr, ctx) {
190
+ if (expr.kind === 'number') {
191
+ const bits = unit * 8;
192
+ const min = unit === 4 ? -0x80000000 : -(2 ** (bits - 1));
193
+ const max = unit === 4 ? 0xffffffff : 2 ** bits - 1;
194
+ if (expr.value < min || expr.value > max) {
195
+ return failure('immediate-out-of-range', `${String(expr.value)} does not fit in ${String(bits)} bits.`);
196
+ }
197
+ return { value: expr.value };
198
+ }
199
+ if (expr.kind !== 'symbol')
200
+ return failure('unsupported-syntax', 'data values must be numbers, symbols, or labels.');
201
+ const resolved = targetOf(expr, ctx);
202
+ if ('code' in resolved)
203
+ return resolved;
204
+ return {
205
+ value: 0,
206
+ relocation: {
207
+ kind: 'WORD32',
208
+ fieldMask: 0xffffffff,
209
+ target: resolved.target,
210
+ fieldValue: 0,
211
+ },
212
+ };
213
+ }
214
+ //# sourceMappingURL=relocations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relocations.js","sourceRoot":"","sources":["../../src/asm/relocations.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;;;;;;;GAQG;AACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAC;AAIvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AA4B5C,SAAS,OAAO,CAAC,IAAoB,EAAE,OAAe;IACpD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,OAAO,CAAI,UAAyB;IAClD,OAAO,MAAM,IAAI,UAAU,CAAC;AAC9B,CAAC;AAED,SAAS,cAAc,CAAI,KAAQ,EAAE,UAAuC;IAC1E,OAAO,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACtE,CAAC;AAED,yEAAyE;AACzE,SAAS,QAAQ,CACf,MAAkB,EAClB,GAAmB;IAEnB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,uEAAuE;QACvE,uCAAuC;QACvC,OAAO;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;YACpE,IAAI,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,iBAAiB,EAAE,GAAG,MAAM,CAAC,IAAI,kBAAkB,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5C,OAAO;QACL,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE;QAC/E,IAAI,EAAE,MAAM;KACb,CAAC;AACJ,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,YAAY,CAAC,IAAU,EAAE,MAAe,EAAE,GAAmB;IAC3E,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;gBACzC,OAAO,OAAO,CACZ,wBAAwB,EACxB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,gBAAgB,CAC7F,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,OAAO,CACZ,oBAAoB,EACpB,GAAG,IAAI,CAAC,IAAI,gDAAgD,CAC7D,CAAC;QACJ,KAAK,KAAK;YACR,OAAO,OAAO,CAAC,oBAAoB,EAAE,uCAAuC,CAAC,CAAC;QAChF,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;YAC3B,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAClF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC5B,IAAI,EAAE,KAAK,QAAQ;oBAAE,OAAO,OAAO,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAC;gBACrF,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACjF,CAAC;YACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACtC,IAAI,MAAM,IAAI,QAAQ;gBAAE,OAAO,QAAQ,CAAC;YACxC,MAAM,KAAK,GAAG,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACrE,OAAO;gBACL,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;gBACrB,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE;aACpF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAU,EAAE,GAAmB;IACpD,IAAI,KAAa,CAAC;IAClB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC;QAC3F,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;YAClC,OAAO,OAAO,CACZ,oBAAoB,EACpB,GAAG,IAAI,CAAC,IAAI,UAAU,KAAK,CAAC,OAAO,SAAS,GAAG,CAAC,OAAO,GAAG,CAC3D,CAAC;QACJ,CAAC;QACD,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,OAAO,OAAO,CAAC,oBAAoB,EAAE,kCAAkC,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC;QACjB,OAAO,OAAO,CAAC,oBAAoB,EAAE,uCAAuC,CAAC,CAAC;IAChF,MAAM,YAAY,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,YAAY,GAAG,CAAC,MAAM,IAAI,YAAY,GAAG,MAAM,EAAE,CAAC;QACpD,OAAO,OAAO,CACZ,qBAAqB,EACrB,iBAAiB,MAAM,CAAC,YAAY,CAAC,qBAAqB,CAC3D,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,IAAU,EAAE,GAAmB;IACpD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;YACtB,OAAO,OAAO,CAAC,oBAAoB,EAAE,qCAAqC,CAAC,CAAC;QAC9E,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,UAAU,EAAE,EAAE,CAAC;IAC/E,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QACxB,OAAO,OAAO,CAAC,oBAAoB,EAAE,+CAA+C,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACxC,OAAO;QACL,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE;QACnC,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,CAAC;SACd;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,IAAU,EACV,GAAW,EACX,IAAY,EACZ,IAAgC;IAEhC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,oBAAoB,EAAE,OAAO,IAAI,oBAAoB,CAAC,CAAC;IAClG,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QACvC,OAAO,OAAO,CACZ,wBAAwB,EACxB,OAAO,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,GAAG,CAAC,GAAG,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,IAAU,EAAE,OAAgB,EAAE,GAAmB;IAC1E,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,KAAK;YACR,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5D,KAAK,KAAK;YACR,OAAO;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;aACzF,CAAC;QACJ,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACvD,IAAI,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;YACnC,OAAO,cAAc,CACnB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,EACzD,MAAM,CAAC,UAAU,CAClB,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5C,KAAK,OAAO;YACV,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ,CAAC;oBACjC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;oBACtD,IAAI,OAAO,CAAC,KAAK,CAAC;wBAAE,OAAO,KAAK,CAAC;oBACjC,OAAO,cAAc,CACnB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EACrD,KAAK,CAAC,UAAU,CACjB,CAAC;gBACJ,CAAC;gBACD,KAAK,QAAQ;oBACX,OAAO,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1C,KAAK,IAAI;oBACP,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBAC/D,IAAI,EAAE,OAAO;wBACb,KAAK;qBACN,CAAC,CAAC,CAAC;gBACN,KAAK,QAAQ,CAAC;gBACd,KAAK,UAAU;oBACb,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBAC1D,IAAI,EAAE,KAAK;wBACX,KAAK;wBACL,IAAI,EAAE,EAAE;wBACR,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC,CAAC;gBACN,KAAK,QAAQ;oBACX,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBAC5D,IAAI,EAAE,KAAK;wBACX,KAAK;wBACL,IAAI,EAAE,EAAE;wBACR,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC,CAAC;gBACN;oBACE,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;wBAClE,IAAI,EAAE,KAAK;wBACX,KAAK;wBACL,IAAI,EAAE,EAAE;wBACR,MAAM,EAAE,KAAK;qBACd,CAAC,CAAC,CAAC;YACR,CAAC;IACL,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,WAAW,CAAC,IAAe,EAAE,IAAU,EAAE,GAAmB;IAC1E,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;QACtB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;YACzC,OAAO,OAAO,CACZ,wBAAwB,EACxB,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAC9D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QACxB,OAAO,OAAO,CAAC,oBAAoB,EAAE,kDAAkD,CAAC,CAAC;IAC3F,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACxC,OAAO;QACL,KAAK,EAAE,CAAC;QACR,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,CAAC;SACd;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { Relocation, Section, WordOrigin } from '../public-types.js';
2
+ export type SectionKind = Section['kind'];
3
+ /** `.text` holds code; `.bss` and `.sbss` reserve space; everything else is data. */
4
+ export declare function sectionKind(name: string): SectionKind;
5
+ /** Accumulates one section's contents during layout. */
6
+ export declare class SectionBuilder {
7
+ readonly name: string;
8
+ readonly kind: SectionKind;
9
+ readonly relocations: Relocation[];
10
+ private readonly data;
11
+ private readonly origins;
12
+ private reserved;
13
+ constructor(name: string);
14
+ /** The current size, in bytes. */
15
+ get offset(): number;
16
+ pushWord(word: number, origin: WordOrigin): void;
17
+ pushBytes(bytes: Uint8Array, origin: WordOrigin): void;
18
+ /** Reserve zeroed space: nop words where code is word-aligned, zero bytes otherwise. */
19
+ pad(size: number, origin: WordOrigin): void;
20
+ private coverWithOrigin;
21
+ finish(): Section;
22
+ }
23
+ //# sourceMappingURL=sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../src/asm/sections.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE1E,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE1C,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAIrD;AAED,wDAAwD;AACxD,qBAAa,cAAc;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAM;IACxC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,OAAO,CAAC,QAAQ,CAAK;gBAET,IAAI,EAAE,MAAM;IAKxB,kCAAkC;IAClC,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAKhD,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAKtD,wFAAwF;IACxF,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAY3C,OAAO,CAAC,eAAe;IAKvB,MAAM,IAAI,OAAO;CAyBlB"}