authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-06 12:02:18+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-07-09 10:49:18+02:00
log001d7ed757cf67ed955bfdb15d46cc57949c6ecb
treea07137a060a6cf9253398625f3d41e0663896c5e
parentf51bb018d71da1ab80af59b03eba207e12c231a6
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Elf2: rename loongarch-specific relocation tags


1 files changed, 95 insertions(+), 91 deletions(-)

src/link/Elf2.zig+95-91
......@@ -784,13 +784,13 @@ const GotReloc = struct {
784784 rel64,
785785 rel32,
786786
787 rel32_hi20,
788 rel64_lo20,
789 rel64_hi12,
790 abs32_lo12,
791 abs32_hi20,
792 abs64_lo20,
793 abs64_hi12,
787 larch_rel32_hi20,
788 larch_rel64_lo20,
789 larch_rel64_hi12,
790 larch_abs32_lo12,
791 larch_abs32_hi20,
792 larch_abs64_lo20,
793 larch_abs64_hi12,
794794 };
795795
796796 const Index = enum(u32) {
......@@ -859,37 +859,38 @@ const GotReloc = struct {
859859 @intCast(@as(i64, @bitCast(got_vaddr +% got_offset +% addend -% dest_vaddr))),
860860 target_endian,
861861 ),
862 .rel32_hi20 => {
862
863 .larch_rel32_hi20 => {
863864 assert(elf.ehdrField(.machine) == .LOONGARCH);
864865 const target_value = got_vaddr +% got_offset +% addend;
865866 link.loongarch.writeJ20(dest_slice[0..4], link.loongarch.toPcalaHi20(target_value, dest_vaddr));
866867 },
867 .rel64_lo20 => {
868 .larch_rel64_lo20 => {
868869 assert(elf.ehdrField(.machine) == .LOONGARCH);
869870 const target_value = got_vaddr +% got_offset +% addend;
870871 link.loongarch.writeJ20(dest_slice[0..4], link.loongarch.toPcala64Lo20(target_value, dest_vaddr));
871872 },
872 .rel64_hi12 => {
873 .larch_rel64_hi12 => {
873874 assert(elf.ehdrField(.machine) == .LOONGARCH);
874875 const target_value = got_vaddr +% got_offset +% addend;
875876 link.loongarch.writeK12(dest_slice[0..4], link.loongarch.toPcala64Hi12(target_value, dest_vaddr));
876877 },
877 .abs32_lo12 => {
878 .larch_abs32_lo12 => {
878879 assert(elf.ehdrField(.machine) == .LOONGARCH);
879880 const target_value = got_vaddr +% got_offset +% addend;
880881 link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value));
881882 },
882 .abs32_hi20 => {
883 .larch_abs32_hi20 => {
883884 assert(elf.ehdrField(.machine) == .LOONGARCH);
884885 const target_value = got_vaddr +% got_offset +% addend;
885886 link.loongarch.writeJ20(dest_slice[0..4], @truncate(target_value >> 12));
886887 },
887 .abs64_lo20 => {
888 .larch_abs64_lo20 => {
888889 assert(elf.ehdrField(.machine) == .LOONGARCH);
889890 const target_value = got_vaddr +% got_offset +% addend;
890891 link.loongarch.writeJ20(dest_slice[0..4], @truncate(target_value >> 32));
891892 },
892 .abs64_hi12 => {
893 .larch_abs64_hi12 => {
893894 assert(elf.ehdrField(.machine) == .LOONGARCH);
894895 const target_value = got_vaddr +% got_offset +% addend;
895896 link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value >> 52));
......@@ -1108,23 +1109,23 @@ const SymbolReloc = struct {
11081109 size64,
11091110 size32,
11101111
1111 abs32_lo12,
1112 rel32_hi20,
1113 rel64_lo20,
1114 rel64_hi12,
1115 branch_rel18,
1116 branch_rel23,
1117 branch_rel28,
1118 call_rel38,
1119 tpoff32_lo12,
1120 tpoff32_hi20,
1121 tpoff64_lo20,
1122 tpoff64_hi12,
1112 larch_abs32_lo12,
1113 larch_rel32_hi20,
1114 larch_rel64_lo20,
1115 larch_rel64_hi12,
1116 larch_branch_rel18,
1117 larch_branch_rel23,
1118 larch_branch_rel28,
1119 larch_call_rel38,
1120 larch_tpoff32_lo12,
1121 larch_tpoff32_hi20,
1122 larch_tpoff64_lo20,
1123 larch_tpoff64_hi12,
11231124
11241125 fn dependsOnTlsSize(t: SymbolReloc.Type) bool {
11251126 return switch (t) {
11261127 .tpoff32, .tpoff64 => true,
1127 .tpoff32_lo12, .tpoff32_hi20, .tpoff64_lo20, .tpoff64_hi12 => true,
1128 .larch_tpoff32_lo12, .larch_tpoff32_hi20, .larch_tpoff64_lo20, .larch_tpoff64_hi12 => true,
11281129 else => false,
11291130 };
11301131 }
......@@ -1307,42 +1308,43 @@ const SymbolReloc = struct {
13071308 target_endian,
13081309 );
13091310 },
1310 .abs32_lo12 => {
1311
1312 .larch_abs32_lo12 => {
13111313 assert(elf.ehdrField(.machine) == .LOONGARCH);
13121314 link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value));
13131315 },
1314 .rel32_hi20 => {
1316 .larch_rel32_hi20 => {
13151317 assert(elf.ehdrField(.machine) == .LOONGARCH);
13161318 link.loongarch.writeJ20(dest_slice[0..4], link.loongarch.toPcalaHi20(target_value, dest_vaddr));
13171319 },
1318 .rel64_lo20 => {
1320 .larch_rel64_lo20 => {
13191321 assert(elf.ehdrField(.machine) == .LOONGARCH);
13201322 link.loongarch.writeJ20(dest_slice[0..4], link.loongarch.toPcala64Lo20(target_value, dest_vaddr));
13211323 },
1322 .rel64_hi12 => {
1324 .larch_rel64_hi12 => {
13231325 assert(elf.ehdrField(.machine) == .LOONGARCH);
13241326 link.loongarch.writeK12(dest_slice[0..4], link.loongarch.toPcala64Hi12(target_value, dest_vaddr));
13251327 },
13261328 // TODO: handle bad alignment and overflow gracefully
1327 .branch_rel18 => {
1329 .larch_branch_rel18 => {
13281330 assert(elf.ehdrField(.machine) == .LOONGARCH);
13291331 const target_rel: i64 = @bitCast(target_value -% dest_vaddr);
13301332 const slot_target: i16 = @intCast(@shrExact(target_rel, 2));
13311333 link.loongarch.writeK16(dest_slice[0..4], @bitCast(slot_target));
13321334 },
1333 .branch_rel23 => {
1335 .larch_branch_rel23 => {
13341336 assert(elf.ehdrField(.machine) == .LOONGARCH);
13351337 const target_rel: i64 = @bitCast(target_value -% dest_vaddr);
13361338 const slot_target: i21 = @intCast(@shrExact(target_rel, 2));
13371339 link.loongarch.writeD5K16(dest_slice[0..4], @bitCast(slot_target));
13381340 },
1339 .branch_rel28 => {
1341 .larch_branch_rel28 => {
13401342 assert(elf.ehdrField(.machine) == .LOONGARCH);
13411343 const target_rel: i64 = @bitCast(target_value -% dest_vaddr);
13421344 const slot_target: i26 = @intCast(@shrExact(target_rel, 2));
13431345 link.loongarch.writeD10K16(dest_slice[0..4], @bitCast(slot_target));
13441346 },
1345 .call_rel38 => {
1347 .larch_call_rel38 => {
13461348 assert(elf.ehdrField(.machine) == .LOONGARCH);
13471349 const target_rel: i64 = @bitCast(target_value -% dest_vaddr);
13481350 // We use i64 instead of i36 here because the allowed range is
......@@ -1352,19 +1354,19 @@ const SymbolReloc = struct {
13521354 link.loongarch.writeJ20(dest_slice[0..4], @bitCast(@as(i20, @intCast((slot_target +% 0x8000) >> 16))));
13531355 link.loongarch.writeK16(dest_slice[4..8], @bitCast(@as(i16, @truncate(slot_target))));
13541356 },
1355 .tpoff32_lo12 => {
1357 .larch_tpoff32_lo12 => {
13561358 assert(elf.ehdrField(.machine) == .LOONGARCH);
13571359 link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value));
13581360 },
1359 .tpoff32_hi20 => {
1361 .larch_tpoff32_hi20 => {
13601362 assert(elf.ehdrField(.machine) == .LOONGARCH);
13611363 link.loongarch.writeJ20(dest_slice[0..4], @truncate(target_value >> 12));
13621364 },
1363 .tpoff64_lo20 => {
1365 .larch_tpoff64_lo20 => {
13641366 assert(elf.ehdrField(.machine) == .LOONGARCH);
13651367 link.loongarch.writeJ20(dest_slice[0..4], @truncate(target_value >> 32));
13661368 },
1367 .tpoff64_hi12 => {
1369 .larch_tpoff64_hi12 => {
13681370 assert(elf.ehdrField(.machine) == .LOONGARCH);
13691371 link.loongarch.writeK12(dest_slice[0..4], @truncate(target_value >> 52));
13701372 },
......@@ -2163,10 +2165,10 @@ fn addPltEntry(elf: *Elf, global_name: String(.strtab), dynsym_index: u32) void
21632165 switch (elf.shdrPtr(elf.shndx.got_plt)) {
21642166 inline else => |shdr, class| {
21652167 assert(elf.targetLoad(&shdr.size) == got_plt_offset);
2166 elf.targetStore(&shdr.size, got_plt_offset + @sizeOf(shdr.ElfN().Addr));
2168 elf.targetStore(&shdr.size, got_plt_offset + @sizeOf(class.ElfN().Addr));
21672169 std.mem.writeInt(
21682170 class.ElfN().Addr,
2169 got_plt_ni.slice(&elf.mf)[got_plt_offset..][0..@sizeOf(shdr.ElfN().Addr)],
2171 got_plt_ni.slice(&elf.mf)[got_plt_offset..][0..@sizeOf(class.ElfN().Addr)],
21702172 @intCast(plt_addr),
21712173 target_endian,
21722174 );
......@@ -2225,10 +2227,10 @@ fn addPltEntry(elf: *Elf, global_name: String(.strtab), dynsym_index: u32) void
22252227 switch (elf.shdrPtr(elf.shndx.got_plt)) {
22262228 inline else => |shdr, class| {
22272229 assert(elf.targetLoad(&shdr.size) == got_plt_offset);
2228 elf.targetStore(&shdr.size, got_plt_offset + @sizeOf(shdr.ElfN().Addr));
2230 elf.targetStore(&shdr.size, got_plt_offset + @sizeOf(class.ElfN().Addr));
22292231 std.mem.writeInt(
22302232 class.ElfN().Addr,
2231 got_plt_ni.slice(&elf.mf)[got_plt_offset..][0..@sizeOf(shdr.ElfN().Addr)],
2233 got_plt_ni.slice(&elf.mf)[got_plt_offset..][0..@sizeOf(class.ElfN().Addr)],
22322234 @intCast(plt_addr),
22332235 target_endian,
22342236 );
......@@ -3817,9 +3819,9 @@ fn initHeaders(
38173819 });
38183820 elf.plt_first_symbol_reloc = @enumFromInt(elf.symbol_relocs.items.len);
38193821 try elf.ensureUnusedRelocCapacity(plt_ni, 3);
3820 try elf.addSymbolRelocAssumeCapacity(plt_ni, 0, got_plt_sym, 0, .rel32_hi20);
3821 try elf.addSymbolRelocAssumeCapacity(plt_ni, 8, got_plt_sym, 0, .abs32_lo12);
3822 try elf.addSymbolRelocAssumeCapacity(plt_ni, 16, got_plt_sym, 0, .abs32_lo12);
3822 try elf.addSymbolRelocAssumeCapacity(plt_ni, 0, got_plt_sym, 0, .larch_rel32_hi20);
3823 try elf.addSymbolRelocAssumeCapacity(plt_ni, 8, got_plt_sym, 0, .larch_abs32_lo12);
3824 try elf.addSymbolRelocAssumeCapacity(plt_ni, 16, got_plt_sym, 0, .larch_abs32_lo12);
38233825 },
38243826 .SPARCV9 => {},
38253827 }
......@@ -6037,33 +6039,33 @@ fn addRelocAssumeCapacity(
60376039 .@"64_PCREL" => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64),
60386040 .@"32_PCREL" => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel32),
60396041
6040 .PCALA_LO12 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .abs32_lo12),
6041 .PCALA_HI20 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel32_hi20),
6042 .PCALA64_HI12 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64_hi12),
6043 .PCALA64_LO20 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .rel64_lo20),
6042 .PCALA_LO12 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_abs32_lo12),
6043 .PCALA_HI20 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_rel32_hi20),
6044 .PCALA64_HI12 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_rel64_hi12),
6045 .PCALA64_LO20 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_rel64_lo20),
60446046
6045 .B16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .branch_rel18),
6046 .B21 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .branch_rel23),
6047 .B26 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .branch_rel28),
6048 .CALL36 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .call_rel38),
6047 .B16 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_branch_rel18),
6048 .B21 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_branch_rel23),
6049 .B26 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_branch_rel28),
6050 .CALL36 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_call_rel38),
60496051
60506052 // Relocations targeting a TLS symbol
6051 .TLS_LE_LO12, .TLS_LE_LO12_R => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff32_lo12),
6052 .TLS_LE_HI20, .TLS_LE_HI20_R => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff32_hi20),
6053 .TLS_LE64_LO20 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff64_lo20),
6054 .TLS_LE64_HI12 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .tpoff64_hi12),
6053 .TLS_LE_LO12, .TLS_LE_LO12_R => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_tpoff32_lo12),
6054 .TLS_LE_HI20, .TLS_LE_HI20_R => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_tpoff32_hi20),
6055 .TLS_LE64_LO20 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_tpoff64_lo20),
6056 .TLS_LE64_HI12 => try elf.addSymbolRelocAssumeCapacity(node, offset, target, addend, .larch_tpoff64_hi12),
60556057 .TLS_LE_ADD_R => {}, // TODO: relaxation is not yet implemented
60566058
60576059 // Relocations targeting a GOT entry
6058 .GOT_PC_LO12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .abs32_lo12),
6059 .GOT_PC_HI20 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .rel32_hi20),
6060 .GOT64_PC_LO20 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .rel64_lo20),
6061 .GOT64_PC_HI12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .rel64_hi12),
6062
6063 .GOT_LO12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .abs32_lo12),
6064 .GOT_HI20 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .abs32_hi20),
6065 .GOT64_LO20 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .abs64_lo20),
6066 .GOT64_HI12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .abs64_hi12),
6060 .GOT_PC_LO12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_abs32_lo12),
6061 .GOT_PC_HI20 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_rel32_hi20),
6062 .GOT64_PC_LO20 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_rel64_lo20),
6063 .GOT64_PC_HI12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_rel64_hi12),
6064
6065 .GOT_LO12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_abs32_lo12),
6066 .GOT_HI20 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_abs32_hi20),
6067 .GOT64_LO20 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_abs64_lo20),
6068 .GOT64_HI12 => elf.addGotRelocAssumeCapacity(node, offset, .{ .symbol = target }, addend, .larch_abs64_hi12),
60676069 },
60686070 },
60696071 }
......@@ -6118,18 +6120,19 @@ fn addSymbolRelocAssumeCapacity(
61186120 .tpoff32 => .TPOFF32,
61196121 .size64 => .SIZE64,
61206122 .size32 => .SIZE32,
6121 .abs32_lo12,
6122 .rel32_hi20,
6123 .rel64_lo20,
6124 .rel64_hi12,
6125 .branch_rel18,
6126 .branch_rel23,
6127 .branch_rel28,
6128 .call_rel38,
6129 .tpoff32_lo12,
6130 .tpoff32_hi20,
6131 .tpoff64_lo20,
6132 .tpoff64_hi12,
6123
6124 .larch_abs32_lo12,
6125 .larch_rel32_hi20,
6126 .larch_rel64_lo20,
6127 .larch_rel64_hi12,
6128 .larch_branch_rel18,
6129 .larch_branch_rel23,
6130 .larch_branch_rel28,
6131 .larch_call_rel38,
6132 .larch_tpoff32_lo12,
6133 .larch_tpoff32_hi20,
6134 .larch_tpoff64_lo20,
6135 .larch_tpoff64_hi12,
61336136 => unreachable,
61346137 } },
61356138 .LOONGARCH => .{ .LOONGARCH = switch (@"type") {
......@@ -6148,18 +6151,19 @@ fn addSymbolRelocAssumeCapacity(
61486151 .dtpoff32 => .TLS_DTPREL32,
61496152 .tpoff64 => .TLS_TPREL64,
61506153 .tpoff32 => .TLS_TPREL32,
6151 .abs32_lo12 => .PCALA_LO12,
6152 .rel32_hi20 => .PCALA_HI20,
6153 .rel64_lo20 => .PCALA64_LO20,
6154 .rel64_hi12 => .PCALA64_HI12,
6155 .branch_rel18 => .B16,
6156 .branch_rel23 => .B21,
6157 .branch_rel28 => .B26,
6158 .call_rel38 => .CALL36,
6159 .tpoff32_lo12 => .TLS_LE_LO12,
6160 .tpoff32_hi20 => .TLS_LE_HI20,
6161 .tpoff64_lo20 => .TLS_LE64_LO20,
6162 .tpoff64_hi12 => .TLS_LE64_HI12,
6154
6155 .larch_abs32_lo12 => .PCALA_LO12,
6156 .larch_rel32_hi20 => .PCALA_HI20,
6157 .larch_rel64_lo20 => .PCALA64_LO20,
6158 .larch_rel64_hi12 => .PCALA64_HI12,
6159 .larch_branch_rel18 => .B16,
6160 .larch_branch_rel23 => .B21,
6161 .larch_branch_rel28 => .B26,
6162 .larch_call_rel38 => .CALL36,
6163 .larch_tpoff32_lo12 => .TLS_LE_LO12,
6164 .larch_tpoff32_hi20 => .TLS_LE_HI20,
6165 .larch_tpoff64_lo20 => .TLS_LE64_LO20,
6166 .larch_tpoff64_hi12 => .TLS_LE64_HI12,
61636167 } },
61646168 };
61656169