feat(selfhost): achieve binary-identical selfhost loop

- Add -Wl,--build-id=none to C compilation flags (removes non-deterministic build ID)
- Update Makefile selfhost-loop to strip debug info before ELF comparison
- Bootstrap compiler and selfhost compiler both deterministic
This commit is contained in:
2026-06-11 10:00:14 +03:00
parent 0e93ea911c
commit 9bbeb4fd1d
3 changed files with 12 additions and 10 deletions
+7 -5
View File
@@ -123,14 +123,16 @@ selfhost-loop: build
else \ else \
echo " C output: DIFFERENT ✗"; \ echo " C output: DIFFERENT ✗"; \
fi fi
@echo "Comparing ELF binaries..." @echo "Comparing ELF binaries (stripped)..."
@if diff build/selfhost-loop-a/build/buxc2 build/selfhost-loop-b/build/buxc2 > /dev/null 2>&1; then \ @cp build/selfhost-loop-a/build/buxc2 /tmp/buxc2_a && strip -d /tmp/buxc2_a
@cp build/selfhost-loop-b/build/buxc2 /tmp/buxc2_b && strip -d /tmp/buxc2_b
@if diff /tmp/buxc2_a /tmp/buxc2_b > /dev/null 2>&1; then \
echo " ELF binary: IDENTICAL ✓"; \ echo " ELF binary: IDENTICAL ✓"; \
echo "=== Selfhost loop PASSED ==="; \ echo "=== Selfhost loop PASSED ==="; \
else \ else \
echo " ELF binary: DIFFERENT ✗ (may be due to timestamps)"; \ echo " ELF binary: DIFFERENT ✗"; \
echo " C output was identical — ELF difference is likely linker non-determinism"; \ echo "=== Selfhost loop FAILED ==="; \
echo "=== Selfhost loop: C codegen deterministic ✓, ELF non-deterministic (expected) ==="; \ exit 1; \
fi fi
lsp: tools/bux-lsp lsp: tools/bux-lsp
+1 -1
View File
@@ -488,7 +488,7 @@ proc cmdBuild*(args: seq[string], opts: GlobalOptions): int =
# Compile with cc # Compile with cc
let outputName = if pctx.man.name != "": pctx.man.name else: "bux_out" let outputName = if pctx.man.name != "": pctx.man.name else: "bux_out"
let outputFile = buildDir / outputName let outputFile = buildDir / outputName
let ccCmd = &"cc -O0 -g -pthread -o {outputFile} {cFile} {runtimeDst} {ioDst} -lm -lcrypto 2>&1" let ccCmd = &"cc -O0 -g -pthread -Wl,--build-id=none -o {outputFile} {cFile} {runtimeDst} {ioDst} -lm -lcrypto 2>&1"
if opts.verbose: if opts.verbose:
printInfo(&"running: {ccCmd}", useColor) printInfo(&"running: {ccCmd}", useColor)
let (output, exitCode) = execCmdEx(ccCmd) let (output, exitCode) = execCmdEx(ccCmd)
+4 -4
View File
@@ -255,13 +255,13 @@ func Cli_Build(srcPath: String, outPath: String, targetTriple: String, isRelease
if !String_Eq(targetTriple, "") { if !String_Eq(targetTriple, "") {
StringBuilder_Append(&cmdBuf, "clang "); StringBuilder_Append(&cmdBuf, "clang ");
StringBuilder_Append(&cmdBuf, optFlags); StringBuilder_Append(&cmdBuf, optFlags);
StringBuilder_Append(&cmdBuf, " -pthread -target "); StringBuilder_Append(&cmdBuf, " -pthread -Wl,--build-id=none -target ");
StringBuilder_Append(&cmdBuf, targetTriple); StringBuilder_Append(&cmdBuf, targetTriple);
StringBuilder_Append(&cmdBuf, " "); StringBuilder_Append(&cmdBuf, " ");
} else { } else {
StringBuilder_Append(&cmdBuf, "cc "); StringBuilder_Append(&cmdBuf, "cc ");
StringBuilder_Append(&cmdBuf, optFlags); StringBuilder_Append(&cmdBuf, optFlags);
StringBuilder_Append(&cmdBuf, " -pthread "); StringBuilder_Append(&cmdBuf, " -pthread -Wl,--build-id=none ");
} }
StringBuilder_Append(&cmdBuf, "-o "); StringBuilder_Append(&cmdBuf, "-o ");
StringBuilder_Append(&cmdBuf, outPath); StringBuilder_Append(&cmdBuf, outPath);
@@ -1181,13 +1181,13 @@ func Cli_BuildProject(projectDir: String, targetTriple: String, isRelease: bool)
if !String_Eq(targetTriple, "") { if !String_Eq(targetTriple, "") {
StringBuilder_Append(&ccBuf, "clang "); StringBuilder_Append(&ccBuf, "clang ");
StringBuilder_Append(&ccBuf, optFlags2); StringBuilder_Append(&ccBuf, optFlags2);
StringBuilder_Append(&ccBuf, " -pthread -target "); StringBuilder_Append(&ccBuf, " -pthread -Wl,--build-id=none -target ");
StringBuilder_Append(&ccBuf, targetTriple); StringBuilder_Append(&ccBuf, targetTriple);
StringBuilder_Append(&ccBuf, " "); StringBuilder_Append(&ccBuf, " ");
} else { } else {
StringBuilder_Append(&ccBuf, "cc "); StringBuilder_Append(&ccBuf, "cc ");
StringBuilder_Append(&ccBuf, optFlags2); StringBuilder_Append(&ccBuf, optFlags2);
StringBuilder_Append(&ccBuf, " -pthread "); StringBuilder_Append(&ccBuf, " -pthread -Wl,--build-id=none ");
} }
StringBuilder_Append(&ccBuf, "-o "); StringBuilder_Append(&ccBuf, "-o ");
StringBuilder_Append(&ccBuf, outBin); StringBuilder_Append(&ccBuf, outBin);