authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-10-27 00:23:43+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-10-27 01:31:18+03:00
logf3a3fb3d880528e8b6404648c605ed092ef1412c
tree057fc8501bee11acfed485d49dfe52accb86aa7e
parent595ccecd88d82874e7f677ee1809c04fc29424ff

llvm: pass optional slices like regular slices


1 files changed, 10 insertions(+), 3 deletions(-)

src/codegen/llvm.zig+10-3
......@@ -1027,7 +1027,9 @@ pub const Object = struct {
10271027 dg.addArgAttr(llvm_func, llvm_arg_i, "noalias");
10281028 }
10291029 }
1030 dg.addArgAttr(llvm_func, llvm_arg_i, "nonnull");
1030 if (param_ty.zigTypeTag() != .Optional) {
1031 dg.addArgAttr(llvm_func, llvm_arg_i, "nonnull");
1032 }
10311033 if (!ptr_info.mutable) {
10321034 dg.addArgAttr(llvm_func, llvm_arg_i, "readonly");
10331035 }
......@@ -3117,7 +3119,11 @@ pub const DeclGen = struct {
31173119 .slice => {
31183120 const param_ty = fn_info.param_types[it.zig_index - 1];
31193121 var buf: Type.SlicePtrFieldTypeBuffer = undefined;
3120 const ptr_ty = param_ty.slicePtrFieldType(&buf);
3122 var opt_buf: Type.Payload.ElemType = undefined;
3123 const ptr_ty = if (param_ty.zigTypeTag() == .Optional)
3124 param_ty.optionalChild(&opt_buf).slicePtrFieldType(&buf)
3125 else
3126 param_ty.slicePtrFieldType(&buf);
31213127 const ptr_llvm_ty = try dg.lowerType(ptr_ty);
31223128 const len_llvm_ty = try dg.lowerType(Type.usize);
31233129
......@@ -10358,7 +10364,8 @@ const ParamTypeIterator = struct {
1035810364 .Unspecified, .Inline => {
1035910365 it.zig_index += 1;
1036010366 it.llvm_index += 1;
10361 if (ty.isSlice()) {
10367 var buf: Type.Payload.ElemType = undefined;
10368 if (ty.isSlice() or (ty.zigTypeTag() == .Optional and ty.optionalChild(&buf).isSlice())) {
1036210369 return .slice;
1036310370 } else if (isByRef(ty)) {
1036410371 return .byref;