Commit e9ac2ce116

Alex Rønne Petersen <alex@alexrp.com>
2025-07-16 18:33:15
compiler-rt: move strlen from libzigc to here
LLVM 21 has started recognizing strlen-like idioms and optimizing them to strlen calls, so we need this function provided in compiler-rt for libc-less compilations.
1 parent dfa55e1
Changed files (3)
lib/c/string.zig
@@ -4,7 +4,6 @@ const common = @import("common.zig");
 
 comptime {
     @export(&strcmp, .{ .name = "strcmp", .linkage = common.linkage, .visibility = common.visibility });
-    @export(&strlen, .{ .name = "strlen", .linkage = common.linkage, .visibility = common.visibility });
     @export(&strncmp, .{ .name = "strncmp", .linkage = common.linkage, .visibility = common.visibility });
     @export(&strcasecmp, .{ .name = "strcasecmp", .linkage = common.linkage, .visibility = common.visibility });
     @export(&strncasecmp, .{ .name = "strncasecmp", .linkage = common.linkage, .visibility = common.visibility });
@@ -103,7 +102,3 @@ test strncmp {
     try std.testing.expect(strncmp(@ptrCast("b"), @ptrCast("a"), 1) > 0);
     try std.testing.expect(strncmp(@ptrCast("\xff"), @ptrCast("\x02"), 1) > 0);
 }
-
-fn strlen(s: [*:0]const c_char) callconv(.c) usize {
-    return std.mem.len(s);
-}
lib/compiler_rt/strlen.zig
@@ -0,0 +1,10 @@
+const std = @import("std");
+const common = @import("common.zig");
+
+comptime {
+    @export(&strlen, .{ .name = "strlen", .linkage = common.linkage, .visibility = common.visibility });
+}
+
+fn strlen(s: [*:0]const c_char) callconv(.c) usize {
+    return std.mem.len(s);
+}
lib/compiler_rt.zig
@@ -263,6 +263,8 @@ comptime {
         _ = @import("compiler_rt/memcmp.zig");
         _ = @import("compiler_rt/bcmp.zig");
         _ = @import("compiler_rt/ssp.zig");
+
+        _ = @import("compiler_rt/strlen.zig");
     }
 
     // Temporarily used for uefi until https://github.com/ziglang/zig/issues/21630 is addressed.