selfhost: drop snake_case locals in dyn/dynout/obj + w6a + cgen + ww driver
This commit is contained in:
@@ -200,51 +200,51 @@ fn elfglobals(a: *arena, buf: *u8, len: u64) *defent = {
|
||||
let shnum: u32 = rdu16(buf, EHDR_SHNUM): u32;
|
||||
let shstrndx: u32 = rdu16(buf, EHDR_SHSTRNDX): u32;
|
||||
|
||||
let shstr_sh_off: u64 = rdu64(buf, shoff + (shstrndx: u64) * SHDR_SIZE + SHDR_OFFSET);
|
||||
let shstr: *u8 = buf + shstr_sh_off;
|
||||
let shstrshoff: u64 = rdu64(buf, shoff + (shstrndx: u64) * SHDR_SIZE + SHDR_OFFSET);
|
||||
let shstr: *u8 = buf + shstrshoff;
|
||||
|
||||
let idx_text: i32 = -1;
|
||||
let idx_symtab: i32 = -1;
|
||||
let idxtext: i32 = -1;
|
||||
let idxsymtab: i32 = -1;
|
||||
let i: u32 = 0u32;
|
||||
for (i < shnum) {
|
||||
let sh_off: u64 = shoff + (i: u64) * SHDR_SIZE;
|
||||
let sh_type: u32 = rdu32(buf, sh_off + SHDR_TYPE);
|
||||
let sh_name: u32 = rdu32(buf, sh_off + SHDR_NAME);
|
||||
let nm: *u8 = shstr + (sh_name: u64);
|
||||
if (sh_type == SHT_PROGBITS: u32) {
|
||||
if (cstreq(nm, ".text")) { idx_text = i: i32; };
|
||||
let secoff: u64 = shoff + (i: u64) * SHDR_SIZE;
|
||||
let shtype: u32 = rdu32(buf, secoff + SHDR_TYPE);
|
||||
let shname: u32 = rdu32(buf, secoff + SHDR_NAME);
|
||||
let nm: *u8 = shstr + (shname: u64);
|
||||
if (shtype == SHT_PROGBITS: u32) {
|
||||
if (cstreq(nm, ".text")) { idxtext = i: i32; };
|
||||
};
|
||||
if (sh_type == SHT_SYMTAB: u32) { idx_symtab = i: i32; };
|
||||
if (shtype == SHT_SYMTAB: u32) { idxsymtab = i: i32; };
|
||||
i += 1u32;
|
||||
};
|
||||
if (idx_text < 0) { return nil; };
|
||||
if (idx_symtab < 0) { return nil; };
|
||||
if (idxtext < 0) { return nil; };
|
||||
if (idxsymtab < 0) { return nil; };
|
||||
|
||||
let sym_sh: u64 = shoff + (idx_symtab: u64) * SHDR_SIZE;
|
||||
let sym_off: u64 = rdu64(buf, sym_sh + SHDR_OFFSET);
|
||||
let sym_size: u64 = rdu64(buf, sym_sh + SHDR_SIZE_F);
|
||||
let sym_link: u32 = rdu32(buf, sym_sh + SHDR_LINK);
|
||||
let nsyms: u64 = sym_size / SYM_SIZE;
|
||||
let symsh: u64 = shoff + (idxsymtab: u64) * SHDR_SIZE;
|
||||
let symoff: u64 = rdu64(buf, symsh + SHDR_OFFSET);
|
||||
let symsize: u64 = rdu64(buf, symsh + SHDR_SIZE_F);
|
||||
let symlink: u32 = rdu32(buf, symsh + SHDR_LINK);
|
||||
let nsyms: u64 = symsize / SYM_SIZE;
|
||||
|
||||
let str_sh: u64 = shoff + (sym_link: u64) * SHDR_SIZE;
|
||||
let str_off: u64 = rdu64(buf, str_sh + SHDR_OFFSET);
|
||||
let strtab: *u8 = buf + str_off;
|
||||
let strsh: u64 = shoff + (symlink: u64) * SHDR_SIZE;
|
||||
let stroff: u64 = rdu64(buf, strsh + SHDR_OFFSET);
|
||||
let strtab: *u8 = buf + stroff;
|
||||
|
||||
let head: *defent = nil;
|
||||
let si: u64 = 1u64;
|
||||
for (si < nsyms) {
|
||||
let sym_p: u64 = sym_off + si * SYM_SIZE;
|
||||
let st_name: u32 = rdu32(buf, sym_p + SYM_NAME);
|
||||
let st_info: u8 = buf[sym_p + SYM_INFO];
|
||||
let st_shndx: u16 = rdu16(buf, sym_p + SYM_SHNDX);
|
||||
let bind: u32 = (st_info: u32) >> 4u32;
|
||||
let symp: u64 = symoff + si * SYM_SIZE;
|
||||
let stname: u32 = rdu32(buf, symp + SYM_NAME);
|
||||
let stinfo: u8 = buf[symp + SYM_INFO];
|
||||
let stshndx: u16 = rdu16(buf, symp + SYM_SHNDX);
|
||||
let bind: u32 = (stinfo: u32) >> 4u32;
|
||||
// STB_GLOBAL = 1; defined in .text.
|
||||
if (bind == 1u32) {
|
||||
if (st_shndx != 0u16) {
|
||||
if ((st_shndx: i32) == idx_text) {
|
||||
let nm_p: *u8 = strtab + (st_name: u64);
|
||||
if (nm_p[0u64] != 0u8) {
|
||||
let nm: str = cstrtostr(a, nm_p);
|
||||
if (stshndx != 0u16) {
|
||||
if ((stshndx: i32) == idxtext) {
|
||||
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;
|
||||
@@ -283,31 +283,31 @@ fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
||||
let tail: *armember = nil;
|
||||
let pos: u64 = 8u64; // past "!<arch>\n"
|
||||
for (pos + 60u64 <= len) {
|
||||
let hdr_size: u64 = arfield(buf + pos + 48u64, 10u64);
|
||||
let hdr_end: u64 = pos + 60u64;
|
||||
if (hdr_end + hdr_size > len) { break; };
|
||||
let hdrsize: u64 = arfield(buf + pos + 48u64, 10u64);
|
||||
let hdrend: u64 = pos + 60u64;
|
||||
if (hdrend + hdrsize > len) { break; };
|
||||
let first: u8 = buf[pos];
|
||||
// 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 = hdr_size;
|
||||
let mb: *u8 = amalloc(l.a, hdr_size): *u8;
|
||||
m.size = hdrsize;
|
||||
let mb: *u8 = amalloc(l.a, hdrsize): *u8;
|
||||
let i: u64 = 0u64;
|
||||
for (i < hdr_size) {
|
||||
mb[i] = buf[hdr_end + i];
|
||||
for (i < hdrsize) {
|
||||
mb[i] = buf[hdrend + i];
|
||||
i += 1u64;
|
||||
};
|
||||
m.data = mb;
|
||||
m.defs = elfglobals(l.a, mb, hdr_size);
|
||||
m.defs = elfglobals(l.a, mb, hdrsize);
|
||||
m.loaded = 0;
|
||||
m.mnext = nil;
|
||||
if (head == nil) { head = m; }
|
||||
else { tail.mnext = m; };
|
||||
tail = m;
|
||||
}; }; };
|
||||
pos = hdr_end + hdr_size;
|
||||
if ((hdr_size & 1u64) != 0u64) { pos = pos + 1u64; };
|
||||
pos = hdrend + hdrsize;
|
||||
if ((hdrsize & 1u64) != 0u64) { pos = pos + 1u64; };
|
||||
};
|
||||
|
||||
let changed: i32 = 1;
|
||||
@@ -360,50 +360,50 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
||||
let shnum: u32 = rdu16(buf, EHDR_SHNUM): u32;
|
||||
let shstrndx: u32 = rdu16(buf, EHDR_SHSTRNDX): u32;
|
||||
|
||||
let shstr_sh_off: u64 = rdu64(buf, shoff + (shstrndx: u64) * SHDR_SIZE + SHDR_OFFSET);
|
||||
let shstr: *u8 = buf + shstr_sh_off;
|
||||
let shstrshoff: u64 = rdu64(buf, shoff + (shstrndx: u64) * SHDR_SIZE + SHDR_OFFSET);
|
||||
let shstr: *u8 = buf + shstrshoff;
|
||||
|
||||
// find .text, .symtab, .rela.text
|
||||
let idx_text: i32 = -1;
|
||||
let idx_symtab: i32 = -1;
|
||||
let idx_rela: i32 = -1;
|
||||
let idxtext: i32 = -1;
|
||||
let idxsymtab: i32 = -1;
|
||||
let idxrela: i32 = -1;
|
||||
let i: u32 = 0u32;
|
||||
for (i < shnum) {
|
||||
let sh_off: u64 = shoff + (i: u64) * SHDR_SIZE;
|
||||
let sh_type: u32 = rdu32(buf, sh_off + SHDR_TYPE);
|
||||
let sh_name: u32 = rdu32(buf, sh_off + SHDR_NAME);
|
||||
let nm: *u8 = shstr + (sh_name: u64);
|
||||
if (sh_type == SHT_PROGBITS: u32) {
|
||||
if (cstreq(nm, ".text")) { idx_text = i: i32; };
|
||||
let secoff: u64 = shoff + (i: u64) * SHDR_SIZE;
|
||||
let shtype: u32 = rdu32(buf, secoff + SHDR_TYPE);
|
||||
let shname: u32 = rdu32(buf, secoff + SHDR_NAME);
|
||||
let nm: *u8 = shstr + (shname: u64);
|
||||
if (shtype == SHT_PROGBITS: u32) {
|
||||
if (cstreq(nm, ".text")) { idxtext = i: i32; };
|
||||
};
|
||||
if (sh_type == SHT_SYMTAB: u32) { idx_symtab = i: i32; };
|
||||
if (sh_type == SHT_RELA: u32) {
|
||||
if (cstreq(nm, ".rela.text")) { idx_rela = i: i32; };
|
||||
if (shtype == SHT_SYMTAB: u32) { idxsymtab = i: i32; };
|
||||
if (shtype == SHT_RELA: u32) {
|
||||
if (cstreq(nm, ".rela.text")) { idxrela = i: i32; };
|
||||
};
|
||||
i += 1u32;
|
||||
};
|
||||
if (idx_text < 0) {
|
||||
if (idxtext < 0) {
|
||||
os.write(2, "w6l: missing .text\n".ptr, 18u64);
|
||||
return -1;
|
||||
};
|
||||
if (idx_symtab < 0) {
|
||||
if (idxsymtab < 0) {
|
||||
os.write(2, "w6l: missing .symtab\n".ptr, 20u64);
|
||||
return -1;
|
||||
};
|
||||
|
||||
let text_sh: u64 = shoff + (idx_text: u64) * SHDR_SIZE;
|
||||
let text_off: u64 = rdu64(buf, text_sh + SHDR_OFFSET);
|
||||
let text_size: u64 = rdu64(buf, text_sh + SHDR_SIZE_F);
|
||||
let textsh: u64 = shoff + (idxtext: u64) * SHDR_SIZE;
|
||||
let textoff: u64 = rdu64(buf, textsh + SHDR_OFFSET);
|
||||
let textsize: u64 = rdu64(buf, textsh + SHDR_SIZE_F);
|
||||
|
||||
let sym_sh: u64 = shoff + (idx_symtab: u64) * SHDR_SIZE;
|
||||
let sym_off: u64 = rdu64(buf, sym_sh + SHDR_OFFSET);
|
||||
let sym_size: u64 = rdu64(buf, sym_sh + SHDR_SIZE_F);
|
||||
let sym_link: u32 = rdu32(buf, sym_sh + SHDR_LINK);
|
||||
let nsyms: u64 = sym_size / SYM_SIZE;
|
||||
let symsh: u64 = shoff + (idxsymtab: u64) * SHDR_SIZE;
|
||||
let symoff: u64 = rdu64(buf, symsh + SHDR_OFFSET);
|
||||
let symsize: u64 = rdu64(buf, symsh + SHDR_SIZE_F);
|
||||
let symlink: u32 = rdu32(buf, symsh + SHDR_LINK);
|
||||
let nsyms: u64 = symsize / SYM_SIZE;
|
||||
|
||||
let str_sh: u64 = shoff + (sym_link: u64) * SHDR_SIZE;
|
||||
let str_off: u64 = rdu64(buf, str_sh + SHDR_OFFSET);
|
||||
let strtab: *u8 = buf + str_off;
|
||||
let strsh: u64 = shoff + (symlink: u64) * SHDR_SIZE;
|
||||
let stroff: u64 = rdu64(buf, strsh + SHDR_OFFSET);
|
||||
let strtab: *u8 = buf + stroff;
|
||||
|
||||
// Track this object.
|
||||
let ob: *lobj = amalloc(l.a, 64u64): *lobj;
|
||||
@@ -411,28 +411,28 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
||||
ob.buf = buf;
|
||||
ob.len = len;
|
||||
ob.textoff = l.textlen;
|
||||
ob.textsize = text_size;
|
||||
ob.textsize = textsize;
|
||||
ob.onext = l.objs;
|
||||
l.objs = ob;
|
||||
|
||||
// Append .text bytes to the combined image.
|
||||
emittext(l, buf + text_off, text_size);
|
||||
emittext(l, buf + textoff, textsize);
|
||||
|
||||
// Walk symbols. We don't keep a per-object map[] of *lsym. Instead
|
||||
// the reloc loop re-walks symtab and re-interns by name. Simpler
|
||||
// than dancing around the cgen's u64-shift gaps.
|
||||
let si: u64 = 1u64; // skip index 0 (always undef sentinel)
|
||||
for (si < nsyms) {
|
||||
let sym_p: u64 = sym_off + si * SYM_SIZE;
|
||||
let st_name: u32 = rdu32(buf, sym_p + SYM_NAME);
|
||||
let st_shndx: u16 = rdu16(buf, sym_p + SYM_SHNDX);
|
||||
let st_value: u64 = rdu64(buf, sym_p + SYM_VALUE);
|
||||
let nm_p: *u8 = strtab + (st_name: u64);
|
||||
if (nm_p[0u64] != 0u8) {
|
||||
let nm: str = cstrtostr(l.a, nm_p);
|
||||
let symp: u64 = symoff + si * SYM_SIZE;
|
||||
let stname: u32 = rdu32(buf, symp + SYM_NAME);
|
||||
let stshndx: u16 = rdu16(buf, symp + SYM_SHNDX);
|
||||
let stvalue: u64 = rdu64(buf, symp + SYM_VALUE);
|
||||
let nmp: *u8 = strtab + (stname: u64);
|
||||
if (nmp[0u64] != 0u8) {
|
||||
let nm: str = cstrtostr(l.a, nmp);
|
||||
let gs: *lsym = intern(l, nm);
|
||||
if (st_shndx != 0u16) {
|
||||
if ((st_shndx: i32) == idx_text) {
|
||||
if (stshndx != 0u16) {
|
||||
if ((stshndx: i32) == idxtext) {
|
||||
if (gs.defined != 0) {
|
||||
os.write(2, "w6l: duplicate symbol\n".ptr, 21u64);
|
||||
l.errs += 1;
|
||||
@@ -440,7 +440,7 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
||||
gs.defined = 1;
|
||||
gs.owner = ob;
|
||||
gs.idxinowner = si: i32;
|
||||
gs.val = ob.textoff + st_value;
|
||||
gs.val = ob.textoff + stvalue;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -449,30 +449,30 @@ fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
||||
};
|
||||
|
||||
// Per-object relocation collection.
|
||||
if (idx_rela >= 0) {
|
||||
let rela_sh: u64 = shoff + (idx_rela: u64) * SHDR_SIZE;
|
||||
let rela_off: u64 = rdu64(buf, rela_sh + SHDR_OFFSET);
|
||||
let rela_size: u64 = rdu64(buf, rela_sh + SHDR_SIZE_F);
|
||||
let nrel: u64 = rela_size / RELA_SIZE;
|
||||
if (idxrela >= 0) {
|
||||
let relash: u64 = shoff + (idxrela: u64) * SHDR_SIZE;
|
||||
let relaoff: u64 = rdu64(buf, relash + SHDR_OFFSET);
|
||||
let relasize: u64 = rdu64(buf, relash + SHDR_SIZE_F);
|
||||
let nrel: u64 = relasize / RELA_SIZE;
|
||||
let ri: u64 = 0u64;
|
||||
for (ri < nrel) {
|
||||
let rp: u64 = rela_off + ri * RELA_SIZE;
|
||||
let r_off: u64 = rdu64(buf, rp + RELA_OFFSET);
|
||||
let r_info: u64 = rdu64(buf, rp + RELA_INFO);
|
||||
let r_addend: u64 = rdu64(buf, rp + RELA_ADDEND);
|
||||
let r_sym_idx: u32 = (r_info >> 32u64): u32;
|
||||
let r_kind: i32 = ((r_info & 4294967295u64): u32): i32;
|
||||
let rp: u64 = relaoff + ri * RELA_SIZE;
|
||||
let roff: u64 = rdu64(buf, rp + RELA_OFFSET);
|
||||
let rinfo: u64 = rdu64(buf, rp + RELA_INFO);
|
||||
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, 48u64): *lrel;
|
||||
nr.off = ob.textoff + r_off;
|
||||
nr.kind = r_kind;
|
||||
nr.addend = r_addend: i64;
|
||||
nr.off = ob.textoff + roff;
|
||||
nr.kind = rkind;
|
||||
nr.addend = raddend: i64;
|
||||
// Look up the referenced sym by name (re-walk symtab).
|
||||
if ((r_sym_idx: u64) < nsyms) {
|
||||
let s_p: u64 = sym_off + (r_sym_idx: u64) * SYM_SIZE;
|
||||
let s_name: u32 = rdu32(buf, s_p + SYM_NAME);
|
||||
let s_nm: *u8 = strtab + (s_name: u64);
|
||||
if (s_nm[0u64] != 0u8) {
|
||||
let nm: str = cstrtostr(l.a, s_nm);
|
||||
if ((rsymidx: u64) < nsyms) {
|
||||
let sp: u64 = symoff + (rsymidx: u64) * SYM_SIZE;
|
||||
let sname: u32 = rdu32(buf, sp + SYM_NAME);
|
||||
let snm: *u8 = strtab + (sname: u64);
|
||||
if (snm[0u64] != 0u8) {
|
||||
let nm: str = cstrtostr(l.a, snm);
|
||||
nr.sym = intern(l, nm);
|
||||
};
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user