| ... | @@ -1165,6 +1165,14 @@ const SymbolReloc = struct { | ... | @@ -1165,6 +1165,14 @@ const SymbolReloc = struct { |
| 1165 | larch_tpoff64_lo20, | 1165 | larch_tpoff64_lo20, |
| 1166 | larch_tpoff64_hi12, | 1166 | larch_tpoff64_hi12, |
| 1167 | | 1167 | |
| | 1168 | sparc_wdisp30, |
| | 1169 | sparc_pc10, |
| | 1170 | sparc_pc22, |
| | 1171 | sparc_wplt30, |
| | 1172 | sparc_h44, |
| | 1173 | sparc_m44, |
| | 1174 | sparc_l44, |
| | 1175 | |
| 1168 | fn dependsOnTlsSize(t: SymbolReloc.Type) bool { | 1176 | fn dependsOnTlsSize(t: SymbolReloc.Type) bool { |
| 1169 | return switch (t) { | 1177 | return switch (t) { |
| 1170 | .tpoff32, .tpoff64 => true, | 1178 | .tpoff32, .tpoff64 => true, |
| ... | @@ -1499,6 +1507,55 @@ const SymbolReloc = struct { | ... | @@ -1499,6 +1507,55 @@ const SymbolReloc = struct { |
| 1499 | assert(elf.ehdrField(.machine) == .LOONGARCH); | 1507 | assert(elf.ehdrField(.machine) == .LOONGARCH); |
| 1500 | link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value >> 52)); | 1508 | link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value >> 52)); |
| 1501 | }, | 1509 | }, |
| | 1510 | |
| | 1511 | .sparc_wdisp30 => { |
| | 1512 | const dest_ptr: *link.sparc.reloc.Disp30 = @ptrCast(@alignCast(dest_slice)); |
| | 1513 | var result = elf.targetLoad(dest_ptr); |
| | 1514 | result.disp30 = @truncate((target_value -% dest_vaddr) >> 2); |
| | 1515 | elf.targetStore(dest_ptr, result); |
| | 1516 | }, |
| | 1517 | .sparc_pc10 => { |
| | 1518 | const dest_ptr: *link.sparc.reloc.Simm13 = @ptrCast(@alignCast(dest_slice)); |
| | 1519 | var result = elf.targetLoad(dest_ptr); |
| | 1520 | result.simm13 = @as(u10, @truncate(target_value -% dest_vaddr)); |
| | 1521 | elf.targetStore(dest_ptr, result); |
| | 1522 | }, |
| | 1523 | .sparc_pc22 => { |
| | 1524 | const dest_ptr: *link.sparc.reloc.Disp22 = @ptrCast(@alignCast(dest_slice)); |
| | 1525 | var result = elf.targetLoad(dest_ptr); |
| | 1526 | result.disp22 = @truncate((target_value -% dest_vaddr) >> 10); |
| | 1527 | elf.targetStore(dest_ptr, result); |
| | 1528 | }, |
| | 1529 | .sparc_wplt30 => { |
| | 1530 | const plt_index = switch (reloc.target.unwrap()) { |
| | 1531 | .local => continue :type .sparc_wdisp30, |
| | 1532 | .global => |name| elf.plt.getIndex(name) orelse continue :type .sparc_wdisp30, |
| | 1533 | }; |
| | 1534 | if (elf.pltEntryIsDead(plt_index)) continue :type .sparc_wdisp30; |
| | 1535 | const plt_entry = elf.shndx.plt.vaddr(elf) +% (4 + plt_index) * 32; |
| | 1536 | const dest_ptr: *link.sparc.reloc.Disp30 = @ptrCast(@alignCast(dest_slice)); |
| | 1537 | var result = elf.targetLoad(dest_ptr); |
| | 1538 | result.disp30 = @truncate((plt_entry +% @as(u64, @bitCast(reloc.addend)) -% dest_vaddr) >> 2); |
| | 1539 | elf.targetStore(dest_ptr, result); |
| | 1540 | }, |
| | 1541 | .sparc_h44 => { |
| | 1542 | const dest_ptr: *link.sparc.reloc.Imm22 = @ptrCast(@alignCast(dest_slice)); |
| | 1543 | var result = elf.targetLoad(dest_ptr); |
| | 1544 | result.imm22 = @truncate(target_value >> 22); |
| | 1545 | elf.targetStore(dest_ptr, result); |
| | 1546 | }, |
| | 1547 | .sparc_m44 => { |
| | 1548 | const dest_ptr: *link.sparc.reloc.Imm10 = @ptrCast(@alignCast(dest_slice)); |
| | 1549 | var result = elf.targetLoad(dest_ptr); |
| | 1550 | result.imm10 = @truncate(target_value >> 12); |
| | 1551 | elf.targetStore(dest_ptr, result); |
| | 1552 | }, |
| | 1553 | .sparc_l44 => { |
| | 1554 | const dest_ptr: *link.sparc.reloc.Imm13 = @ptrCast(@alignCast(dest_slice)); |
| | 1555 | var result = elf.targetLoad(dest_ptr); |
| | 1556 | result.imm13 = @as(u12, @truncate(target_value)); |
| | 1557 | elf.targetStore(dest_ptr, result); |
| | 1558 | }, |
| 1502 | } | 1559 | } |
| 1503 | } | 1560 | } |
| 1504 | | 1561 | |
| ... | @@ -6206,15 +6263,11 @@ fn addRelocAssumeCapacity( | ... | @@ -6206,15 +6263,11 @@ fn addRelocAssumeCapacity( |
| 6206 | .IRELATIVE, | 6263 | .IRELATIVE, |
| 6207 | => std.debug.panic("TODO: error for illegal or unsupported input relocation, {t}", .{@"type".SPARC}), | 6264 | => std.debug.panic("TODO: error for illegal or unsupported input relocation, {t}", .{@"type".SPARC}), |
| 6208 | | 6265 | |
| 6209 | inline .WDISP30, | 6266 | inline .WDISP22, |
| 6210 | .WDISP22, | | |
| 6211 | .HI22, | 6267 | .HI22, |
| 6212 | .@"22", | 6268 | .@"22", |
| 6213 | .@"13", | 6269 | .@"13", |
| 6214 | .LO10, | 6270 | .LO10, |
| 6215 | .PC10, | | |
| 6216 | .PC22, | | |
| 6217 | .WPLT30, | | |
| 6218 | .HIPLT22, | 6271 | .HIPLT22, |
| 6219 | .LOPLT10, | 6272 | .LOPLT10, |
| 6220 | .PCPLT22, | 6273 | .PCPLT22, |
| ... | @@ -6235,9 +6288,6 @@ fn addRelocAssumeCapacity( | ... | @@ -6235,9 +6288,6 @@ fn addRelocAssumeCapacity( |
| 6235 | .@"6", | 6288 | .@"6", |
| 6236 | .HIX22, | 6289 | .HIX22, |
| 6237 | .LOX10, | 6290 | .LOX10, |
| 6238 | .H44, | | |
| 6239 | .M44, | | |
| 6240 | .L44, | | |
| 6241 | .REGISTER, | 6291 | .REGISTER, |
| 6242 | .TLS_GD_HI22, | 6292 | .TLS_GD_HI22, |
| 6243 | .TLS_GD_LO10, | 6293 | .TLS_GD_LO10, |
| ... | @@ -6264,12 +6314,19 @@ fn addRelocAssumeCapacity( | ... | @@ -6264,12 +6314,19 @@ fn addRelocAssumeCapacity( |
| 6264 | .DISP8 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel8), | 6314 | .DISP8 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel8), |
| 6265 | .DISP16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel16), | 6315 | .DISP16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel16), |
| 6266 | .DISP32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel32), | 6316 | .DISP32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel32), |
| | 6317 | .WDISP30 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_wdisp30), |
| | 6318 | .PC10 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_pc10), |
| | 6319 | .PC22 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_pc22), |
| | 6320 | .WPLT30 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_wplt30), |
| 6267 | .UA32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs32), | 6321 | .UA32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs32), |
| 6268 | .PLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs32), | 6322 | .PLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs32), |
| 6269 | .PCPLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltrel32), | 6323 | .PCPLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltrel32), |
| 6270 | .@"64" => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64), | 6324 | .@"64" => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64), |
| 6271 | .DISP64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64), | 6325 | .DISP64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64), |
| 6272 | .PLT64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs64), | 6326 | .PLT64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs64), |
| | 6327 | .H44 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_h44), |
| | 6328 | .M44 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_m44), |
| | 6329 | .L44 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .sparc_l44), |
| 6273 | .UA64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64), | 6330 | .UA64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64), |
| 6274 | .UA16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs16), | 6331 | .UA16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs16), |
| 6275 | .SIZE32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size32), | 6332 | .SIZE32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size32), |
| ... | @@ -6371,6 +6428,15 @@ fn addSymbolRelocAssumeCapacity( | ... | @@ -6371,6 +6428,15 @@ fn addSymbolRelocAssumeCapacity( |
| 6371 | .larch_tpoff64_lo20, | 6428 | .larch_tpoff64_lo20, |
| 6372 | .larch_tpoff64_hi12, | 6429 | .larch_tpoff64_hi12, |
| 6373 | => unreachable, | 6430 | => unreachable, |
| | 6431 | |
| | 6432 | .sparc_wdisp30, |
| | 6433 | .sparc_pc10, |
| | 6434 | .sparc_pc22, |
| | 6435 | .sparc_wplt30, |
| | 6436 | .sparc_h44, |
| | 6437 | .sparc_m44, |
| | 6438 | .sparc_l44, |
| | 6439 | => unreachable, |
| 6374 | } }, | 6440 | } }, |
| 6375 | .LOONGARCH => .{ .LOONGARCH = switch (@"type") { | 6441 | .LOONGARCH => .{ .LOONGARCH = switch (@"type") { |
| 6376 | .write_rela => unreachable, | 6442 | .write_rela => unreachable, |
| ... | @@ -6407,6 +6473,15 @@ fn addSymbolRelocAssumeCapacity( | ... | @@ -6407,6 +6473,15 @@ fn addSymbolRelocAssumeCapacity( |
| 6407 | .larch_tpoff32_hi20 => .TLS_LE_HI20, | 6473 | .larch_tpoff32_hi20 => .TLS_LE_HI20, |
| 6408 | .larch_tpoff64_lo20 => .TLS_LE64_LO20, | 6474 | .larch_tpoff64_lo20 => .TLS_LE64_LO20, |
| 6409 | .larch_tpoff64_hi12 => .TLS_LE64_HI12, | 6475 | .larch_tpoff64_hi12 => .TLS_LE64_HI12, |
| | 6476 | |
| | 6477 | .sparc_wdisp30, |
| | 6478 | .sparc_pc10, |
| | 6479 | .sparc_pc22, |
| | 6480 | .sparc_wplt30, |
| | 6481 | .sparc_h44, |
| | 6482 | .sparc_m44, |
| | 6483 | .sparc_l44, |
| | 6484 | => unreachable, |
| 6410 | } }, | 6485 | } }, |
| 6411 | .SPARCV9 => .{ .SPARC = switch (@"type") { | 6486 | .SPARCV9 => .{ .SPARC = switch (@"type") { |
| 6412 | .write_rela => unreachable, | 6487 | .write_rela => unreachable, |
| ... | @@ -6444,6 +6519,14 @@ fn addSymbolRelocAssumeCapacity( | ... | @@ -6444,6 +6519,14 @@ fn addSymbolRelocAssumeCapacity( |
| 6444 | .larch_tpoff64_lo20, | 6519 | .larch_tpoff64_lo20, |
| 6445 | .larch_tpoff64_hi12, | 6520 | .larch_tpoff64_hi12, |
| 6446 | => unreachable, | 6521 | => unreachable, |
| | 6522 | |
| | 6523 | .sparc_wdisp30 => .WDISP30, |
| | 6524 | .sparc_pc10 => .PC10, |
| | 6525 | .sparc_pc22 => .PC22, |
| | 6526 | .sparc_wplt30 => .WPLT30, |
| | 6527 | .sparc_h44 => .H44, |
| | 6528 | .sparc_m44 => .M44, |
| | 6529 | .sparc_l44 => .L44, |
| 6447 | } }, | 6530 | } }, |
| 6448 | }; | 6531 | }; |
| 6449 | | 6532 | |