| ... | ... | @@ -5433,6 +5433,7 @@ pub const FuncGen = struct { |
| 5433 | 5433 | const llvm_params_len = inputs.len + outputs.len - return_count; |
| 5434 | 5434 | const llvm_param_types = try arena.alloc(*const llvm.Type, llvm_params_len); |
| 5435 | 5435 | const llvm_param_values = try arena.alloc(*const llvm.Value, llvm_params_len); |
| 5436 | const llvm_param_attrs = try arena.alloc(bool, llvm_params_len); |
| 5436 | 5437 | const target = self.dg.module.getTarget(); |
| 5437 | 5438 | |
| 5438 | 5439 | var llvm_param_i: usize = 0; |
| ... | ... | @@ -5461,6 +5462,7 @@ pub const FuncGen = struct { |
| 5461 | 5462 | const output_inst = try self.resolveInst(output); |
| 5462 | 5463 | llvm_param_values[llvm_param_i] = output_inst; |
| 5463 | 5464 | llvm_param_types[llvm_param_i] = output_inst.typeOf(); |
| 5465 | llvm_param_attrs[llvm_param_i] = true; |
| 5464 | 5466 | llvm_param_i += 1; |
| 5465 | 5467 | } |
| 5466 | 5468 | |
| ... | ... | @@ -5530,6 +5532,11 @@ pub const FuncGen = struct { |
| 5530 | 5532 | if (!std.mem.eql(u8, name, "_")) { |
| 5531 | 5533 | name_map.putAssumeCapacityNoClobber(name, {}); |
| 5532 | 5534 | } |
| 5535 | |
| 5536 | // In the case of indirect inputs, LLVM requires the callsite to have |
| 5537 | // an elementtype(<ty>) attribute. |
| 5538 | llvm_param_attrs[llvm_param_i] = constraint[0] == '*'; |
| 5539 | |
| 5533 | 5540 | llvm_param_i += 1; |
| 5534 | 5541 | total_i += 1; |
| 5535 | 5542 | } |
| ... | ... | @@ -5622,7 +5629,7 @@ pub const FuncGen = struct { |
| 5622 | 5629 | .ATT, |
| 5623 | 5630 | .False, |
| 5624 | 5631 | ); |
| 5625 | | return self.builder.buildCall( |
| 5632 | const call = self.builder.buildCall( |
| 5626 | 5633 | asm_fn, |
| 5627 | 5634 | llvm_param_values.ptr, |
| 5628 | 5635 | @intCast(c_uint, llvm_param_values.len), |
| ... | ... | @@ -5630,6 +5637,13 @@ pub const FuncGen = struct { |
| 5630 | 5637 | .Auto, |
| 5631 | 5638 | "", |
| 5632 | 5639 | ); |
| 5640 | for (llvm_param_attrs) |need_elem_ty, i| { |
| 5641 | if (need_elem_ty) { |
| 5642 | const elem_ty = llvm_param_types[i].getElementType(); |
| 5643 | llvm.setCallElemTypeAttr(call, i, elem_ty); |
| 5644 | } |
| 5645 | } |
| 5646 | return call; |
| 5633 | 5647 | } |
| 5634 | 5648 | |
| 5635 | 5649 | fn airIsNonNull( |