w6l: replace streq/streqd clones with strings.compare (Wave-2 hand-rolled->lib)
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user