wcc: build generated labels at their exact size

This commit is contained in:
2026-08-09 03:38:03 +09:00
parent 0a16811ab1
commit a030268c52
2 changed files with 86 additions and 31 deletions

View File

@@ -338,3 +338,65 @@ fn strdefcheck(label: str, stage: str, s: str, sym: str, wantlea: str,
"export fn main() i32 = { return 0; };\n"),
"TEXT beta.bfn", "LEAQ\tbeta._S_", "alpha.MSG(SB)");
};
fn longident(prefix: str) str = {
let run: str = "nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn";
return strings.concat(prefix, run, run, run);
};
@test fn longgeneratednames() void = {
let fnname: str = longident("f");
let fsrc: str = strings.concat(
"package main;\n",
"fn ", fnname, "() i32 = {\n",
" if (true) { return 42; };\n",
" return 1;\n",
"};\n",
"export fn main() i32 = { return ", fnname, "(); };\n");
let ftd: str = testenv.fresh();
testenv.writefile(strings.concat(ftd, "/src.ww"), fsrc);
emitstage(ftd, "long_function_label", "cstage",
testenv.driver("w6c"), "cs.s");
emitstage(ftd, "long_function_label", "wwstage",
testenv.driver("w6c_ww"), "ws.s");
let fcs: str = testenv.readfile(strings.concat(ftd, "/cs.s"));
let fws: str = testenv.readfile(strings.concat(ftd, "/ws.s"));
let textneedle: str = strings.concat("TEXT main.", fnname, ",$0");
let labelneedle: str = strings.concat("main.", fnname, "_end_");
if (!testenv.has(fcs, textneedle) || !testenv.has(fws, textneedle)
|| !testenv.has(fcs, labelneedle) || !testenv.has(fws, labelneedle)) {
fail("long_function_label", "full generated label missing");
};
if (!testenv.same(fcs, fws)) {
fail("long_function_label", "cstage vs wwstage asm differs");
};
testenv.clean(ftd);
let modname: str = longident("p");
let ssrc: str = strings.concat(
"package ", modname, ";\n",
"export fn f() i32 = {\n",
" let s: str = \"x\";\n",
" return s.len;\n",
"};\n");
let std: str = testenv.fresh();
testenv.writefile(strings.concat(std, "/src.ww"), ssrc);
emitstage(std, "long_strlit_label", "cstage",
testenv.driver("w6c"), "cs.s");
emitstage(std, "long_strlit_label", "wwstage",
testenv.driver("w6c_ww"), "ws.s");
let scs: str = testenv.readfile(strings.concat(std, "/cs.s"));
let sws: str = testenv.readfile(strings.concat(std, "/ws.s"));
let leaneedle: str = strings.concat("LEAQ\t", modname,
"._S_0(SB), AX");
let dataneedle: str = strings.concat("DATA ", modname,
"._S_0(SB),\"x\\x00\"");
if (!testenv.has(scs, leaneedle) || !testenv.has(sws, leaneedle)
|| !testenv.has(scs, dataneedle) || !testenv.has(sws, dataneedle)) {
fail("long_strlit_label", "full DATA/LEAQ label missing");
};
if (!testenv.same(scs, sws)) {
fail("long_strlit_label", "cstage vs wwstage asm differs");
};
testenv.clean(std);
};