selfhost/cmd/w6l: drop l_* prefix from exports + snake fields/helpers

This commit is contained in:
2026-05-11 14:34:11 +09:00
parent f250bcfb3a
commit fce0a54d62
8 changed files with 334 additions and 370 deletions

View File

@@ -23,10 +23,10 @@
// [dynamic_off] .dynamic (writable; covered by PT_DYNAMIC)
//
// cgen workaround notes:
// - Two-level field assignments through pointers (e.g. r.sym.is_dyn = 1)
// - Two-level field assignments through pointers (e.g. r.sym.isdyn = 1)
// silently fail in the current wwstage cgen. We bind the inner
// pointer to a local first: `let sym = r.sym; sym.is_dyn = 1;`
// - Tuple returns of (i32, str) drop the str payload. l_so_version
// pointer to a local first: `let sym = r.sym; sym.isdyn = 1;`
// - Tuple returns of (i32, str) drop the str payload. soversion
// returns a plain str instead.
// - `def NAME: str = "...";` produces a bogus str (len ends up adding
// to an offset accumulator). We use a fn returning the literal.
@@ -175,19 +175,19 @@ fn str_eq_d(a: str, b: str) bool = {
// ---- main entry --------------------------------------------------------
export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
let a: *arena = l.a;
let n: i32 = l.dyn_n;
let n: i32 = l.dynn;
let nu: u64 = n: u64;
// ---- collect dyn syms into a plt_idx-indexed array ----
let dynsyms: **lsym = amalloc(a, nu * 8u64): **lsym;
let s: *lsym = l.syms;
for (s != nil) {
if (s.is_dyn != 0) {
if (s.plt_idx >= 0) {
if (s.plt_idx < n) {
dynsyms[s.plt_idx] = s;
if (s.isdyn != 0) {
if (s.pltidx >= 0) {
if (s.pltidx < n) {
dynsyms[s.pltidx] = s;
};
};
};
@@ -214,7 +214,7 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
let j: i32 = 0;
for (j < n) {
let dsm: *lsym = dynsyms[j];
let dl: *lso = dsm.dyn_lib;
let dl: *lso = dsm.dynlib;
if (dl == so) { used = 1; j = n; }
else { j += 1; };
};
@@ -254,10 +254,10 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
let j: i32 = 0;
for (j < n) {
let dsm: *lsym = dynsyms[j];
let dl: *lso = dsm.dyn_lib;
let dl: *lso = dsm.dynlib;
if (dl == cur_so) {
let nm0: str = dsm.name;
let dv: str = l_so_version(cur_so, nm0);
let dv: str = soversion(cur_so, nm0);
if (dv.len > 0) {
has = 1; j = n;
} else { j += 1; };
@@ -270,10 +270,10 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
let jj: i32 = 0;
for (jj < n) {
let dsm2: *lsym = dynsyms[jj];
let dl2: *lso = dsm2.dyn_lib;
let dl2: *lso = dsm2.dynlib;
if (dl2 == cur_so) {
let nm2: str = dsm2.name;
let vname: str = l_so_version(cur_so, nm2);
let vname: str = soversion(cur_so, nm2);
if (vname.len > 0) {
let seen: i32 = 0;
let k: i32 = 0;
@@ -387,9 +387,9 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
pi = 0;
for (pi < n) {
let dsm3: *lsym = dynsyms[pi];
let dl3: *lso = dsm3.dyn_lib;
let dl3: *lso = dsm3.dynlib;
let nm3: str = dsm3.name;
let vname: str = l_so_version(dl3, nm3);
let vname: str = soversion(dl3, nm3);
if (vname.len == 0) {
d_wr16(versym_for, (pi: u64) * 2u64, VER_NDX_GLOBAL_D);
} else {
@@ -630,7 +630,7 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
for (r != nil) {
if (r.sym != nil) {
let rsym: *lsym = r.sym;
if (rsym.is_dyn != 0) {
if (rsym.isdyn != 0) {
if (r.kind != R_X86_64_PC32_D) {
if (r.kind != R_X86_64_PLT32_D) {
os.write(2, "w6l: dynamic reloc kind unsupported\n".ptr, 35u64);
@@ -638,7 +638,7 @@ export fn l_emit_dyn_elf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
};
};
let site: u64 = text_va + r.off;
let stub: u64 = plt_va + (rsym.plt_idx: u64) * PLT_STUB_BYTES_D;
let stub: u64 = plt_va + (rsym.pltidx: u64) * PLT_STUB_BYTES_D;
let disp: i64 = (stub: i64) - (site: i64) + r.addend;
d_wr32(l.text, r.off, (disp: i32): u32);
};