Commit 5af7ae1dc4

Andrew Kelley <andrew@ziglang.org>
2021-10-12 00:50:39
stage2: LLVM backend: fix var args function calls
1 parent 6d6cf59
Changed files (2)
src
src/codegen/llvm.zig
@@ -1490,11 +1490,17 @@ pub const FuncGen = struct {
             break :blk ret_ptr;
         };
 
-        for (args) |arg, i| {
-            const param_ty = fn_info.param_types[i];
-            if (!param_ty.hasCodeGenBits()) continue;
+        if (fn_info.is_var_args) {
+            for (args) |arg| {
+                try llvm_args.append(try self.resolveInst(arg));
+            }
+        } else {
+            for (args) |arg, i| {
+                const param_ty = fn_info.param_types[i];
+                if (!param_ty.hasCodeGenBits()) continue;
 
-            try llvm_args.append(try self.resolveInst(arg));
+                try llvm_args.append(try self.resolveInst(arg));
+            }
         }
 
         const call = self.builder.buildCall(
src/Air.zig
@@ -264,10 +264,10 @@ pub const Inst = struct {
         /// Uses the `un_op` field.
         /// Triggers `resolveTypeLayout` on the return type.
         ret,
-        /// This instruction communicates that the function's result value is inside
-        /// the operand, which is a pointer. If the function will pass the result by-ref,
-        /// the pointer operand is a `ret_ptr` instruction. Otherwise, this instruction
-        /// is equivalent to a `load` on the operand, followed by a `ret` on the loaded value.
+        /// This instruction communicates that the function's result value is pointed to by
+        /// the operand. If the function will pass the result by-ref, the operand is a
+        /// `ret_ptr` instruction. Otherwise, this instruction is equivalent to a `load`
+        /// on the operand, followed by a `ret` on the loaded value.
         /// Result type is always noreturn; no instructions in a block follow this one.
         /// Uses the `un_op` field.
         /// Triggers `resolveTypeLayout` on the return type.