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