diff options
| author | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2021-01-02 18:53:11 +0100 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-01-03 19:54:12 -0800 |
| commit | aa0906e9aaaf36bc928b5502bdb34e7a0409b2c0 (patch) | |
| tree | d6f669cebdae86ea204b4db4086cdd44bdcc8b87 /src/codegen.zig | |
| parent | 4400d2d7abb3be8c7b9fde9754fc58d4510c5107 (diff) | |
| download | zig-aa0906e9aaaf36bc928b5502bdb34e7a0409b2c0.tar.gz zig-aa0906e9aaaf36bc928b5502bdb34e7a0409b2c0.zip | |
stage2 x86_64: fix bug in Function.gen
Previously, the x86_64 backend would remove code for exitlude relocs
if the jump amount were 0. This causes issues as earlier jumps rely on
the jump being present at the same address.
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index cd6ea15737..c2537a1ca0 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -543,13 +543,10 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type { if (self.code.items.len >= math.maxInt(i32)) { return self.fail(self.src, "unable to perform relocation: jump too far", .{}); } - for (self.exitlude_jump_relocs.items) |jmp_reloc| { + if (self.exitlude_jump_relocs.items.len == 1) { + self.code.items.len -= 5; + } else for (self.exitlude_jump_relocs.items) |jmp_reloc| { const amt = self.code.items.len - (jmp_reloc + 4); - // If it wouldn't jump at all, elide it. - if (amt == 0) { - self.code.items.len -= 5; - continue; - } const s32_amt = @intCast(i32, amt); mem.writeIntLittle(i32, self.code.items[jmp_reloc..][0..4], s32_amt); } |
