diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 8f3346e10bff053df5b12e0843a4d60563d2e36f..9b2d9c76b0a396acd7a54ce5bf8d649f49956d85 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -405,6 +405,12 @@ fn gen(self: *Self) InnerError!void { const aligned_stack_end = mem.alignForward(stack_end, self.stack_align); if (aligned_stack_end > 0) { self.mir_instructions.items(.data)[backpatch_reloc].imm = @intCast(i32, aligned_stack_end); + } else { + self.mir_instructions.set(backpatch_reloc, .{ + .tag = .nop, + .ops = undefined, + .data = undefined, + }); } if (self.exitlude_jump_relocs.items.len == 1) { diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig index 7fd81d46c29d5ece7d50353e2005daff06b2830f..d337b7c6296ef44b41374885b283cb2530e50ff7 100644 --- a/src/arch/x86_64/Emit.zig +++ b/src/arch/x86_64/Emit.zig @@ -134,6 +134,7 @@ pub fn emitMir(emit: *Emit) InnerError!void { .@"test" => try emit.mirTest(inst), .brk => try emit.mirBrk(), + .nop => try emit.mirNop(), .call_extern => try emit.mirCallExtern(inst), @@ -185,6 +186,11 @@ fn mirBrk(emit: *Emit) InnerError!void { encoder.opcode_1byte(0xcc); } +fn mirNop(emit: *Emit) InnerError!void { + const encoder = try Encoder.init(emit.code, 1); + encoder.opcode_1byte(0x90); +} + fn mirSyscall(emit: *Emit) InnerError!void { const encoder = try Encoder.init(emit.code, 2); encoder.opcode_2byte(0x0f, 0x05); diff --git a/src/arch/x86_64/Mir.zig b/src/arch/x86_64/Mir.zig index 05d374a856a9b44de0bf2fb00ea341421895aa97..690b1ce5f2a446de66f7e9e9542c4926662de3e4 100644 --- a/src/arch/x86_64/Mir.zig +++ b/src/arch/x86_64/Mir.zig @@ -247,6 +247,9 @@ pub const Inst = struct { /// Breakpoint brk, + /// Nop + nop, + /// Pseudo-instructions /// call extern function /// Notes: