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; };
|
if (streq(s.name, name)) { return s; };
|
||||||
s = s.snext;
|
s = s.snext;
|
||||||
};
|
};
|
||||||
let n: *asym = amalloc(a.a, 64u64): *asym;
|
let n: *asym = alloc(asym { name = name, snext = a.syms })!;
|
||||||
n.name = name;
|
|
||||||
n.snext = a.syms;
|
|
||||||
a.syms = n;
|
a.syms = n;
|
||||||
return 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.
|
// Append a fresh aprog to the list with given opcode and label.
|
||||||
fn addprog(a: *asm_, opc: i32, lbl: str) *aprog = {
|
fn addprog(a: *asm_, opc: i32, lbl: str) *aprog = {
|
||||||
let pr: *aprog = amalloc(a.a, 96u64): *aprog;
|
let pr: *aprog = alloc(aprog { as_ = opc, line = a.line, label = lbl })!;
|
||||||
pr.as_ = opc;
|
pr.from = alloc(aoperand { })!;
|
||||||
pr.line = a.line;
|
pr.to = alloc(aoperand { })!;
|
||||||
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;
|
|
||||||
if (a.head == nil) { a.head = pr; }
|
if (a.head == nil) { a.head = pr; }
|
||||||
else { a.tail.link = pr; };
|
else { a.tail.link = pr; };
|
||||||
a.tail = pr;
|
a.tail = pr;
|
||||||
|
|||||||
@@ -163,9 +163,7 @@ export fn intern(a: *asm_, name: str) *asym = {
|
|||||||
if (streq(s.name, name)) { return s; };
|
if (streq(s.name, name)) { return s; };
|
||||||
s = s.snext;
|
s = s.snext;
|
||||||
};
|
};
|
||||||
let n: *asym = amalloc(a.a, 64u64): *asym;
|
let n: *asym = alloc(asym { name = name, snext = a.syms })!;
|
||||||
n.name = name;
|
|
||||||
n.snext = a.syms;
|
|
||||||
a.syms = n;
|
a.syms = n;
|
||||||
return 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.
|
// Append a fresh aprog to the list with given opcode and label.
|
||||||
fn addprog(a: *asm_, opc: i32, lbl: str) *aprog = {
|
fn addprog(a: *asm_, opc: i32, lbl: str) *aprog = {
|
||||||
let pr: *aprog = amalloc(a.a, 96u64): *aprog;
|
let pr: *aprog = alloc(aprog { as_ = opc, line = a.line, label = lbl })!;
|
||||||
pr.as_ = opc;
|
pr.from = alloc(aoperand { })!;
|
||||||
pr.line = a.line;
|
pr.to = alloc(aoperand { })!;
|
||||||
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;
|
|
||||||
if (a.head == nil) { a.head = pr; }
|
if (a.head == nil) { a.head = pr; }
|
||||||
else { a.tail.link = pr; };
|
else { a.tail.link = pr; };
|
||||||
a.tail = pr;
|
a.tail = pr;
|
||||||
|
|||||||
@@ -1269,9 +1269,7 @@ fn elfglobals(a: *arena, buf: *u8, len: u64) *defent = {
|
|||||||
let nmp: *u8 = strtab + (stname: u64);
|
let nmp: *u8 = strtab + (stname: u64);
|
||||||
if (nmp[0u64] != 0u8) {
|
if (nmp[0u64] != 0u8) {
|
||||||
let nm: str = cstrtostr(a, nmp);
|
let nm: str = cstrtostr(a, nmp);
|
||||||
let de: *defent = amalloc(a, 32u64): *defent;
|
let de: *defent = alloc(defent { name = nm, dnext = head })!;
|
||||||
de.name = nm;
|
|
||||||
de.dnext = head;
|
|
||||||
head = de;
|
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
|
// Skip the symbol table ('/'), long-name table ('//'), and
|
||||||
// any padding entries (NUL or space leading byte).
|
// any padding entries (NUL or space leading byte).
|
||||||
if (first != 47u8) { if (first != 0u8) { if (first != 32u8) {
|
if (first != 47u8) { if (first != 0u8) { if (first != 32u8) {
|
||||||
let m: *armember = amalloc(l.a, 48u64): *armember;
|
let m: *armember = alloc(armember { size = hdrsize })!;
|
||||||
m.size = hdrsize;
|
|
||||||
let mb: *u8 = amalloc(l.a, hdrsize): *u8;
|
let mb: *u8 = amalloc(l.a, hdrsize): *u8;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < hdrsize) {
|
for (i < hdrsize) {
|
||||||
@@ -1324,8 +1321,6 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
|||||||
};
|
};
|
||||||
m.data = mb;
|
m.data = mb;
|
||||||
m.defs = elfglobals(l.a, mb, hdrsize);
|
m.defs = elfglobals(l.a, mb, hdrsize);
|
||||||
m.loaded = 0;
|
|
||||||
m.mnext = nil;
|
|
||||||
if (head == nil) { head = m; }
|
if (head == nil) { head = m; }
|
||||||
else { tail.mnext = m; };
|
else { tail.mnext = m; };
|
||||||
tail = m;
|
tail = m;
|
||||||
@@ -1442,15 +1437,16 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Track this object.
|
// Track this object.
|
||||||
let ob: *lobj = amalloc(l.a, 96u64): *lobj;
|
let ob: *lobj = alloc(lobj {
|
||||||
ob.path = cstrtostr(l.a, path);
|
path = cstrtostr(l.a, path),
|
||||||
ob.buf = buf;
|
buf = buf,
|
||||||
ob.len = len;
|
len = len,
|
||||||
ob.textoff = l.textlen;
|
textoff = l.textlen,
|
||||||
ob.textsize = textsize;
|
textsize = textsize,
|
||||||
ob.dataoff = l.datalen;
|
dataoff = l.datalen,
|
||||||
ob.datasize = datasize;
|
datasize = datasize,
|
||||||
ob.onext = l.objs;
|
onext = l.objs,
|
||||||
|
})!;
|
||||||
l.objs = ob;
|
l.objs = ob;
|
||||||
|
|
||||||
// Append .text bytes to the combined image.
|
// 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 raddend: u64 = rdu64(buf, rp + RELA_ADDEND);
|
||||||
let rsymidx: u32 = (rinfo >> 32u64): u32;
|
let rsymidx: u32 = (rinfo >> 32u64): u32;
|
||||||
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
|
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
|
||||||
let nr: *lrel = amalloc(l.a, 64u64): *lrel;
|
let nr: *lrel = alloc(lrel {
|
||||||
nr.off = ob.textoff + roff;
|
off = ob.textoff + roff,
|
||||||
nr.section = 0;
|
section = 0,
|
||||||
nr.kind = rkind;
|
kind = rkind,
|
||||||
nr.addend = raddend: i64;
|
addend = raddend: i64,
|
||||||
|
rnext = l.rels,
|
||||||
|
})!;
|
||||||
// Look up the referenced sym by name (re-walk symtab).
|
// Look up the referenced sym by name (re-walk symtab).
|
||||||
if ((rsymidx: u64) < nsyms) {
|
if ((rsymidx: u64) < nsyms) {
|
||||||
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
|
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.sym = intern(l, nm);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
nr.rnext = l.rels;
|
|
||||||
l.rels = nr;
|
l.rels = nr;
|
||||||
ri += 1u64;
|
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 raddend: u64 = rdu64(buf, rp + RELA_ADDEND);
|
||||||
let rsymidx: u32 = (rinfo >> 32u64): u32;
|
let rsymidx: u32 = (rinfo >> 32u64): u32;
|
||||||
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
|
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
|
||||||
let nr: *lrel = amalloc(l.a, 64u64): *lrel;
|
let nr: *lrel = alloc(lrel {
|
||||||
nr.off = ob.dataoff + roff;
|
off = ob.dataoff + roff,
|
||||||
nr.section = 1;
|
section = 1,
|
||||||
nr.kind = rkind;
|
kind = rkind,
|
||||||
nr.addend = raddend: i64;
|
addend = raddend: i64,
|
||||||
|
rnext = l.rels,
|
||||||
|
})!;
|
||||||
if ((rsymidx: u64) < nsyms) {
|
if ((rsymidx: u64) < nsyms) {
|
||||||
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
|
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
|
||||||
let sname: u32 = rdu32(buf, sp + SYM_NAME);
|
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.sym = intern(l, nm);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
nr.rnext = l.rels;
|
|
||||||
l.rels = nr;
|
l.rels = nr;
|
||||||
ri += 1u64;
|
ri += 1u64;
|
||||||
};
|
};
|
||||||
@@ -3080,8 +3078,7 @@ def BASE: u64 = 4194304u64; // 0x400000
|
|||||||
def CODE_VA_OFF: u64 = 4096u64; // .text starts at base + 0x1000
|
def CODE_VA_OFF: u64 = 4096u64; // .text starts at base + 0x1000
|
||||||
|
|
||||||
fn mklnk(a: *arena) *lnk = {
|
fn mklnk(a: *arena) *lnk = {
|
||||||
let l: *lnk = amalloc(a, 144u64): *lnk;
|
let l: *lnk = alloc(lnk { a = a })!;
|
||||||
l.a = a;
|
|
||||||
return l;
|
return l;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -20,8 +20,7 @@ def BASE: u64 = 4194304u64; // 0x400000
|
|||||||
def CODE_VA_OFF: u64 = 4096u64; // .text starts at base + 0x1000
|
def CODE_VA_OFF: u64 = 4096u64; // .text starts at base + 0x1000
|
||||||
|
|
||||||
fn mklnk(a: *arena) *lnk = {
|
fn mklnk(a: *arena) *lnk = {
|
||||||
let l: *lnk = amalloc(a, 144u64): *lnk;
|
let l: *lnk = alloc(lnk { a = a })!;
|
||||||
l.a = a;
|
|
||||||
return l;
|
return l;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -297,9 +297,7 @@ fn elfglobals(a: *arena, buf: *u8, len: u64) *defent = {
|
|||||||
let nmp: *u8 = strtab + (stname: u64);
|
let nmp: *u8 = strtab + (stname: u64);
|
||||||
if (nmp[0u64] != 0u8) {
|
if (nmp[0u64] != 0u8) {
|
||||||
let nm: str = cstrtostr(a, nmp);
|
let nm: str = cstrtostr(a, nmp);
|
||||||
let de: *defent = amalloc(a, 32u64): *defent;
|
let de: *defent = alloc(defent { name = nm, dnext = head })!;
|
||||||
de.name = nm;
|
|
||||||
de.dnext = head;
|
|
||||||
head = de;
|
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
|
// Skip the symbol table ('/'), long-name table ('//'), and
|
||||||
// any padding entries (NUL or space leading byte).
|
// any padding entries (NUL or space leading byte).
|
||||||
if (first != 47u8) { if (first != 0u8) { if (first != 32u8) {
|
if (first != 47u8) { if (first != 0u8) { if (first != 32u8) {
|
||||||
let m: *armember = amalloc(l.a, 48u64): *armember;
|
let m: *armember = alloc(armember { size = hdrsize })!;
|
||||||
m.size = hdrsize;
|
|
||||||
let mb: *u8 = amalloc(l.a, hdrsize): *u8;
|
let mb: *u8 = amalloc(l.a, hdrsize): *u8;
|
||||||
let i: u64 = 0u64;
|
let i: u64 = 0u64;
|
||||||
for (i < hdrsize) {
|
for (i < hdrsize) {
|
||||||
@@ -352,8 +349,6 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
|||||||
};
|
};
|
||||||
m.data = mb;
|
m.data = mb;
|
||||||
m.defs = elfglobals(l.a, mb, hdrsize);
|
m.defs = elfglobals(l.a, mb, hdrsize);
|
||||||
m.loaded = 0;
|
|
||||||
m.mnext = nil;
|
|
||||||
if (head == nil) { head = m; }
|
if (head == nil) { head = m; }
|
||||||
else { tail.mnext = m; };
|
else { tail.mnext = m; };
|
||||||
tail = m;
|
tail = m;
|
||||||
@@ -470,15 +465,16 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Track this object.
|
// Track this object.
|
||||||
let ob: *lobj = amalloc(l.a, 96u64): *lobj;
|
let ob: *lobj = alloc(lobj {
|
||||||
ob.path = cstrtostr(l.a, path);
|
path = cstrtostr(l.a, path),
|
||||||
ob.buf = buf;
|
buf = buf,
|
||||||
ob.len = len;
|
len = len,
|
||||||
ob.textoff = l.textlen;
|
textoff = l.textlen,
|
||||||
ob.textsize = textsize;
|
textsize = textsize,
|
||||||
ob.dataoff = l.datalen;
|
dataoff = l.datalen,
|
||||||
ob.datasize = datasize;
|
datasize = datasize,
|
||||||
ob.onext = l.objs;
|
onext = l.objs,
|
||||||
|
})!;
|
||||||
l.objs = ob;
|
l.objs = ob;
|
||||||
|
|
||||||
// Append .text bytes to the combined image.
|
// 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 raddend: u64 = rdu64(buf, rp + RELA_ADDEND);
|
||||||
let rsymidx: u32 = (rinfo >> 32u64): u32;
|
let rsymidx: u32 = (rinfo >> 32u64): u32;
|
||||||
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
|
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
|
||||||
let nr: *lrel = amalloc(l.a, 64u64): *lrel;
|
let nr: *lrel = alloc(lrel {
|
||||||
nr.off = ob.textoff + roff;
|
off = ob.textoff + roff,
|
||||||
nr.section = 0;
|
section = 0,
|
||||||
nr.kind = rkind;
|
kind = rkind,
|
||||||
nr.addend = raddend: i64;
|
addend = raddend: i64,
|
||||||
|
rnext = l.rels,
|
||||||
|
})!;
|
||||||
// Look up the referenced sym by name (re-walk symtab).
|
// Look up the referenced sym by name (re-walk symtab).
|
||||||
if ((rsymidx: u64) < nsyms) {
|
if ((rsymidx: u64) < nsyms) {
|
||||||
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
|
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.sym = intern(l, nm);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
nr.rnext = l.rels;
|
|
||||||
l.rels = nr;
|
l.rels = nr;
|
||||||
ri += 1u64;
|
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 raddend: u64 = rdu64(buf, rp + RELA_ADDEND);
|
||||||
let rsymidx: u32 = (rinfo >> 32u64): u32;
|
let rsymidx: u32 = (rinfo >> 32u64): u32;
|
||||||
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
|
let rkind: i32 = ((rinfo & 4294967295u64): u32): i32;
|
||||||
let nr: *lrel = amalloc(l.a, 64u64): *lrel;
|
let nr: *lrel = alloc(lrel {
|
||||||
nr.off = ob.dataoff + roff;
|
off = ob.dataoff + roff,
|
||||||
nr.section = 1;
|
section = 1,
|
||||||
nr.kind = rkind;
|
kind = rkind,
|
||||||
nr.addend = raddend: i64;
|
addend = raddend: i64,
|
||||||
|
rnext = l.rels,
|
||||||
|
})!;
|
||||||
if ((rsymidx: u64) < nsyms) {
|
if ((rsymidx: u64) < nsyms) {
|
||||||
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
|
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
|
||||||
let sname: u32 = rdu32(buf, sp + SYM_NAME);
|
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.sym = intern(l, nm);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
nr.rnext = l.rels;
|
|
||||||
l.rels = nr;
|
l.rels = nr;
|
||||||
ri += 1u64;
|
ri += 1u64;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user