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

@@ -822,40 +822,35 @@ fn emitoff(v: i64) void = {
// avoid cross-module same-leaf collisions (task #13); w6a accepts
// '.' in label-cont (lex.c:18).
fn mklabel(c: *cgen, prefix: str) str = {
let buf: [128]u8;
let i: i32 = 0;
let mname: str = c.curmod;
let fname: str = c.fnname;
let ns: str = strconv.i64tos(c.labelseq: i64, strconv.base.DEC);
c.labelseq += 1;
let total: i32 = mname.len + fname.len + prefix.len + ns.len + 2;
if (mname.len > 0) { total += 1; };
let p: []u8 = alloc([], (total: u64) + 1u64)!;
let i: i32 = 0;
let j: i32 = 0;
for (j < mname.len) {
buf[i] = mname[j];
p[i] = mname[j];
i += 1; j += 1;
};
if (mname.len > 0) { buf[i] = '.'; i += 1; };
let fname: str = c.fnname;
if (mname.len > 0) { p[i] = '.'; i += 1; };
j = 0;
for (j < fname.len) {
buf[i] = fname[j];
p[i] = fname[j];
i += 1; j += 1;
};
buf[i] = '_'; i += 1;
p[i] = '_'; i += 1;
j = 0;
for (j < prefix.len) {
buf[i] = prefix[j];
p[i] = prefix[j];
i += 1; j += 1;
};
buf[i] = '_'; i += 1;
let ns: str = strconv.i64tos(c.labelseq: i64, strconv.base.DEC);
p[i] = '_'; i += 1;
let n: i32 = ns.len;
let dk: i32 = 0;
for (dk < n) { buf[i + dk] = ns.ptr[dk]; dk += 1; };
c.labelseq += 1;
let total: i32 = i + n;
let p: []u8 = alloc([], (total: u64) + 1u64)!;
let k: i32 = 0;
for (k < total) {
p[k] = buf[k];
k += 1;
};
for (dk < n) { p[i + dk] = ns.ptr[dk]; dk += 1; };
p[total] = 0u8;
let r: str;
r.ptr = p.ptr;
@@ -917,22 +912,20 @@ fn internstrlit(c: *cgen, bytes: str) str = {
// #49: per-unit prefix so two str-bearing packages don't both emit
// `_S_0`.. and collide at w6l link. Pure function of the module path
// (matching mklabel's spelling), so the self-host fixed-point holds.
let buf: [128]u8;
let i: i32 = 0;
let mname: str = c.curmod;
let j: i32 = 0;
for (j < mname.len) { buf[i] = mname[j]; i += 1; j += 1; };
if (mname.len > 0) { buf[i] = '.'; i += 1; };
buf[i] = 95u8; i += 1; buf[i] = 83u8; i += 1; buf[i] = 95u8; i += 1; // "_S_"
let ns: str = strconv.i64tos(c.strlitseq: i64, strconv.base.DEC);
c.strlitseq += 1;
let total: i32 = mname.len + ns.len + 3;
if (mname.len > 0) { total += 1; };
let p: []u8 = alloc([], (total: u64) + 1u64)!;
let i: i32 = 0;
let j: i32 = 0;
for (j < mname.len) { p[i] = mname[j]; i += 1; j += 1; };
if (mname.len > 0) { p[i] = '.'; i += 1; };
p[i] = 95u8; i += 1; p[i] = 83u8; i += 1; p[i] = 95u8; i += 1;
let n: i32 = ns.len;
let dk: i32 = 0;
for (dk < n) { buf[i + dk] = ns.ptr[dk]; dk += 1; };
c.strlitseq += 1;
let total: i32 = i + n;
let p: []u8 = alloc([], (total: u64) + 1u64)!;
let k: i32 = 0;
for (k < total) { p[k] = buf[k]; k += 1; };
for (dk < n) { p[i + dk] = ns.ptr[dk]; dk += 1; };
p[total] = 0u8;
let lab: str;
lab.ptr = p.ptr;