| ... | ... | @@ -797,6 +797,7 @@ pub const Object = struct { |
| 797 | 797 | const param_ty = fn_info.param_types[it.zig_index - 1]; |
| 798 | 798 | const param = llvm_func.getParam(llvm_arg_i); |
| 799 | 799 | try args.ensureUnusedCapacity(1); |
| 800 | assert(!it.byval_attr); |
| 800 | 801 | |
| 801 | 802 | if (isByRef(param_ty)) { |
| 802 | 803 | const alignment = param_ty.abiAlignment(target); |
| ... | ... | @@ -840,11 +841,16 @@ pub const Object = struct { |
| 840 | 841 | }, |
| 841 | 842 | .byref => { |
| 842 | 843 | const param_ty = fn_info.param_types[it.zig_index - 1]; |
| 844 | const param_llvm_ty = try dg.lowerType(param_ty); |
| 843 | 845 | const param = llvm_func.getParam(llvm_arg_i); |
| 846 | const alignment = param_ty.abiAlignment(target); |
| 844 | 847 | |
| 845 | 848 | dg.addArgAttr(llvm_func, llvm_arg_i, "nonnull"); |
| 846 | 849 | dg.addArgAttr(llvm_func, llvm_arg_i, "readonly"); |
| 847 | | dg.addArgAttrInt(llvm_func, llvm_arg_i, "align", param_ty.abiAlignment(target)); |
| 850 | dg.addArgAttrInt(llvm_func, llvm_arg_i, "align", alignment); |
| 851 | if (it.byval_attr) { |
| 852 | llvm_func.addByValAttr(llvm_arg_i, param_llvm_ty); |
| 853 | } |
| 848 | 854 | |
| 849 | 855 | llvm_arg_i += 1; |
| 850 | 856 | |
| ... | ... | @@ -853,14 +859,13 @@ pub const Object = struct { |
| 853 | 859 | if (isByRef(param_ty)) { |
| 854 | 860 | args.appendAssumeCapacity(param); |
| 855 | 861 | } else { |
| 856 | | const alignment = param_ty.abiAlignment(target); |
| 857 | | const param_llvm_ty = try dg.lowerType(param_ty); |
| 858 | 862 | const load_inst = builder.buildLoad(param_llvm_ty, param, ""); |
| 859 | 863 | load_inst.setAlignment(alignment); |
| 860 | 864 | args.appendAssumeCapacity(load_inst); |
| 861 | 865 | } |
| 862 | 866 | }, |
| 863 | 867 | .abi_sized_int => { |
| 868 | assert(!it.byval_attr); |
| 864 | 869 | const param_ty = fn_info.param_types[it.zig_index - 1]; |
| 865 | 870 | const param = llvm_func.getParam(llvm_arg_i); |
| 866 | 871 | llvm_arg_i += 1; |
| ... | ... | @@ -890,6 +895,7 @@ pub const Object = struct { |
| 890 | 895 | } |
| 891 | 896 | }, |
| 892 | 897 | .slice => { |
| 898 | assert(!it.byval_attr); |
| 893 | 899 | const param_ty = fn_info.param_types[it.zig_index - 1]; |
| 894 | 900 | const ptr_info = param_ty.ptrInfo().data; |
| 895 | 901 | |
| ... | ... | @@ -919,6 +925,7 @@ pub const Object = struct { |
| 919 | 925 | try args.append(aggregate); |
| 920 | 926 | }, |
| 921 | 927 | .multiple_llvm_ints => { |
| 928 | assert(!it.byval_attr); |
| 922 | 929 | const llvm_ints = it.llvm_types_buffer[0..it.llvm_types_len]; |
| 923 | 930 | const param_ty = fn_info.param_types[it.zig_index - 1]; |
| 924 | 931 | const param_llvm_ty = try dg.lowerType(param_ty); |
| ... | ... | @@ -949,6 +956,7 @@ pub const Object = struct { |
| 949 | 956 | try args.append(loaded); |
| 950 | 957 | }, |
| 951 | 958 | .multiple_llvm_float => { |
| 959 | assert(!it.byval_attr); |
| 952 | 960 | const llvm_floats = it.llvm_types_buffer[0..it.llvm_types_len]; |
| 953 | 961 | const param_ty = fn_info.param_types[it.zig_index - 1]; |
| 954 | 962 | const param_llvm_ty = try dg.lowerType(param_ty); |
| ... | ... | @@ -983,6 +991,7 @@ pub const Object = struct { |
| 983 | 991 | try args.append(loaded); |
| 984 | 992 | }, |
| 985 | 993 | .as_u16 => { |
| 994 | assert(!it.byval_attr); |
| 986 | 995 | const param = llvm_func.getParam(llvm_arg_i); |
| 987 | 996 | llvm_arg_i += 1; |
| 988 | 997 | const casted = builder.buildBitCast(param, dg.context.halfType(), ""); |
| ... | ... | @@ -2406,14 +2415,6 @@ pub const DeclGen = struct { |
| 2406 | 2415 | dg.addFnAttr(llvm_fn, "noreturn"); |
| 2407 | 2416 | } |
| 2408 | 2417 | |
| 2409 | | var llvm_arg_i = @as(c_uint, @boolToInt(sret)) + @boolToInt(err_return_tracing); |
| 2410 | | var it = iterateParamTypes(dg, fn_info); |
| 2411 | | while (it.next()) |_| : (llvm_arg_i += 1) { |
| 2412 | | if (!it.byval_attr) continue; |
| 2413 | | const param = llvm_fn.getParam(llvm_arg_i); |
| 2414 | | llvm_fn.addByValAttr(llvm_arg_i, param.typeOf().getElementType()); |
| 2415 | | } |
| 2416 | | |
| 2417 | 2418 | return llvm_fn; |
| 2418 | 2419 | } |
| 2419 | 2420 | |