diff options
| author | Robin Voetter <robin@voetter.nl> | 2021-10-18 01:00:07 +0200 |
|---|---|---|
| committer | Robin Voetter <robin@voetter.nl> | 2021-10-20 03:44:02 +0200 |
| commit | 05c5c99a95c894d7e3241e1729e09aa7eacb6035 (patch) | |
| tree | 4593305c8204570abf179c260574cf775862d49f /src/codegen/llvm.zig | |
| parent | e5d6fe18b90cf2602e7e7712b4dd807b4e243356 (diff) | |
| download | zig-05c5c99a95c894d7e3241e1729e09aa7eacb6035.tar.gz zig-05c5c99a95c894d7e3241e1729e09aa7eacb6035.zip | |
stage2: air ptr_slice_len_ptr and ptr_slice_ptr_ptr
Diffstat (limited to 'src/codegen/llvm.zig')
| -rw-r--r-- | src/codegen/llvm.zig | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 1a8a70c39b..8ec5075f84 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -1709,6 +1709,10 @@ pub const FuncGen = struct { .assembly => try self.airAssembly(inst), .slice_ptr => try self.airSliceField(inst, 0), .slice_len => try self.airSliceField(inst, 1), + + .ptr_slice_ptr_ptr => try self.airPtrSliceFieldPtr(inst, 0), + .ptr_slice_len_ptr => try self.airPtrSliceFieldPtr(inst, 1), + .array_to_slice => try self.airArrayToSlice(inst), .float_to_int => try self.airFloatToInt(inst), .int_to_float => try self.airIntToFloat(inst), @@ -2091,6 +2095,15 @@ pub const FuncGen = struct { return self.builder.buildExtractValue(operand, index, ""); } + fn airPtrSliceFieldPtr(self: *FuncGen, inst: Air.Inst.Index, index: c_uint) !?*const llvm.Value { + if (self.liveness.isUnused(inst)) return null; + + const ty_op = self.air.instructions.items(.data)[inst].ty_op; + const slice_ptr = try self.resolveInst(ty_op.operand); + + return self.builder.buildStructGEP(slice_ptr, index, ""); + } + fn airSliceElemVal(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { const bin_op = self.air.instructions.items(.data)[inst].bin_op; const slice_ty = self.air.typeOf(bin_op.lhs); |
