| ... | ... | @@ -1186,11 +1186,27 @@ const SymbolReloc = struct { |
| 1186 | 1186 | sparc_h44, |
| 1187 | 1187 | sparc_m44, |
| 1188 | 1188 | sparc_l44, |
| 1189 | sparc_ldo_hix22, |
| 1190 | sparc_ldo_lox10, |
| 1191 | sparc_le_hix22, |
| 1192 | sparc_le_lox10, |
| 1189 | 1193 | |
| 1190 | 1194 | fn dependsOnTlsSize(t: SymbolReloc.Type) bool { |
| 1191 | 1195 | return switch (t) { |
| 1192 | | .tpoff32, .tpoff64 => true, |
| 1193 | | .larch_tpoff32_lo12, .larch_tpoff32_hi20, .larch_tpoff64_lo20, .larch_tpoff64_hi12 => true, |
| 1196 | .tpoff32, |
| 1197 | .tpoff64, |
| 1198 | => true, |
| 1199 | |
| 1200 | .larch_tpoff32_lo12, |
| 1201 | .larch_tpoff32_hi20, |
| 1202 | .larch_tpoff64_lo20, |
| 1203 | .larch_tpoff64_hi12, |
| 1204 | => true, |
| 1205 | |
| 1206 | .sparc_le_hix22, |
| 1207 | .sparc_le_lox10, |
| 1208 | => true, |
| 1209 | |
| 1194 | 1210 | else => false, |
| 1195 | 1211 | }; |
| 1196 | 1212 | } |
| ... | ... | @@ -1570,6 +1586,44 @@ const SymbolReloc = struct { |
| 1570 | 1586 | result.imm13 = @as(u12, @truncate(target_value)); |
| 1571 | 1587 | elf.targetStore(dest_ptr, result); |
| 1572 | 1588 | }, |
| 1589 | .sparc_ldo_hix22 => { |
| 1590 | const dest_ptr: *link.sparc.reloc.Simm22 = @ptrCast(@alignCast(dest_slice)); |
| 1591 | var result = elf.targetLoad(dest_ptr); |
| 1592 | result.simm22 = @truncate(target_value >> 10); |
| 1593 | elf.targetStore(dest_ptr, result); |
| 1594 | }, |
| 1595 | .sparc_ldo_lox10 => { |
| 1596 | const dest_ptr: *link.sparc.reloc.Simm13 = @ptrCast(@alignCast(dest_slice)); |
| 1597 | var result = elf.targetLoad(dest_ptr); |
| 1598 | result.simm13 = @as(u10, @truncate(target_value)); |
| 1599 | elf.targetStore(dest_ptr, result); |
| 1600 | }, |
| 1601 | .sparc_le_hix22 => { |
| 1602 | const tls_phndx = elf.getNode(elf.ni.tls).segment; |
| 1603 | const tls_size: u64 = switch (elf.phdrSlice()) { |
| 1604 | inline else => |phdr| tls_size: { |
| 1605 | assert(elf.targetLoad(&phdr[tls_phndx].type) == .TLS); |
| 1606 | break :tls_size elf.targetLoad(&phdr[tls_phndx].memsz); |
| 1607 | }, |
| 1608 | }; |
| 1609 | const dest_ptr: *link.sparc.reloc.Imm22 = @ptrCast(@alignCast(dest_slice)); |
| 1610 | var result = elf.targetLoad(dest_ptr); |
| 1611 | result.imm22 = @truncate(~(target_value -% tls_size) >> 10); |
| 1612 | elf.targetStore(dest_ptr, result); |
| 1613 | }, |
| 1614 | .sparc_le_lox10 => { |
| 1615 | const tls_phndx = elf.getNode(elf.ni.tls).segment; |
| 1616 | const tls_size: u64 = switch (elf.phdrSlice()) { |
| 1617 | inline else => |phdr| tls_size: { |
| 1618 | assert(elf.targetLoad(&phdr[tls_phndx].type) == .TLS); |
| 1619 | break :tls_size elf.targetLoad(&phdr[tls_phndx].memsz); |
| 1620 | }, |
| 1621 | }; |
| 1622 | const dest_ptr: *link.sparc.reloc.Simm13 = @ptrCast(@alignCast(dest_slice)); |
| 1623 | var result = elf.targetLoad(dest_ptr); |
| 1624 | result.simm13 = @as(u13, 0b1110000000000) | @as(u10, @truncate(target_value -% tls_size)); |
| 1625 | elf.targetStore(dest_ptr, result); |
| 1626 | }, |
| 1573 | 1627 | } |
| 1574 | 1628 | } |
| 1575 | 1629 | |
| ... | ... | @@ -6307,12 +6361,8 @@ fn addRelocAssumeCapacity( |
| 6307 | 6361 | .TLS_GD_LO10, |
| 6308 | 6362 | .TLS_GD_CALL, |
| 6309 | 6363 | .TLS_LDM_CALL, |
| 6310 | | .TLS_LDO_HIX22, |
| 6311 | | .TLS_LDO_LOX10, |
| 6312 | 6364 | .TLS_IE_HI22, |
| 6313 | 6365 | .TLS_IE_LO10, |
| 6314 | | .TLS_LE_HIX22, |
| 6315 | | .TLS_LE_LOX10, |
| 6316 | 6366 | .TLS_DTPMOD32, |
| 6317 | 6367 | .TLS_DTPMOD64, |
| 6318 | 6368 | .H34, |
| ... | ... | @@ -6345,6 +6395,10 @@ fn addRelocAssumeCapacity( |
| 6345 | 6395 | .SIZE64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size64), |
| 6346 | 6396 | |
| 6347 | 6397 | // Relocations targeting a TLS symbol |
| 6398 | .TLS_LDO_HIX22 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_ldo_hix22), |
| 6399 | .TLS_LDO_LOX10 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_ldo_lox10), |
| 6400 | .TLS_LE_HIX22 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_le_hix22), |
| 6401 | .TLS_LE_LOX10 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_le_lox10), |
| 6348 | 6402 | .TLS_DTPOFF32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .dtpoff32), |
| 6349 | 6403 | .TLS_DTPOFF64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .dtpoff64), |
| 6350 | 6404 | .TLS_TPOFF32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff32), |
| ... | ... | @@ -6450,6 +6504,10 @@ fn addSymbolRelocAssumeCapacity( |
| 6450 | 6504 | .sparc_h44, |
| 6451 | 6505 | .sparc_m44, |
| 6452 | 6506 | .sparc_l44, |
| 6507 | .sparc_ldo_hix22, |
| 6508 | .sparc_ldo_lox10, |
| 6509 | .sparc_le_hix22, |
| 6510 | .sparc_le_lox10, |
| 6453 | 6511 | => unreachable, |
| 6454 | 6512 | } }, |
| 6455 | 6513 | .LOONGARCH => .{ .LOONGARCH = switch (@"type") { |
| ... | ... | @@ -6495,6 +6553,10 @@ fn addSymbolRelocAssumeCapacity( |
| 6495 | 6553 | .sparc_h44, |
| 6496 | 6554 | .sparc_m44, |
| 6497 | 6555 | .sparc_l44, |
| 6556 | .sparc_ldo_hix22, |
| 6557 | .sparc_ldo_lox10, |
| 6558 | .sparc_le_hix22, |
| 6559 | .sparc_le_lox10, |
| 6498 | 6560 | => unreachable, |
| 6499 | 6561 | } }, |
| 6500 | 6562 | .SPARCV9 => .{ .SPARC = switch (@"type") { |
| ... | ... | @@ -6541,6 +6603,10 @@ fn addSymbolRelocAssumeCapacity( |
| 6541 | 6603 | .sparc_h44 => .H44, |
| 6542 | 6604 | .sparc_m44 => .M44, |
| 6543 | 6605 | .sparc_l44 => .L44, |
| 6606 | .sparc_ldo_hix22 => .TLS_LDO_HIX22, |
| 6607 | .sparc_ldo_lox10 => .TLS_LDO_LOX10, |
| 6608 | .sparc_le_hix22 => .TLS_LE_HIX22, |
| 6609 | .sparc_le_lox10 => .TLS_LE_LOX10, |
| 6544 | 6610 | } }, |
| 6545 | 6611 | }; |
| 6546 | 6612 | |