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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user