@scriptc/compiler 0.1.5 → 0.1.7
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/ambient/scriptc-node-fallback.d.ts +0 -1
- package/ambient/scriptc.d.ts +13 -5
- package/dist/backend/c/c-emitter.d.ts +5 -0
- package/dist/backend/c/c-emitter.js +15 -0
- package/dist/backend/c/c-emitter.js.map +1 -1
- package/dist/backend/c/exprs.js +81 -9
- package/dist/backend/c/exprs.js.map +1 -1
- package/dist/backend/c/stmts.js +25 -1
- package/dist/backend/c/stmts.js.map +1 -1
- package/dist/backend/c/walkers.js +2 -3
- package/dist/backend/c/walkers.js.map +1 -1
- package/dist/backend/debug-symbols.d.ts +8 -0
- package/dist/backend/debug-symbols.js +52 -0
- package/dist/backend/debug-symbols.js.map +1 -0
- package/dist/backend/link-plan.d.ts +1 -0
- package/dist/backend/link-plan.js +2 -0
- package/dist/backend/link-plan.js.map +1 -1
- package/dist/backend/linker.js +8 -0
- package/dist/backend/linker.js.map +1 -1
- package/dist/backend/llvm/blocks.d.ts +2 -0
- package/dist/backend/llvm/blocks.js +18 -2
- package/dist/backend/llvm/blocks.js.map +1 -1
- package/dist/backend/llvm/debug-info.d.ts +32 -0
- package/dist/backend/llvm/debug-info.js +203 -0
- package/dist/backend/llvm/debug-info.js.map +1 -0
- package/dist/backend/llvm/dyn.js +4 -10
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +2 -0
- package/dist/backend/llvm/emitter.js +49 -4
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +28 -2
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +10 -0
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +37 -0
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +4 -3
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +9 -0
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/split.js +4 -1
- package/dist/backend/llvm/split.js.map +1 -1
- package/dist/backend/llvm/split.test.js +26 -1
- package/dist/backend/llvm/split.test.js.map +1 -1
- package/dist/backend/native-toolchain.js +58 -8
- package/dist/backend/native-toolchain.js.map +1 -1
- package/dist/backend/native-toolchain.test.js +10 -0
- package/dist/backend/native-toolchain.test.js.map +1 -1
- package/dist/backend/source-locations.d.ts +12 -0
- package/dist/backend/source-locations.js +32 -0
- package/dist/backend/source-locations.js.map +1 -0
- package/dist/backend/source-locations.test.d.ts +1 -0
- package/dist/backend/source-locations.test.js +16 -0
- package/dist/backend/source-locations.test.js.map +1 -0
- package/dist/coverage/surface-manifest.js +6 -1
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +4 -0
- package/dist/diagnostics/diagnostic.js +12 -0
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/executable/executable-cache.js +28 -4
- package/dist/executable/executable-cache.js.map +1 -1
- package/dist/executable/executable-cache.test.js +23 -0
- package/dist/executable/executable-cache.test.js.map +1 -1
- package/dist/frontend/arguments-usage.d.ts +6 -0
- package/dist/frontend/arguments-usage.js +40 -0
- package/dist/frontend/arguments-usage.js.map +1 -0
- package/dist/frontend/binding-source.d.ts +4 -0
- package/dist/frontend/binding-source.js +18 -0
- package/dist/frontend/binding-source.js.map +1 -0
- package/dist/frontend/lowering/array-indexed-mutation.d.ts +8 -0
- package/dist/frontend/lowering/array-indexed-mutation.js +176 -0
- package/dist/frontend/lowering/array-indexed-mutation.js.map +1 -0
- package/dist/frontend/lowering/containers/string-and-regexp.d.ts +7 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js +190 -13
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/expressions/object-literals.js +13 -8
- package/dist/frontend/lowering/expressions/object-literals.js.map +1 -1
- package/dist/frontend/lowering/expressions/optional-chains.d.ts +5 -6
- package/dist/frontend/lowering/expressions/optional-chains.js +7 -6
- package/dist/frontend/lowering/expressions/optional-chains.js.map +1 -1
- package/dist/frontend/lowering/indexed-comparison.d.ts +6 -0
- package/dist/frontend/lowering/indexed-comparison.js +30 -0
- package/dist/frontend/lowering/indexed-comparison.js.map +1 -0
- package/dist/frontend/lowering/lower-builtins.d.ts +1 -1
- package/dist/frontend/lowering/lower-builtins.js +21 -10
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.d.ts +2 -9
- package/dist/frontend/lowering/lower-calls.js +406 -40
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +3 -27
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.d.ts +8 -2
- package/dist/frontend/lowering/lower-containers.js +454 -104
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +134 -18
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-island.d.ts +1 -1
- package/dist/frontend/lowering/lower-island.js +1 -1
- package/dist/frontend/lowering/lower-modules.js +19 -8
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +4 -37
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lowerer.js +14 -3
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/surfaces.d.ts +3 -1
- package/dist/frontend/lowering/surfaces.js +50 -7
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/program.d.ts +5 -0
- package/dist/frontend/program.js +216 -32
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/program.test.d.ts +1 -0
- package/dist/frontend/program.test.js +117 -0
- package/dist/frontend/program.test.js.map +1 -0
- package/dist/frontend/type-mapper.d.ts +4 -2
- package/dist/frontend/type-mapper.js +249 -186
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/frontend/type-mapper.test.d.ts +1 -0
- package/dist/frontend/type-mapper.test.js +86 -0
- package/dist/frontend/type-mapper.test.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.js +4 -2
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/ir.d.ts +33 -14
- package/dist/ir/ir.js +5 -1
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/validate.js +57 -31
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +17 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/compiler-self-identity.d.ts +1 -1
- package/dist/library/compiler-self-identity.js +31 -15
- package/dist/library/compiler-self-identity.js.map +1 -1
- package/dist/library/compiler-self-identity.test.d.ts +1 -0
- package/dist/library/compiler-self-identity.test.js +93 -0
- package/dist/library/compiler-self-identity.test.js.map +1 -0
- package/package.json +17 -17
- package/surface-manifest.json +155 -4
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { execFileSync } from "node:child_process";
|
|
1
|
+
import { execFileSync, spawnSync } from "node:child_process";
|
|
2
2
|
import { mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { afterAll, expect, test } from "vitest";
|
|
6
6
|
import { splitLlvmLibraryProgram, splitLlvmProgram } from "./split.js";
|
|
7
|
+
import { LlvmDebugInfo } from "./debug-info.js";
|
|
8
|
+
import { VOID } from "../../ir/ir.js";
|
|
7
9
|
const scratch = [];
|
|
8
10
|
afterAll(async () => {
|
|
9
11
|
const { rm } = await import("node:fs/promises");
|
|
@@ -62,6 +64,29 @@ test("thread-local program state conservatively keeps the single-TU path", () =>
|
|
|
62
64
|
const tls = SAMPLE.replace("@hidden_value = internal global i64 7", "@hidden_value = internal thread_local global i64 7");
|
|
63
65
|
expect(splitLlvmProgram(tls, { minimumBytes: 0, targetBytes: 64 * 1024 })).toBeNull();
|
|
64
66
|
});
|
|
67
|
+
test("debug metadata stays on definitions when splitting LLVM modules", async () => {
|
|
68
|
+
const debug = new LlvmDebugInfo("/source/main.ts", new Map([["/source/main.ts", "console.log(1);\n"]]));
|
|
69
|
+
let source = SAMPLE;
|
|
70
|
+
for (const name of ["left", "right", "public_entry"]) {
|
|
71
|
+
const loc = { file: "/source/main.ts", start: 0, end: 1 };
|
|
72
|
+
const scope = debug.function({ name, loc, params: [], locals: [], body: [], returnType: VOID });
|
|
73
|
+
const location = debug.location(loc, scope);
|
|
74
|
+
source = source.replace(new RegExp(`(@${name}\\(\\) #0) \\{([\\s\\S]*?)\\n\\}`), (_, header, body) => `${header} !dbg ${scope} {${body.split("\n").map((line) => line.startsWith(" ") ? `${line}, !dbg ${location}` : line).join("\n")}\n}`);
|
|
75
|
+
}
|
|
76
|
+
source += debug.render();
|
|
77
|
+
const split = splitLlvmProgram(source, { minimumBytes: 0 });
|
|
78
|
+
expect(split).not.toBeNull();
|
|
79
|
+
const dir = await mkdtemp(join(tmpdir(), "scriptc-debug-split-"));
|
|
80
|
+
scratch.push(dir);
|
|
81
|
+
for (const shard of split.shards) {
|
|
82
|
+
expect(shard.source).not.toMatch(/^declare.*!dbg/m);
|
|
83
|
+
const path = join(dir, shard.name);
|
|
84
|
+
await writeFile(path, shard.source);
|
|
85
|
+
const result = spawnSync("clang", ["-Wno-override-module", "-c", path, "-o", `${path}.o`], { encoding: "utf8" });
|
|
86
|
+
expect(result.status, result.stderr).toBe(0);
|
|
87
|
+
expect(result.stderr).toBe("");
|
|
88
|
+
}
|
|
89
|
+
});
|
|
65
90
|
test("dev libraries split at the measured 2MB crossover while executables retain 4MB", () => {
|
|
66
91
|
const body = Array.from({ length: 700 }, (_, i) => `define internal i64 @library_pad_${i}() #0 {\nentry:\n ; ${"x".repeat(3072)}\n ret i64 ${i}\n}\n`).join("\n");
|
|
67
92
|
const source = SAMPLE.replace("define i64 @public_entry", `${body}\ndefine i64 @public_entry`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"split.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/split.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"split.test.js","sourceRoot":"","sources":["../../../src/backend/llvm/split.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { fileURLToPath } from "node:url";
|
|
|
11
11
|
import { promisify } from "node:util";
|
|
12
12
|
import { localizeElfObject, mergeAndLocalizeCoffObjects } from "./object-localize.js";
|
|
13
13
|
import { executableOptimizationLinkerArgs, executableStripLinkerArgs, windowsSubsystemLinkerArgs } from "./targets.js";
|
|
14
|
+
import { createDarwinDebugSymbols, installDarwinDebugSymbols, needsDarwinDebugSymbols, readDarwinDebugSymbols } from "./debug-symbols.js";
|
|
14
15
|
import { createVendorArchives, MBEDTLS_VERSION, QJS_COMMIT, ZLIB_VERSION, } from "./vendor-archives.js";
|
|
15
16
|
import { cacheDigestPath, cacheRootDir, copyValidCachedFile, ensurePrivateCacheRoot, fileDigest, fileExists, installArtifact, privateSiblingPath, protectCachedArtifact, pruneCache, publishCachedFile, validCachedFile, } from "./build-cache.js";
|
|
16
17
|
export { buildCacheRoot, prepareBuildCacheRoot, pruneBuildCache, resolveBuildCacheRoot, } from "./build-cache.js";
|
|
@@ -2680,7 +2681,7 @@ function localArtifactStampIntegrity(stamp) {
|
|
|
2680
2681
|
.update(JSON.stringify(stamp))
|
|
2681
2682
|
.digest("hex");
|
|
2682
2683
|
}
|
|
2683
|
-
async function localArtifactHit(stampPath, outPath, key) {
|
|
2684
|
+
async function localArtifactHit(stampPath, outPath, key, darwinDebugSymbols = false) {
|
|
2684
2685
|
try {
|
|
2685
2686
|
const stamp = JSON.parse(await readFile(stampPath, "utf8"));
|
|
2686
2687
|
const output = await lstat(outPath);
|
|
@@ -2688,6 +2689,8 @@ async function localArtifactHit(stampPath, outPath, key) {
|
|
|
2688
2689
|
if (stamp.version !== 2 ||
|
|
2689
2690
|
stamp.key !== key ||
|
|
2690
2691
|
!/^[0-9a-f]{64}$/.test(stamp.digest ?? "") ||
|
|
2692
|
+
(darwinDebugSymbols !== (stamp.debugSymbolsDigest !== undefined)) ||
|
|
2693
|
+
(stamp.debugSymbolsDigest !== undefined && !/^[0-9a-f]{64}$/.test(stamp.debugSymbolsDigest)) ||
|
|
2691
2694
|
!Array.isArray(stamp.dependencies) ||
|
|
2692
2695
|
!/^[0-9a-f]{64}$/.test(stamp.integrity ?? "") ||
|
|
2693
2696
|
localArtifactStampIntegrity({
|
|
@@ -2695,6 +2698,7 @@ async function localArtifactHit(stampPath, outPath, key) {
|
|
|
2695
2698
|
key: stamp.key,
|
|
2696
2699
|
digest: stamp.digest,
|
|
2697
2700
|
dependencies: stamp.dependencies,
|
|
2701
|
+
...(stamp.debugSymbolsDigest === undefined ? {} : { debugSymbolsDigest: stamp.debugSymbolsDigest }),
|
|
2698
2702
|
}) !== stamp.integrity ||
|
|
2699
2703
|
!output.isFile() ||
|
|
2700
2704
|
(output.mode & 0o777) !== expectedMode ||
|
|
@@ -2718,7 +2722,8 @@ async function localArtifactHit(stampPath, outPath, key) {
|
|
|
2718
2722
|
typeof dependency.targetMtimeMs !== "number" ||
|
|
2719
2723
|
typeof dependency.targetCtimeMs !== "number")) ||
|
|
2720
2724
|
!(await nativeArtifactDependenciesStillMatch(stamp.dependencies)) ||
|
|
2721
|
-
await fileDigest(outPath) !== stamp.digest
|
|
2725
|
+
await fileDigest(outPath) !== stamp.digest ||
|
|
2726
|
+
darwinDebugSymbols && createHash("sha256").update(await readDarwinDebugSymbols(outPath)).digest("hex") !== stamp.debugSymbolsDigest) {
|
|
2722
2727
|
return null;
|
|
2723
2728
|
}
|
|
2724
2729
|
const now = new Date();
|
|
@@ -2729,7 +2734,7 @@ async function localArtifactHit(stampPath, outPath, key) {
|
|
|
2729
2734
|
return null;
|
|
2730
2735
|
}
|
|
2731
2736
|
}
|
|
2732
|
-
async function publishLocalArtifactStamp(stampPath, outPath, key, dependencyPaths, recursiveDirectories = [], recursiveExclusions = []) {
|
|
2737
|
+
async function publishLocalArtifactStamp(stampPath, outPath, key, dependencyPaths, recursiveDirectories = [], recursiveExclusions = [], darwinDebugSymbols = false) {
|
|
2733
2738
|
await mkdir(dirname(stampPath), { recursive: true });
|
|
2734
2739
|
const tmp = `${stampPath}.tmp-${process.pid}-${Math.random().toString(36).slice(2)}`;
|
|
2735
2740
|
try {
|
|
@@ -2739,6 +2744,9 @@ async function publishLocalArtifactStamp(stampPath, outPath, key, dependencyPath
|
|
|
2739
2744
|
key,
|
|
2740
2745
|
digest: await fileDigest(outPath),
|
|
2741
2746
|
dependencies,
|
|
2747
|
+
...(darwinDebugSymbols
|
|
2748
|
+
? { debugSymbolsDigest: createHash("sha256").update(await readDarwinDebugSymbols(outPath)).digest("hex") }
|
|
2749
|
+
: {}),
|
|
2742
2750
|
};
|
|
2743
2751
|
const stamp = {
|
|
2744
2752
|
...unsigned,
|
|
@@ -2898,6 +2906,10 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
2898
2906
|
const tls = (opts.tls ?? false) || nativeFetch || netIsland;
|
|
2899
2907
|
const tlsCa = (opts.tlsCa ?? false) || tls;
|
|
2900
2908
|
const driver = resolveCc();
|
|
2909
|
+
const darwinDebugSymbols = needsDarwinDebugSymbols(targetPlatform(driver), optimization, opts.strip);
|
|
2910
|
+
const debugFlags = optimization === "dev" && !opts.strip
|
|
2911
|
+
? ["-gline-tables-only", ...(opts.cPath.endsWith(".ll") ? [] : ["-gno-column-info"])]
|
|
2912
|
+
: [];
|
|
2901
2913
|
const shardNames = new Set();
|
|
2902
2914
|
const programShardsValid = opts.programShards?.every((shard) => {
|
|
2903
2915
|
if (basename(shard.name) !== shard.name || !shard.name.endsWith(".ll") ||
|
|
@@ -3032,7 +3044,7 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
3032
3044
|
programBytes,
|
|
3033
3045
|
compilerPath: effectiveCompiler.canonicalPath,
|
|
3034
3046
|
};
|
|
3035
|
-
const hit = await localArtifactHit(stampPath, opts.outPath, key);
|
|
3047
|
+
const hit = await localArtifactHit(stampPath, opts.outPath, key, darwinDebugSymbols);
|
|
3036
3048
|
if (hit !== null) {
|
|
3037
3049
|
await opts.onArtifactReady?.({ dependencies: hit.dependencies }).catch(() => undefined);
|
|
3038
3050
|
return;
|
|
@@ -3212,10 +3224,11 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
3212
3224
|
// the historical single invocation, cached-.o substitution on cache misses.
|
|
3213
3225
|
const buildArgs = (rt, build = {}) => [
|
|
3214
3226
|
"-std=c11",
|
|
3227
|
+
...debugFlags,
|
|
3215
3228
|
...driver.targetArgs,
|
|
3216
3229
|
...threadArgs,
|
|
3217
3230
|
...(sanitize
|
|
3218
|
-
? ["-O1", "-fsanitize=address", "-DSCR_RC_AUDIT"]
|
|
3231
|
+
? [optimization === "dev" ? "-O0" : "-O1", "-fsanitize=address", "-DSCR_RC_AUDIT"]
|
|
3219
3232
|
: [optimization === "dev" ? "-O0" : "-O2"]),
|
|
3220
3233
|
...executableSectionFlags.compile,
|
|
3221
3234
|
...(opts.textDecoderLegacy ? ["-DSCR_TEXT_DECODER_LEGACY"] : []),
|
|
@@ -3405,10 +3418,11 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
3405
3418
|
// historical single clang invocation.
|
|
3406
3419
|
const cflags = [
|
|
3407
3420
|
"-std=c11",
|
|
3421
|
+
...debugFlags,
|
|
3408
3422
|
...driver.targetArgs,
|
|
3409
3423
|
...threadArgs,
|
|
3410
3424
|
...(sanitize
|
|
3411
|
-
? ["-O1", "-fsanitize=address", "-DSCR_RC_AUDIT"]
|
|
3425
|
+
? [optimization === "dev" ? "-O0" : "-O1", "-fsanitize=address", "-DSCR_RC_AUDIT"]
|
|
3412
3426
|
: [optimization === "dev" ? "-O0" : "-O2"]),
|
|
3413
3427
|
...executableSectionFlags.compile,
|
|
3414
3428
|
...(opts.textDecoderLegacy ? ["-DSCR_TEXT_DECODER_LEGACY"] : []),
|
|
@@ -3761,12 +3775,29 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
3761
3775
|
if (!(await copyValidCachedFile(cachedBin, tmpOut))) {
|
|
3762
3776
|
throw new Error("invalid cached executable");
|
|
3763
3777
|
}
|
|
3778
|
+
if (darwinDebugSymbols) {
|
|
3779
|
+
const cachedSymbols = `${cachedBin}.dsym`;
|
|
3780
|
+
const symbolsCopy = privateSiblingPath(opts.outPath, "dsym-hit");
|
|
3781
|
+
try {
|
|
3782
|
+
if (!(await copyValidCachedFile(cachedSymbols, symbolsCopy)))
|
|
3783
|
+
throw new Error("invalid cached dSYM");
|
|
3784
|
+
const bytes = await readFile(symbolsCopy);
|
|
3785
|
+
// A concurrent publisher may replace either payload. The sidecar
|
|
3786
|
+
// also names its binary digest so a mixed pair always misses.
|
|
3787
|
+
if (bytes.subarray(0, 32).toString("hex") !== await fileDigest(tmpOut))
|
|
3788
|
+
throw new Error("mismatched cached dSYM");
|
|
3789
|
+
await installDarwinDebugSymbols(bytes.subarray(32), opts.outPath);
|
|
3790
|
+
}
|
|
3791
|
+
finally {
|
|
3792
|
+
await rm(symbolsCopy, { force: true });
|
|
3793
|
+
}
|
|
3794
|
+
}
|
|
3764
3795
|
// Match a fresh linker output under the caller's current umask. Reusing a
|
|
3765
3796
|
// cache entry populated by a less restrictive shell must not widen access.
|
|
3766
3797
|
await chmod(tmpOut, 0o777 & ~process.umask());
|
|
3767
3798
|
await rename(tmpOut, opts.outPath);
|
|
3768
3799
|
if (localArtifact !== null && localArtifactDependencyPaths !== null) {
|
|
3769
|
-
const stamp = await publishLocalArtifactStamp(localArtifact.stampPath, opts.outPath, localArtifact.key, localArtifactDependencyPaths, [dirname(resolve(opts.cPath))], [persistentCache.root]).catch(() => null);
|
|
3800
|
+
const stamp = await publishLocalArtifactStamp(localArtifact.stampPath, opts.outPath, localArtifact.key, localArtifactDependencyPaths, [dirname(resolve(opts.cPath))], [persistentCache.root], darwinDebugSymbols).catch(() => null);
|
|
3770
3801
|
if (stamp !== null) {
|
|
3771
3802
|
await opts.onArtifactReady?.({ dependencies: stamp.dependencies }).catch(() => undefined);
|
|
3772
3803
|
}
|
|
@@ -3934,6 +3965,14 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
3934
3965
|
await runClang(buildArgs((p) => objects?.get(p) ?? p, shardedProgramObject === null
|
|
3935
3966
|
? { programPath, outPath: privateOut, compilerVisibleSource: opts.cPath }
|
|
3936
3967
|
: { programPath: shardedProgramObject, outPath: privateOut }));
|
|
3968
|
+
if (darwinDebugSymbols) {
|
|
3969
|
+
// clang invokes dsymutil when compiling a source TU while linking.
|
|
3970
|
+
// A sharded program is already an object, so run it explicitly while
|
|
3971
|
+
// the merged object and staged runtime inputs still exist.
|
|
3972
|
+
if (shardedProgramObject !== null)
|
|
3973
|
+
await createDarwinDebugSymbols(privateOut);
|
|
3974
|
+
await installDarwinDebugSymbols(await readDarwinDebugSymbols(privateOut), opts.outPath);
|
|
3975
|
+
}
|
|
3937
3976
|
await installArtifact(privateOut, opts.outPath);
|
|
3938
3977
|
if (cachedBin !== null && keyHex !== null) {
|
|
3939
3978
|
// Metadata comparison catches ordinary changes cheaply, but cannot by
|
|
@@ -3972,6 +4011,14 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
3972
4011
|
// generated code and embedded literals private; the hit path reapplies
|
|
3973
4012
|
// the caller's current executable mode to its destination copy.
|
|
3974
4013
|
await publishCachedFile(privateOut, cachedBin);
|
|
4014
|
+
if (darwinDebugSymbols) {
|
|
4015
|
+
const symbols = privateSiblingPath(privateOut, "debug-symbols");
|
|
4016
|
+
await writeFile(symbols, Buffer.concat([
|
|
4017
|
+
Buffer.from(await fileDigest(privateOut), "hex"),
|
|
4018
|
+
await readDarwinDebugSymbols(privateOut),
|
|
4019
|
+
]));
|
|
4020
|
+
await publishCachedFile(symbols, `${cachedBin}.dsym`);
|
|
4021
|
+
}
|
|
3975
4022
|
}
|
|
3976
4023
|
catch {
|
|
3977
4024
|
/* publishing is best-effort */
|
|
@@ -3981,7 +4028,7 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
3981
4028
|
localArtifactDependencyPaths !== null &&
|
|
3982
4029
|
cacheCompleteArtifact &&
|
|
3983
4030
|
cacheInputsStable) {
|
|
3984
|
-
const stamp = await publishLocalArtifactStamp(localArtifact.stampPath, opts.outPath, localArtifact.key, localArtifactDependencyPaths, [dirname(resolve(opts.cPath))], [persistentCache.root]).catch(() => null);
|
|
4031
|
+
const stamp = await publishLocalArtifactStamp(localArtifact.stampPath, opts.outPath, localArtifact.key, localArtifactDependencyPaths, [dirname(resolve(opts.cPath))], [persistentCache.root], darwinDebugSymbols).catch(() => null);
|
|
3985
4032
|
if (stamp !== null) {
|
|
3986
4033
|
await opts.onArtifactReady?.({ dependencies: stamp.dependencies }).catch(() => undefined);
|
|
3987
4034
|
}
|
|
@@ -3997,6 +4044,9 @@ async function compileCInternal(opts, cacheWarmOnly, cacheWarmPaths) {
|
|
|
3997
4044
|
export async function compileC(opts) {
|
|
3998
4045
|
clearCcCaches();
|
|
3999
4046
|
await compileCInternal(opts, false);
|
|
4047
|
+
if (targetPlatform(resolveCc()) === "darwin" && !needsDarwinDebugSymbols("darwin", opts.optimization, opts.strip)) {
|
|
4048
|
+
await rm(`${opts.outPath}.dSYM`, { recursive: true, force: true });
|
|
4049
|
+
}
|
|
4000
4050
|
}
|
|
4001
4051
|
export function supportedNativeCacheWarmProfiles(driver) {
|
|
4002
4052
|
if (isMobileTarget(driver.target) || targetPlatform(driver) === "wasi")
|