authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-10-27 19:43:38+02:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-10-28 03:48:18-04:00
log2be1250f244a362b832cfc3d519a27363495f130
treeeffd609f5b418fdeabda57323f54e14bbd299d54
parent0d00b7c585f0e3a20ace71105f562bd7bdd14489

x86_64: no more load/lea_symbol weirdness


8 files changed, 62 insertions(+), 68 deletions(-)

src/arch/aarch64/CodeGen.zig+1-1
...@@ -6176,7 +6176,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {...@@ -6176,7 +6176,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {
6176 .memory => |addr| .{ .memory = addr },6176 .memory => |addr| .{ .memory = addr },
6177 .load_got => |sym_index| .{ .linker_load = .{ .type = .got, .sym_index = sym_index } },6177 .load_got => |sym_index| .{ .linker_load = .{ .type = .got, .sym_index = sym_index } },
6178 .load_direct => |sym_index| .{ .linker_load = .{ .type = .direct, .sym_index = sym_index } },6178 .load_direct => |sym_index| .{ .linker_load = .{ .type = .direct, .sym_index = sym_index } },
6179 .load_symbol, .lea_symbol, .load_tlv => unreachable, // TODO6179 .load_symbol, .load_tlv => unreachable, // TODO
6180 },6180 },
6181 .fail => |msg| {6181 .fail => |msg| {
6182 self.err_msg = msg;6182 self.err_msg = msg;
src/arch/arm/CodeGen.zig+1-1
...@@ -6135,7 +6135,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {...@@ -6135,7 +6135,7 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {
6135 .mcv => |mcv| switch (mcv) {6135 .mcv => |mcv| switch (mcv) {
6136 .none => .none,6136 .none => .none,
6137 .undef => .undef,6137 .undef => .undef,
6138 .load_got, .load_symbol, .lea_symbol, .load_direct, .load_tlv => unreachable, // TODO6138 .load_got, .load_symbol, .load_direct, .load_tlv => unreachable, // TODO
6139 .immediate => |imm| .{ .immediate = @as(u32, @truncate(imm)) },6139 .immediate => |imm| .{ .immediate = @as(u32, @truncate(imm)) },
6140 .memory => |addr| .{ .memory = addr },6140 .memory => |addr| .{ .memory = addr },
6141 },6141 },
src/arch/riscv64/CodeGen.zig+1-1
...@@ -2591,7 +2591,7 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {...@@ -2591,7 +2591,7 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {
2591 .mcv => |mcv| switch (mcv) {2591 .mcv => |mcv| switch (mcv) {
2592 .none => .none,2592 .none => .none,
2593 .undef => .undef,2593 .undef => .undef,
2594 .load_got, .load_symbol, .lea_symbol, .load_direct, .load_tlv => unreachable, // TODO2594 .load_got, .load_symbol, .load_direct, .load_tlv => unreachable, // TODO
2595 .immediate => |imm| .{ .immediate = imm },2595 .immediate => |imm| .{ .immediate = imm },
2596 .memory => |addr| .{ .memory = addr },2596 .memory => |addr| .{ .memory = addr },
2597 },2597 },
src/arch/sparc64/CodeGen.zig+1-1
...@@ -4137,7 +4137,7 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {...@@ -4137,7 +4137,7 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {
4137 .mcv => |mcv| switch (mcv) {4137 .mcv => |mcv| switch (mcv) {
4138 .none => .none,4138 .none => .none,
4139 .undef => .undef,4139 .undef => .undef,
4140 .load_got, .load_symbol, .lea_symbol, .load_direct, .load_tlv => unreachable, // TODO4140 .load_got, .load_symbol, .load_direct, .load_tlv => unreachable, // TODO
4141 .immediate => |imm| .{ .immediate = imm },4141 .immediate => |imm| .{ .immediate = imm },
4142 .memory => |addr| .{ .memory = addr },4142 .memory => |addr| .{ .memory = addr },
4143 },4143 },
src/arch/x86_64/CodeGen.zig+11-20
...@@ -453,8 +453,8 @@ pub const MCValue = union(enum) {...@@ -453,8 +453,8 @@ pub const MCValue = union(enum) {
453 .lea_frame => |pl| try writer.print("{} + 0x{x}", .{ pl.index, pl.off }),453 .lea_frame => |pl| try writer.print("{} + 0x{x}", .{ pl.index, pl.off }),
454 .reserved_frame => |pl| try writer.print("(dead:{})", .{pl}),454 .reserved_frame => |pl| try writer.print("(dead:{})", .{pl}),
455 .air_ref => |pl| try writer.print("(air:0x{x})", .{@intFromEnum(pl)}),455 .air_ref => |pl| try writer.print("(air:0x{x})", .{@intFromEnum(pl)}),
456 .load_symbol => |pl| try writer.print("[mem:{d}]", .{pl}),456 .load_symbol => |pl| try writer.print("[symbol:{d}]", .{pl}),
457 .lea_symbol => |pl| try writer.print("mem:{d}", .{pl}),457 .lea_symbol => |pl| try writer.print("symbol:{d}", .{pl}),
458 }458 }
459 }459 }
460};460};
...@@ -11627,8 +11627,8 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {...@@ -11627,8 +11627,8 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
11627 .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .lea_got = sym_index }) }11627 .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .lea_got = sym_index }) }
11628 else11628 else
11629 return self.fail("invalid modifier: '{s}'", .{modifier}),11629 return self.fail("invalid modifier: '{s}'", .{modifier}),
11630 .lea_symbol => |sym_index| if (mem.eql(u8, modifier, "P"))11630 .load_symbol => |sym_index| if (mem.eql(u8, modifier, "P"))
11631 .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .lea_symbol = sym_index }) }11631 .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .load_symbol = sym_index }) }
11632 else11632 else
11633 return self.fail("invalid modifier: '{s}'", .{modifier}),11633 return self.fail("invalid modifier: '{s}'", .{modifier}),
11634 else => return self.fail("invalid constraint: '{s}'", .{op_str}),11634 else => return self.fail("invalid constraint: '{s}'", .{op_str}),
...@@ -12489,10 +12489,9 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr...@@ -12489,10 +12489,9 @@ fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerEr
12489 },12489 },
12490 .lea_symbol, .lea_direct, .lea_got => |sym_index| {12490 .lea_symbol, .lea_direct, .lea_got => |sym_index| {
12491 const atom_index = try self.owner.getSymbolIndex(self);12491 const atom_index = try self.owner.getSymbolIndex(self);
12492 if (self.bin_file.cast(link.File.Elf)) |elf_file| {12492 if (self.bin_file.cast(link.File.Elf)) |_| {
12493 const sym = elf_file.symbol(elf_file.zigModulePtr().symbol(sym_index));
12494 _ = try self.addInst(.{12493 _ = try self.addInst(.{
12495 .tag = if (sym.flags.has_zig_got) .mov else .lea,12494 .tag = .lea,
12496 .ops = .linker_reloc,12495 .ops = .linker_reloc,
12497 .data = .{ .rx = .{12496 .data = .{ .rx = .{
12498 .r1 = dst_reg.to64(),12497 .r1 = dst_reg.to64(),
...@@ -12783,7 +12782,7 @@ fn genLazySymbolRef(...@@ -12783,7 +12782,7 @@ fn genLazySymbolRef(
12783 };12782 };
12784 switch (tag) {12783 switch (tag) {
12785 .lea, .mov => _ = try self.addInst(.{12784 .lea, .mov => _ = try self.addInst(.{
12786 .tag = .mov,12785 .tag = tag,
12787 .ops = .linker_reloc,12786 .ops = .linker_reloc,
12788 .data = .{ .rx = .{12787 .data = .{ .rx = .{
12789 .r1 = reg.to64(),12788 .r1 = reg.to64(),
...@@ -12797,15 +12796,6 @@ fn genLazySymbolRef(...@@ -12797,15 +12796,6 @@ fn genLazySymbolRef(
12797 }),12796 }),
12798 else => unreachable,12797 else => unreachable,
12799 }12798 }
12800 switch (tag) {
12801 .lea, .call => {},
12802 .mov => try self.asmRegisterMemory(
12803 .{ ._, tag },
12804 reg.to64(),
12805 Memory.sib(.qword, .{ .base = .{ .reg = reg.to64() } }),
12806 ),
12807 else => unreachable,
12808 }
12809 }12799 }
12810 } else if (self.bin_file.cast(link.File.Plan9)) |p9_file| {12800 } else if (self.bin_file.cast(link.File.Plan9)) |p9_file| {
12811 const atom_index = p9_file.getOrCreateAtomForLazySymbol(lazy_sym) catch |err|12801 const atom_index = p9_file.getOrCreateAtomForLazySymbol(lazy_sym) catch |err|
...@@ -14692,10 +14682,12 @@ fn resolveInst(self: *Self, ref: Air.Inst.Ref) InnerError!MCValue {...@@ -14692,10 +14682,12 @@ fn resolveInst(self: *Self, ref: Air.Inst.Ref) InnerError!MCValue {
14692 } else mcv: {14682 } else mcv: {
14693 const ip_index = Air.refToInterned(ref).?;14683 const ip_index = Air.refToInterned(ref).?;
14694 const gop = try self.const_tracking.getOrPut(self.gpa, ip_index);14684 const gop = try self.const_tracking.getOrPut(self.gpa, ip_index);
14695 if (!gop.found_existing) gop.value_ptr.* = InstTracking.init(try self.genTypedValue(.{14685 const mcv = try self.genTypedValue(.{
14696 .ty = ty,14686 .ty = ty,
14697 .val = ip_index.toValue(),14687 .val = ip_index.toValue(),
14698 }));14688 });
14689 std.debug.print("genTypedValue: {any}\n", .{mcv});
14690 if (!gop.found_existing) gop.value_ptr.* = InstTracking.init(mcv);
14699 break :mcv gop.value_ptr.short;14691 break :mcv gop.value_ptr.short;
14700 };14692 };
1470114693
...@@ -14743,7 +14735,6 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {...@@ -14743,7 +14735,6 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {
14743 .immediate => |imm| .{ .immediate = imm },14735 .immediate => |imm| .{ .immediate = imm },
14744 .memory => |addr| .{ .memory = addr },14736 .memory => |addr| .{ .memory = addr },
14745 .load_symbol => |sym_index| .{ .load_symbol = sym_index },14737 .load_symbol => |sym_index| .{ .load_symbol = sym_index },
14746 .lea_symbol => |sym_index| .{ .lea_symbol = sym_index },
14747 .load_direct => |sym_index| .{ .load_direct = sym_index },14738 .load_direct => |sym_index| .{ .load_direct = sym_index },
14748 .load_got => |sym_index| .{ .lea_got = sym_index },14739 .load_got => |sym_index| .{ .lea_got = sym_index },
14749 .load_tlv => |sym_index| .{ .lea_tlv = sym_index },14740 .load_tlv => |sym_index| .{ .lea_tlv = sym_index },
src/arch/x86_64/Emit.zig+1-1
...@@ -96,7 +96,7 @@ pub fn emitMir(emit: *Emit) Error!void {...@@ -96,7 +96,7 @@ pub fn emitMir(emit: *Emit) Error!void {
96 } else {96 } else {
97 const r_type: u32 = if (sym.flags.has_zig_got)97 const r_type: u32 = if (sym.flags.has_zig_got)
98 link.File.Elf.R_X86_64_ZIG_GOT3298 link.File.Elf.R_X86_64_ZIG_GOT32
99 else if (sym.flags.has_got)99 else if (sym.flags.needs_got)
100 std.elf.R_X86_64_GOT32100 std.elf.R_X86_64_GOT32
101 else101 else
102 std.elf.R_X86_64_32;102 std.elf.R_X86_64_32;
src/arch/x86_64/Lower.zig+44-40
...@@ -415,7 +415,49 @@ fn generic(lower: *Lower, inst: Mir.Inst) Error!void {...@@ -415,7 +415,49 @@ fn generic(lower: *Lower, inst: Mir.Inst) Error!void {
415 => ._,415 => ._,
416 else => return lower.fail("TODO lower .{s}", .{@tagName(inst.ops)}),416 else => return lower.fail("TODO lower .{s}", .{@tagName(inst.ops)}),
417 };417 };
418 try lower.emit(switch (fixes) {418 if (inst.ops == .linker_reloc) {
419 if (lower.bin_file.options.pic) {
420 const reg = inst.data.rx.r1;
421 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;
422 _ = lower.reloc(.{ .linker_reloc = extra });
423 const mnemonic: Mnemonic = switch (inst.tag) {
424 .mov => .mov,
425 .lea => .lea,
426 else => unreachable,
427 };
428 try lower.emit(.none, mnemonic, &.{
429 .{ .reg = reg },
430 .{ .mem = Memory.rip(Memory.PtrSize.fromBitSize(reg.bitSize()), 0) },
431 });
432 } else {
433 switch (inst.tag) {
434 .call => {
435 _ = lower.reloc(.{ .linker_reloc = inst.data.reloc });
436 try lower.emit(.none, .call, &.{
437 .{ .mem = Memory.sib(.qword, .{ .base = .{ .reg = .ds }, .disp = 0 }) },
438 });
439 },
440 .lea => {
441 const reg = inst.data.rx.r1;
442 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;
443 try lower.emit(.none, .mov, &.{
444 .{ .reg = reg },
445 .{ .imm = lower.reloc(.{ .linker_reloc = extra }) },
446 });
447 },
448 .mov => {
449 const reg = inst.data.rx.r1;
450 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;
451 _ = lower.reloc(.{ .linker_reloc = extra });
452 try lower.emit(.none, .mov, &.{
453 .{ .reg = reg },
454 .{ .mem = Memory.sib(.qword, .{ .base = .{ .reg = .ds }, .disp = 0 }) },
455 });
456 },
457 else => return lower.fail("TODO lower {s} {s}", .{ @tagName(inst.tag), @tagName(inst.ops) }),
458 }
459 }
460 } else try lower.emit(switch (fixes) {
419 inline else => |tag| comptime if (std.mem.indexOfScalar(u8, @tagName(tag), ' ')) |space|461 inline else => |tag| comptime if (std.mem.indexOfScalar(u8, @tagName(tag), ' ')) |space|
420 @field(Prefix, @tagName(tag)[0..space])462 @field(Prefix, @tagName(tag)[0..space])
421 else463 else
...@@ -544,45 +586,7 @@ fn generic(lower: *Lower, inst: Mir.Inst) Error!void {...@@ -544,45 +586,7 @@ fn generic(lower: *Lower, inst: Mir.Inst) Error!void {
544 .extern_fn_reloc => &.{586 .extern_fn_reloc => &.{
545 .{ .imm = lower.reloc(.{ .linker_extern_fn = inst.data.reloc }) },587 .{ .imm = lower.reloc(.{ .linker_extern_fn = inst.data.reloc }) },
546 },588 },
547 .linker_reloc => ops: {589 .linker_reloc => unreachable,
548 if (lower.bin_file.options.pic) {
549 const reg = inst.data.rx.r1;
550 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;
551 _ = lower.reloc(.{ .linker_reloc = extra });
552 break :ops &.{
553 .{ .reg = reg },
554 .{ .mem = Memory.rip(Memory.PtrSize.fromBitSize(reg.bitSize()), 0) },
555 };
556 } else {
557 switch (inst.tag) {
558 .call => {
559 _ = lower.reloc(.{ .linker_reloc = inst.data.reloc });
560 break :ops &.{
561 .{ .mem = Memory.sib(.qword, .{ .base = .{ .reg = .ds }, .disp = 0 }) },
562 };
563 },
564 .mov => {
565 const reg = inst.data.rx.r1;
566 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;
567 _ = lower.reloc(.{ .linker_reloc = extra });
568 break :ops &.{
569 .{ .reg = reg },
570 .{ .mem = Memory.sib(.qword, .{ .base = .{ .reg = .ds }, .disp = 0 }) },
571 };
572 },
573 .lea => {
574 const reg = inst.data.rx.r1;
575 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;
576 _ = lower.reloc(.{ .linker_reloc = extra });
577 break :ops &.{
578 .{ .reg = reg },
579 .{ .mem = Memory.sib(.qword, .{ .base = .{ .reg = .ds }, .disp = 0 }) },
580 };
581 },
582 else => return lower.fail("TODO lower {s} {s}", .{ @tagName(inst.tag), @tagName(inst.ops) }),
583 }
584 }
585 },
586 .got_reloc, .direct_reloc, .import_reloc, .tlv_reloc => ops: {590 .got_reloc, .direct_reloc, .import_reloc, .tlv_reloc => ops: {
587 const reg = inst.data.rx.r1;591 const reg = inst.data.rx.r1;
588 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;592 const extra = lower.mir.extraData(Mir.Reloc, inst.data.rx.payload).data;
src/codegen.zig+2-3
...@@ -828,7 +828,6 @@ pub const GenResult = union(enum) {...@@ -828,7 +828,6 @@ pub const GenResult = union(enum) {
828 /// Reference to memory location but deferred until linker allocated the Decl in memory.828 /// Reference to memory location but deferred until linker allocated the Decl in memory.
829 /// Traditionally, this corresponds to emitting a relocation in a relocatable object file.829 /// Traditionally, this corresponds to emitting a relocation in a relocatable object file.
830 load_symbol: u32,830 load_symbol: u32,
831 lea_symbol: u32,
832 };831 };
833832
834 fn mcv(val: MCValue) GenResult {833 fn mcv(val: MCValue) GenResult {
...@@ -905,12 +904,12 @@ fn genDeclRef(...@@ -905,12 +904,12 @@ fn genDeclRef(
905 null;904 null;
906 const sym_index = try elf_file.getGlobalSymbol(name, lib_name);905 const sym_index = try elf_file.getGlobalSymbol(name, lib_name);
907 elf_file.symbol(elf_file.zigModulePtr().symbol(sym_index)).flags.needs_got = true;906 elf_file.symbol(elf_file.zigModulePtr().symbol(sym_index)).flags.needs_got = true;
908 return GenResult.mcv(.{ .lea_symbol = sym_index });907 return GenResult.mcv(.{ .load_symbol = sym_index });
909 }908 }
910 const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index);909 const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index);
911 const sym = elf_file.symbol(sym_index);910 const sym = elf_file.symbol(sym_index);
912 _ = try sym.getOrCreateZigGotEntry(sym_index, elf_file);911 _ = try sym.getOrCreateZigGotEntry(sym_index, elf_file);
913 return GenResult.mcv(.{ .lea_symbol = sym.esym_index });912 return GenResult.mcv(.{ .load_symbol = sym.esym_index });
914 } else if (bin_file.cast(link.File.MachO)) |macho_file| {913 } else if (bin_file.cast(link.File.MachO)) |macho_file| {
915 const atom_index = try macho_file.getOrCreateAtomForDecl(decl_index);914 const atom_index = try macho_file.getOrCreateAtomForDecl(decl_index);
916 const sym_index = macho_file.getAtom(atom_index).getSymbolIndex().?;915 const sym_index = macho_file.getAtom(atom_index).getSymbolIndex().?;