selfhost/cmd/w6l: drop d_/rd_/wr_ prefixes on dyn/dynout/obj helpers

This commit is contained in:
2026-05-11 14:40:05 +09:00
parent fc09320eb7
commit 5d91ee778e
4 changed files with 510 additions and 510 deletions

View File

@@ -71,13 +71,13 @@ def VA_NEXT: u64 = 4u64;
// ---- little-endian byte readers ---------------------------------------
fn d_u16(p: *u8, off: u64) u16 = {
fn du16(p: *u8, off: u64) u16 = {
let b0: u16 = p[off]: u16;
let b1: u16 = p[off + 1u64]: u16;
return b0 | (b1 << 8u16);
};
fn d_u32(p: *u8, off: u64) u32 = {
fn du32(p: *u8, off: u64) u32 = {
let b0: u32 = p[off]: u32;
let b1: u32 = p[off + 1u64]: u32;
let b2: u32 = p[off + 2u64]: u32;
@@ -85,32 +85,32 @@ fn d_u32(p: *u8, off: u64) u32 = {
return b0 | (b1 << 8u32) | (b2 << 16u32) | (b3 << 24u32);
};
fn d_u64(p: *u8, off: u64) u64 = {
let lo: u64 = d_u32(p, off): u64;
let hi: u64 = d_u32(p, off + 4u64): u64;
fn du64(p: *u8, off: u64) u64 = {
let lo: u64 = du32(p, off): u64;
let hi: u64 = du32(p, off + 4u64): u64;
return lo | (hi << 32u64);
};
fn d_i64(p: *u8, off: u64) i64 = {
return d_u64(p, off): i64;
fn di64(p: *u8, off: u64) i64 = {
return du64(p, off): i64;
};
// ---- C-string helpers --------------------------------------------------
fn d_cstrlen(p: *u8) u64 = {
fn dcstrlen(p: *u8) u64 = {
let n: u64 = 0u64;
for (p[n] != 0u8) { n += 1u64; };
return n;
};
fn d_cstr_to_str(a: *arena, p: *u8) str = {
let n: u64 = d_cstrlen(p);
fn dcstrtostr(a: *arena, p: *u8) str = {
let n: u64 = dcstrlen(p);
return astrndup(a, p, n);
};
// basename: scan for last '/' and return pointer past it.
fn d_basename(p: *u8) *u8 = {
let n: u64 = d_cstrlen(p);
fn dbasename(p: *u8) *u8 = {
let n: u64 = dcstrlen(p);
let i: u64 = n;
for (i > 0u64) {
i -= 1u64;
@@ -146,12 +146,12 @@ fn vdnameat(buf: *u8, verdef_off: u64, verdef_size: u64,
let off: u64 = 0u64;
for (off < verdef_size) {
let vd_p: u64 = verdef_off + off;
let vd_ndx: u16 = d_u16(buf, vd_p + VD_NDX);
let vd_aux: u32 = d_u32(buf, vd_p + VD_AUX);
let vd_next: u32 = d_u32(buf, vd_p + VD_NEXT);
let vd_ndx: u16 = du16(buf, vd_p + VD_NDX);
let vd_aux: u32 = du32(buf, vd_p + VD_AUX);
let vd_next: u32 = du32(buf, vd_p + VD_NEXT);
if (vd_ndx == ndx) {
let aux_p: u64 = vd_p + (vd_aux: u64);
let vda_name: u32 = d_u32(buf, aux_p + VA_NAME);
let vda_name: u32 = du32(buf, aux_p + VA_NAME);
return verstr + (vda_name: u64);
};
if (vd_next == 0u32) { return nil; };
@@ -179,15 +179,15 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
if (buf[2u64] != 76u8) { return soerr("not ELF"); };
if (buf[3u64] != 70u8) { return soerr("not ELF"); };
if (buf[4u64] != 2u8) { return soerr("not ELFCLASS64"); };
if (d_u16(buf, EH_EMACHINE) != EM_X86_64_SO) {
if (du16(buf, EH_EMACHINE) != EM_X86_64_SO) {
return soerr("not amd64");
};
if (d_u16(buf, EH_ETYPE) != ET_DYN_SO) {
if (du16(buf, EH_ETYPE) != ET_DYN_SO) {
return soerr("not ET_DYN");
};
let shoff: u64 = d_u64(buf, EH_SHOFF);
let shnum: u32 = d_u16(buf, EH_SHNUM): u32;
let shoff: u64 = du64(buf, EH_SHOFF);
let shnum: u32 = du16(buf, EH_SHNUM): u32;
if (shoff == 0u64) { return soerr("stripped .so unsupported"); };
if (shnum == 0u32) { return soerr("stripped .so unsupported"); };
@@ -199,7 +199,7 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
let i: u32 = 0u32;
for (i < shnum) {
let sh_p: u64 = shoff + (i: u64) * SH_SIZE;
let sh_type: u32 = d_u32(buf, sh_p + SH_TYPE);
let sh_type: u32 = du32(buf, sh_p + SH_TYPE);
if (sh_type == SHT_DYNSYM) { idx_dynsym = i: i32; };
if (sh_type == SHT_DYNAMIC) { idx_dynamic = i: i32; };
if (sh_type == SHT_GNU_VERSYM) { idx_versym = i: i32; };
@@ -211,13 +211,13 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
};
let dynsym_sh: u64 = shoff + (idx_dynsym: u64) * SH_SIZE;
let dynsym_off: u64 = d_u64(buf, dynsym_sh + SH_OFFSET);
let dynsym_size: u64 = d_u64(buf, dynsym_sh + SH_SIZE_F);
let dynsym_link: u32 = d_u32(buf, dynsym_sh + SH_LINK);
let dynsym_off: u64 = du64(buf, dynsym_sh + SH_OFFSET);
let dynsym_size: u64 = du64(buf, dynsym_sh + SH_SIZE_F);
let dynsym_link: u32 = du32(buf, dynsym_sh + SH_LINK);
let nsyms: u64 = dynsym_size / SY_SIZE;
let dynstr_sh: u64 = shoff + (dynsym_link: u64) * SH_SIZE;
let dynstr_off: u64 = d_u64(buf, dynstr_sh + SH_OFFSET);
let dynstr_off: u64 = du64(buf, dynstr_sh + SH_OFFSET);
let dynstr: *u8 = buf + dynstr_off;
// SONAME: .dynamic strings live in the section pointed at by its
@@ -225,22 +225,22 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
let soname_cs: *u8 = nil;
if (idx_dynamic >= 0) {
let dyn_sh: u64 = shoff + (idx_dynamic: u64) * SH_SIZE;
let dyn_off: u64 = d_u64(buf, dyn_sh + SH_OFFSET);
let dyn_size: u64 = d_u64(buf, dyn_sh + SH_SIZE_F);
let dyn_link: u32 = d_u32(buf, dyn_sh + SH_LINK);
let dyn_off: u64 = du64(buf, dyn_sh + SH_OFFSET);
let dyn_size: u64 = du64(buf, dyn_sh + SH_SIZE_F);
let dyn_link: u32 = du32(buf, dyn_sh + SH_LINK);
let dstr_sh: u64 = shoff + (dyn_link: u64) * SH_SIZE;
let dstr_off: u64 = d_u64(buf, dstr_sh + SH_OFFSET);
let dstr_off: u64 = du64(buf, dstr_sh + SH_OFFSET);
let dstr: *u8 = buf + dstr_off;
let nd: u64 = dyn_size / DY_SIZE;
let di: u64 = 0u64;
for (di < nd) {
let d_p: u64 = dyn_off + di * DY_SIZE;
let d_tag: i64 = d_i64(buf, d_p + DY_TAG);
let d_tag: i64 = di64(buf, d_p + DY_TAG);
if (d_tag == DT_NULL_TAG) {
di = nd; // break
} else {
if (d_tag == DT_SONAME_TAG) {
let d_val: u64 = d_u64(buf, d_p + DY_VAL);
let d_val: u64 = du64(buf, d_p + DY_VAL);
soname_cs = dstr + d_val;
di = nd; // break
} else {
@@ -250,7 +250,7 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
};
};
if (soname_cs == nil) {
soname_cs = d_basename(path);
soname_cs = dbasename(path);
};
// Versym is one u16 per dynsym entry.
@@ -258,7 +258,7 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
let has_versym: i32 = 0;
if (idx_versym >= 0) {
let vs_sh: u64 = shoff + (idx_versym: u64) * SH_SIZE;
versym_off = d_u64(buf, vs_sh + SH_OFFSET);
versym_off = du64(buf, vs_sh + SH_OFFSET);
has_versym = 1;
};
@@ -268,26 +268,26 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
let verstr: *u8 = nil;
if (idx_verdef >= 0) {
let vd_sh: u64 = shoff + (idx_verdef: u64) * SH_SIZE;
verdef_off = d_u64(buf, vd_sh + SH_OFFSET);
verdef_size = d_u64(buf, vd_sh + SH_SIZE_F);
let vd_link: u32 = d_u32(buf, vd_sh + SH_LINK);
verdef_off = du64(buf, vd_sh + SH_OFFSET);
verdef_size = du64(buf, vd_sh + SH_SIZE_F);
let vd_link: u32 = du32(buf, vd_sh + SH_LINK);
let vstr_sh: u64 = shoff + (vd_link: u64) * SH_SIZE;
let vstr_off: u64 = d_u64(buf, vstr_sh + SH_OFFSET);
let vstr_off: u64 = du64(buf, vstr_sh + SH_OFFSET);
verstr = buf + vstr_off;
};
// Build the lso. Exports are appended in dynsym order so
// soprovides_v's first-match semantics match the C version.
let so: *lso = amalloc(l.a, 64u64): *lso;
so.path = d_cstr_to_str(l.a, path);
so.soname = d_cstr_to_str(l.a, soname_cs);
so.path = dcstrtostr(l.a, path);
so.soname = dcstrtostr(l.a, soname_cs);
so.exports = nil;
let tail: *lexport = nil;
let si: u64 = 1u64;
for (si < nsyms) {
let s_p: u64 = dynsym_off + si * SY_SIZE;
let st_shndx: u16 = d_u16(buf, s_p + SY_SHNDX);
let st_shndx: u16 = du16(buf, s_p + SY_SHNDX);
if (st_shndx == 0u16) { si += 1u64; } else {
let st_info: u8 = buf[s_p + SY_INFO];
let bind: u32 = (st_info: u32) >> 4u32;
@@ -296,7 +296,7 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
si += 1u64;
continue;
}; };
let st_name: u32 = d_u32(buf, s_p + SY_NAME);
let st_name: u32 = du32(buf, s_p + SY_NAME);
let nm_p: *u8 = dynstr + (st_name: u64);
if (nm_p[0u64] == 0u8) {
si += 1u64;
@@ -308,7 +308,7 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
let vername_cs: *u8 = nil;
let keep: i32 = 1;
if (has_versym != 0) {
let v: u16 = d_u16(buf, versym_off + si * 2u64);
let v: u16 = du16(buf, versym_off + si * 2u64);
if ((v & VERSYM_HIDDEN_C) != 0u16) {
keep = 0; // non-default
} else {
@@ -334,12 +334,12 @@ export fn loadso(l: *lnk, path: *u8) i32 = {
if (keep != 0) {
let e: *lexport = amalloc(l.a, 48u64): *lexport;
e.name = d_cstr_to_str(l.a, nm_p);
e.name = dcstrtostr(l.a, nm_p);
if (vername_cs == nil) {
e.version.ptr = nil;
e.version.len = 0i32;
} else {
e.version = d_cstr_to_str(l.a, vername_cs);
e.version = dcstrtostr(l.a, vername_cs);
};
e.enext = nil;
if (tail == nil) {