authorgravatar for me@tadeo.caTadeo Kondrak <me@tadeo.ca> 2021-02-12 13:40:44-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-02-12 15:40:44-05:00
log9270aae071a4ee840193afe1162b24945cbd6d9e
treedcdd56b0aa3517beac92a05776132dbee6462c1d
parentd3565ed6b48c9c66128f181e7b90b5348504cb3f
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

stage2: fix zero-sized function parameters (#7998)


2 files changed, 37 insertions(+), 10 deletions(-)

src/codegen.zig+15-10
......@@ -3705,17 +3705,22 @@ fn Function(comptime arch: std.Target.Cpu.Arch) type {
37053705 for (param_types) |ty, i| {
37063706 switch (ty.zigTypeTag()) {
37073707 .Bool, .Int => {
3708 const param_size = @intCast(u32, ty.abiSize(self.target.*));
3709 if (next_int_reg >= c_abi_int_param_regs.len) {
3710 result.args[i] = .{ .stack_offset = next_stack_offset };
3711 next_stack_offset += param_size;
3708 if (!ty.hasCodeGenBits()) {
3709 assert(cc != .C);
3710 result.args[i] = .{ .none = {} };
37123711 } else {
3713 const aliased_reg = registerAlias(
3714 c_abi_int_param_regs[next_int_reg],
3715 param_size,
3716 );
3717 result.args[i] = .{ .register = aliased_reg };
3718 next_int_reg += 1;
3712 const param_size = @intCast(u32, ty.abiSize(self.target.*));
3713 if (next_int_reg >= c_abi_int_param_regs.len) {
3714 result.args[i] = .{ .stack_offset = next_stack_offset };
3715 next_stack_offset += param_size;
3716 } else {
3717 const aliased_reg = registerAlias(
3718 c_abi_int_param_regs[next_int_reg],
3719 param_size,
3720 );
3721 result.args[i] = .{ .register = aliased_reg };
3722 next_int_reg += 1;
3723 }
37193724 }
37203725 },
37213726 else => return self.fail(src, "TODO implement function parameters of type {s}", .{@tagName(ty.zigTypeTag())}),
test/stage2/test.zig+22
......@@ -1393,4 +1393,26 @@ pub fn addCases(ctx: *TestContext) !void {
13931393 "",
13941394 );
13951395 }
1396
1397 {
1398 var case = ctx.exe("passing u0 to function", linux_x64);
1399 case.addCompareOutput(
1400 \\export fn _start() noreturn {
1401 \\ doNothing(0);
1402 \\ exit();
1403 \\}
1404 \\fn doNothing(arg: u0) void {}
1405 \\fn exit() noreturn {
1406 \\ asm volatile ("syscall"
1407 \\ :
1408 \\ : [number] "{rax}" (231),
1409 \\ [arg1] "{rdi}" (0)
1410 \\ : "rcx", "r11", "memory"
1411 \\ );
1412 \\ unreachable;
1413 \\}
1414 ,
1415 "",
1416 );
1417 }
13961418}