| ... | ... | @@ -1165,6 +1165,14 @@ const SymbolReloc = struct { |
| 1165 | 1165 | larch_tpoff64_lo20, |
| 1166 | 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 | 1176 | fn dependsOnTlsSize(t: SymbolReloc.Type) bool { |
| 1169 | 1177 | return switch (t) { |
| 1170 | 1178 | .tpoff32, .tpoff64 => true, |
| ... | ... | @@ -1499,6 +1507,55 @@ const SymbolReloc = struct { |
| 1499 | 1507 | assert(elf.ehdrField(.machine) == .LOONGARCH); |
| 1500 | 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 | 6263 | .IRELATIVE, |
| 6207 | 6264 | => std.debug.panic("TODO: error for illegal or unsupported input relocation, {t}", .{@"type".SPARC}), |
| 6208 | 6265 | |
| 6209 | | inline .WDISP30, |
| 6210 | | .WDISP22, |
| 6266 | inline .WDISP22, |
| 6211 | 6267 | .HI22, |
| 6212 | 6268 | .@"22", |
| 6213 | 6269 | .@"13", |
| 6214 | 6270 | .LO10, |
| 6215 | | .PC10, |
| 6216 | | .PC22, |
| 6217 | | .WPLT30, |
| 6218 | 6271 | .HIPLT22, |
| 6219 | 6272 | .LOPLT10, |
| 6220 | 6273 | .PCPLT22, |
| ... | ... | @@ -6235,9 +6288,6 @@ fn addRelocAssumeCapacity( |
| 6235 | 6288 | .@"6", |
| 6236 | 6289 | .HIX22, |
| 6237 | 6290 | .LOX10, |
| 6238 | | .H44, |
| 6239 | | .M44, |
| 6240 | | .L44, |
| 6241 | 6291 | .REGISTER, |
| 6242 | 6292 | .TLS_GD_HI22, |
| 6243 | 6293 | .TLS_GD_LO10, |
| ... | ... | @@ -6264,12 +6314,19 @@ fn addRelocAssumeCapacity( |
| 6264 | 6314 | .DISP8 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel8), |
| 6265 | 6315 | .DISP16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel16), |
| 6266 | 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 | 6321 | .UA32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs32), |
| 6268 | 6322 | .PLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltabs32), |
| 6269 | 6323 | .PCPLT32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .pltrel32), |
| 6270 | 6324 | .@"64" => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64), |
| 6271 | 6325 | .DISP64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64), |
| 6272 | 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 | 6330 | .UA64 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs64), |
| 6274 | 6331 | .UA16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs16), |
| 6275 | 6332 | .SIZE32 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .size32), |
| ... | ... | @@ -6371,6 +6428,15 @@ fn addSymbolRelocAssumeCapacity( |
| 6371 | 6428 | .larch_tpoff64_lo20, |
| 6372 | 6429 | .larch_tpoff64_hi12, |
| 6373 | 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 | 6441 | .LOONGARCH => .{ .LOONGARCH = switch (@"type") { |
| 6376 | 6442 | .write_rela => unreachable, |
| ... | ... | @@ -6407,6 +6473,15 @@ fn addSymbolRelocAssumeCapacity( |
| 6407 | 6473 | .larch_tpoff32_hi20 => .TLS_LE_HI20, |
| 6408 | 6474 | .larch_tpoff64_lo20 => .TLS_LE64_LO20, |
| 6409 | 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 | 6486 | .SPARCV9 => .{ .SPARC = switch (@"type") { |
| 6412 | 6487 | .write_rela => unreachable, |
| ... | ... | @@ -6444,6 +6519,14 @@ fn addSymbolRelocAssumeCapacity( |
| 6444 | 6519 | .larch_tpoff64_lo20, |
| 6445 | 6520 | .larch_tpoff64_hi12, |
| 6446 | 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 | |