diff --git a/selfhost/cmd/w6a/main.combined.ww b/selfhost/cmd/w6a/main.combined.ww index 86b75d32..ed8cb8d0 100644 --- a/selfhost/cmd/w6a/main.combined.ww +++ b/selfhost/cmd/w6a/main.combined.ww @@ -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; diff --git a/selfhost/cmd/w6a/parse.ww b/selfhost/cmd/w6a/parse.ww index 796b763e..64af80a9 100644 --- a/selfhost/cmd/w6a/parse.ww +++ b/selfhost/cmd/w6a/parse.ww @@ -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; diff --git a/selfhost/cmd/w6l/main.combined.ww b/selfhost/cmd/w6l/main.combined.ww index 4d705566..dacadd86 100644 --- a/selfhost/cmd/w6l/main.combined.ww +++ b/selfhost/cmd/w6l/main.combined.ww @@ -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; }; diff --git a/selfhost/cmd/w6l/main.ww b/selfhost/cmd/w6l/main.ww index 894af6f9..13cb7af9 100644 --- a/selfhost/cmd/w6l/main.ww +++ b/selfhost/cmd/w6l/main.ww @@ -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; }; diff --git a/selfhost/cmd/w6l/obj.ww b/selfhost/cmd/w6l/obj.ww index 4c895d2f..86a53d3a 100644 --- a/selfhost/cmd/w6l/obj.ww +++ b/selfhost/cmd/w6l/obj.ww @@ -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; };