| ... | ... | @@ -3101,6 +3101,12 @@ static void gen_set_stack_pointer(CodeGen *g, LLVMValueRef aligned_end_addr) { |
| 3101 | 3101 | LLVMBuildCall(g->builder, write_register_fn_val, params, 2, ""); |
| 3102 | 3102 | } |
| 3103 | 3103 | |
| 3104 | static void set_call_instr_sret(CodeGen *g, LLVMValueRef call_instr) { |
| 3105 | unsigned attr_kind_id = LLVMGetEnumAttributeKindForName("sret", 4); |
| 3106 | LLVMAttributeRef sret_attr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(), attr_kind_id, 1); |
| 3107 | LLVMAddCallSiteAttribute(call_instr, 1, sret_attr); |
| 3108 | } |
| 3109 | |
| 3104 | 3110 | static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstructionCall *instruction) { |
| 3105 | 3111 | LLVMValueRef fn_val; |
| 3106 | 3112 | TypeTableEntry *fn_type; |
| ... | ... | @@ -3196,6 +3202,7 @@ static LLVMValueRef ir_render_call(CodeGen *g, IrExecutable *executable, IrInstr |
| 3196 | 3202 | } else if (!ret_has_bits) { |
| 3197 | 3203 | return nullptr; |
| 3198 | 3204 | } else if (first_arg_ret) { |
| 3205 | set_call_instr_sret(g, result); |
| 3199 | 3206 | return instruction->tmp_ptr; |
| 3200 | 3207 | } else if (handle_is_ptr(src_return_type)) { |
| 3201 | 3208 | auto store_instr = LLVMBuildStore(g->builder, result, instruction->tmp_ptr); |
| ... | ... | @@ -4662,8 +4669,9 @@ static LLVMValueRef get_coro_alloc_helper_fn_val(CodeGen *g, LLVMTypeRef alloc_f |
| 4662 | 4669 | args.append(allocator_val); |
| 4663 | 4670 | args.append(coro_size); |
| 4664 | 4671 | args.append(alignment_val); |
| 4665 | | ZigLLVMBuildCall(g->builder, alloc_fn_val, args.items, args.length, |
| 4672 | LLVMValueRef call_instruction = ZigLLVMBuildCall(g->builder, alloc_fn_val, args.items, args.length, |
| 4666 | 4673 | get_llvm_cc(g, CallingConventionUnspecified), ZigLLVM_FnInlineAuto, ""); |
| 4674 | set_call_instr_sret(g, call_instruction); |
| 4667 | 4675 | LLVMValueRef err_val_ptr = LLVMBuildStructGEP(g->builder, sret_ptr, err_union_err_index, ""); |
| 4668 | 4676 | LLVMValueRef err_val = LLVMBuildLoad(g->builder, err_val_ptr, ""); |
| 4669 | 4677 | LLVMBuildStore(g->builder, err_val, err_code_ptr); |