authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-15 22:06:18+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-16 19:33:06+02:00
log6993b3e23e3b8f45f66902ebe23980aa155b343c
treeadb1ee6b64e7a7f9aeef458f5c133c8c899b3d67
parentd3b1c903dddee56b0f2ab06a00848b1b0017f062

codegen: refactor .actual_got into .extern_got


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

src/arch/aarch64/CodeGen.zig+5-5
......@@ -4012,7 +4012,7 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type
40124012 .got => .load_memory_ptr_got,
40134013 .direct => .load_memory_ptr_direct,
40144014 .import => unreachable,
4015 .actual_got => unreachable,
4015 .extern_got => unreachable,
40164016 };
40174017 const atom_index = switch (self.bin_file.tag) {
40184018 .macho => blk: {
......@@ -5532,7 +5532,7 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
55325532 .got => .load_memory_ptr_got,
55335533 .direct => .load_memory_ptr_direct,
55345534 .import => unreachable,
5535 .actual_got => unreachable,
5535 .extern_got => unreachable,
55365536 };
55375537 const atom_index = switch (self.bin_file.tag) {
55385538 .macho => blk: {
......@@ -5654,7 +5654,7 @@ fn genSetReg(self: *Self, ty: Type, reg: Register, mcv: MCValue) InnerError!void
56545654 .got => .load_memory_got,
56555655 .direct => .load_memory_direct,
56565656 .import => .load_memory_import,
5657 .actual_got => unreachable,
5657 .extern_got => unreachable,
56585658 };
56595659 const atom_index = switch (self.bin_file.tag) {
56605660 .macho => blk: {
......@@ -5852,7 +5852,7 @@ fn genSetStackArgument(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) I
58525852 .got => .load_memory_ptr_got,
58535853 .direct => .load_memory_ptr_direct,
58545854 .import => unreachable,
5855 .actual_got => unreachable,
5855 .extern_got => unreachable,
58565856 };
58575857 const atom_index = switch (self.bin_file.tag) {
58585858 .macho => blk: {
......@@ -6180,7 +6180,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {
61806180 .memory => |addr| .{ .memory = addr },
61816181 .load_got => |sym_index| .{ .linker_load = .{ .type = .got, .sym_index = sym_index } },
61826182 .load_direct => |sym_index| .{ .linker_load = .{ .type = .direct, .sym_index = sym_index } },
6183 .load_actual_got, .load_tlv => unreachable, // TODO
6183 .load_extern_got, .load_tlv => unreachable, // TODO
61846184 },
61856185 .fail => |msg| {
61866186 self.err_msg = msg;
src/arch/arm/CodeGen.zig+1-1
......@@ -6135,7 +6135,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {
61356135 .mcv => |mcv| switch (mcv) {
61366136 .none => .none,
61376137 .undef => .undef,
6138 .load_got, .load_actual_got, .load_direct, .load_tlv => unreachable, // TODO
6138 .load_got, .load_extern_got, .load_direct, .load_tlv => unreachable, // TODO
61396139 .immediate => |imm| .{ .immediate = @as(u32, @truncate(imm)) },
61406140 .memory => |addr| .{ .memory = addr },
61416141 },
src/arch/riscv64/CodeGen.zig+1-1
......@@ -2591,7 +2591,7 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {
25912591 .mcv => |mcv| switch (mcv) {
25922592 .none => .none,
25932593 .undef => .undef,
2594 .load_got, .load_actual_got, .load_direct, .load_tlv => unreachable, // TODO
2594 .load_got, .load_extern_got, .load_direct, .load_tlv => unreachable, // TODO
25952595 .immediate => |imm| .{ .immediate = imm },
25962596 .memory => |addr| .{ .memory = addr },
25972597 },
src/arch/sparc64/CodeGen.zig+1-1
......@@ -4137,7 +4137,7 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {
41374137 .mcv => |mcv| switch (mcv) {
41384138 .none => .none,
41394139 .undef => .undef,
4140 .load_got, .load_actual_got, .load_direct, .load_tlv => unreachable, // TODO
4140 .load_got, .load_extern_got, .load_direct, .load_tlv => unreachable, // TODO
41414141 .immediate => |imm| .{ .immediate = imm },
41424142 .memory => |addr| .{ .memory = addr },
41434143 },
src/arch/x86_64/CodeGen.zig+72-70
......@@ -207,10 +207,12 @@ pub const MCValue = union(enum) {
207207 /// The value is a pointer to a value referenced indirectly via GOT.
208208 /// Payload is a symbol index.
209209 lea_got: u32,
210 /// TODO indirection via actual .got table
211 /// LOL Jakub, the king of naming...
212 load_actual_got: u32,
213 lea_actual_got: u32,
210 /// The value is an extern variable referenced via GOT.
211 /// Payload is a symbol index.
212 load_extern_got: u32,
213 /// The value is a pointer to an extern variable referenced via GOT.
214 /// Payload is a symbol index.
215 lea_extern_got: u32,
214216 /// The value is a threadlocal variable.
215217 /// Payload is a symbol index.
216218 load_tlv: u32,
......@@ -299,7 +301,7 @@ pub const MCValue = union(enum) {
299301 .register_overflow,
300302 .lea_direct,
301303 .lea_got,
302 .lea_actual_got,
304 .lea_extern_got,
303305 .lea_tlv,
304306 .lea_frame,
305307 .reserved_frame,
......@@ -313,7 +315,7 @@ pub const MCValue = union(enum) {
313315 .load_direct => |sym_index| .{ .lea_direct = sym_index },
314316 .load_got => |sym_index| .{ .lea_got = sym_index },
315317 .load_tlv => |sym_index| .{ .lea_tlv = sym_index },
316 .load_actual_got => |sym_index| .{ .lea_actual_got = sym_index },
318 .load_extern_got => |sym_index| .{ .lea_extern_got = sym_index },
317319 .load_frame => |frame_addr| .{ .lea_frame = frame_addr },
318320 };
319321 }
......@@ -331,7 +333,7 @@ pub const MCValue = union(enum) {
331333 .indirect,
332334 .load_direct,
333335 .load_got,
334 .load_actual_got,
336 .load_extern_got,
335337 .load_tlv,
336338 .load_frame,
337339 .reserved_frame,
......@@ -342,7 +344,7 @@ pub const MCValue = union(enum) {
342344 .register_offset => |reg_off| .{ .indirect = reg_off },
343345 .lea_direct => |sym_index| .{ .load_direct = sym_index },
344346 .lea_got => |sym_index| .{ .load_got = sym_index },
345 .lea_actual_got => |sym_index| .{ .load_actual_got = sym_index },
347 .lea_extern_got => |sym_index| .{ .load_extern_got = sym_index },
346348 .lea_tlv => |sym_index| .{ .load_tlv = sym_index },
347349 .lea_frame => |frame_addr| .{ .load_frame = frame_addr },
348350 };
......@@ -366,8 +368,8 @@ pub const MCValue = union(enum) {
366368 .lea_direct,
367369 .load_got,
368370 .lea_got,
369 .load_actual_got,
370 .lea_actual_got,
371 .load_extern_got,
372 .lea_extern_got,
371373 .load_tlv,
372374 .lea_tlv,
373375 .load_frame,
......@@ -402,8 +404,8 @@ pub const MCValue = union(enum) {
402404 .lea_direct,
403405 .load_got,
404406 .lea_got,
405 .load_actual_got,
406 .lea_actual_got,
407 .load_extern_got,
408 .lea_extern_got,
407409 .load_tlv,
408410 .lea_tlv,
409411 .lea_frame,
......@@ -446,8 +448,8 @@ pub const MCValue = union(enum) {
446448 .lea_direct => |pl| try writer.print("direct:{d}", .{pl}),
447449 .load_got => |pl| try writer.print("[got:{d}]", .{pl}),
448450 .lea_got => |pl| try writer.print("got:{d}", .{pl}),
449 .load_actual_got => |pl| try writer.print("[actual_got:{d}]", .{pl}),
450 .lea_actual_got => |pl| try writer.print("actual_got:{d}", .{pl}),
451 .load_extern_got => |pl| try writer.print("[extern_got:{d}]", .{pl}),
452 .lea_extern_got => |pl| try writer.print("extern_got:{d}", .{pl}),
451453 .load_tlv => |pl| try writer.print("[tlv:{d}]", .{pl}),
452454 .lea_tlv => |pl| try writer.print("tlv:{d}", .{pl}),
453455 .load_frame => |pl| try writer.print("[{} + 0x{x}]", .{ pl.index, pl.off }),
......@@ -475,8 +477,8 @@ const InstTracking = struct {
475477 .lea_direct,
476478 .load_got,
477479 .lea_got,
478 .load_actual_got,
479 .lea_actual_got,
480 .load_extern_got,
481 .lea_extern_got,
480482 .load_tlv,
481483 .lea_tlv,
482484 .load_frame,
......@@ -536,8 +538,8 @@ const InstTracking = struct {
536538 .lea_direct,
537539 .load_got,
538540 .lea_got,
539 .load_actual_got,
540 .lea_actual_got,
541 .load_extern_got,
542 .lea_extern_got,
541543 .load_tlv,
542544 .lea_tlv,
543545 .load_frame,
......@@ -573,8 +575,8 @@ const InstTracking = struct {
573575 .lea_direct,
574576 .load_got,
575577 .lea_got,
576 .load_actual_got,
577 .lea_actual_got,
578 .load_extern_got,
579 .lea_extern_got,
578580 .load_tlv,
579581 .lea_tlv,
580582 .lea_frame,
......@@ -4391,7 +4393,7 @@ fn airArrayElemVal(self: *Self, inst: Air.Inst.Index) !void {
43914393 .memory,
43924394 .load_direct,
43934395 .load_got,
4394 .load_actual_got,
4396 .load_extern_got,
43954397 .load_tlv,
43964398 => try self.genSetReg(addr_reg, Type.usize, array.address()),
43974399 .lea_direct, .lea_tlv => unreachable,
......@@ -5872,7 +5874,7 @@ fn load(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) InnerErro
58725874 .register_offset,
58735875 .lea_direct,
58745876 .lea_got,
5875 .lea_actual_got,
5877 .lea_extern_got,
58765878 .lea_tlv,
58775879 .lea_frame,
58785880 => try self.genCopy(dst_ty, dst_mcv, ptr_mcv.deref()),
......@@ -5880,7 +5882,7 @@ fn load(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) InnerErro
58805882 .indirect,
58815883 .load_direct,
58825884 .load_got,
5883 .load_actual_got,
5885 .load_extern_got,
58845886 .load_tlv,
58855887 .load_frame,
58865888 => {
......@@ -6019,7 +6021,7 @@ fn store(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) InnerErr
60196021 .register_offset,
60206022 .lea_direct,
60216023 .lea_got,
6022 .lea_actual_got,
6024 .lea_extern_got,
60236025 .lea_tlv,
60246026 .lea_frame,
60256027 => try self.genCopy(src_ty, ptr_mcv.deref(), src_mcv),
......@@ -6027,7 +6029,7 @@ fn store(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) InnerErr
60276029 .indirect,
60286030 .load_direct,
60296031 .load_got,
6030 .load_actual_got,
6032 .load_extern_got,
60316033 .load_tlv,
60326034 .load_frame,
60336035 => {
......@@ -6449,7 +6451,7 @@ fn genUnOpMir(self: *Self, mir_tag: Mir.Inst.FixedTag, dst_ty: Type, dst_mcv: MC
64496451 .register_overflow,
64506452 .lea_direct,
64516453 .lea_got,
6452 .lea_actual_got,
6454 .lea_extern_got,
64536455 .lea_tlv,
64546456 .lea_frame,
64556457 .reserved_frame,
......@@ -6457,7 +6459,7 @@ fn genUnOpMir(self: *Self, mir_tag: Mir.Inst.FixedTag, dst_ty: Type, dst_mcv: MC
64576459 => unreachable, // unmodifiable destination
64586460 .register => |dst_reg| try self.asmRegister(mir_tag, registerAlias(dst_reg, abi_size)),
64596461 .register_pair => unreachable, // unimplemented
6460 .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => {
6462 .memory, .load_got, .load_extern_got, .load_direct, .load_tlv => {
64616463 const addr_reg = try self.register_manager.allocReg(null, abi.RegisterClass.gp);
64626464 const addr_reg_lock = self.register_manager.lockRegAssumeUnused(addr_reg);
64636465 defer self.register_manager.unlockReg(addr_reg_lock);
......@@ -7415,8 +7417,8 @@ fn genBinOp(
74157417 .lea_direct,
74167418 .load_got,
74177419 .lea_got,
7418 .load_actual_got,
7419 .lea_actual_got,
7420 .load_extern_got,
7421 .lea_extern_got,
74207422 .load_tlv,
74217423 .lea_tlv,
74227424 .lea_frame,
......@@ -7473,8 +7475,8 @@ fn genBinOp(
74737475 .lea_direct,
74747476 .load_got,
74757477 .lea_got,
7476 .load_actual_got,
7477 .lea_actual_got,
7478 .load_extern_got,
7479 .lea_extern_got,
74787480 .load_tlv,
74797481 .lea_tlv,
74807482 .lea_frame,
......@@ -8427,7 +8429,7 @@ fn genBinOpMir(
84278429 .register_overflow,
84288430 .lea_direct,
84298431 .lea_got,
8430 .lea_actual_got,
8432 .lea_extern_got,
84318433 .lea_tlv,
84328434 .lea_frame,
84338435 .reserved_frame,
......@@ -8516,8 +8518,8 @@ fn genBinOpMir(
85168518 .lea_direct,
85178519 .load_got,
85188520 .lea_got,
8519 .load_actual_got,
8520 .lea_actual_got,
8521 .load_extern_got,
8522 .lea_extern_got,
85218523 .load_tlv,
85228524 .lea_tlv,
85238525 .load_frame,
......@@ -8550,7 +8552,7 @@ fn genBinOpMir(
85508552 .register_offset,
85518553 .lea_direct,
85528554 .lea_got,
8553 .lea_actual_got,
8555 .lea_extern_got,
85548556 .lea_tlv,
85558557 .lea_frame,
85568558 => {
......@@ -8566,7 +8568,7 @@ fn genBinOpMir(
85668568 .memory,
85678569 .load_direct,
85688570 .load_got,
8569 .load_actual_got,
8571 .load_extern_got,
85708572 .load_tlv,
85718573 => {
85728574 const ptr_ty = try mod.singleConstPtrType(ty);
......@@ -8587,13 +8589,13 @@ fn genBinOpMir(
85878589 }
85888590 }
85898591 },
8590 .memory, .indirect, .load_got, .load_actual_got, .load_direct, .load_tlv, .load_frame => {
8592 .memory, .indirect, .load_got, .load_extern_got, .load_direct, .load_tlv, .load_frame => {
85918593 const OpInfo = ?struct { addr_reg: Register, addr_lock: RegisterLock };
85928594 const limb_abi_size: u32 = @min(abi_size, 8);
85938595
85948596 const dst_info: OpInfo = switch (dst_mcv) {
85958597 else => unreachable,
8596 .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => dst: {
8598 .memory, .load_got, .load_extern_got, .load_direct, .load_tlv => dst: {
85978599 const dst_addr_reg =
85988600 (try self.register_manager.allocReg(null, abi.RegisterClass.gp)).to64();
85998601 const dst_addr_lock = self.register_manager.lockRegAssumeUnused(dst_addr_reg);
......@@ -8627,17 +8629,17 @@ fn genBinOpMir(
86278629 .indirect,
86288630 .lea_direct,
86298631 .lea_got,
8630 .lea_actual_got,
8632 .lea_extern_got,
86318633 .lea_tlv,
86328634 .load_frame,
86338635 .lea_frame,
86348636 => null,
8635 .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => src: {
8637 .memory, .load_got, .load_extern_got, .load_direct, .load_tlv => src: {
86368638 switch (resolved_src_mcv) {
86378639 .memory => |addr| if (math.cast(i32, @as(i64, @bitCast(addr))) != null and
86388640 math.cast(i32, @as(i64, @bitCast(addr)) + abi_size - limb_abi_size) != null)
86398641 break :src null,
8640 .load_got, .load_actual_got, .load_direct, .load_tlv => {},
8642 .load_got, .load_extern_got, .load_direct, .load_tlv => {},
86418643 else => unreachable,
86428644 }
86438645
......@@ -8680,7 +8682,7 @@ fn genBinOpMir(
86808682 switch (dst_mcv) {
86818683 .memory,
86828684 .load_got,
8683 .load_actual_got,
8685 .load_extern_got,
86848686 .load_direct,
86858687 .load_tlv,
86868688 => .{ .base = .{ .reg = dst_info.?.addr_reg }, .disp = off },
......@@ -8765,8 +8767,8 @@ fn genBinOpMir(
87658767 .lea_direct,
87668768 .load_got,
87678769 .lea_got,
8768 .load_actual_got,
8769 .lea_actual_got,
8770 .load_extern_got,
8771 .lea_extern_got,
87708772 .load_tlv,
87718773 .lea_tlv,
87728774 .load_frame,
......@@ -8782,7 +8784,7 @@ fn genBinOpMir(
87828784 .register_offset,
87838785 .lea_direct,
87848786 .lea_got,
8785 .lea_actual_got,
8787 .lea_extern_got,
87868788 .lea_tlv,
87878789 .lea_frame,
87888790 => switch (limb_i) {
......@@ -8832,7 +8834,7 @@ fn genIntMulComplexOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: M
88328834 .register_overflow,
88338835 .lea_direct,
88348836 .lea_got,
8835 .lea_actual_got,
8837 .lea_extern_got,
88368838 .lea_tlv,
88378839 .lea_frame,
88388840 .reserved_frame,
......@@ -8881,8 +8883,8 @@ fn genIntMulComplexOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: M
88818883 .lea_direct,
88828884 .load_got,
88838885 .lea_got,
8884 .load_actual_got,
8885 .lea_actual_got,
8886 .load_extern_got,
8887 .lea_extern_got,
88868888 .load_tlv,
88878889 .lea_tlv,
88888890 .lea_frame,
......@@ -8921,7 +8923,7 @@ fn genIntMulComplexOpMir(self: *Self, dst_ty: Type, dst_mcv: MCValue, src_mcv: M
89218923 }
89228924 },
89238925 .register_pair => unreachable, // unimplemented
8924 .memory, .indirect, .load_direct, .load_got, .load_actual_got, .load_tlv, .load_frame => {
8926 .memory, .indirect, .load_direct, .load_got, .load_extern_got, .load_tlv, .load_frame => {
89258927 const tmp_reg = try self.copyToTmpRegister(dst_ty, dst_mcv);
89268928 const tmp_mcv = MCValue{ .register = tmp_reg };
89278929 const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg);
......@@ -9014,7 +9016,7 @@ fn genVarDbgInfo(
90149016 //} },
90159017 .memory => |address| .{ .memory = address },
90169018 .load_got => |sym_index| .{ .linker_load = .{ .type = .got, .sym_index = sym_index } },
9017 .load_actual_got => |sym_index| .{ .linker_load = .{ .type = .actual_got, .sym_index = sym_index } },
9019 .load_extern_got => |sym_index| .{ .linker_load = .{ .type = .extern_got, .sym_index = sym_index } },
90189020 .load_direct => |sym_index| .{ .linker_load = .{ .type = .direct, .sym_index = sym_index } },
90199021 .immediate => |x| .{ .immediate = x },
90209022 .undef => .undef,
......@@ -9454,14 +9456,14 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
94549456 .indirect,
94559457 .lea_direct,
94569458 .lea_got,
9457 .lea_actual_got,
9459 .lea_extern_got,
94589460 .lea_tlv,
94599461 .lea_frame,
94609462 .reserved_frame,
94619463 .air_ref,
94629464 => unreachable,
94639465 .register_pair, .load_frame => null,
9464 .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => dst: {
9466 .memory, .load_got, .load_extern_got, .load_direct, .load_tlv => dst: {
94659467 switch (resolved_dst_mcv) {
94669468 .memory => |addr| if (math.cast(
94679469 i32,
......@@ -9470,7 +9472,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
94709472 i32,
94719473 @as(i64, @bitCast(addr)) + abi_size - 8,
94729474 ) != null) break :dst null,
9473 .load_got, .load_actual_got, .load_direct, .load_tlv => {},
9475 .load_got, .load_extern_got, .load_direct, .load_tlv => {},
94749476 else => unreachable,
94759477 }
94769478
......@@ -9513,14 +9515,14 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
95139515 .indirect,
95149516 .lea_direct,
95159517 .lea_got,
9516 .lea_actual_got,
9518 .lea_extern_got,
95179519 .lea_tlv,
95189520 .lea_frame,
95199521 .reserved_frame,
95209522 .air_ref,
95219523 => unreachable,
95229524 .register_pair, .load_frame => null,
9523 .memory, .load_got, .load_actual_got, .load_direct, .load_tlv => src: {
9525 .memory, .load_got, .load_extern_got, .load_direct, .load_tlv => src: {
95249526 switch (resolved_src_mcv) {
95259527 .memory => |addr| if (math.cast(
95269528 i32,
......@@ -9529,7 +9531,7 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void {
95299531 i32,
95309532 @as(i64, @bitCast(addr)) + abi_size - 8,
95319533 ) != null) break :src null,
9532 .load_got, .load_actual_got, .load_direct, .load_tlv => {},
9534 .load_got, .load_extern_got, .load_direct, .load_tlv => {},
95339535 else => unreachable,
95349536 }
95359537
......@@ -9948,7 +9950,7 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC
99489950 .register_overflow,
99499951 .lea_direct,
99509952 .lea_got,
9951 .lea_actual_got,
9953 .lea_extern_got,
99529954 .lea_tlv,
99539955 .lea_frame,
99549956 .reserved_frame,
......@@ -9975,7 +9977,7 @@ fn isNull(self: *Self, inst: Air.Inst.Index, opt_ty: Type, opt_mcv: MCValue) !MC
99759977
99769978 .memory,
99779979 .load_got,
9978 .load_actual_got,
9980 .load_extern_got,
99799981 .load_direct,
99809982 .load_tlv,
99819983 => {
......@@ -10533,7 +10535,7 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
1053310535 .memory => |addr| if (math.cast(i32, @as(i64, @bitCast(addr)))) |_|
1053410536 break :arg input_mcv,
1053510537 .indirect, .load_frame => break :arg input_mcv,
10536 .load_direct, .load_got, .load_actual_got, .load_tlv => {},
10538 .load_direct, .load_got, .load_extern_got, .load_tlv => {},
1053710539 else => {
1053810540 const temp_mcv = try self.allocTempRegOrMem(ty, false);
1053910541 try self.genCopy(ty, temp_mcv, input_mcv);
......@@ -11194,7 +11196,7 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError
1119411196 .register_overflow,
1119511197 .lea_direct,
1119611198 .lea_got,
11197 .lea_actual_got,
11199 .lea_extern_got,
1119811200 .lea_tlv,
1119911201 .lea_frame,
1120011202 .reserved_frame,
......@@ -11246,11 +11248,11 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError
1124611248 }
1124711249 },
1124811250 .indirect => |reg_off| try self.genSetMem(.{ .reg = reg_off.reg }, reg_off.off, ty, src_mcv),
11249 .memory, .load_direct, .load_got, .load_actual_got, .load_tlv => {
11251 .memory, .load_direct, .load_got, .load_extern_got, .load_tlv => {
1125011252 switch (dst_mcv) {
1125111253 .memory => |addr| if (math.cast(i32, @as(i64, @bitCast(addr)))) |small_addr|
1125211254 return self.genSetMem(.{ .reg = .ds }, small_addr, ty, src_mcv),
11253 .load_direct, .load_got, .load_actual_got, .load_tlv => {},
11255 .load_direct, .load_got, .load_extern_got, .load_tlv => {},
1125411256 else => unreachable,
1125511257 }
1125611258
......@@ -11412,7 +11414,7 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr
1141211414 else => unreachable,
1141311415 },
1141411416 )),
11415 .memory, .load_direct, .load_got, .load_actual_got, .load_tlv => {
11417 .memory, .load_direct, .load_got, .load_extern_got, .load_tlv => {
1141611418 switch (src_mcv) {
1141711419 .memory => |addr| if (math.cast(i32, @as(i64, @bitCast(addr)))) |small_addr|
1141811420 return (try self.moveStrategy(
......@@ -11440,7 +11442,7 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr
1144011442 },
1144111443 .Float, .Vector => {},
1144211444 },
11443 .load_got, .load_actual_got, .load_tlv => {},
11445 .load_got, .load_extern_got, .load_tlv => {},
1144411446 else => unreachable,
1144511447 }
1144611448
......@@ -11454,18 +11456,18 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr
1145411456 Memory.sib(Memory.PtrSize.fromSize(abi_size), .{ .base = .{ .reg = addr_reg } }),
1145511457 );
1145611458 },
11457 .lea_direct, .lea_got, .lea_actual_got => |sym_index| {
11459 .lea_direct, .lea_got, .lea_extern_got => |sym_index| {
1145811460 const atom_index = try self.owner.getSymbolIndex(self);
1145911461 _ = try self.addInst(.{
1146011462 .tag = switch (src_mcv) {
1146111463 .lea_direct => .lea,
11462 .lea_got, .lea_actual_got => .mov,
11464 .lea_got, .lea_extern_got => .mov,
1146311465 else => unreachable,
1146411466 },
1146511467 .ops = switch (src_mcv) {
1146611468 .lea_direct => .direct_reloc,
1146711469 .lea_got => .got_reloc,
11468 .lea_actual_got => .actual_got_reloc,
11470 .lea_extern_got => .extern_got_reloc,
1146911471 else => unreachable,
1147011472 },
1147111473 .data = .{ .rx = .{
......@@ -11601,8 +11603,8 @@ fn genSetMem(self: *Self, base: Memory.Base, disp: i32, ty: Type, src_mcv: MCVal
1160111603 .lea_direct,
1160211604 .load_got,
1160311605 .lea_got,
11604 .load_actual_got,
11605 .lea_actual_got,
11606 .load_extern_got,
11607 .lea_extern_got,
1160611608 .load_tlv,
1160711609 .lea_tlv,
1160811610 .load_frame,
......@@ -13608,7 +13610,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {
1360813610 .memory => |addr| .{ .memory = addr },
1360913611 .load_direct => |sym_index| .{ .load_direct = sym_index },
1361013612 .load_got => |sym_index| .{ .lea_got = sym_index },
13611 .load_actual_got => |sym_index| .{ .lea_actual_got = sym_index },
13613 .load_extern_got => |sym_index| .{ .lea_extern_got = sym_index },
1361213614 .load_tlv => |sym_index| .{ .lea_tlv = sym_index },
1361313615 },
1361413616 .fail => |msg| {
src/arch/x86_64/Emit.zig+3-3
......@@ -79,7 +79,7 @@ pub fn emitMir(emit: *Emit) Error!void {
7979 @tagName(emit.bin_file.tag),
8080 }),
8181 .linker_got,
82 .linker_actual_got,
82 .linker_extern_got,
8383 .linker_direct,
8484 .linker_direct_got,
8585 .linker_import,
......@@ -88,13 +88,13 @@ pub fn emitMir(emit: *Emit) Error!void {
8888 const r_type: u32 = switch (lowered_relocs[0].target) {
8989 .linker_direct_got => link.File.Elf.R_X86_64_ZIG_GOT32,
9090 .linker_got => link.File.Elf.R_X86_64_ZIG_GOTPCREL,
91 .linker_actual_got => std.elf.R_X86_64_GOTPCREL,
91 .linker_extern_got => std.elf.R_X86_64_GOTPCREL,
9292 .linker_direct => std.elf.R_X86_64_PC32,
9393 else => unreachable,
9494 };
9595 const r_addend: i64 = switch (lowered_relocs[0].target) {
9696 .linker_direct_got => 0,
97 .linker_got, .linker_actual_got, .linker_direct => -4,
97 .linker_got, .linker_extern_got, .linker_direct => -4,
9898 else => unreachable,
9999 };
100100 const atom_ptr = elf_file.symbol(symbol.atom_index).atom(elf_file).?;
src/arch/x86_64/Lower.zig+4-4
......@@ -51,7 +51,7 @@ pub const Reloc = struct {
5151 inst: Mir.Inst.Index,
5252 linker_extern_fn: Mir.Reloc,
5353 linker_got: Mir.Reloc,
54 linker_actual_got: Mir.Reloc,
54 linker_extern_got: Mir.Reloc,
5555 linker_direct: Mir.Reloc,
5656 linker_direct_got: Mir.Reloc,
5757 linker_import: Mir.Reloc,
......@@ -389,7 +389,7 @@ fn generic(lower: *Lower, inst: Mir.Inst) Error!void {
389389 .rrmi_sib, .rrmi_rip => inst.data.rrix.fixes,
390390 .mi_sib_u, .mi_rip_u, .mi_sib_s, .mi_rip_s => inst.data.x.fixes,
391391 .m_sib, .m_rip, .rax_moffs, .moffs_rax => inst.data.x.fixes,
392 .extern_fn_reloc, .got_reloc, .actual_got_reloc, .direct_reloc, .direct_got_reloc, .import_reloc, .tlv_reloc => ._,
392 .extern_fn_reloc, .got_reloc, .extern_got_reloc, .direct_reloc, .direct_got_reloc, .import_reloc, .tlv_reloc => ._,
393393 else => return lower.fail("TODO lower .{s}", .{@tagName(inst.ops)}),
394394 };
395395 try lower.emit(switch (fixes) {
......@@ -533,12 +533,12 @@ fn generic(lower: *Lower, inst: Mir.Inst) Error!void {
533533 else => unreachable,
534534 }
535535 },
536 .got_reloc, .actual_got_reloc, .direct_reloc, .import_reloc, .tlv_reloc => ops: {
536 .got_reloc, .extern_got_reloc, .direct_reloc, .import_reloc, .tlv_reloc => ops: {
537537 const reg = inst.data.rx.r1;
538538 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;
539539 _ = lower.reloc(switch (inst.ops) {
540540 .got_reloc => .{ .linker_got = extra },
541 .actual_got_reloc => .{ .linker_actual_got = extra },
541 .extern_got_reloc => .{ .linker_extern_got = extra },
542542 .direct_reloc => .{ .linker_direct = extra },
543543 .import_reloc => .{ .linker_import = extra },
544544 .tlv_reloc => .{ .linker_tlv = extra },
src/arch/x86_64/Mir.zig+3-2
......@@ -783,8 +783,9 @@ pub const Inst = struct {
783783 /// Linker relocation - GOT indirection.
784784 /// Uses `rx` payload with extra data of type `Reloc`.
785785 got_reloc,
786 /// TODO
787 actual_got_reloc,
786 /// Linker relocation - reference to an extern variable via GOT.
787 /// Uses `rx` payload with extra data of type `Reloc`.
788 extern_got_reloc,
788789 /// Linker relocation - direct reference.
789790 /// Uses `rx` payload with extra data of type `Reloc`.
790791 direct_reloc,
src/codegen.zig+5-4
......@@ -793,12 +793,13 @@ fn lowerDeclRef(
793793
794794/// Helper struct to denote that the value is in memory but requires a linker relocation fixup:
795795/// * got - the value is referenced indirectly via GOT entry index (the linker emits a got-type reloc)
796/// * extern_got - pointer to extern variable referenced via GOT
796797/// * direct - the value is referenced directly via symbol index index (the linker emits a displacement reloc)
797798/// * import - the value is referenced indirectly via import entry index (the linker emits an import-type reloc)
798799pub const LinkerLoad = struct {
799800 type: enum {
800801 got,
801 actual_got,
802 extern_got,
802803 direct,
803804 import,
804805 },
......@@ -828,8 +829,8 @@ pub const GenResult = union(enum) {
828829 load_got: u32,
829830 /// Direct by-address reference to memory location.
830831 memory: u64,
831 /// TODO LOL Jakub, the king of naming...
832 load_actual_got: u32,
832 /// Pointer to extern variable via GOT.
833 load_extern_got: u32,
833834 };
834835
835836 fn mcv(val: MCValue) GenResult {
......@@ -898,7 +899,7 @@ fn genDeclRef(
898899 mod.intern_pool.stringToSliceUnwrap(ov.lib_name)
899900 else
900901 null;
901 return GenResult.mcv(.{ .load_actual_got = try elf_file.getGlobalSymbol(name, lib_name) });
902 return GenResult.mcv(.{ .load_extern_got = try elf_file.getGlobalSymbol(name, lib_name) });
902903 }
903904 const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index);
904905 const sym = elf_file.symbol(sym_index);