@specy/x86 2.2.1 → 2.3.0

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/dist/index.d.mts CHANGED
@@ -259,16 +259,27 @@ type X86EmulatorEventHandler<T extends X86EmulatorEventName> = (event: X86Emulat
259
259
  * line of source for NASM; the same work in its own module takes single-digit
260
260
  * milliseconds, and produces byte-identical output.
261
261
  *
262
- * The object file comes back as bytes for the caller to stage wherever the
263
- * linker expects it, so the linker can keep running inside blink unchanged.
262
+ * The object files come back as bytes for the caller to stage wherever the
263
+ * linker expects them, so the linker can keep running inside blink unchanged.
264
264
  */
265
265
  interface WasmAssembler {
266
266
  assemble(project: X86Project): Promise<WasmAssemblyResult>;
267
267
  }
268
+ /** One translation unit's object, and the Project File it was assembled from. */
269
+ type WasmAssemblyUnit = {
270
+ path: string;
271
+ object: Uint8Array;
272
+ };
268
273
  type WasmAssemblyResult = {
269
- /** The assembler's exit status: 0 when it wrote an object file. */status: number; /** What it wrote to stdout, verbatim. */
274
+ /** The assembler's exit status: 0 when every translation unit assembled. */status: number; /** What it wrote to stdout, verbatim. */
270
275
  stdout: string; /** What it wrote to stderr, verbatim - the diagnostics a parser reads. */
271
- stderr: string; /** The object file, or null when the assembly failed. */
276
+ stderr: string;
277
+ /**
278
+ * The objects to link, Entry first. Empty when any translation unit failed:
279
+ * a partial link would report missing symbols that are only missing because
280
+ * the File defining them is the one that did not assemble.
281
+ */
282
+ units: WasmAssemblyUnit[]; /** The Entry's object, or null when the assembly failed. */
272
283
  object: Uint8Array | null;
273
284
  };
274
285
  //#endregion
@@ -277,6 +288,14 @@ interface Binary {
277
288
  file: ResourceSource;
278
289
  commands: string;
279
290
  }
291
+ interface LinkerBinary {
292
+ file: ResourceSource;
293
+ /**
294
+ * The command that links however many objects the Project's translation units produced. Every
295
+ * path it is given is one this package generated, so none of them needs escaping.
296
+ */
297
+ link(objects: readonly string[]): string;
298
+ }
280
299
  interface DiagnosticLine {
281
300
  file?: string;
282
301
  line: number;
@@ -304,7 +323,7 @@ interface AssemblerMode {
304
323
  * portable C. Fasm is written in x86 assembly and has no such build.
305
324
  */
306
325
  assembler?: Binary;
307
- linker?: Binary;
326
+ linker?: LinkerBinary;
308
327
  };
309
328
  /** Runs outside blink, and takes precedence over `binaries.assembler`. */
310
329
  wasmAssembler?: WasmAssembler;
@@ -322,7 +341,7 @@ declare const assemblers: {
322
341
  };
323
342
  linker: {
324
343
  file: URL;
325
- commands: string;
344
+ link: (objects: readonly string[]) => string;
326
345
  };
327
346
  };
328
347
  };
@@ -346,7 +365,7 @@ declare const assemblers: {
346
365
  binaries: {
347
366
  linker: {
348
367
  file: URL;
349
- commands: string;
368
+ link: (objects: readonly string[]) => string;
350
369
  };
351
370
  };
352
371
  wasmAssembler: WasmAssembler;
@@ -357,6 +376,17 @@ declare const DEFAULT_ASSEMBLER_ID: AssemblerId;
357
376
  declare function nasmDiagnostics(str: string): DiagnosticLine[];
358
377
  declare function gnuDiagnostics(str: string): DiagnosticLine[];
359
378
  declare function fasmDiagnostics(str: string): DiagnosticLine[];
379
+ /**
380
+ * What `ld` said, as diagnostics. Nothing else in the toolchain reports a symbol that no
381
+ * translation unit defines: NASM accepts every `extern` on the author's word, and the mistake
382
+ * only surfaces here. Without this the link simply failed and the build looked like it had
383
+ * succeeded, leaving the program unrunnable and nothing on screen to say why.
384
+ *
385
+ * `ld` writes a location as `file:line:(section+offset):`, and writes the notes that introduce an
386
+ * error - "in function `_start':" - as lines ending in a colon, which are skipped in favour of
387
+ * the error itself.
388
+ */
389
+ declare function ldDiagnostics(str: string): DiagnosticLine[];
360
390
  /**
361
391
  * The one-based column a diagnostic belongs on. NASM reports a line and no
362
392
  * column, but it names the thing it is complaining about: `msg' in "symbol
@@ -522,7 +552,9 @@ declare class BlinkRuntime {
522
552
  private sourceMap;
523
553
  private sourceProject;
524
554
  private assembleOnly;
525
- private assembledObject;
555
+ private assembledObjects;
556
+ /** What the linker said, kept apart from the assembler's log so `ld`'s own parser reads it. */
557
+ private linkerLogs;
526
558
  private readonly defaultArgc;
527
559
  private readonly defaultArgv;
528
560
  private constructor();
@@ -542,13 +574,21 @@ declare class BlinkRuntime {
542
574
  private checkProjectWithWasmAssembler;
543
575
  private buildProject;
544
576
  /**
545
- * The object this build's assembler wrote, for the checks that read it
546
- * rather than the assembler's own words. Null when the assembly failed, and
577
+ * The objects this build's assembler wrote, for the checks that read them
578
+ * rather than the assembler's own words. Empty when the assembly failed, and
547
579
  * when the assembler writes an executable directly and never produces one.
548
- * Read once per build, so a previous build's object can never stand in for
549
- * one that was never written.
580
+ * Read once per build, so a previous build's objects can never stand in for
581
+ * ones that were never written.
582
+ */
583
+ private takeAssembledObjects;
584
+ /**
585
+ * What the link had to say. A link that failed leaves no program to run, so a build that
586
+ * reported nothing would hand the caller a success it cannot act on - the state stays `Ready`
587
+ * and the next step or run fails with a message about the emulator rather than the mistake.
588
+ * The fallback covers a linker that fails in a way its parser does not recognise, so a failed
589
+ * link is always visible as an error whatever `ld` chose to say about it.
550
590
  */
551
- private takeAssembledObject;
591
+ private linkDiagnostics;
552
592
  /**
553
593
  * Nothing in the toolchain treats a missing entry point as a failure: NASM
554
594
  * has no opinion on it and `ld` only warns, then starts the program at the
@@ -564,6 +604,12 @@ declare class BlinkRuntime {
564
604
  * the object itself.
565
605
  */
566
606
  private assembleWithWasmAssembler;
607
+ /**
608
+ * Starts the link, and starts a log of its own for it. The assembler's parser cannot read
609
+ * `ld`'s diagnostics and `ld`'s cannot read the assembler's, so what each of them said has to
610
+ * stay separable even though both reach the caller as one report.
611
+ */
612
+ private beginLinking;
567
613
  private collectAssemblerDiagnostics;
568
614
  private emitAssemblerOutput;
569
615
  private parseAssemblerDiagnostics;
@@ -626,6 +672,13 @@ declare function validateX86Project(project: X86Project): void;
626
672
  * preprocessor macros.
627
673
  */
628
674
  declare function stageX86Project(fs: EmscriptenFS, project: X86Project): void;
675
+ /**
676
+ * Points the assembler at one staged Project File and leaves that File's own directory as the
677
+ * working directory, so its `%include`s and `incbin`s resolve from where it was written rather
678
+ * than from wherever the Entry happens to live. The Entry keeps its `/assembly.s` identity, which
679
+ * is the path its existing diagnostics and source maps are written in terms of.
680
+ */
681
+ declare function selectX86Source(fs: EmscriptenFS, project: X86Project, path: string): string;
629
682
  /** Maps a path emitted by NASM or DWARF back to the exact Project path. */
630
683
  declare function x86ProjectSourcePath(sourcePath: string | undefined, project: Pick<X86Project, 'entry' | 'files'>): string;
631
684
  declare function x86ProjectText(project: X86Project, path: string): string;
@@ -710,5 +763,5 @@ declare class X86Emulator extends BaseEmulator<BlinkRuntime, X86RegisterName, X8
710
763
  }
711
764
  declare function createX86Emulator(options?: X86EmulatorOptions): Promise<X86Emulator>;
712
765
  //#endregion
713
- export { AssemblerId, AssemblerMode, BaseEmulator, Binary, BlinkRunOptions, BlinkRuntime, BlinkRuntimeCallbacks, BlinkRuntimeOptions, BlinkState, BlinkenlibModule, BlinkenlibModuleOptions, CompilationError, DEFAULT_ASSEMBLER_ID, DiagnosticLine, DiagnosticSeverity, DiagnosticsParser, DisassemblySnapshot, EmscriptenFS, EmulatorConfig, EmulatorDecoration, EmulatorStatus, ExecutionStep, Instruction, MaybePromise, MemoryReadResult, MemoryWriteResult, MonacoError, MutationOperation, NativeControlFlowKind, NativeInstruction, NativeMemoryWrite, NativeRunControls, NativeRunStop, NativeRunStopKind, NativeStepInfo, NativeSymbol, RegisterHex, RegisterSize, RegisterSnapshot, ResourceSource, StackFrame, StatusRegister, StopReason, StopReasonKind, X86Breakpoint, X86CompilationDiagnostic, X86CompileResult, X86Emulator, X86EmulatorEventHandler, X86EmulatorEventMap, X86EmulatorEventName, X86EmulatorOptions, X86Project, X86ProjectFile, X86RegisterName, X86SourceLocation, X86_PROJECT_ROOT, X86_REGISTER_NAMES, assemblers, createX86Emulator, defaultResourceUrl, fasmDiagnostics, gnuDiagnostics, isNodeRuntime, locateDiagnosticColumn, nasmDiagnostics, observeCallbackResult, readResourceBytes, stageX86Project, toResourceUrl, validateX86Project, x86ProjectSourcePath, x86ProjectText };
766
+ export { AssemblerId, AssemblerMode, BaseEmulator, Binary, BlinkRunOptions, BlinkRuntime, BlinkRuntimeCallbacks, BlinkRuntimeOptions, BlinkState, BlinkenlibModule, BlinkenlibModuleOptions, CompilationError, DEFAULT_ASSEMBLER_ID, DiagnosticLine, DiagnosticSeverity, DiagnosticsParser, DisassemblySnapshot, EmscriptenFS, EmulatorConfig, EmulatorDecoration, EmulatorStatus, ExecutionStep, Instruction, LinkerBinary, MaybePromise, MemoryReadResult, MemoryWriteResult, MonacoError, MutationOperation, NativeControlFlowKind, NativeInstruction, NativeMemoryWrite, NativeRunControls, NativeRunStop, NativeRunStopKind, NativeStepInfo, NativeSymbol, RegisterHex, RegisterSize, RegisterSnapshot, ResourceSource, StackFrame, StatusRegister, StopReason, StopReasonKind, X86Breakpoint, X86CompilationDiagnostic, X86CompileResult, X86Emulator, X86EmulatorEventHandler, X86EmulatorEventMap, X86EmulatorEventName, X86EmulatorOptions, X86Project, X86ProjectFile, X86RegisterName, X86SourceLocation, X86_PROJECT_ROOT, X86_REGISTER_NAMES, assemblers, createX86Emulator, defaultResourceUrl, fasmDiagnostics, gnuDiagnostics, isNodeRuntime, ldDiagnostics, locateDiagnosticColumn, nasmDiagnostics, observeCallbackResult, readResourceBytes, selectX86Source, stageX86Project, toResourceUrl, validateX86Project, x86ProjectSourcePath, x86ProjectText };
714
767
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/resources.ts","../src/interface.ts","../src/callbacks.ts","../src/types.ts","../src/wasm-assembler.ts","../src/assemblers.ts","../src/wasm-types.ts","../src/blink-runtime.ts","../src/project.ts","../src/x86-emulator.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/resources.ts","../src/interface.ts","../src/callbacks.ts","../src/types.ts","../src/wasm-assembler.ts","../src/assemblers.ts","../src/wasm-types.ts","../src/blink-runtime.ts","../src/project.ts","../src/x86-emulator.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -39,6 +39,16 @@ function stageX86Project(fs, project) {
39
39
  fs.chdir(projectDirectory(project.entry));
40
40
  stagedFiles.set(fs, current);
41
41
  }
42
+ /**
43
+ * Points the assembler at one staged Project File and leaves that File's own directory as the
44
+ * working directory, so its `%include`s and `incbin`s resolve from where it was written rather
45
+ * than from wherever the Entry happens to live. The Entry keeps its `/assembly.s` identity, which
46
+ * is the path its existing diagnostics and source maps are written in terms of.
47
+ */
48
+ function selectX86Source(fs, project, path) {
49
+ fs.chdir(projectDirectory(path));
50
+ return path === project.entry ? "/assembly.s" : `${X86_PROJECT_ROOT}/${path}`;
51
+ }
42
52
  /** Maps a path emitted by NASM or DWARF back to the exact Project path. */
43
53
  function x86ProjectSourcePath(sourcePath, project) {
44
54
  if (!sourcePath || sourcePath === "/assembly.s" || sourcePath === "assembly.s") return project.entry;
@@ -81,52 +91,155 @@ function x86ProjectText(project, path) {
81
91
  return typeof contents === "string" ? contents : "";
82
92
  }
83
93
  //#endregion
94
+ //#region src/translation-units.ts
95
+ /**
96
+ * Extensions that make a Project File assembler input in its own right. `.inc` is deliberately
97
+ * absent: it is what an include fragment is conventionally called, and a fragment assembled on
98
+ * its own would define its symbols a second time. A fragment under any other name is caught by
99
+ * the dependency scan instead.
100
+ */
101
+ const SOURCE_EXTENSIONS = [
102
+ ".asm",
103
+ ".s",
104
+ ".nasm"
105
+ ];
106
+ function isX86Source(path) {
107
+ const lower = path.toLowerCase();
108
+ return SOURCE_EXTENSIONS.some((extension) => lower.endsWith(extension));
109
+ }
110
+ /**
111
+ * Every File that could be its own translation unit: assembled separately and linked with the
112
+ * rest, which is what makes `global` in one File and `extern` in another resolve to each other.
113
+ * The Entry comes first so it leads the link, and the rest follow in a stable order so two builds
114
+ * of the same Project lay out identically.
115
+ */
116
+ function x86TranslationUnitCandidates(project) {
117
+ const others = Object.keys(project.files).filter((path) => path !== project.entry).filter((path) => typeof project.files[path] === "string" && isX86Source(path)).sort();
118
+ return [project.entry, ...others];
119
+ }
120
+ /**
121
+ * The Files named by one `nasm -M` run, as Project paths. A File that another source `%include`s
122
+ * is already part of that source: assembling it again would define every one of its symbols a
123
+ * second time, so the link would fail on duplicate definitions rather than on anything the author
124
+ * wrote. Asking NASM rather than scanning for `%include` ourselves is what keeps macro-generated
125
+ * and conditional includes right, since NASM is the only thing that knows which ones it took.
126
+ */
127
+ function parseDependencyList(output, project) {
128
+ const separator = output.indexOf(":");
129
+ if (separator < 0) return [];
130
+ return output.slice(separator + 1).replace(/\\\r?\n/g, " ").split(/\s+/).filter(Boolean).map((written) => x86ProjectSourcePath(written, project));
131
+ }
132
+ //#endregion
84
133
  //#region src/wasm-assembler.ts
85
- const SOURCE_PATH = "/assembly.s";
86
134
  const OBJECT_PATH = "/program.o";
87
135
  /**
88
136
  * `-g -F dwarf` is what makes the source map possible: the debugger reads
89
137
  * `.debug_line` out of the linked executable to map an address back to the line
90
- * it was written on. The paths match what `stageX86Project` writes, and the
91
- * working directory it selects is what lets NASM resolve `%include` itself.
138
+ * it was written on. The working directory `selectX86Source` selects is what
139
+ * lets NASM resolve `%include` itself.
92
140
  */
93
141
  const NASM_ARGS = [
94
142
  "-g",
95
143
  "-F",
96
144
  "dwarf",
97
- "-felf64",
98
- SOURCE_PATH,
99
- "-o",
100
- OBJECT_PATH
145
+ "-felf64"
101
146
  ];
102
- const nasmWasmAssembler = { async assemble(project) {
147
+ async function createNasmModule() {
103
148
  let stdout = "";
104
149
  let stderr = "";
105
- const module = await createNasm({
106
- noInitialRun: true,
107
- print: (line) => {
108
- stdout += `${line}\n`;
109
- },
110
- printErr: (line) => {
111
- stderr += `${line}\n`;
112
- }
113
- });
114
- stageX86Project(module.FS, project);
150
+ return {
151
+ module: await createNasm({
152
+ noInitialRun: true,
153
+ print: (line) => {
154
+ stdout += `${line}\n`;
155
+ },
156
+ printErr: (line) => {
157
+ stderr += `${line}\n`;
158
+ }
159
+ }),
160
+ stdout: () => stdout,
161
+ stderr: () => stderr
162
+ };
163
+ }
164
+ /**
165
+ * Emscripten's Node path sets `process.exitCode` from the status the module
166
+ * exits with, so an assembly that failed would leave the host process exiting
167
+ * non-zero for a reason of its own. NASM's status belongs to the caller of this
168
+ * function, never to the host.
169
+ */
170
+ function callNasm(module, args) {
115
171
  const host = globalThis.process;
116
172
  const hostExitCode = host?.exitCode;
117
- const status = module.callMain([...NASM_ARGS]);
173
+ const status = module.callMain(args);
118
174
  if (host) host.exitCode = hostExitCode;
119
- const object = status === 0 && module.FS.analyzePath(OBJECT_PATH).exists ? module.FS.readFile(OBJECT_PATH) : null;
175
+ return status;
176
+ }
177
+ /**
178
+ * Which Files the Project's candidate translation units `%include`, so that a fragment is
179
+ * assembled as part of whatever includes it and never a second time on its own. Every candidate
180
+ * is scanned before any of them is treated as a unit, because a fragment can be included by a
181
+ * File that sorts after it.
182
+ */
183
+ async function scanIncludedFiles(project, candidates) {
184
+ const included = /* @__PURE__ */ new Set();
185
+ if (candidates.length < 2) return included;
186
+ for (const path of candidates) {
187
+ const { module, stdout } = await createNasmModule();
188
+ stageX86Project(module.FS, project);
189
+ const source = selectX86Source(module.FS, project, path);
190
+ callNasm(module, [
191
+ "-M",
192
+ ...NASM_ARGS,
193
+ source,
194
+ "-o",
195
+ OBJECT_PATH
196
+ ]);
197
+ for (const dependency of parseDependencyList(stdout(), project)) if (dependency !== path) included.add(dependency);
198
+ }
199
+ return included;
200
+ }
201
+ const nasmWasmAssembler = { async assemble(project) {
202
+ const candidates = x86TranslationUnitCandidates(project);
203
+ const included = await scanIncludedFiles(project, candidates);
204
+ const units = candidates.filter((path) => path === project.entry || !included.has(path));
205
+ let stdout = "";
206
+ let stderr = "";
207
+ let status = 0;
208
+ const assembled = [];
209
+ for (const path of units) {
210
+ const { module, stdout: readStdout, stderr: readStderr } = await createNasmModule();
211
+ stageX86Project(module.FS, project);
212
+ const source = selectX86Source(module.FS, project, path);
213
+ const unitStatus = callNasm(module, [
214
+ ...NASM_ARGS,
215
+ source,
216
+ "-o",
217
+ OBJECT_PATH
218
+ ]);
219
+ stdout += readStdout();
220
+ stderr += readStderr();
221
+ if (!(unitStatus === 0 && module.FS.analyzePath(OBJECT_PATH).exists)) {
222
+ if (status === 0) status = unitStatus === 0 ? 1 : unitStatus;
223
+ continue;
224
+ }
225
+ assembled.push({
226
+ path,
227
+ object: module.FS.readFile(OBJECT_PATH)
228
+ });
229
+ }
230
+ const ok = status === 0 && assembled.length === units.length;
120
231
  return {
121
232
  status,
122
233
  stdout,
123
234
  stderr,
124
- object
235
+ units: ok ? assembled : [],
236
+ object: ok ? assembled[0]?.object ?? null : null
125
237
  };
126
238
  } };
127
239
  //#endregion
128
240
  //#region src/assemblers.ts
129
241
  const assemblerAsset = (filename) => new URL(`./assets/assemblers/${filename}`, import.meta.url);
242
+ const linkCommand = (objects) => `/linker ${objects.join(" ")} -o /program`;
130
243
  const assemblers = {
131
244
  GNU_trunk: {
132
245
  id: "GNU_trunk",
@@ -140,7 +253,7 @@ const assemblers = {
140
253
  },
141
254
  linker: {
142
255
  file: assemblerAsset("gnu-ld.2.43.50.elf"),
143
- commands: "/linker /program.o -o /program"
256
+ link: linkCommand
144
257
  }
145
258
  }
146
259
  },
@@ -161,7 +274,7 @@ const assemblers = {
161
274
  diagnosticsParser: nasmDiagnostics,
162
275
  binaries: { linker: {
163
276
  file: assemblerAsset("gnu-ld.2.43.50.elf"),
164
- commands: "/linker /program.o -o /program"
277
+ link: linkCommand
165
278
  } },
166
279
  wasmAssembler: nasmWasmAssembler
167
280
  }
@@ -231,6 +344,36 @@ function fasmDiagnostics(str) {
231
344
  return diagnostics;
232
345
  }
233
346
  /**
347
+ * What `ld` said, as diagnostics. Nothing else in the toolchain reports a symbol that no
348
+ * translation unit defines: NASM accepts every `extern` on the author's word, and the mistake
349
+ * only surfaces here. Without this the link simply failed and the build looked like it had
350
+ * succeeded, leaving the program unrunnable and nothing on screen to say why.
351
+ *
352
+ * `ld` writes a location as `file:line:(section+offset):`, and writes the notes that introduce an
353
+ * error - "in function `_start':" - as lines ending in a colon, which are skipped in favour of
354
+ * the error itself.
355
+ */
356
+ function ldDiagnostics(str) {
357
+ const diagnostics = [];
358
+ const locatedRegex = /^(.*?):(\d+):(?:\([^)]*\))?:\s*(.+)$/;
359
+ for (const line of str.split(/\r?\n/)) {
360
+ const text = line.trim().replace(/^\/linker:\s*/, "");
361
+ if (!text || text.startsWith("$ ") || text.endsWith(":")) continue;
362
+ const located = text.match(locatedRegex);
363
+ const message = (located?.[3] ?? text).trim();
364
+ if (!message) continue;
365
+ if (message.includes("cannot find entry symbol")) continue;
366
+ const isWarning = message.startsWith("warning:");
367
+ diagnostics.push({
368
+ ...located?.[1] ? { file: located[1] } : {},
369
+ line: located ? Number.parseInt(located[2] ?? "0", 10) : 1,
370
+ error: isWarning ? message.slice(8).trim() : message,
371
+ severity: isWarning ? "warning" : "error"
372
+ });
373
+ }
374
+ return diagnostics;
375
+ }
376
+ /**
234
377
  * The one-based column a diagnostic belongs on. NASM reports a line and no
235
378
  * column, but it names the thing it is complaining about: `msg' in "symbol
236
379
  * `msg' not defined", `.data' in a section warning. Finding that name in the
@@ -846,7 +989,9 @@ var BlinkRuntime = class BlinkRuntime {
846
989
  sourceMap = null;
847
990
  sourceProject = null;
848
991
  assembleOnly = false;
849
- assembledObject = null;
992
+ assembledObjects = [];
993
+ /** What the linker said, kept apart from the assembler's log so `ld`'s own parser reads it. */
994
+ linkerLogs = null;
850
995
  defaultArgc = "/program";
851
996
  defaultArgv = "";
852
997
  constructor(module, mode, callbacks, scheduler) {
@@ -922,7 +1067,7 @@ var BlinkRuntime = class BlinkRuntime {
922
1067
  const sourceProject = copyX86Project(project);
923
1068
  const assembled = await this.mode.wasmAssembler.assemble(sourceProject);
924
1069
  const report = assembled.stdout + assembled.stderr;
925
- return toCompileResult([...this.parseAssemblerDiagnostics(report, sourceProject), ...this.entryPointDiagnostics(assembled.object, sourceProject)], report);
1070
+ return toCompileResult([...this.parseAssemblerDiagnostics(report, sourceProject), ...this.entryPointDiagnostics(assembled.units.map((unit) => unit.object), sourceProject)], report);
926
1071
  }
927
1072
  async buildProject(project, options) {
928
1073
  this.assertReadyForCompile();
@@ -932,7 +1077,8 @@ var BlinkRuntime = class BlinkRuntime {
932
1077
  this.assemblerLogs = "";
933
1078
  this.assemblerErrors = [];
934
1079
  this.assemblerDiagnostics = [];
935
- this.assembledObject = null;
1080
+ this.assembledObjects = [];
1081
+ this.linkerLogs = null;
936
1082
  this.sourceMap = null;
937
1083
  this.assembleOnly = !options.link;
938
1084
  try {
@@ -942,24 +1088,49 @@ var BlinkRuntime = class BlinkRuntime {
942
1088
  this.assembleOnly = false;
943
1089
  this.module.FS.chdir("/");
944
1090
  }
945
- const diagnostics = [...this.assemblerDiagnostics.map((diagnostic) => ({
946
- ...diagnostic,
947
- file: x86ProjectSourcePath(diagnostic.file, sourceProject)
948
- })), ...this.entryPointDiagnostics(this.takeAssembledObject(), sourceProject)];
1091
+ const diagnostics = [
1092
+ ...this.assemblerDiagnostics.map((diagnostic) => ({
1093
+ ...diagnostic,
1094
+ file: x86ProjectSourcePath(diagnostic.file, sourceProject)
1095
+ })),
1096
+ ...this.entryPointDiagnostics(this.takeAssembledObjects(), sourceProject),
1097
+ ...this.linkDiagnostics(sourceProject)
1098
+ ];
949
1099
  if (this.state === "PROGRAM_LOADED") this.sourceMap = this.tryReadSourceMap();
950
1100
  return toCompileResult(diagnostics, this.assemblerLogs);
951
1101
  }
952
1102
  /**
953
- * The object this build's assembler wrote, for the checks that read it
954
- * rather than the assembler's own words. Null when the assembly failed, and
1103
+ * The objects this build's assembler wrote, for the checks that read them
1104
+ * rather than the assembler's own words. Empty when the assembly failed, and
955
1105
  * when the assembler writes an executable directly and never produces one.
956
- * Read once per build, so a previous build's object can never stand in for
957
- * one that was never written.
1106
+ * Read once per build, so a previous build's objects can never stand in for
1107
+ * ones that were never written.
958
1108
  */
959
- takeAssembledObject() {
960
- const object = this.assembledObject;
961
- this.assembledObject = null;
962
- return object;
1109
+ takeAssembledObjects() {
1110
+ const objects = this.assembledObjects;
1111
+ this.assembledObjects = [];
1112
+ return objects;
1113
+ }
1114
+ /**
1115
+ * What the link had to say. A link that failed leaves no program to run, so a build that
1116
+ * reported nothing would hand the caller a success it cannot act on - the state stays `Ready`
1117
+ * and the next step or run fails with a message about the emulator rather than the mistake.
1118
+ * The fallback covers a linker that fails in a way its parser does not recognise, so a failed
1119
+ * link is always visible as an error whatever `ld` chose to say about it.
1120
+ */
1121
+ linkDiagnostics(sourceProject) {
1122
+ if (this.linkerLogs === null) return [];
1123
+ const diagnostics = ldDiagnostics(this.linkerLogs).map((diagnostic) => ({
1124
+ ...diagnostic,
1125
+ file: x86ProjectSourcePath(diagnostic.file, sourceProject)
1126
+ }));
1127
+ if (this.state === "PROGRAM_LOADED" || diagnostics.some((diagnostic) => diagnostic.severity === "error")) return diagnostics;
1128
+ return [...diagnostics, {
1129
+ line: 1,
1130
+ file: sourceProject.entry,
1131
+ severity: "error",
1132
+ error: "linking failed, so there is no program to run."
1133
+ }];
963
1134
  }
964
1135
  /**
965
1136
  * Nothing in the toolchain treats a missing entry point as a failure: NASM
@@ -968,9 +1139,9 @@ var BlinkRuntime = class BlinkRuntime {
968
1139
  * is the least explicable thing a program can do to someone learning, so it
969
1140
  * is reported as an error here and the mistake is usually a misspelling.
970
1141
  */
971
- entryPointDiagnostics(object, sourceProject) {
972
- if (!object || !this.mode.binaries.linker) return [];
973
- const globals = readDefinedGlobalSymbols(object);
1142
+ entryPointDiagnostics(objects, sourceProject) {
1143
+ if (!objects.length || !this.mode.binaries.linker) return [];
1144
+ const globals = objects.flatMap((object) => readDefinedGlobalSymbols(object));
974
1145
  if (globals.includes("_start")) return [];
975
1146
  const nearest = findNearestSymbol(DEFAULT_ENTRY_SYMBOL, globals);
976
1147
  const nearestHint = nearest ? ` Did you mean \`${DEFAULT_ENTRY_SYMBOL}\` where you wrote \`${nearest}\`?` : "";
@@ -991,7 +1162,7 @@ var BlinkRuntime = class BlinkRuntime {
991
1162
  this.module._blinkenlib_run_fast();
992
1163
  await this.waitForState((state) => state !== "ASSEMBLING" && state !== "LINKING");
993
1164
  if (this.assemblerErrors.length === 0) try {
994
- this.assembledObject = this.module.FS.readFile("/program.o");
1165
+ this.assembledObjects = [this.module.FS.readFile("/program.o")];
995
1166
  } catch {}
996
1167
  }
997
1168
  /**
@@ -1005,23 +1176,32 @@ var BlinkRuntime = class BlinkRuntime {
1005
1176
  this.emitAssemblerOutput(assembled.stdout, this.callbacks.stdout);
1006
1177
  this.emitAssemblerOutput(assembled.stderr, this.callbacks.stderr);
1007
1178
  this.collectAssemblerDiagnostics();
1008
- if (!assembled.object) {
1179
+ if (!assembled.units.length) {
1009
1180
  this.setState("READY");
1010
1181
  return;
1011
1182
  }
1183
+ this.assembledObjects = assembled.units.map((unit) => unit.object);
1012
1184
  if (!options.link) {
1013
- this.assembledObject = assembled.object;
1014
1185
  this.setState("READY");
1015
1186
  return;
1016
1187
  }
1017
- this.assembledObject = assembled.object;
1018
- this.writeExecutableSync("/program.o", assembled.object);
1019
- this.setState("LINKING");
1188
+ const objectPaths = assembled.units.map((_, index) => index === 0 ? "/program.o" : `/program.${index}.o`);
1189
+ assembled.units.forEach((unit, index) => this.writeExecutableSync(objectPaths[index], unit.object));
1190
+ this.beginLinking();
1020
1191
  await defer();
1021
- this.setEmulationArgs("/linker", this.mode.binaries.linker?.commands ?? "", "");
1192
+ this.setEmulationArgs("/linker", this.mode.binaries.linker?.link(objectPaths) ?? "", "");
1022
1193
  this.module._blinkenlib_run_fast();
1023
1194
  await this.waitForState((state) => state !== "LINKING");
1024
1195
  }
1196
+ /**
1197
+ * Starts the link, and starts a log of its own for it. The assembler's parser cannot read
1198
+ * `ld`'s diagnostics and `ld`'s cannot read the assembler's, so what each of them said has to
1199
+ * stay separable even though both reach the caller as one report.
1200
+ */
1201
+ beginLinking() {
1202
+ this.linkerLogs = "";
1203
+ this.setState("LINKING");
1204
+ }
1025
1205
  collectAssemblerDiagnostics() {
1026
1206
  this.assemblerDiagnostics = this.mode.diagnosticsParser?.(this.assemblerLogs) ?? [];
1027
1207
  this.assemblerErrors = this.assemblerDiagnostics.filter((diagnostic) => diagnostic.severity === "error");
@@ -1218,7 +1398,10 @@ var BlinkRuntime = class BlinkRuntime {
1218
1398
  this.module.blinkenlibSetRunControls(BigInt(limit), (options.breakpointAddresses ?? []).map((address) => address.toString()));
1219
1399
  }
1220
1400
  collectAssemblerLog(charCode) {
1221
- if (this.state === "ASSEMBLING" || this.state === "LINKING") this.assemblerLogs += String.fromCharCode(charCode);
1401
+ if (this.state !== "ASSEMBLING" && this.state !== "LINKING") return;
1402
+ const character = String.fromCharCode(charCode);
1403
+ this.assemblerLogs += character;
1404
+ if (this.state === "LINKING" && this.linkerLogs !== null) this.linkerLogs += character;
1222
1405
  }
1223
1406
  handleSignal(signal, code) {
1224
1407
  if (signal !== SIGNALS.SIGTRAP) {
@@ -1297,9 +1480,9 @@ var BlinkRuntime = class BlinkRuntime {
1297
1480
  this.setState("PROGRAM_LOADED");
1298
1481
  return;
1299
1482
  }
1300
- this.setState("LINKING");
1483
+ this.beginLinking();
1301
1484
  this.scheduler(() => {
1302
- this.setEmulationArgs("/linker", this.mode.binaries.linker?.commands ?? "", "");
1485
+ this.setEmulationArgs("/linker", this.mode.binaries.linker?.link(["/program.o"]) ?? "", "");
1303
1486
  this.module._blinkenlib_run_fast();
1304
1487
  });
1305
1488
  }
@@ -2020,6 +2203,6 @@ async function createX86Emulator(options = {}) {
2020
2203
  return X86Emulator.create(options);
2021
2204
  }
2022
2205
  //#endregion
2023
- export { BaseEmulator, BlinkRuntime, BlinkState, DEFAULT_ASSEMBLER_ID, EmulatorStatus, RegisterSize, X86Emulator, X86_PROJECT_ROOT, X86_REGISTER_NAMES, assemblers, createX86Emulator, defaultResourceUrl, fasmDiagnostics, gnuDiagnostics, isNodeRuntime, locateDiagnosticColumn, nasmDiagnostics, observeCallbackResult, readResourceBytes, stageX86Project, toResourceUrl, validateX86Project, x86ProjectSourcePath, x86ProjectText };
2206
+ export { BaseEmulator, BlinkRuntime, BlinkState, DEFAULT_ASSEMBLER_ID, EmulatorStatus, RegisterSize, X86Emulator, X86_PROJECT_ROOT, X86_REGISTER_NAMES, assemblers, createX86Emulator, defaultResourceUrl, fasmDiagnostics, gnuDiagnostics, isNodeRuntime, ldDiagnostics, locateDiagnosticColumn, nasmDiagnostics, observeCallbackResult, readResourceBytes, selectX86Source, stageX86Project, toResourceUrl, validateX86Project, x86ProjectSourcePath, x86ProjectText };
2024
2207
 
2025
2208
  //# sourceMappingURL=index.mjs.map