| ... | @@ -1186,11 +1186,27 @@ const SymbolReloc = struct { | ... | @@ -1186,11 +1186,27 @@ const SymbolReloc = struct { |
| 1186 | sparc_h44, | 1186 | sparc_h44, |
| 1187 | sparc_m44, | 1187 | sparc_m44, |
| 1188 | sparc_l44, | 1188 | sparc_l44, |
| | 1189 | sparc_ldo_hix22, |
| | 1190 | sparc_ldo_lox10, |
| | 1191 | sparc_le_hix22, |
| | 1192 | sparc_le_lox10, |
| 1189 | | 1193 | |
| 1190 | fn dependsOnTlsSize(t: SymbolReloc.Type) bool { | 1194 | fn dependsOnTlsSize(t: SymbolReloc.Type) bool { |
| 1191 | return switch (t) { | 1195 | return switch (t) { |
| 1192 | .tpoff32, .tpoff64 => true, | 1196 | .tpoff32, |
| 1193 | .larch_tpoff32_lo12, .larch_tpoff32_hi20, .larch_tpoff64_lo20, .larch_tpoff64_hi12 => true, | 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 | else => false, | 1210 | else => false, |
| 1195 | }; | 1211 | }; |
| 1196 | } | 1212 | } |
| ... | @@ -1570,6 +1586,44 @@ const SymbolReloc = struct { | ... | @@ -1570,6 +1586,44 @@ const SymbolReloc = struct { |
| 1570 | result.imm13 = @as(u12, @truncate(target_value)); | 1586 | result.imm13 = @as(u12, @truncate(target_value)); |
| 1571 | elf.targetStore(dest_ptr, result); | 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,12 +6361,8 @@ fn addRelocAssumeCapacity( |
| 6307 | .TLS_GD_LO10, | 6361 | .TLS_GD_LO10, |
| 6308 | .TLS_GD_CALL, | 6362 | .TLS_GD_CALL, |
| 6309 | .TLS_LDM_CALL, | 6363 | .TLS_LDM_CALL, |
| 6310 | .TLS_LDO_HIX22, | | |
| 6311 | .TLS_LDO_LOX10, | | |
| 6312 | .TLS_IE_HI22, | 6364 | .TLS_IE_HI22, |
| 6313 | .TLS_IE_LO10, | 6365 | .TLS_IE_LO10, |
| 6314 | .TLS_LE_HIX22, | | |
| 6315 | .TLS_LE_LOX10, | | |
| 6316 | .TLS_DTPMOD32, | 6366 | .TLS_DTPMOD32, |
| 6317 | .TLS_DTPMOD64, | 6367 | .TLS_DTPMOD64, |
| 6318 | .H34, | 6368 | .H34, |
| ... | @@ -6345,6 +6395,10 @@ fn addRelocAssumeCapacity( | ... | @@ -6345,6 +6395,10 @@ fn addRelocAssumeCapacity( |
| 6345 | .SIZE64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size64), | 6395 | .SIZE64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size64), |
| 6346 | | 6396 | |
| 6347 | // Relocations targeting a TLS symbol | 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 | .TLS_DTPOFF32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .dtpoff32), | 6402 | .TLS_DTPOFF32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .dtpoff32), |
| 6349 | .TLS_DTPOFF64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .dtpoff64), | 6403 | .TLS_DTPOFF64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .dtpoff64), |
| 6350 | .TLS_TPOFF32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff32), | 6404 | .TLS_TPOFF32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff32), |
| ... | @@ -6450,6 +6504,10 @@ fn addSymbolRelocAssumeCapacity( | ... | @@ -6450,6 +6504,10 @@ fn addSymbolRelocAssumeCapacity( |
| 6450 | .sparc_h44, | 6504 | .sparc_h44, |
| 6451 | .sparc_m44, | 6505 | .sparc_m44, |
| 6452 | .sparc_l44, | 6506 | .sparc_l44, |
| | 6507 | .sparc_ldo_hix22, |
| | 6508 | .sparc_ldo_lox10, |
| | 6509 | .sparc_le_hix22, |
| | 6510 | .sparc_le_lox10, |
| 6453 | => unreachable, | 6511 | => unreachable, |
| 6454 | } }, | 6512 | } }, |
| 6455 | .LOONGARCH => .{ .LOONGARCH = switch (@"type") { | 6513 | .LOONGARCH => .{ .LOONGARCH = switch (@"type") { |
| ... | @@ -6495,6 +6553,10 @@ fn addSymbolRelocAssumeCapacity( | ... | @@ -6495,6 +6553,10 @@ fn addSymbolRelocAssumeCapacity( |
| 6495 | .sparc_h44, | 6553 | .sparc_h44, |
| 6496 | .sparc_m44, | 6554 | .sparc_m44, |
| 6497 | .sparc_l44, | 6555 | .sparc_l44, |
| | 6556 | .sparc_ldo_hix22, |
| | 6557 | .sparc_ldo_lox10, |
| | 6558 | .sparc_le_hix22, |
| | 6559 | .sparc_le_lox10, |
| 6498 | => unreachable, | 6560 | => unreachable, |
| 6499 | } }, | 6561 | } }, |
| 6500 | .SPARCV9 => .{ .SPARC = switch (@"type") { | 6562 | .SPARCV9 => .{ .SPARC = switch (@"type") { |
| ... | @@ -6541,6 +6603,10 @@ fn addSymbolRelocAssumeCapacity( | ... | @@ -6541,6 +6603,10 @@ fn addSymbolRelocAssumeCapacity( |
| 6541 | .sparc_h44 => .H44, | 6603 | .sparc_h44 => .H44, |
| 6542 | .sparc_m44 => .M44, | 6604 | .sparc_m44 => .M44, |
| 6543 | .sparc_l44 => .L44, | 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 | |