diff --git a/selfhost/cmd/w6l/dyn.ww b/selfhost/cmd/w6l/dyn.ww index 09d0aad8..5bc2cb7b 100644 --- a/selfhost/cmd/w6l/dyn.ww +++ b/selfhost/cmd/w6l/dyn.ww @@ -376,7 +376,7 @@ export fn soprovides(so: *lso, name: str) i32 = { if (so == nil) { return 0; }; let e: *lexport = so.exports; for (e != nil) { - if (streq(e.name, name)) { return 1; }; + if (strings.compare(e.name, name) == 0) { return 1; }; e = e.enext; }; return 0; @@ -391,7 +391,7 @@ export fn soversion(so: *lso, name: str) str = { if (so == nil) { return result; }; let e: *lexport = so.exports; for (e != nil) { - if (streq(e.name, name)) { + if (strings.compare(e.name, name) == 0) { result.ptr = e.version.ptr; result.len = e.version.len; return result; @@ -400,5 +400,3 @@ export fn soversion(so: *lso, name: str) str = { }; return result; }; - -// `streq` lives in sym.ww — same bundle, single definition. diff --git a/selfhost/cmd/w6l/dynout.ww b/selfhost/cmd/w6l/dynout.ww index 8868f948..8f2f1e6c 100644 --- a/selfhost/cmd/w6l/dynout.ww +++ b/selfhost/cmd/w6l/dynout.ww @@ -26,6 +26,7 @@ package w6l; import os; import rt; +import strings; import sym; // ELF constants @@ -152,16 +153,6 @@ fn alignup(off: u64, a: u64) u64 = { 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 -------------------------------------------------------- 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; existing.ptr = vernameptrarr[kk]; existing.len = drdi32(vernamelenbuf.ptr, (kk: u64) * 4u64); - if (streqd(existing, vname)) { + if (strings.compare(existing, vname) == 0) { seen = 1; k = added; } else { k += 1; }; }; @@ -394,7 +385,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = { let exi: str; exi.ptr = vernameptrarr[vk]; 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); dwr16(versymfor.ptr, (pi: u64) * 2u64, other); matched = 1; diff --git a/selfhost/cmd/w6l/main.combined.ww b/selfhost/cmd/w6l/main.combined.ww index 129d09b1..18cf5c22 100644 --- a/selfhost/cmd/w6l/main.combined.ww +++ b/selfhost/cmd/w6l/main.combined.ww @@ -2839,6 +2839,8 @@ export fn rpad(s: str, p: rune, maxlen: i32) str = { package w6l; +import strings; + type lsym = struct { name: str, val: u64, // offset within combined .text (or .data when @@ -2911,20 +2913,10 @@ type lnk = struct { 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 = { let s: *lsym = l.syms; for (s != nil) { - if (streq(s.name, name)) { return s; }; + if (strings.compare(s.name, name) == 0) { return s; }; s = s.snext; }; 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 = { let s: *lsym = l.syms; for (s != nil) { - if (streq(s.name, name)) { return s; }; + if (strings.compare(s.name, name) == 0) { return s; }; s = s.snext; }; return nil; @@ -3938,7 +3930,7 @@ export fn soprovides(so: *lso, name: str) i32 = { if (so == nil) { return 0; }; let e: *lexport = so.exports; for (e != nil) { - if (streq(e.name, name)) { return 1; }; + if (strings.compare(e.name, name) == 0) { return 1; }; e = e.enext; }; return 0; @@ -3953,7 +3945,7 @@ export fn soversion(so: *lso, name: str) str = { if (so == nil) { return result; }; let e: *lexport = so.exports; for (e != nil) { - if (streq(e.name, name)) { + if (strings.compare(e.name, name) == 0) { result.ptr = e.version.ptr; result.len = e.version.len; return result; @@ -3963,8 +3955,6 @@ export fn soversion(so: *lso, name: str) str = { return result; }; -// `streq` lives in sym.ww — same bundle, single definition. - // selfhost/cmd/w6l/pass.ww — port of cmd/w6l/pass.c. // // Resolution + relocation. l_resolve flags every undefined symbol @@ -4125,6 +4115,7 @@ package w6l; import os; import rt; +import strings; import sym; // ELF constants @@ -4251,16 +4242,6 @@ fn alignup(off: u64, a: u64) u64 = { 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 -------------------------------------------------------- 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; existing.ptr = vernameptrarr[kk]; existing.len = drdi32(vernamelenbuf.ptr, (kk: u64) * 4u64); - if (streqd(existing, vname)) { + if (strings.compare(existing, vname) == 0) { seen = 1; k = added; } else { k += 1; }; }; @@ -4493,7 +4474,7 @@ export fn emitdynelf(l: *lnk, fd: i32, base: u64, entry: u64) i32 = { let exi: str; exi.ptr = vernameptrarr[vk]; 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); dwr16(versymfor.ptr, (pi: u64) * 2u64, other); matched = 1; diff --git a/selfhost/cmd/w6l/sym.ww b/selfhost/cmd/w6l/sym.ww index 1cefcb19..7e0fba74 100644 --- a/selfhost/cmd/w6l/sym.ww +++ b/selfhost/cmd/w6l/sym.ww @@ -5,6 +5,8 @@ package w6l; +import strings; + type lsym = struct { name: str, val: u64, // offset within combined .text (or .data when @@ -77,20 +79,10 @@ type lnk = struct { 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 = { let s: *lsym = l.syms; for (s != nil) { - if (streq(s.name, name)) { return s; }; + if (strings.compare(s.name, name) == 0) { return s; }; s = s.snext; }; 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 = { let s: *lsym = l.syms; for (s != nil) { - if (streq(s.name, name)) { return s; }; + if (strings.compare(s.name, name) == 0) { return s; }; s = s.snext; }; return nil;