From ad3828db45b7830d5953e7c728c227e78f574cf9 Mon Sep 17 00:00:00 2001 From: GasInfinity Date: Tue, 13 Jan 2026 22:14:07 +0100 Subject: [PATCH] feat(libzigc): use common `rand` implementations * also remove their musl implementation --- lib/c/stdlib.zig | 2 ++ lib/c/stdlib/rand.zig | 30 ++++++++++++++++++++++++++++++ lib/libc/musl/src/prng/rand.c | 15 --------------- lib/libc/musl/src/prng/rand_r.c | 15 --------------- src/libs/musl.zig | 2 -- src/libs/wasi_libc.zig | 2 -- 6 files changed, 32 insertions(+), 34 deletions(-) create mode 100644 lib/c/stdlib/rand.zig delete mode 100644 lib/libc/musl/src/prng/rand.c delete mode 100644 lib/libc/musl/src/prng/rand_r.c diff --git a/lib/c/stdlib.zig b/lib/c/stdlib.zig index 67b6345b13fd3217670031586ce009b40e6950a6..6ee0d19fb524f44f16bca6ef2939b93aba42a819 100644 --- a/lib/c/stdlib.zig +++ b/lib/c/stdlib.zig @@ -7,6 +7,8 @@ const ldiv_t = std.c.ldiv_t; const lldiv_t = std.c.lldiv_t; comptime { + _ = @import("stdlib/rand.zig"); + if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) { // Functions specific to musl and wasi-libc. @export(&abs, .{ .name = "abs", .linkage = common.linkage, .visibility = common.visibility }); diff --git a/lib/c/stdlib/rand.zig b/lib/c/stdlib/rand.zig new file mode 100644 index 0000000000000000000000000000000000000000..9ca7a51967a40fa8d180ae4aff8eaf763cdd3bb2 --- /dev/null +++ b/lib/c/stdlib/rand.zig @@ -0,0 +1,30 @@ +const std = @import("std"); +const common = @import("../common.zig"); +const builtin = @import("builtin"); + +comptime { + if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) { + @export(&rand, .{ .name = "rand", .linkage = common.linkage, .visibility = common.visibility }); + @export(&srand, .{ .name = "srand", .linkage = common.linkage, .visibility = common.visibility }); + @export(&rand_r, .{ .name = "rand_r", .linkage = common.linkage, .visibility = common.visibility }); + } +} + +// NOTE: The PRNG used for `rand` is unspecified, so it can be any! +var rand_state: std.Random.SplitMix64 = .init(1); + +fn rand_r(seed: *c_uint) callconv(.c) c_int { + var mix: std.Random.SplitMix64 = .init(seed.*); + defer seed.* = @truncate(mix.s); + + // Every bundled libc defines RAND_MAX as `std.math.maxInt(u31)` (except windows where it is `std.math.maxInt(u15)`) + return @as(u31, @truncate(mix.next() >> 33)); +} + +fn srand(seed: c_uint) callconv(.c) void { + rand_state = .init(seed); +} + +fn rand() callconv(.c) c_int { + return @as(u31, @truncate(rand_state.next() >> 33)); +} diff --git a/lib/libc/musl/src/prng/rand.c b/lib/libc/musl/src/prng/rand.c deleted file mode 100644 index c000cd248cef667bab257940768616c9349f7d70..0000000000000000000000000000000000000000 --- a/lib/libc/musl/src/prng/rand.c +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include - -static uint64_t seed; - -void srand(unsigned s) -{ - seed = s-1; -} - -int rand(void) -{ - seed = 6364136223846793005ULL*seed + 1; - return seed>>33; -} diff --git a/lib/libc/musl/src/prng/rand_r.c b/lib/libc/musl/src/prng/rand_r.c deleted file mode 100644 index 638614c867911a133d4a3f054c7150e28d5a4425..0000000000000000000000000000000000000000 --- a/lib/libc/musl/src/prng/rand_r.c +++ /dev/null @@ -1,15 +0,0 @@ -#include - -static unsigned temper(unsigned x) -{ - x ^= x>>11; - x ^= x<<7 & 0x9D2C5680; - x ^= x<<15 & 0xEFC60000; - x ^= x>>18; - return x; -} - -int rand_r(unsigned *seed) -{ - return temper(*seed = *seed * 1103515245 + 12345)/2; -} diff --git a/src/libs/musl.zig b/src/libs/musl.zig index e2d683ae69d81119a9be641180dc96301feb8190..e7cea46f0ccf7c155f9a8bb4a3b001a0375d62c4 100644 --- a/src/libs/musl.zig +++ b/src/libs/musl.zig @@ -1310,9 +1310,7 @@ const src_files = [_][]const u8{ "musl/src/prng/lrand48.c", "musl/src/prng/mrand48.c", "musl/src/prng/__rand48_step.c", - "musl/src/prng/rand.c", "musl/src/prng/random.c", - "musl/src/prng/rand_r.c", "musl/src/prng/__seed48.c", "musl/src/prng/seed48.c", "musl/src/prng/srand48.c", diff --git a/src/libs/wasi_libc.zig b/src/libs/wasi_libc.zig index 3b4fa178d1ad3f59aa9c559f88f15faadc86dd72..afee02912170a483c33446221d2a6ecc3507f025 100644 --- a/src/libs/wasi_libc.zig +++ b/src/libs/wasi_libc.zig @@ -890,8 +890,6 @@ const libc_top_half_src_files = [_][]const u8{ "musl/src/prng/lrand48.c", "musl/src/prng/mrand48.c", "musl/src/prng/__rand48_step.c", - "musl/src/prng/rand.c", - "musl/src/prng/rand_r.c", "musl/src/prng/__seed48.c", "musl/src/prng/seed48.c", "musl/src/prng/srand48.c", -- 2.54.0