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; };
|
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.
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user