From 964e93dc471a2b7b226112a609af482f6907e3fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 3 Aug 2026 19:21:45 +0200 Subject: [PATCH] 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. --- lib/c/wchar.zig | 7 +------ lib/compiler_rt.zig | 5 +++++ lib/std/c.zig | 2 ++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/c/wchar.zig b/lib/c/wchar.zig index 81858e2136527c52b4345d2e228ef8e3f6325633..4f8f23f692b8fa23ae3f5ac652815ca620938d0d 100644 --- a/lib/c/wchar.zig +++ b/lib/c/wchar.zig @@ -14,7 +14,6 @@ comptime { symbol(&wmemcpy, "wmemcpy"); symbol(&wmemmove, "wmemmove"); symbol(&wmemset, "wmemset"); - symbol(&wcslen, "wcslen"); symbol(&wcsnlen, "wcsnlen"); symbol(&wcscmp, "wcscmp"); symbol(&wcsncmp, "wcsncmp"); @@ -81,10 +80,6 @@ fn wmemset(dest: [*]wchar_t, elem: wchar_t, len: usize) callconv(.c) [*]wchar_t return dest; } -fn wcslen(str: [*:0]const wchar_t) callconv(.c) usize { - return std.mem.len(str); -} - fn wcsnlen(str: [*:0]const wchar_t, max: usize) callconv(.c) usize { for (0..max) |i| { if (str[i] == 0) return i; @@ -199,7 +194,7 @@ fn wcswcs(noalias haystack: [*:0]const wchar_t, noalias needle: [*:0]const wchar } fn wcsdup(str: [*:0]const wchar_t) callconv(.c) ?[*:0]wchar_t { - const len = wcslen(str); + const len = c.wcslen(str); const size = (len + 1) * @sizeOf(wchar_t); const d_opaque = c.malloc(size) orelse return null; const d: [*]wchar_t = @ptrCast(@alignCast(d_opaque)); diff --git a/lib/compiler_rt.zig b/lib/compiler_rt.zig index e4d4824a38654c26da6a763f75e8df8cfd408681..b37807f8d5f05bb6eb07533965fc2cdd8a98db18 100644 --- a/lib/compiler_rt.zig +++ b/lib/compiler_rt.zig @@ -162,6 +162,7 @@ comptime { symbol(&bcmp, "bcmp"); _ = @import("compiler_rt/ssp.zig"); symbol(&strlen, "strlen"); + symbol(&wcslen, "wcslen"); } _ = @import("compiler_rt/elf.zig"); @@ -178,6 +179,10 @@ fn strlen(s: [*:0]const c_char) callconv(.c) usize { return std.mem.len(s); } +fn wcslen(s: [*:0]const std.c.wchar_t) callconv(.c) usize { + return std.mem.len(s); +} + fn memcmp(vl: [*]const u8, vr: [*]const u8, n: usize) callconv(.c) c_int { var i: usize = 0; while (i < n) : (i += 1) { diff --git a/lib/std/c.zig b/lib/std/c.zig index 7c8dcd4f075086eda8f3e620481e20e7cc5063f4..24ca60ab2c3c4ad4022bc82a5d2c40ed4056c15d 100644 --- a/lib/std/c.zig +++ b/lib/std/c.zig @@ -11389,6 +11389,8 @@ pub extern "c" fn div(a: c_int, b: c_int) div_t; pub extern "c" fn ldiv(a: c_long, b: c_long) ldiv_t; pub extern "c" fn lldiv(a: c_longlong, b: c_longlong) lldiv_t; +pub extern "c" fn wcslen(s: [*:0]const wchar_t) usize; + pub extern "c" fn atoi(str: [*:0]const c_char) c_int; pub extern "c" fn atol(str: [*:0]const c_char) c_long; pub extern "c" fn atoll(str: [*:0]const c_char) c_longlong; -- 2.54.0