aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/Module.zig b/src/Module.zig
index 7c18f8f65a..bc6d0d4a6c 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -1198,6 +1198,30 @@ pub const Scope = struct {
gz.astgen.extra.appendSliceAssumeCapacity(gz.instructions.items);
}
+ /// Same as `setBlockBody` except we don't copy instructions which are
+ /// `store_to_block_ptr` instructions with lhs set to .none.
+ pub fn setBlockBodyEliding(gz: GenZir, inst: Zir.Inst.Index) !void {
+ const gpa = gz.astgen.gpa;
+ try gz.astgen.extra.ensureCapacity(gpa, gz.astgen.extra.items.len +
+ @typeInfo(Zir.Inst.Block).Struct.fields.len + gz.instructions.items.len);
+ const zir_datas = gz.astgen.instructions.items(.data);
+ const zir_tags = gz.astgen.instructions.items(.tag);
+ const block_pl_index = gz.astgen.addExtraAssumeCapacity(Zir.Inst.Block{
+ .body_len = @intCast(u32, gz.instructions.items.len),
+ });
+ zir_datas[inst].pl_node.payload_index = block_pl_index;
+ for (gz.instructions.items) |sub_inst| {
+ if (zir_tags[sub_inst] == .store_to_block_ptr and
+ zir_datas[sub_inst].bin.lhs == .none)
+ {
+ // Decrement `body_len`.
+ gz.astgen.extra.items[block_pl_index] -= 1;
+ continue;
+ }
+ gz.astgen.extra.appendAssumeCapacity(sub_inst);
+ }
+ }
+
pub fn identAsString(gz: *GenZir, ident_token: ast.TokenIndex) !u32 {
const astgen = gz.astgen;
const gpa = astgen.gpa;
@@ -1445,6 +1469,30 @@ pub const Scope = struct {
return gz.indexToRef(new_index);
}
+ pub fn addExtendedPayload(
+ gz: *GenZir,
+ opcode: Zir.Inst.Extended,
+ extra: anytype,
+ ) !Zir.Inst.Ref {
+ const gpa = gz.astgen.gpa;
+
+ try gz.instructions.ensureCapacity(gpa, gz.instructions.items.len + 1);
+ try gz.astgen.instructions.ensureCapacity(gpa, gz.astgen.instructions.len + 1);
+
+ const payload_index = try gz.astgen.addExtra(extra);
+ const new_index = @intCast(Zir.Inst.Index, gz.astgen.instructions.len);
+ gz.astgen.instructions.appendAssumeCapacity(.{
+ .tag = .extended,
+ .data = .{ .extended = .{
+ .opcode = opcode,
+ .small = undefined,
+ .operand = payload_index,
+ } },
+ });
+ gz.instructions.appendAssumeCapacity(new_index);
+ return gz.indexToRef(new_index);
+ }
+
pub fn addArrayTypeSentinel(
gz: *GenZir,
len: Zir.Inst.Ref,