| author | |
| committer | |
| log | 2be1250f244a362b832cfc3d519a27363495f130 |
| tree | effd609f5b418fdeabda57323f54e14bbd299d54 |
| parent | 0d00b7c585f0e3a20ace71105f562bd7bdd14489 |
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 | 6176 | .memory => |addr| .{ .memory = addr }, |
| 6177 | 6177 | .load_got => |sym_index| .{ .linker_load = .{ .type = .got, .sym_index = sym_index } }, |
| 6178 | 6178 | .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 | |
| 6180 | 6180 | }, |
| 6181 | 6181 | .fail => |msg| { |
| 6182 | 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 | 6135 | .mcv => |mcv| switch (mcv) { |
| 6136 | 6136 | .none => .none, |
| 6137 | 6137 | .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 | |
| 6139 | 6139 | .immediate => |imm| .{ .immediate = @as(u32, @truncate(imm)) }, |
| 6140 | 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 | 2591 | .mcv => |mcv| switch (mcv) { |
| 2592 | 2592 | .none => .none, |
| 2593 | 2593 | .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 | |
| 2595 | 2595 | .immediate => |imm| .{ .immediate = imm }, |
| 2596 | 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 | 4137 | .mcv => |mcv| switch (mcv) { |
| 4138 | 4138 | .none => .none, |
| 4139 | 4139 | .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 | |
| 4141 | 4141 | .immediate => |imm| .{ .immediate = imm }, |
| 4142 | 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 | 453 | .lea_frame => |pl| try writer.print("{} + 0x{x}", .{ pl.index, pl.off }), |
| 454 | 454 | .reserved_frame => |pl| try writer.print("(dead:{})", .{pl}), |
| 455 | 455 | .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}), | |
| 458 | 458 | } |
| 459 | 459 | } |
| 460 | 460 | }; |
| ... | ... | @@ -11627,8 +11627,8 @@ fn airAsm(self: *Self, inst: Air.Inst.Index) !void { |
| 11627 | 11627 | .{ .reg = try self.copyToTmpRegister(Type.usize, .{ .lea_got = sym_index }) } |
| 11628 | 11628 | else |
| 11629 | 11629 | 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 }) } | |
| 11632 | 11632 | else |
| 11633 | 11633 | return self.fail("invalid modifier: '{s}'", .{modifier}), |
| 11634 | 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 | 12489 | }, |
| 12490 | 12490 | .lea_symbol, .lea_direct, .lea_got => |sym_index| { |
| 12491 | 12491 | 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)) |_| { | |
| 12494 | 12493 | _ = try self.addInst(.{ |
| 12495 | .tag = if (sym.flags.has_zig_got) .mov else .lea, | |
| 12494 | .tag = .lea, | |
| 12496 | 12495 | .ops = .linker_reloc, |
| 12497 | 12496 | .data = .{ .rx = .{ |
| 12498 | 12497 | .r1 = dst_reg.to64(), |
| ... | ... | @@ -12783,7 +12782,7 @@ fn genLazySymbolRef( |
| 12783 | 12782 | }; |
| 12784 | 12783 | switch (tag) { |
| 12785 | 12784 | .lea, .mov => _ = try self.addInst(.{ |
| 12786 | .tag = .mov, | |
| 12785 | .tag = tag, | |
| 12787 | 12786 | .ops = .linker_reloc, |
| 12788 | 12787 | .data = .{ .rx = .{ |
| 12789 | 12788 | .r1 = reg.to64(), |
| ... | ... | @@ -12797,15 +12796,6 @@ fn genLazySymbolRef( |
| 12797 | 12796 | }), |
| 12798 | 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 | 12800 | } else if (self.bin_file.cast(link.File.Plan9)) |p9_file| { |
| 12811 | 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 | 14682 | } else mcv: { |
| 14693 | 14683 | const ip_index = Air.refToInterned(ref).?; |
| 14694 | 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 | 14686 | .ty = ty, |
| 14697 | 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 | 14691 | break :mcv gop.value_ptr.short; |
| 14700 | 14692 | }; |
| 14701 | 14693 | |
| ... | ... | @@ -14743,7 +14735,6 @@ fn genTypedValue(self: *Self, arg_tv: TypedValue) InnerError!MCValue { |
| 14743 | 14735 | .immediate => |imm| .{ .immediate = imm }, |
| 14744 | 14736 | .memory => |addr| .{ .memory = addr }, |
| 14745 | 14737 | .load_symbol => |sym_index| .{ .load_symbol = sym_index }, |
| 14746 | .lea_symbol => |sym_index| .{ .lea_symbol = sym_index }, | |
| 14747 | 14738 | .load_direct => |sym_index| .{ .load_direct = sym_index }, |
| 14748 | 14739 | .load_got => |sym_index| .{ .lea_got = sym_index }, |
| 14749 | 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 | 96 | } else { |
| 97 | 97 | const r_type: u32 = if (sym.flags.has_zig_got) |
| 98 | 98 | link.File.Elf.R_X86_64_ZIG_GOT32 |
| 99 | else if (sym.flags.has_got) | |
| 99 | else if (sym.flags.needs_got) | |
| 100 | 100 | std.elf.R_X86_64_GOT32 |
| 101 | 101 | else |
| 102 | 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 | 415 | => ._, |
| 416 | 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 | 461 | inline else => |tag| comptime if (std.mem.indexOfScalar(u8, @tagName(tag), ' ')) |space| |
| 420 | 462 | @field(Prefix, @tagName(tag)[0..space]) |
| 421 | 463 | else |
| ... | ... | @@ -544,45 +586,7 @@ fn generic(lower: *Lower, inst: Mir.Inst) Error!void { |
| 544 | 586 | .extern_fn_reloc => &.{ |
| 545 | 587 | .{ .imm = lower.reloc(.{ .linker_extern_fn = inst.data.reloc }) }, |
| 546 | 588 | }, |
| 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, | |
| 586 | 590 | .got_reloc, .direct_reloc, .import_reloc, .tlv_reloc => ops: { |
| 587 | 591 | const reg = inst.data.rx.r1; |
| 588 | 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 | 828 | /// Reference to memory location but deferred until linker allocated the Decl in memory. |
| 829 | 829 | /// Traditionally, this corresponds to emitting a relocation in a relocatable object file. |
| 830 | 830 | load_symbol: u32, |
| 831 | lea_symbol: u32, | |
| 832 | 831 | }; |
| 833 | 832 | |
| 834 | 833 | fn mcv(val: MCValue) GenResult { |
| ... | ... | @@ -905,12 +904,12 @@ fn genDeclRef( |
| 905 | 904 | null; |
| 906 | 905 | const sym_index = try elf_file.getGlobalSymbol(name, lib_name); |
| 907 | 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 | 909 | const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index); |
| 911 | 910 | const sym = elf_file.symbol(sym_index); |
| 912 | 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 | 913 | } else if (bin_file.cast(link.File.MachO)) |macho_file| { |
| 915 | 914 | const atom_index = try macho_file.getOrCreateAtomForDecl(decl_index); |
| 916 | 915 | const sym_index = macho_file.getAtom(atom_index).getSymbolIndex().?; |