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 {
61766176 .memory => |addr| .{ .memory = addr },
61776177 .load_got => |sym_index| .{ .linker_load = .{ .type = .got, .sym_index = sym_index } },
61786178 .load_direct => |sym_index| .{ .linker_load = .{ .type = .direct, .sym_index = sym_index } },
6179 .load_symbol, .lea_symbol, .load_tlv => unreachable, // TODO
6179 .load_symbol, .load_tlv => unreachable, // TODO
61806180 },
61816181 .fail => |msg| {
61826182 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_symbol, .lea_symbol, .load_direct, .load_tlv => unreachable, // TODO
6138 .load_got, .load_symbol, .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_symbol, .lea_symbol, .load_direct, .load_tlv => unreachable, // TODO
2594 .load_got, .load_symbol, .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_symbol, .lea_symbol, .load_direct, .load_tlv => unreachable, // TODO
4140 .load_got, .load_symbol, .load_direct, .load_tlv => unreachable, // TODO
41414141 .immediate => |imm| .{ .immediate = imm },
41424142 .memory => |addr| .{ .memory = addr },
41434143 },
src/arch/x86_64/CodeGen.zig+11-20
......@@ -453,8 +453,8 @@ pub const MCValue = union(enum) {
453453 .lea_frame => |pl| try writer.print("{} + 0x{x}", .{ pl.index, pl.off }),
454454 .reserved_frame => |pl| try writer.print("(dead:{})", .{pl}),
455455 .air_ref => |pl| try writer.print("(air:0x{x})", .{@intFromEnum(pl)}),
456 .load_symbol => |pl| try writer.print("[mem:{d}]", .{pl}),
457 .lea_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("symbol:{d}", .{pl}),
458458 }
459459 }
460460};
......@@ -11627,8 +11627,8 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void {
1162711627 .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .lea_got = sym_index }) }
1162811628 else
1162911629 return self.fail("invalid modifier: '{s}'", .{modifier}),
11630 .lea_symbol => |sym_index| if (mem.eql(u8, modifier, "P"))
11631 .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .lea_symbol = sym_index }) }
11630 .load_symbol => |sym_index| if (mem.eql(u8, modifier, "P"))
11631 .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .load_symbol = sym_index }) }
1163211632 else
1163311633 return self.fail("invalid modifier: '{s}'", .{modifier}),
1163411634 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
1248912489 },
1249012490 .lea_symbol, .lea_direct, .lea_got => |sym_index| {
1249112491 const atom_index = try self.owner.getSymbolIndex(self);
12492 if (self.bin_file.cast(link.File.Elf)) |elf_file| {
12493 const sym = elf_file.symbol(elf_file.zigModulePtr().symbol(sym_index));
12492 if (self.bin_file.cast(link.File.Elf)) |_| {
1249412493 _ = try self.addInst(.{
12495 .tag = if (sym.flags.has_zig_got) .mov else .lea,
12494 .tag = .lea,
1249612495 .ops = .linker_reloc,
1249712496 .data = .{ .rx = .{
1249812497 .r1 = dst_reg.to64(),
......@@ -12783,7 +12782,7 @@ fn genLazySymbolRef(
1278312782 };
1278412783 switch (tag) {
1278512784 .lea, .mov => _ = try self.addInst(.{
12786 .tag = .mov,
12785 .tag = tag,
1278712786 .ops = .linker_reloc,
1278812787 .data = .{ .rx = .{
1278912788 .r1 = reg.to64(),
......@@ -12797,15 +12796,6 @@ fn genLazySymbolRef(
1279712796 }),
1279812797 else => unreachable,
1279912798 }
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 }
1280912799 }
1281012800 } else if (self.bin_file.cast(link.File.Plan9)) |p9_file| {
1281112801 const atom_index = p9_file.getOrCreateAtomForLazySymbol(lazy_sym) catch |err|
......@@ -14692,10 +14682,12 @@ fn resolveInst(self: *Self, ref: Air.Inst.Ref) InnerError!MCValue {
1469214682 } else mcv: {
1469314683 const ip_index = Air.refToInterned(ref).?;
1469414684 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(.{
1469614686 .ty = ty,
1469714687 .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);
1469914691 break :mcv gop.value_ptr.short;
1470014692 };
1470114693
......@@ -14743,7 +14735,6 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue {
1474314735 .immediate => |imm| .{ .immediate = imm },
1474414736 .memory => |addr| .{ .memory = addr },
1474514737 .load_symbol => |sym_index| .{ .load_symbol = sym_index },
14746 .lea_symbol => |sym_index| .{ .lea_symbol = sym_index },
1474714738 .load_direct => |sym_index| .{ .load_direct = sym_index },
1474814739 .load_got => |sym_index| .{ .lea_got = sym_index },
1474914740 .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 {
9696 } else {
9797 const r_type: u32 = if (sym.flags.has_zig_got)
9898 link.File.Elf.R_X86_64_ZIG_GOT32
99 else if (sym.flags.has_got)
99 else if (sym.flags.needs_got)
100100 std.elf.R_X86_64_GOT32
101101 else
102102 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 {
415415 => ._,
416416 else => return lower.fail("TODO lower .{s}", .{@tagName(inst.ops)}),
417417 };
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) {
419461 inline else => |tag| comptime if (std.mem.indexOfScalar(u8, @tagName(tag), ' ')) |space|
420462 @field(Prefix, @tagName(tag)[0..space])
421463 else
......@@ -544,45 +586,7 @@ fn generic(lower: *Lower, inst: Mir.Inst) Error!void {
544586 .extern_fn_reloc => &.{
545587 .{ .imm = lower.reloc(.{ .linker_extern_fn = inst.data.reloc }) },
546588 },
547 .linker_reloc => ops: {
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 },
589 .linker_reloc => unreachable,
586590 .got_reloc, .direct_reloc, .import_reloc, .tlv_reloc => ops: {
587591 const reg = inst.data.rx.r1;
588592 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) {
828828 /// Reference to memory location but deferred until linker allocated the Decl in memory.
829829 /// Traditionally, this corresponds to emitting a relocation in a relocatable object file.
830830 load_symbol: u32,
831 lea_symbol: u32,
832831 };
833832
834833 fn mcv(val: MCValue) GenResult {
......@@ -905,12 +904,12 @@ fn genDeclRef(
905904 null;
906905 const sym_index = try elf_file.getGlobalSymbol(name, lib_name);
907906 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 });
909908 }
910909 const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index);
911910 const sym = elf_file.symbol(sym_index);
912911 _ = 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 });
914913 } else if (bin_file.cast(link.File.MachO)) |macho_file| {
915914 const atom_index = try macho_file.getOrCreateAtomForDecl(decl_index);
916915 const sym_index = macho_file.getAtom(atom_index).getSymbolIndex().?;