authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-06 21:19:49+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-09 10:54:49+02:00
log09b38f89e3a6c39b468326bc7499f243b241c144
tree85803b778bfb6f7a380da7ef6ea7eaaaa2c4c8c1
parent429a5d948b37368d292aa718b4bfae0197a0128c
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Elf2: implement some sparc-specific TLS GOT relocations


1 files changed, 16 insertions(+), 2 deletions(-)

src/link/Elf2.zig+16-2
......@@ -795,6 +795,8 @@ const GotReloc = struct {
795795 sparc_10,
796796 sparc_13,
797797 sparc_22,
798 sparc_ldm_hi22,
799 sparc_ldm_lo10,
798800 sparc_op_hix22,
799801 sparc_op_lox10,
800802 };
......@@ -920,6 +922,18 @@ const GotReloc = struct {
920922 result.simm22 = @truncate(got_offset >> 10);
921923 elf.targetStore(dest_ptr, result);
922924 },
925 .sparc_ldm_hi22 => {
926 const dest_ptr: *link.sparc.reloc.Simm22 = @ptrCast(@alignCast(dest_slice));
927 var result = elf.targetLoad(dest_ptr);
928 result.simm22 = @truncate((got_offset +% addend) >> 10);
929 elf.targetStore(dest_ptr, result);
930 },
931 .sparc_ldm_lo10 => {
932 const dest_ptr: *link.sparc.reloc.Simm13 = @ptrCast(@alignCast(dest_slice));
933 var result = elf.targetLoad(dest_ptr);
934 result.simm13 = @as(u10, @truncate(got_offset +% addend));
935 elf.targetStore(dest_ptr, result);
936 },
923937 .sparc_op_hix22 => {
924938 const dest_ptr: *link.sparc.reloc.Imm22 = @ptrCast(@alignCast(dest_slice));
925939 var result = elf.targetLoad(dest_ptr);
......@@ -6292,8 +6306,6 @@ fn addRelocAssumeCapacity(
62926306 .TLS_GD_HI22,
62936307 .TLS_GD_LO10,
62946308 .TLS_GD_CALL,
6295 .TLS_LDM_HI22,
6296 .TLS_LDM_LO10,
62976309 .TLS_LDM_CALL,
62986310 .TLS_LDO_HIX22,
62996311 .TLS_LDO_LOX10,
......@@ -6350,6 +6362,8 @@ fn addRelocAssumeCapacity(
63506362 .GOT10 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_10),
63516363 .GOT13 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_13),
63526364 .GOT22 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .sparc_22),
6365 .TLS_LDM_HI22 => elf.addGotRelocAssumeCapacity(node, offset, .tlsld0, addend, .sparc_ldm_hi22),
6366 .TLS_LDM_LO10 => elf.addGotRelocAssumeCapacity(node, offset, .tlsld0, addend, .sparc_ldm_lo10),
63536367 // These need similar handling to `R_X86_64_GOTOFF64`. No compiler seems to emit them though.
63546368 .GOTDATA_HIX22 => @panic("TODO: R_SPARC_GOTDATA_HIX22"),
63556369 .GOTDATA_LOX10 => @panic("TODO: R_SPARC_GOTDATA_LOX10"),