selfhost/cmd/w6l: drop l_* prefix from exports + snake fields/helpers
This commit is contained in:
@@ -75,8 +75,8 @@ def RELA_ADDEND: u64 = 16u64;
|
||||
|
||||
// ---- file slurp --------------------------------------------------------
|
||||
|
||||
fn read_all(path_cs: *u8) (*u8, u64) = {
|
||||
let fd: i32 = os.open(path_cs, os.O_RDONLY, 0i32);
|
||||
fn readall(path: *u8) (*u8, u64) = {
|
||||
let fd: i32 = os.open(path, os.O_RDONLY, 0i32);
|
||||
if (fd < 0) { return nil, 0u64; };
|
||||
let n: i64 = os.filesize(fd);
|
||||
if (n < 0i64) { os.close(fd); return nil, 0u64; };
|
||||
@@ -89,7 +89,7 @@ fn read_all(path_cs: *u8) (*u8, u64) = {
|
||||
|
||||
// ---- text buffer growth ------------------------------------------------
|
||||
|
||||
fn emit_text(l: *lnk, src: *u8, n: u64) void = {
|
||||
fn emittext(l: *lnk, src: *u8, n: u64) void = {
|
||||
if (l.textlen + n > l.textcap) {
|
||||
let nc: u64 = l.textcap;
|
||||
if (nc == 0u64) { nc = 4096u64; };
|
||||
@@ -122,7 +122,7 @@ fn cstrlen(p: *u8) u64 = {
|
||||
return n;
|
||||
};
|
||||
|
||||
fn cstr_eq(p: *u8, lit: str) bool = {
|
||||
fn cstreq(p: *u8, lit: str) bool = {
|
||||
let n: u64 = lit.len: u64;
|
||||
let i: u64 = 0u64;
|
||||
for (i < n) {
|
||||
@@ -134,8 +134,8 @@ fn cstr_eq(p: *u8, lit: str) bool = {
|
||||
return true;
|
||||
};
|
||||
|
||||
// Build a ww str from a NUL-terminated *u8 (for passing to l_intern).
|
||||
fn cstr_to_str(a: *arena, p: *u8) str = {
|
||||
// Build a ww str from a NUL-terminated *u8 (for passing to intern).
|
||||
fn cstrtostr(a: *arena, p: *u8) str = {
|
||||
let n: u64 = cstrlen(p);
|
||||
return astrndup(a, p, n);
|
||||
};
|
||||
@@ -159,7 +159,7 @@ type armember = struct {
|
||||
mnext: *armember,
|
||||
};
|
||||
|
||||
fn is_archive(p: *u8, len: u64) bool = {
|
||||
fn isarchive(p: *u8, len: u64) bool = {
|
||||
if (len < 8u64) { return false; };
|
||||
if (p[0u64] != 33u8) { return false; }; // '!'
|
||||
if (p[1u64] != 60u8) { return false; }; // '<'
|
||||
@@ -172,8 +172,8 @@ fn is_archive(p: *u8, len: u64) bool = {
|
||||
return true;
|
||||
};
|
||||
|
||||
// ar_field — parse a space-padded decimal integer of width n.
|
||||
fn ar_field(p: *u8, n: u64) u64 = {
|
||||
// arfield — parse a space-padded decimal integer of width n.
|
||||
fn arfield(p: *u8, n: u64) u64 = {
|
||||
let v: u64 = 0u64;
|
||||
let i: u64 = 0u64;
|
||||
for (i < n) {
|
||||
@@ -186,10 +186,10 @@ fn ar_field(p: *u8, n: u64) u64 = {
|
||||
return v;
|
||||
};
|
||||
|
||||
// elf_globals — return a linked list of names of globally-defined
|
||||
// elfglobals — return a linked list of names of globally-defined
|
||||
// (STB_GLOBAL) symbols whose section is `.text`. Names are arena
|
||||
// copies, so the source ELF buffer can be freed afterward.
|
||||
fn elf_globals(a: *arena, buf: *u8, len: u64) *defent = {
|
||||
fn elfglobals(a: *arena, buf: *u8, len: u64) *defent = {
|
||||
if (len < EHDR_SIZE) { return nil; };
|
||||
if (buf[0u64] != 127u8) { return nil; };
|
||||
if (buf[1u64] != 69u8) { return nil; };
|
||||
@@ -212,7 +212,7 @@ fn elf_globals(a: *arena, buf: *u8, len: u64) *defent = {
|
||||
let sh_name: u32 = rd_u32(buf, sh_off + SHDR_NAME);
|
||||
let nm: *u8 = shstr + (sh_name: u64);
|
||||
if (sh_type == SHT_PROGBITS: u32) {
|
||||
if (cstr_eq(nm, ".text")) { idx_text = i: i32; };
|
||||
if (cstreq(nm, ".text")) { idx_text = i: i32; };
|
||||
};
|
||||
if (sh_type == SHT_SYMTAB: u32) { idx_symtab = i: i32; };
|
||||
i += 1u32;
|
||||
@@ -244,7 +244,7 @@ fn elf_globals(a: *arena, buf: *u8, len: u64) *defent = {
|
||||
if ((st_shndx: i32) == idx_text) {
|
||||
let nm_p: *u8 = strtab + (st_name: u64);
|
||||
if (nm_p[0u64] != 0u8) {
|
||||
let nm: str = cstr_to_str(a, nm_p);
|
||||
let nm: str = cstrtostr(a, nm_p);
|
||||
let de: *defent = amalloc(a, 32u64): *defent;
|
||||
de.name = nm;
|
||||
de.dnext = head;
|
||||
@@ -258,13 +258,13 @@ fn elf_globals(a: *arena, buf: *u8, len: u64) *defent = {
|
||||
return head;
|
||||
};
|
||||
|
||||
// member_defines_undef — true if any of m's defined globals matches a
|
||||
// memberdefinesundef — true if any of m's defined globals matches a
|
||||
// currently-undefined symbol in the linker's symbol table. Names not
|
||||
// already interned are uninteresting (the link doesn't need them yet).
|
||||
fn member_defines_undef(l: *lnk, m: *armember) bool = {
|
||||
fn memberdefinesundef(l: *lnk, m: *armember) bool = {
|
||||
let de: *defent = m.defs;
|
||||
for (de != nil) {
|
||||
let s: *lsym = l_lookup(l, de.name);
|
||||
let s: *lsym = lookup(l, de.name);
|
||||
if (s != nil) {
|
||||
if (s.defined == 0) { return true; };
|
||||
};
|
||||
@@ -273,17 +273,17 @@ fn member_defines_undef(l: *lnk, m: *armember) bool = {
|
||||
return false;
|
||||
};
|
||||
|
||||
// load_archive — port of cmd/w6l/obj.c:load_archive.
|
||||
// loadarchive — port of cmd/w6l/obj.c:load_archive.
|
||||
//
|
||||
// Pass 1 indexes every regular member. Pass 2 iteratively pulls in any
|
||||
// member that supplies a currently-undefined symbol; each pull may
|
||||
// introduce fresh undefs, so we loop until quiescent.
|
||||
fn load_archive(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
fn loadarchive(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
||||
let head: *armember = nil;
|
||||
let tail: *armember = nil;
|
||||
let pos: u64 = 8u64; // past "!<arch>\n"
|
||||
for (pos + 60u64 <= len) {
|
||||
let hdr_size: u64 = ar_field(buf + pos + 48u64, 10u64);
|
||||
let hdr_size: u64 = arfield(buf + pos + 48u64, 10u64);
|
||||
let hdr_end: u64 = pos + 60u64;
|
||||
if (hdr_end + hdr_size > len) { break; };
|
||||
let first: u8 = buf[pos];
|
||||
@@ -299,7 +299,7 @@ fn load_archive(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
i += 1u64;
|
||||
};
|
||||
m.data = mb;
|
||||
m.defs = elf_globals(l.a, mb, hdr_size);
|
||||
m.defs = elfglobals(l.a, mb, hdr_size);
|
||||
m.loaded = 0;
|
||||
m.mnext = nil;
|
||||
if (head == nil) { head = m; }
|
||||
@@ -316,8 +316,8 @@ fn load_archive(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
let m: *armember = head;
|
||||
for (m != nil) {
|
||||
if (m.loaded == 0) {
|
||||
if (member_defines_undef(l, m)) {
|
||||
if (load_image(l, path_cs, m.data, m.size) == 0) {
|
||||
if (memberdefinesundef(l, m)) {
|
||||
if (loadimage(l, path, m.data, m.size) == 0) {
|
||||
m.loaded = 1;
|
||||
changed = 1;
|
||||
};
|
||||
@@ -331,21 +331,21 @@ fn load_archive(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
|
||||
// ---- main loader -------------------------------------------------------
|
||||
|
||||
export fn l_load(l: *lnk, path_cs: *u8) i32 = {
|
||||
export fn load(l: *lnk, path: *u8) i32 = {
|
||||
let bufp: *u8;
|
||||
let buflen: u64;
|
||||
bufp, buflen = read_all(path_cs);
|
||||
bufp, buflen = readall(path);
|
||||
if (bufp == nil) {
|
||||
os.write(2, "w6l: cannot read object\n".ptr, 23u64);
|
||||
return -1;
|
||||
};
|
||||
if (is_archive(bufp, buflen)) {
|
||||
return load_archive(l, path_cs, bufp, buflen);
|
||||
if (isarchive(bufp, buflen)) {
|
||||
return loadarchive(l, path, bufp, buflen);
|
||||
};
|
||||
return load_image(l, path_cs, bufp, buflen);
|
||||
return loadimage(l, path, bufp, buflen);
|
||||
};
|
||||
|
||||
fn load_image(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
fn loadimage(l: *lnk, path: *u8, buf: *u8, len: u64) i32 = {
|
||||
if (len < EHDR_SIZE) { return -1; };
|
||||
// magic: 0x7f, 'E', 'L', 'F'
|
||||
if (buf[0u64] != 127u8) { return -1; };
|
||||
@@ -374,11 +374,11 @@ fn load_image(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
let sh_name: u32 = rd_u32(buf, sh_off + SHDR_NAME);
|
||||
let nm: *u8 = shstr + (sh_name: u64);
|
||||
if (sh_type == SHT_PROGBITS: u32) {
|
||||
if (cstr_eq(nm, ".text")) { idx_text = i: i32; };
|
||||
if (cstreq(nm, ".text")) { idx_text = i: i32; };
|
||||
};
|
||||
if (sh_type == SHT_SYMTAB: u32) { idx_symtab = i: i32; };
|
||||
if (sh_type == SHT_RELA: u32) {
|
||||
if (cstr_eq(nm, ".rela.text")) { idx_rela = i: i32; };
|
||||
if (cstreq(nm, ".rela.text")) { idx_rela = i: i32; };
|
||||
};
|
||||
i += 1u32;
|
||||
};
|
||||
@@ -407,16 +407,16 @@ fn load_image(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
|
||||
// Track this object.
|
||||
let ob: *lobj = amalloc(l.a, 64u64): *lobj;
|
||||
ob.path = cstr_to_str(l.a, path_cs);
|
||||
ob.path = cstrtostr(l.a, path);
|
||||
ob.buf = buf;
|
||||
ob.len = len;
|
||||
ob.text_off = l.textlen;
|
||||
ob.text_size = text_size;
|
||||
ob.textoff = l.textlen;
|
||||
ob.textsize = text_size;
|
||||
ob.onext = l.objs;
|
||||
l.objs = ob;
|
||||
|
||||
// Append .text bytes to the combined image.
|
||||
emit_text(l, buf + text_off, text_size);
|
||||
emittext(l, buf + text_off, text_size);
|
||||
|
||||
// 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
|
||||
@@ -429,8 +429,8 @@ fn load_image(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
let st_value: u64 = rd_u64(buf, sym_p + SYM_VALUE);
|
||||
let nm_p: *u8 = strtab + (st_name: u64);
|
||||
if (nm_p[0u64] != 0u8) {
|
||||
let nm: str = cstr_to_str(l.a, nm_p);
|
||||
let gs: *lsym = l_intern(l, nm);
|
||||
let nm: str = cstrtostr(l.a, nm_p);
|
||||
let gs: *lsym = intern(l, nm);
|
||||
if (st_shndx != 0u16) {
|
||||
if ((st_shndx: i32) == idx_text) {
|
||||
if (gs.defined != 0) {
|
||||
@@ -439,8 +439,8 @@ fn load_image(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
} else {
|
||||
gs.defined = 1;
|
||||
gs.owner = ob;
|
||||
gs.idx_in_owner = si: i32;
|
||||
gs.val = ob.text_off + st_value;
|
||||
gs.idxinowner = si: i32;
|
||||
gs.val = ob.textoff + st_value;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -463,7 +463,7 @@ fn load_image(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
let r_sym_idx: u32 = (r_info >> 32u64): u32;
|
||||
let r_kind: i32 = ((r_info & 4294967295u64): u32): i32;
|
||||
let nr: *lrel = amalloc(l.a, 48u64): *lrel;
|
||||
nr.off = ob.text_off + r_off;
|
||||
nr.off = ob.textoff + r_off;
|
||||
nr.kind = r_kind;
|
||||
nr.addend = r_addend: i64;
|
||||
// Look up the referenced sym by name (re-walk symtab).
|
||||
@@ -472,8 +472,8 @@ fn load_image(l: *lnk, path_cs: *u8, buf: *u8, len: u64) i32 = {
|
||||
let s_name: u32 = rd_u32(buf, s_p + SYM_NAME);
|
||||
let s_nm: *u8 = strtab + (s_name: u64);
|
||||
if (s_nm[0u64] != 0u8) {
|
||||
let nm: str = cstr_to_str(l.a, s_nm);
|
||||
nr.sym = l_intern(l, nm);
|
||||
let nm: str = cstrtostr(l.a, s_nm);
|
||||
nr.sym = intern(l, nm);
|
||||
};
|
||||
};
|
||||
nr.rnext = l.rels;
|
||||
|
||||
Reference in New Issue
Block a user