authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-15 14:23:36+02:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2024-08-15 14:23:36+02:00
log4d5bf0f09a29eeb0eb7f3602825f1a0095b8427e
tree540c55e59e6e6c78e0b0824b20f5a009e943aa71
parent79418fa0abe4b19a2fd2fb10cf3c1144b927d10f

x86_64: deref GOT pointer when requesting var value


1 files changed, 15 insertions(+), 1 deletions(-)

src/arch/x86_64/Lower.zig+15-1
...@@ -402,7 +402,21 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)...@@ -402,7 +402,21 @@ fn emit(lower: *Lower, prefix: Prefix, mnemonic: Mnemonic, ops: []const Operand)
402 if (elf_sym.flags.is_extern_ptr) emit_mnemonic = .mov;402 if (elf_sym.flags.is_extern_ptr) emit_mnemonic = .mov;
403 break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) };403 break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) };
404 },404 },
405 .mov => break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) },405 .mov => {
406 if (elf_sym.flags.is_extern_ptr) {
407 const reg = ops[0].reg;
408 lower.result_insts[lower.result_insts_len] =
409 try Instruction.new(.none, .mov, &[_]Operand{
410 .{ .reg = reg.to64() },
411 .{ .mem = Memory.rip(.qword, 0) },
412 });
413 lower.result_insts_len += 1;
414 break :op .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{ .base = .{
415 .reg = reg.to64(),
416 } }) };
417 }
418 break :op .{ .mem = Memory.rip(mem_op.sib.ptr_size, 0) };
419 },
406 else => unreachable,420 else => unreachable,
407 } else switch (mnemonic) {421 } else switch (mnemonic) {
408 .call => break :op .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{422 .call => break :op .{ .mem = Memory.sib(mem_op.sib.ptr_size, .{