authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-03 19:21:45+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-08-31 23:11:18+02:00
log6fbe42de92ac1012d8b53d42f94b26865c2a18f1
tree57ada0adfe22b8f602e7c3c352c6f9dbb50ccdf1
parenta86ee7d90f6e802c01901d9e41e2c3617f7820a5
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

move wcslen from libzigc to compiler-rt

Similar to strlen, LLVM 23+ will sometimes emit libcalls to this function even when libc isn't linked.

3 files changed, 8 insertions(+), 6 deletions(-)

lib/c/wchar.zig+1-6
...@@ -14,7 +14,6 @@ comptime {...@@ -14,7 +14,6 @@ comptime {
14 symbol(&wmemcpy, "wmemcpy");14 symbol(&wmemcpy, "wmemcpy");
15 symbol(&wmemmove, "wmemmove");15 symbol(&wmemmove, "wmemmove");
16 symbol(&wmemset, "wmemset");16 symbol(&wmemset, "wmemset");
17 symbol(&wcslen, "wcslen");
18 symbol(&wcsnlen, "wcsnlen");17 symbol(&wcsnlen, "wcsnlen");
19 symbol(&wcscmp, "wcscmp");18 symbol(&wcscmp, "wcscmp");
20 symbol(&wcsncmp, "wcsncmp");19 symbol(&wcsncmp, "wcsncmp");
...@@ -78,10 +77,6 @@ fn wmemset(dest: [*]wchar_t, elem: wchar_t, len: usize) callconv(.c) [*]wchar_t...@@ -78,10 +77,6 @@ fn wmemset(dest: [*]wchar_t, elem: wchar_t, len: usize) callconv(.c) [*]wchar_t
78 return dest;77 return dest;
79}78}
8079
81fn wcslen(str: [*:0]const wchar_t) callconv(.c) usize {
82 return wcsnlen(str, std.math.maxInt(usize));
83}
84
85fn wcsnlen(str: [*:0]const wchar_t, max: usize) callconv(.c) usize {80fn wcsnlen(str: [*:0]const wchar_t, max: usize) callconv(.c) usize {
86 return std.mem.findScalar(wchar_t, str[0..max], 0) orelse max;81 return std.mem.findScalar(wchar_t, str[0..max], 0) orelse max;
87}82}
...@@ -193,7 +188,7 @@ fn wcswcs(noalias haystack: [*:0]const wchar_t, noalias needle: [*:0]const wchar...@@ -193,7 +188,7 @@ fn wcswcs(noalias haystack: [*:0]const wchar_t, noalias needle: [*:0]const wchar
193}188}
194189
195fn wcsdup(str: [*:0]const wchar_t) callconv(.c) ?[*:0]wchar_t {190fn wcsdup(str: [*:0]const wchar_t) callconv(.c) ?[*:0]wchar_t {
196 const len = wcslen(str);191 const len = c.wcslen(str);
197 const size = (len + 1) * @sizeOf(wchar_t);192 const size = (len + 1) * @sizeOf(wchar_t);
198 const d_opaque = c.malloc(size) orelse return null;193 const d_opaque = c.malloc(size) orelse return null;
199 const d: [*]wchar_t = @ptrCast(@alignCast(d_opaque));194 const d: [*]wchar_t = @ptrCast(@alignCast(d_opaque));
lib/compiler_rt.zig+5
...@@ -174,6 +174,7 @@ comptime {...@@ -174,6 +174,7 @@ comptime {
174 symbol(&bcmp, "bcmp");174 symbol(&bcmp, "bcmp");
175 _ = @import("compiler_rt/ssp.zig");175 _ = @import("compiler_rt/ssp.zig");
176 symbol(&strlen, "strlen");176 symbol(&strlen, "strlen");
177 symbol(&wcslen, "wcslen");
177 }178 }
178179
179 // Temporarily used for uefi until https://github.com/ziglang/zig/issues/21630 is addressed.180 // Temporarily used for uefi until https://github.com/ziglang/zig/issues/21630 is addressed.
...@@ -188,6 +189,10 @@ fn strlen(s: [*:0]const c_char) callconv(.c) usize {...@@ -188,6 +189,10 @@ fn strlen(s: [*:0]const c_char) callconv(.c) usize {
188 return std.mem.len(s);189 return std.mem.len(s);
189}190}
190191
192fn wcslen(s: [*:0]const std.c.wchar_t) callconv(.c) usize {
193 return std.mem.len(s);
194}
195
191fn memcmp(vl: [*]const u8, vr: [*]const u8, n: usize) callconv(.c) c_int {196fn memcmp(vl: [*]const u8, vr: [*]const u8, n: usize) callconv(.c) c_int {
192 var i: usize = 0;197 var i: usize = 0;
193 while (i < n) : (i += 1) {198 while (i < n) : (i += 1) {
lib/std/c.zig+2
...@@ -11205,6 +11205,8 @@ pub extern "c" fn div(a: c_int, b: c_int) div_t;...@@ -11205,6 +11205,8 @@ pub extern "c" fn div(a: c_int, b: c_int) div_t;
11205pub extern "c" fn ldiv(a: c_long, b: c_long) ldiv_t;11205pub extern "c" fn ldiv(a: c_long, b: c_long) ldiv_t;
11206pub extern "c" fn lldiv(a: c_longlong, b: c_longlong) lldiv_t;11206pub extern "c" fn lldiv(a: c_longlong, b: c_longlong) lldiv_t;
1120711207
11208pub extern "c" fn wcslen(s: [*:0]const wchar_t) usize;
11209
11208pub extern "c" fn atoi(str: [*:0]const c_char) c_int;11210pub extern "c" fn atoi(str: [*:0]const c_char) c_int;
11209pub extern "c" fn atol(str: [*:0]const c_char) c_long;11211pub extern "c" fn atol(str: [*:0]const c_char) c_long;
11210pub extern "c" fn atoll(str: [*:0]const c_char) c_longlong;11212pub extern "c" fn atoll(str: [*:0]const c_char) c_longlong;