selfhost/cmd/{w6a,w6l}: migrate 10 amalloc sites to alloc(T{...})!

Phase 0 batch 2. Sites: w6a/parse.ww (asym, aprog, aoperand ×2),
w6l/main.ww (lnk), w6l/obj.ww (defent, armember, lobj, lrel ×2).

obj.ww's hdrsize *u8 buffer at line 344 + 7 other runtime-N byte
buffers across the three files (path bufs, n+1 cstr copies, cap
realloc) stay deferred to #8.

Verified via 991_w6a_ww + 992_w6l_ww + 995_self_rebuild +
996_dyn_ww byte-identity. make test 132/132.
This commit is contained in:
2026-05-20 18:25:38 +09:00
parent 469ec85551
commit 104ba3cc0a
5 changed files with 62 additions and 84 deletions

View File

@@ -1313,9 +1313,7 @@ export fn intern(a: *asm_, name: str) *asym = {
if (streq(s.name, name)) { return s; };
s = s.snext;
};
let n: *asym = amalloc(a.a, 64u64): *asym;
n.name = name;
n.snext = a.syms;
let n: *asym = alloc(asym { name = name, snext = a.syms })!;
a.syms = n;
return n;
};
@@ -1516,15 +1514,9 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = {
// Append a fresh aprog to the list with given opcode and label.
fn addprog(a: *asm_, opc: i32, lbl: str) *aprog = {
let pr: *aprog = amalloc(a.a, 96u64): *aprog;
pr.as_ = opc;
pr.line = a.line;
pr.label = lbl;
pr.link = nil;
pr.bytes = nil;
pr.nbytes = 0u64;
pr.from = amalloc(a.a, 48u64): *aoperand;
pr.to = amalloc(a.a, 48u64): *aoperand;
let pr: *aprog = alloc(aprog { as_ = opc, line = a.line, label = lbl })!;
pr.from = alloc(aoperand { })!;
pr.to = alloc(aoperand { })!;
if (a.head == nil) { a.head = pr; }
else { a.tail.link = pr; };
a.tail = pr;

View File

@@ -163,9 +163,7 @@ export fn intern(a: *asm_, name: str) *asym = {
if (streq(s.name, name)) { return s; };
s = s.snext;
};
let n: *asym = amalloc(a.a, 64u64): *asym;
n.name = name;
n.snext = a.syms;
let n: *asym = alloc(asym { name = name, snext = a.syms })!;
a.syms = n;
return n;
};
@@ -366,15 +364,9 @@ fn parseoperand(a: *asm_, p: *u8, offin: u64, n: u64, out: *aoperand) u64 = {
// Append a fresh aprog to the list with given opcode and label.
fn addprog(a: *asm_, opc: i32, lbl: str) *aprog = {
let pr: *aprog = amalloc(a.a, 96u64): *aprog;
pr.as_ = opc;
pr.line = a.line;
pr.label = lbl;
pr.link = nil;
pr.bytes = nil;
pr.nbytes = 0u64;
pr.from = amalloc(a.a, 48u64): *aoperand;
pr.to = amalloc(a.a, 48u64): *aoperand;
let pr: *aprog = alloc(aprog { as_ = opc, line = a.line, label = lbl })!;
pr.from = alloc(aoperand { })!;
pr.to = alloc(aoperand { })!;
if (a.head == nil) { a.head = pr; }
else { a.tail.link = pr; };
a.tail = pr;

View File

@@ -1269,9 +1269,7 @@ fn elfglobals(a: *arena, buf: *u8, len: u64) *defent = {
let nmp: *u8 = strtab + (stname: u64);
if (nmp[0u64] != 0u8) {
let nm: str = cstrtostr(a, nmp);
let de: *defent = amalloc(a, 32u64): *defent;
de.name = nm;
de.dnext = head;
let de: *defent = alloc(defent { name = nm, dnext = head })!;
head = de;
};
};
@@ -1314,8 +1312,7 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
// Skip the symbol table ('/'), long-name table ('//'), and
// any padding entries (NUL or space leading byte).
if (first != 47u8) { if (first != 0u8) { if (first != 32u8) {
let m: *armember = amalloc(l.a, 48u64): *armember;
m.size = hdrsize;
let m: *armember = alloc(armember { size = hdrsize })!;
let mb: *u8 = amalloc(l.a, hdrsize): *u8;
let i: u64 = 0u64;
for (i < hdrsize) {
@@ -1324,8 +1321,6 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
};
m.data = mb;
m.defs = elfglobals(l.a, mb, hdrsize);
m.loaded = 0;
m.mnext = nil;
if (head == nil) { head = m; }
else { tail.mnext = m; };
tail = m;
@@ -1442,15 +1437,16 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
};
// Track this object.
let ob: *lobj = amalloc(l.a, 96u64): *lobj;
ob.path = cstrtostr(l.a, path);
ob.buf = buf;
ob.len = len;
ob.textoff = l.textlen;
ob.textsize = textsize;
ob.dataoff = l.datalen;
ob.datasize = datasize;
ob.onext = l.objs;
let ob: *lobj = alloc(lobj {
path = cstrtostr(l.a, path),
buf = buf,
len = len,
textoff = l.textlen,
textsize = textsize,
dataoff = l.datalen,
datasize = datasize,
onext = l.objs,
})!;
l.objs = ob;
// Append .text bytes to the combined image.
@@ -1524,11 +1520,13 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
let raddend: u64 = rdu64(buf, rp + RELA_ADDEND);
let rsymidx: u32 = (rinfo >> 32u64): u32;
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
let nr: *lrel = amalloc(l.a, 64u64): *lrel;
nr.off = ob.textoff + roff;
nr.section = 0;
nr.kind = rkind;
nr.addend = raddend: i64;
let nr: *lrel = alloc(lrel {
off = ob.textoff + roff,
section = 0,
kind = rkind,
addend = raddend: i64,
rnext = l.rels,
})!;
// Look up the referenced sym by name (re-walk symtab).
if ((rsymidx: u64) < nsyms) {
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
@@ -1539,7 +1537,6 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
nr.sym = intern(l, nm);
};
};
nr.rnext = l.rels;
l.rels = nr;
ri += 1u64;
};
@@ -1560,11 +1557,13 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
let raddend: u64 = rdu64(buf, rp + RELA_ADDEND);
let rsymidx: u32 = (rinfo >> 32u64): u32;
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
let nr: *lrel = amalloc(l.a, 64u64): *lrel;
nr.off = ob.dataoff + roff;
nr.section = 1;
nr.kind = rkind;
nr.addend = raddend: i64;
let nr: *lrel = alloc(lrel {
off = ob.dataoff + roff,
section = 1,
kind = rkind,
addend = raddend: i64,
rnext = l.rels,
})!;
if ((rsymidx: u64) < nsyms) {
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
let sname: u32 = rdu32(buf, sp + SYM_NAME);
@@ -1574,7 +1573,6 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
nr.sym = intern(l, nm);
};
};
nr.rnext = l.rels;
l.rels = nr;
ri += 1u64;
};
@@ -3080,8 +3078,7 @@ def BASE: u64 = 4194304u64; // 0x400000
def CODE_VA_OFF: u64 = 4096u64; // .text starts at base + 0x1000
fn mklnk(a: *arena) *lnk = {
let l: *lnk = amalloc(a, 144u64): *lnk;
l.a = a;
let l: *lnk = alloc(lnk { a = a })!;
return l;
};

View File

@@ -20,8 +20,7 @@ def BASE: u64 = 4194304u64; // 0x400000
def CODE_VA_OFF: u64 = 4096u64; // .text starts at base + 0x1000
fn mklnk(a: *arena) *lnk = {
let l: *lnk = amalloc(a, 144u64): *lnk;
l.a = a;
let l: *lnk = alloc(lnk { a = a })!;
return l;
};

View File

@@ -297,9 +297,7 @@ fn elfglobals(a: *arena, buf: *u8, len: u64) *defent = {
let nmp: *u8 = strtab + (stname: u64);
if (nmp[0u64] != 0u8) {
let nm: str = cstrtostr(a, nmp);
let de: *defent = amalloc(a, 32u64): *defent;
de.name = nm;
de.dnext = head;
let de: *defent = alloc(defent { name = nm, dnext = head })!;
head = de;
};
};
@@ -342,8 +340,7 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
// Skip the symbol table ('/'), long-name table ('//'), and
// any padding entries (NUL or space leading byte).
if (first != 47u8) { if (first != 0u8) { if (first != 32u8) {
let m: *armember = amalloc(l.a, 48u64): *armember;
m.size = hdrsize;
let m: *armember = alloc(armember { size = hdrsize })!;
let mb: *u8 = amalloc(l.a, hdrsize): *u8;
let i: u64 = 0u64;
for (i < hdrsize) {
@@ -352,8 +349,6 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
};
m.data = mb;
m.defs = elfglobals(l.a, mb, hdrsize);
m.loaded = 0;
m.mnext = nil;
if (head == nil) { head = m; }
else { tail.mnext = m; };
tail = m;
@@ -470,15 +465,16 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
};
// Track this object.
let ob: *lobj = amalloc(l.a, 96u64): *lobj;
ob.path = cstrtostr(l.a, path);
ob.buf = buf;
ob.len = len;
ob.textoff = l.textlen;
ob.textsize = textsize;
ob.dataoff = l.datalen;
ob.datasize = datasize;
ob.onext = l.objs;
let ob: *lobj = alloc(lobj {
path = cstrtostr(l.a, path),
buf = buf,
len = len,
textoff = l.textlen,
textsize = textsize,
dataoff = l.datalen,
datasize = datasize,
onext = l.objs,
})!;
l.objs = ob;
// Append .text bytes to the combined image.
@@ -552,11 +548,13 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
let raddend: u64 = rdu64(buf, rp + RELA_ADDEND);
let rsymidx: u32 = (rinfo >> 32u64): u32;
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
let nr: *lrel = amalloc(l.a, 64u64): *lrel;
nr.off = ob.textoff + roff;
nr.section = 0;
nr.kind = rkind;
nr.addend = raddend: i64;
let nr: *lrel = alloc(lrel {
off = ob.textoff + roff,
section = 0,
kind = rkind,
addend = raddend: i64,
rnext = l.rels,
})!;
// Look up the referenced sym by name (re-walk symtab).
if ((rsymidx: u64) < nsyms) {
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
@@ -567,7 +565,6 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
nr.sym = intern(l, nm);
};
};
nr.rnext = l.rels;
l.rels = nr;
ri += 1u64;
};
@@ -588,11 +585,13 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
let raddend: u64 = rdu64(buf, rp + RELA_ADDEND);
let rsymidx: u32 = (rinfo >> 32u64): u32;
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
let nr: *lrel = amalloc(l.a, 64u64): *lrel;
nr.off = ob.dataoff + roff;
nr.section = 1;
nr.kind = rkind;
nr.addend = raddend: i64;
let nr: *lrel = alloc(lrel {
off = ob.dataoff + roff,
section = 1,
kind = rkind,
addend = raddend: i64,
rnext = l.rels,
})!;
if ((rsymidx: u64) < nsyms) {
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
let sname: u32 = rdu32(buf, sp + SYM_NAME);
@@ -602,7 +601,6 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
nr.sym = intern(l, nm);
};
};
nr.rnext = l.rels;
l.rels = nr;
ri += 1u64;
};