aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-10-27 00:23:43 +0300
committerVeikka Tuominen <git@vexu.eu>2022-10-27 01:31:18 +0300
commitf3a3fb3d880528e8b6404648c605ed092ef1412c (patch)
tree057fc8501bee11acfed485d49dfe52accb86aa7e /src
parent595ccecd88d82874e7f677ee1809c04fc29424ff (diff)
downloadzig-f3a3fb3d880528e8b6404648c605ed092ef1412c.tar.gz
zig-f3a3fb3d880528e8b6404648c605ed092ef1412c.zip
llvm: pass optional slices like regular slices
Diffstat (limited to 'src')
-rw-r--r--src/codegen/llvm.zig13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 2eb95dc5e3..2660b19bf3 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -1027,7 +1027,9 @@ pub const Object = struct {
dg.addArgAttr(llvm_func, llvm_arg_i, "noalias");
}
}
- dg.addArgAttr(llvm_func, llvm_arg_i, "nonnull");
+ if (param_ty.zigTypeTag() != .Optional) {
+ dg.addArgAttr(llvm_func, llvm_arg_i, "nonnull");
+ }
if (!ptr_info.mutable) {
dg.addArgAttr(llvm_func, llvm_arg_i, "readonly");
}
@@ -3117,7 +3119,11 @@ pub const DeclGen = struct {
.slice => {
const param_ty = fn_info.param_types[it.zig_index - 1];
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
- const ptr_ty = param_ty.slicePtrFieldType(&buf);
+ var opt_buf: Type.Payload.ElemType = undefined;
+ const ptr_ty = if (param_ty.zigTypeTag() == .Optional)
+ param_ty.optionalChild(&opt_buf).slicePtrFieldType(&buf)
+ else
+ param_ty.slicePtrFieldType(&buf);
const ptr_llvm_ty = try dg.lowerType(ptr_ty);
const len_llvm_ty = try dg.lowerType(Type.usize);
@@ -10358,7 +10364,8 @@ const ParamTypeIterator = struct {
.Unspecified, .Inline => {
it.zig_index += 1;
it.llvm_index += 1;
- if (ty.isSlice()) {
+ var buf: Type.Payload.ElemType = undefined;
+ if (ty.isSlice() or (ty.zigTypeTag() == .Optional and ty.optionalChild(&buf).isSlice())) {
return .slice;
} else if (isByRef(ty)) {
return .byref;