From 09b38f89e3a6c39b468326bc7499f243b241c144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Mon, 6 Jul 2026 21:19:49 +0200 Subject: [PATCH] Elf2: implement some sparc-specific TLS GOT relocations --- src/link/Elf2.zig | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/link/Elf2.zig b/src/link/Elf2.zig index 87e8d16f2b3ff5ea821e81f163e43c92a4a18452..125fc521dc8aeda159502674c7e0d88c5a9fa37b 100644 --- a/src/link/Elf2.zig +++ b/src/link/Elf2.zig @@ -795,6 +795,8 @@ const GotReloc = struct { sparc_10, sparc_13, sparc_22, + sparc_ldm_hi22, + sparc_ldm_lo10, sparc_op_hix22, sparc_op_lox10, }; @@ -920,6 +922,18 @@ const GotReloc = struct { result.simm22 = @truncate(got_offset >> 10); elf.targetStore(dest_ptr, result); }, + .sparc_ldm_hi22 => { + const dest_ptr: *link.sparc.reloc.Simm22 = @ptrCast(@alignCast(dest_slice)); + var result = elf.targetLoad(dest_ptr); + result.simm22 = @truncate((got_offset +% addend) >> 10); + elf.targetStore(dest_ptr, result); + }, + .sparc_ldm_lo10 => { + const dest_ptr: *link.sparc.reloc.Simm13 = @ptrCast(@alignCast(dest_slice)); + var result = elf.targetLoad(dest_ptr); + result.simm13 = @as(u10, @truncate(got_offset +% addend)); + elf.targetStore(dest_ptr, result); + }, .sparc_op_hix22 => { const dest_ptr: *link.sparc.reloc.Imm22 = @ptrCast(@alignCast(dest_slice)); var result = elf.targetLoad(dest_ptr); @@ -6292,8 +6306,6 @@ fn addRelocAssumeCapacity( .TLS_GD_HI22, .TLS_GD_LO10, .TLS_GD_CALL, - .TLS_LDM_HI22, - .TLS_LDM_LO10, .TLS_LDM_CALL, .TLS_LDO_HIX22, .TLS_LDO_LOX10, @@ -6350,6 +6362,8 @@ fn addRelocAssumeCapacity( .GOT10 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_10), .GOT13 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_13), .GOT22 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_22), + .TLS_LDM_HI22 => elf.addGotRelocAssumeCapacity(node, offset, .tlsld0, addend, .sparc_ldm_hi22), + .TLS_LDM_LO10 => elf.addGotRelocAssumeCapacity(node, offset, .tlsld0, addend, .sparc_ldm_lo10), // These need similar handling to `R_X86_64_GOTOFF64`. No compiler seems to emit them though. .GOTDATA_HIX22 => @panic("TODO: R_SPARC_GOTDATA_HIX22"), .GOTDATA_LOX10 => @panic("TODO: R_SPARC_GOTDATA_LOX10"), -- 2.54.0