From f6dec9f3340874c20a57c72f9f48c33f311ac86f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gr=C3=A9goire?= Date: Sun, 12 Jul 2026 17:15:48 -0400 Subject: [PATCH] rtl: fix LinkerSet on release builds LLVM seemed to like doing DCE on those symbols, so export them to ensure they are used. The `Tag` mess is because we need to generate a unique symbol name, and the pointer cast is so we can export e.g zig functions. This is messy. --- src/rtl/linker_set.zig | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/rtl/linker_set.zig b/src/rtl/linker_set.zig index 29b5830..92935c5 100644 --- a/src/rtl/linker_set.zig +++ b/src/rtl/linker_set.zig @@ -26,12 +26,25 @@ pub fn LinkerSet(name: []const u8, comptime T: type) type { return arr[0..n]; } - pub fn insert(elem: T) type { + pub fn insert(comptime elem: T) type { const U = struct { - var storage: T linksection("set_" ++ name) = elem; + var storage: T = elem; + + fn Tag(comptime e: T) type { + return struct { + const tagged = e; + }; + } comptime { - _ = &storage; + // What the fuck? + @export( + @as(*const usize, @ptrCast(&storage)), + .{ + .name = "_set_elem_" ++ name ++ "_" ++ @typeName(Tag(elem)), + .section = "set_" ++ name, + }, + ); } };