w6l: replace streq/streqd clones with strings.compare (Wave-2 hand-rolled->lib)

This commit is contained in:
2026-06-03 04:04:51 +09:00
parent 7d2d2c30ef
commit b4b28bbf02
4 changed files with 18 additions and 56 deletions

View File

@@ -376,7 +376,7 @@ export fn soprovides(so: *lso, name: str) i32 = {
if (so == nil) { return 0; }; if (so == nil) { return 0; };
let e: *lexport = so.exports; let e: *lexport = so.exports;
for (e != nil) { for (e != nil) {
if (streq(e.name, name)) { return 1; }; if (strings.compare(e.name, name) == 0) { return 1; };
e = e.enext; e = e.enext;
}; };
return 0; return 0;
@@ -391,7 +391,7 @@ export fn soversion(so: *lso, name: str) str = {
if (so == nil) { return result; }; if (so == nil) { return result; };
let e: *lexport = so.exports; let e: *lexport = so.exports;
for (e != nil) { for (e != nil) {
if (streq(e.name, name)) { if (strings.compare(e.name, name) == 0) {
result.ptr = e.version.ptr; result.ptr = e.version.ptr;
result.len = e.version.len; result.len = e.version.len;
return result; return result;
@@ -400,5 +400,3 @@ export fn soversion(so: *lso, name: str) str = {
}; };
return result; return result;
}; };
// `streq` lives in sym.ww — same bundle, single definition.

View File

@@ -26,6 +26,7 @@ package w6l;
import os; import os;
import rt; import rt;
import strings;
import sym; import sym;
// ELF constants // ELF constants
@@ -152,16 +153,6 @@ fn alignup(off: u64, a: u64) u64 = {
return (off + a - 1u64) & ~(a - 1u64); return (off + a - 1u64) & ~(a - 1u64);
}; };
fn streqd(a: str, b: str) bool = {
if (a.len != b.len) { return false; };
let i: i32 = 0;
for (i < a.len) {
if (a[i] != b[i]) { return false; };
i += 1;
};
return true;
};
// ---- main entry -------------------------------------------------------- // ---- main entry --------------------------------------------------------
export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = { export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
@@ -274,7 +265,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
let existing: str; let existing: str;
existing.ptr = vernameptrarr[kk]; existing.ptr = vernameptrarr[kk];
existing.len = drdi32(vernamelenbuf.ptr, (kk: u64) * 4u64); existing.len = drdi32(vernamelenbuf.ptr, (kk: u64) * 4u64);
if (streqd(existing, vname)) { if (strings.compare(existing, vname) == 0) {
seen = 1; k = added; seen = 1; k = added;
} else { k += 1; }; } else { k += 1; };
}; };
@@ -394,7 +385,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
let exi: str; let exi: str;
exi.ptr = vernameptrarr[vk]; exi.ptr = vernameptrarr[vk];
exi.len = drdi32(vernamelenbuf.ptr, (vk: u64) * 4u64); exi.len = drdi32(vernamelenbuf.ptr, (vk: u64) * 4u64);
if (streqd(exi, vname)) { if (strings.compare(exi, vname) == 0) {
let other: u16 = drdu16(vervnaother.ptr, (vk: u64) * 2u64); let other: u16 = drdu16(vervnaother.ptr, (vk: u64) * 2u64);
dwr16(versymfor.ptr, (pi: u64) * 2u64, other); dwr16(versymfor.ptr, (pi: u64) * 2u64, other);
matched = 1; matched = 1;

View File

@@ -2839,6 +2839,8 @@ export fn rpad(s: str, p: rune, maxlen: i32) str = {
package w6l; package w6l;
import strings;
type lsym = struct { type lsym = struct {
name: str, name: str,
val: u64, // offset within combined .text (or .data when val: u64, // offset within combined .text (or .data when
@@ -2911,20 +2913,10 @@ type lnk = struct {
dynn: i32, // number of syms routed through PLT dynn: i32, // number of syms routed through PLT
}; };
fn streq(a: str, b: str) bool = {
if (a.len != b.len) { return false; };
let i: i32 = 0;
for (i < a.len) {
if (a[i] != b[i]) { return false; };
i += 1;
};
return true;
};
export fn intern(l: *lnk, name: str) *lsym = { export fn intern(l: *lnk, name: str) *lsym = {
let s: *lsym = l.syms; let s: *lsym = l.syms;
for (s != nil) { for (s != nil) {
if (streq(s.name, name)) { return s; }; if (strings.compare(s.name, name) == 0) { return s; };
s = s.snext; s = s.snext;
}; };
let n: *lsym = alloc(lsym { name = name, snext = l.syms })!; let n: *lsym = alloc(lsym { name = name, snext = l.syms })!;
@@ -2935,7 +2927,7 @@ export fn intern(l: *lnk, name: str) *lsym = {
export fn lookup(l: *lnk, name: str) *lsym = { export fn lookup(l: *lnk, name: str) *lsym = {
let s: *lsym = l.syms; let s: *lsym = l.syms;
for (s != nil) { for (s != nil) {
if (streq(s.name, name)) { return s; }; if (strings.compare(s.name, name) == 0) { return s; };
s = s.snext; s = s.snext;
}; };
return nil; return nil;
@@ -3938,7 +3930,7 @@ export fn soprovides(so: *lso, name: str) i32 = {
if (so == nil) { return 0; }; if (so == nil) { return 0; };
let e: *lexport = so.exports; let e: *lexport = so.exports;
for (e != nil) { for (e != nil) {
if (streq(e.name, name)) { return 1; }; if (strings.compare(e.name, name) == 0) { return 1; };
e = e.enext; e = e.enext;
}; };
return 0; return 0;
@@ -3953,7 +3945,7 @@ export fn soversion(so: *lso, name: str) str = {
if (so == nil) { return result; }; if (so == nil) { return result; };
let e: *lexport = so.exports; let e: *lexport = so.exports;
for (e != nil) { for (e != nil) {
if (streq(e.name, name)) { if (strings.compare(e.name, name) == 0) {
result.ptr = e.version.ptr; result.ptr = e.version.ptr;
result.len = e.version.len; result.len = e.version.len;
return result; return result;
@@ -3963,8 +3955,6 @@ export fn soversion(so: *lso, name: str) str = {
return result; return result;
}; };
// `streq` lives in sym.ww — same bundle, single definition.
// selfhost/cmd/w6l/pass.ww — port of cmd/w6l/pass.c. // selfhost/cmd/w6l/pass.ww — port of cmd/w6l/pass.c.
// //
// Resolution + relocation. l_resolve flags every undefined symbol // Resolution + relocation. l_resolve flags every undefined symbol
@@ -4125,6 +4115,7 @@ package w6l;
import os; import os;
import rt; import rt;
import strings;
import sym; import sym;
// ELF constants // ELF constants
@@ -4251,16 +4242,6 @@ fn alignup(off: u64, a: u64) u64 = {
return (off + a - 1u64) & ~(a - 1u64); return (off + a - 1u64) & ~(a - 1u64);
}; };
fn streqd(a: str, b: str) bool = {
if (a.len != b.len) { return false; };
let i: i32 = 0;
for (i < a.len) {
if (a[i] != b[i]) { return false; };
i += 1;
};
return true;
};
// ---- main entry -------------------------------------------------------- // ---- main entry --------------------------------------------------------
export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = { export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
@@ -4373,7 +4354,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
let existing: str; let existing: str;
existing.ptr = vernameptrarr[kk]; existing.ptr = vernameptrarr[kk];
existing.len = drdi32(vernamelenbuf.ptr, (kk: u64) * 4u64); existing.len = drdi32(vernamelenbuf.ptr, (kk: u64) * 4u64);
if (streqd(existing, vname)) { if (strings.compare(existing, vname) == 0) {
seen = 1; k = added; seen = 1; k = added;
} else { k += 1; }; } else { k += 1; };
}; };
@@ -4493,7 +4474,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = {
let exi: str; let exi: str;
exi.ptr = vernameptrarr[vk]; exi.ptr = vernameptrarr[vk];
exi.len = drdi32(vernamelenbuf.ptr, (vk: u64) * 4u64); exi.len = drdi32(vernamelenbuf.ptr, (vk: u64) * 4u64);
if (streqd(exi, vname)) { if (strings.compare(exi, vname) == 0) {
let other: u16 = drdu16(vervnaother.ptr, (vk: u64) * 2u64); let other: u16 = drdu16(vervnaother.ptr, (vk: u64) * 2u64);
dwr16(versymfor.ptr, (pi: u64) * 2u64, other); dwr16(versymfor.ptr, (pi: u64) * 2u64, other);
matched = 1; matched = 1;

View File

@@ -5,6 +5,8 @@
package w6l; package w6l;
import strings;
type lsym = struct { type lsym = struct {
name: str, name: str,
val: u64, // offset within combined .text (or .data when val: u64, // offset within combined .text (or .data when
@@ -77,20 +79,10 @@ type lnk = struct {
dynn: i32, // number of syms routed through PLT dynn: i32, // number of syms routed through PLT
}; };
fn streq(a: str, b: str) bool = {
if (a.len != b.len) { return false; };
let i: i32 = 0;
for (i < a.len) {
if (a[i] != b[i]) { return false; };
i += 1;
};
return true;
};
export fn intern(l: *lnk, name: str) *lsym = { export fn intern(l: *lnk, name: str) *lsym = {
let s: *lsym = l.syms; let s: *lsym = l.syms;
for (s != nil) { for (s != nil) {
if (streq(s.name, name)) { return s; }; if (strings.compare(s.name, name) == 0) { return s; };
s = s.snext; s = s.snext;
}; };
let n: *lsym = alloc(lsym { name = name, snext = l.syms })!; let n: *lsym = alloc(lsym { name = name, snext = l.syms })!;
@@ -101,7 +93,7 @@ export fn intern(l: *lnk, name: str) *lsym = {
export fn lookup(l: *lnk, name: str) *lsym = { export fn lookup(l: *lnk, name: str) *lsym = {
let s: *lsym = l.syms; let s: *lsym = l.syms;
for (s != nil) { for (s != nil) {
if (streq(s.name, name)) { return s; }; if (strings.compare(s.name, name) == 0) { return s; };
s = s.snext; s = s.snext;
}; };
return nil; return nil;