Commit 66c4396854
Changed files (13)
src
arch
aarch64
arm
riscv64
sparc64
wasm
x86_64
src/arch/aarch64/CodeGen.zig
@@ -4621,9 +4621,9 @@ fn airDbgStmt(self: *Self, inst: Air.Inst.Index) !void {
}
fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
- const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
+ const ty_fn = self.air.instructions.items(.data)[inst].ty_fn;
const mod = self.bin_file.options.module.?;
- const function = self.air.values[ty_pl.payload].getFunction(mod).?;
+ const function = mod.funcPtr(ty_fn.func);
// TODO emit debug info for function change
_ = function;
return self.finishAir(inst, .dead, .{ .none, .none, .none });
src/arch/arm/CodeGen.zig
@@ -4568,9 +4568,9 @@ fn airDbgStmt(self: *Self, inst: Air.Inst.Index) !void {
}
fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
- const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
+ const ty_fn = self.air.instructions.items(.data)[inst].ty_fn;
const mod = self.bin_file.options.module.?;
- const function = self.air.values[ty_pl.payload].getFunction(mod).?;
+ const function = mod.funcPtr(ty_fn.func);
// TODO emit debug info for function change
_ = function;
return self.finishAir(inst, .dead, .{ .none, .none, .none });
src/arch/riscv64/CodeGen.zig
@@ -1875,9 +1875,9 @@ fn airDbgStmt(self: *Self, inst: Air.Inst.Index) !void {
}
fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
- const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
+ const ty_fn = self.air.instructions.items(.data)[inst].ty_fn;
const mod = self.bin_file.options.module.?;
- const function = self.air.values[ty_pl.payload].getFunction(mod).?;
+ const function = mod.funcPtr(ty_fn.func);
// TODO emit debug info for function change
_ = function;
return self.finishAir(inst, .dead, .{ .none, .none, .none });
src/arch/sparc64/CodeGen.zig
@@ -1660,9 +1660,9 @@ fn airDbgBlock(self: *Self, inst: Air.Inst.Index) !void {
}
fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
- const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
+ const ty_fn = self.air.instructions.items(.data)[inst].ty_fn;
const mod = self.bin_file.options.module.?;
- const function = self.air.values[ty_pl.payload].getFunction(mod).?;
+ const function = mod.funcPtr(ty_fn.func);
// TODO emit debug info for function change
_ = function;
return self.finishAir(inst, .dead, .{ .none, .none, .none });
src/arch/wasm/CodeGen.zig
@@ -4947,7 +4947,7 @@ fn airShuffle(func: *CodeGen, inst: Air.Inst.Index) InnerError!void {
const a = try func.resolveInst(extra.a);
const b = try func.resolveInst(extra.b);
- const mask = func.air.values[extra.mask];
+ const mask = extra.mask.toValue();
const mask_len = extra.mask_len;
const child_ty = inst_ty.childType(mod);
src/arch/x86_64/CodeGen.zig
@@ -8541,9 +8541,9 @@ fn airDbgStmt(self: *Self, inst: Air.Inst.Index) !void {
}
fn airDbgInline(self: *Self, inst: Air.Inst.Index) !void {
- const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
+ const ty_fn = self.air.instructions.items(.data)[inst].ty_fn;
const mod = self.bin_file.options.module.?;
- const function = self.air.values[ty_pl.payload].getFunction(mod).?;
+ const function = mod.funcPtr(ty_fn.func);
// TODO emit debug info for function change
_ = function;
return self.finishAir(inst, .unreach, .{ .none, .none, .none });
src/codegen/c.zig
@@ -4302,10 +4302,10 @@ fn airDbgStmt(f: *Function, inst: Air.Inst.Index) !CValue {
}
fn airDbgInline(f: *Function, inst: Air.Inst.Index) !CValue {
- const ty_pl = f.air.instructions.items(.data)[inst].ty_pl;
+ const ty_fn = f.air.instructions.items(.data)[inst].ty_fn;
const mod = f.object.dg.module;
const writer = f.object.writer();
- const function = f.air.values[ty_pl.payload].getFunction(mod).?;
+ const function = mod.funcPtr(ty_fn.func);
try writer.print("/* dbg func:{s} */\n", .{mod.declPtr(function.owner_decl).name});
return .none;
}
@@ -6612,7 +6612,7 @@ fn airShuffle(f: *Function, inst: Air.Inst.Index) !CValue {
const ty_pl = f.air.instructions.items(.data)[inst].ty_pl;
const extra = f.air.extraData(Air.Shuffle, ty_pl.payload).data;
- const mask = f.air.values[extra.mask];
+ const mask = extra.mask.toValue();
const lhs = try f.resolveInst(extra.a);
const rhs = try f.resolveInst(extra.b);
src/codegen/llvm.zig
@@ -5927,10 +5927,10 @@ pub const FuncGen = struct {
fn airDbgInlineBegin(self: *FuncGen, inst: Air.Inst.Index) !?*llvm.Value {
const dib = self.dg.object.di_builder orelse return null;
- const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
+ const ty_fn = self.air.instructions.items(.data)[inst].ty_fn;
const mod = self.dg.module;
- const func = self.air.values[ty_pl.payload].getFunction(mod).?;
+ const func = mod.funcPtr(ty_fn.func);
const decl_index = func.owner_decl;
const decl = mod.declPtr(decl_index);
const di_file = try self.dg.object.getDIFile(self.gpa, mod.namespacePtr(decl.src_namespace).file_scope);
@@ -5986,10 +5986,10 @@ pub const FuncGen = struct {
fn airDbgInlineEnd(self: *FuncGen, inst: Air.Inst.Index) !?*llvm.Value {
if (self.dg.object.di_builder == null) return null;
- const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;
+ const ty_fn = self.air.instructions.items(.data)[inst].ty_fn;
const mod = self.dg.module;
- const func = self.air.values[ty_pl.payload].getFunction(mod).?;
+ const func = mod.funcPtr(ty_fn.func);
const decl = mod.declPtr(func.owner_decl);
const di_file = try self.dg.object.getDIFile(self.gpa, mod.namespacePtr(decl.src_namespace).file_scope);
self.di_file = di_file;
@@ -8875,7 +8875,7 @@ pub const FuncGen = struct {
const extra = self.air.extraData(Air.Shuffle, ty_pl.payload).data;
const a = try self.resolveInst(extra.a);
const b = try self.resolveInst(extra.b);
- const mask = self.air.values[extra.mask];
+ const mask = extra.mask.toValue();
const mask_len = extra.mask_len;
const a_len = self.typeOf(extra.a).vectorLen(mod);
src/codegen/spirv.zig
@@ -2074,7 +2074,7 @@ pub const DeclGen = struct {
const extra = self.air.extraData(Air.Shuffle, ty_pl.payload).data;
const a = try self.resolve(extra.a);
const b = try self.resolve(extra.b);
- const mask = self.air.values[extra.mask];
+ const mask = extra.mask.toValue();
const mask_len = extra.mask_len;
const a_len = self.typeOf(extra.a).vectorLen(mod);
src/Air.zig
@@ -17,7 +17,6 @@ instructions: std.MultiArrayList(Inst).Slice,
/// The meaning of this data is determined by `Inst.Tag` value.
/// The first few indexes are reserved. See `ExtraIndex` for the values.
extra: []const u32,
-values: []const Value,
pub const ExtraIndex = enum(u32) {
/// Payload index of the main `Block` in the `extra` array.
@@ -421,10 +420,10 @@ pub const Inst = struct {
/// Marks the end of a semantic scope for debug info variables.
dbg_block_end,
/// Marks the start of an inline call.
- /// Uses `ty_pl` with the payload being the index of a Value.Function in air.values.
+ /// Uses the `ty_fn` field.
dbg_inline_begin,
/// Marks the end of an inline call.
- /// Uses `ty_pl` with the payload being the index of a Value.Function in air.values.
+ /// Uses the `ty_fn` field.
dbg_inline_end,
/// Marks the beginning of a local variable. The operand is a pointer pointing
/// to the storage for the variable. The local may be a const or a var.
@@ -967,6 +966,10 @@ pub const Inst = struct {
// Index into a different array.
payload: u32,
},
+ ty_fn: struct {
+ ty: Ref,
+ func: Module.Fn.Index,
+ },
br: struct {
block_inst: Index,
operand: Ref,
@@ -1090,8 +1093,7 @@ pub const FieldParentPtr = struct {
pub const Shuffle = struct {
a: Inst.Ref,
b: Inst.Ref,
- // index to air_values
- mask: u32,
+ mask: InternPool.Index,
mask_len: u32,
};
@@ -1469,7 +1471,8 @@ pub fn extraData(air: Air, comptime T: type, index: usize) struct { data: T, end
u32 => air.extra[i],
Inst.Ref => @intToEnum(Inst.Ref, air.extra[i]),
i32 => @bitCast(i32, air.extra[i]),
- else => @compileError("bad field type"),
+ InternPool.Index => @intToEnum(InternPool.Index, air.extra[i]),
+ else => @compileError("bad field type: " ++ @typeName(field.type)),
};
i += 1;
}
@@ -1482,7 +1485,6 @@ pub fn extraData(air: Air, comptime T: type, index: usize) struct { data: T, end
pub fn deinit(air: *Air, gpa: std.mem.Allocator) void {
air.instructions.deinit(gpa);
gpa.free(air.extra);
- gpa.free(air.values);
air.* = undefined;
}
src/Module.zig
@@ -5720,7 +5720,6 @@ pub fn analyzeFnBody(mod: *Module, func_index: Fn.Index, arena: Allocator) SemaE
return Air{
.instructions = sema.air_instructions.toOwnedSlice(),
.extra = try sema.air_extra.toOwnedSlice(gpa),
- .values = try sema.air_values.toOwnedSlice(gpa),
};
}
src/print_air.zig
@@ -15,12 +15,11 @@ pub fn write(stream: anytype, module: *Module, air: Air, liveness: ?Liveness) vo
// the debug safety tag but we want to measure release size.
(@sizeOf(Air.Inst.Tag) + 8);
const extra_bytes = air.extra.len * @sizeOf(u32);
- const values_bytes = air.values.len * @sizeOf(Value);
const tomb_bytes = if (liveness) |l| l.tomb_bits.len * @sizeOf(usize) else 0;
const liveness_extra_bytes = if (liveness) |l| l.extra.len * @sizeOf(u32) else 0;
const liveness_special_bytes = if (liveness) |l| l.special.count() * 8 else 0;
const total_bytes = @sizeOf(Air) + instruction_bytes + extra_bytes +
- values_bytes + @sizeOf(Liveness) + liveness_extra_bytes +
+ @sizeOf(Liveness) + liveness_extra_bytes +
liveness_special_bytes + tomb_bytes;
// zig fmt: off
@@ -28,7 +27,6 @@ pub fn write(stream: anytype, module: *Module, air: Air, liveness: ?Liveness) vo
\\# Total AIR+Liveness bytes: {}
\\# AIR Instructions: {d} ({})
\\# AIR Extra Data: {d} ({})
- \\# AIR Values Bytes: {d} ({})
\\# Liveness tomb_bits: {}
\\# Liveness Extra Data: {d} ({})
\\# Liveness special table: {d} ({})
@@ -37,7 +35,6 @@ pub fn write(stream: anytype, module: *Module, air: Air, liveness: ?Liveness) vo
fmtIntSizeBin(total_bytes),
air.instructions.len, fmtIntSizeBin(instruction_bytes),
air.extra.len, fmtIntSizeBin(extra_bytes),
- air.values.len, fmtIntSizeBin(values_bytes),
fmtIntSizeBin(tomb_bytes),
if (liveness) |l| l.extra.len else 0, fmtIntSizeBin(liveness_extra_bytes),
if (liveness) |l| l.special.count() else 0, fmtIntSizeBin(liveness_special_bytes),
@@ -300,7 +297,8 @@ const Writer = struct {
.struct_field_ptr => try w.writeStructField(s, inst),
.struct_field_val => try w.writeStructField(s, inst),
- .inferred_alloc, .inferred_alloc_comptime => try w.writeConstant(s, inst),
+ .inferred_alloc => @panic("TODO"),
+ .inferred_alloc_comptime => @panic("TODO"),
.interned => try w.writeInterned(s, inst),
.assembly => try w.writeAssembly(s, inst),
.dbg_stmt => try w.writeDbgStmt(s, inst),
@@ -598,14 +596,6 @@ const Writer = struct {
try s.print(", {d}", .{extra.field_index});
}
- fn writeConstant(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void {
- const ty_pl = w.air.instructions.items(.data)[inst].ty_pl;
- const val = w.air.values[ty_pl.payload];
- const ty = w.air.getRefType(ty_pl.ty);
- try w.writeType(s, ty);
- try s.print(", {}", .{val.fmtValue(ty, w.module)});
- }
-
fn writeInterned(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void {
const mod = w.module;
const ip_index = w.air.instructions.items(.data)[inst].interned;
@@ -693,9 +683,9 @@ const Writer = struct {
}
fn writeDbgInline(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void {
- const ty_pl = w.air.instructions.items(.data)[inst].ty_pl;
- const func_index = w.module.intern_pool.indexToFunc(w.air.values[ty_pl.payload].ip_index);
- const owner_decl = w.module.declPtr(w.module.funcPtrUnwrap(func_index).?.owner_decl);
+ const ty_fn = w.air.instructions.items(.data)[inst].ty_fn;
+ const func_index = ty_fn.func;
+ const owner_decl = w.module.declPtr(w.module.funcPtr(func_index).owner_decl);
try s.print("{s}", .{owner_decl.name});
}
src/Sema.zig
@@ -17,7 +17,6 @@ perm_arena: Allocator,
code: Zir,
air_instructions: std.MultiArrayList(Air.Inst) = .{},
air_extra: std.ArrayListUnmanaged(u32) = .{},
-air_values: std.ArrayListUnmanaged(Value) = .{},
/// Maps ZIR to AIR.
inst_map: InstMap = .{},
/// When analyzing an inline function call, owner_decl is the Decl of the caller
@@ -772,7 +771,6 @@ pub fn deinit(sema: *Sema) void {
const gpa = sema.gpa;
sema.air_instructions.deinit(gpa);
sema.air_extra.deinit(gpa);
- sema.air_values.deinit(gpa);
sema.inst_map.deinit(gpa);
sema.decl_val_table.deinit(gpa);
sema.types_to_resolve.deinit(gpa);
@@ -2018,10 +2016,8 @@ fn resolveMaybeUndefValAllowVariablesMaybeRuntime(
}
const air_datas = sema.air_instructions.items(.data);
const val = switch (air_tags[i]) {
- .inferred_alloc, .inferred_alloc_comptime => val: {
- const ty_pl = sema.air_instructions.items(.data)[i].ty_pl;
- break :val sema.air_values.items[ty_pl.payload];
- },
+ .inferred_alloc => unreachable,
+ .inferred_alloc_comptime => unreachable,
.interned => air_datas[i].interned.toValue(),
else => return null,
};
@@ -7930,20 +7926,17 @@ fn emitDbgInline(
new_func_ty: Type,
tag: Air.Inst.Tag,
) CompileError!void {
- if (sema.mod.comp.bin_file.options.strip) return;
+ const mod = sema.mod;
+ if (mod.comp.bin_file.options.strip) return;
// Recursive inline call; no dbg_inline needed.
if (old_func == new_func) return;
- try sema.air_values.append(sema.gpa, (try sema.mod.intern(.{ .func = .{
- .ty = new_func_ty.toIntern(),
- .index = new_func,
- } })).toValue());
_ = try block.addInst(.{
.tag = tag,
- .data = .{ .ty_pl = .{
+ .data = .{ .ty_fn = .{
.ty = try sema.addType(new_func_ty),
- .payload = @intCast(u32, sema.air_values.items.len - 1),
+ .func = new_func,
} },
});
}
@@ -21724,8 +21717,6 @@ fn analyzeShuffle(
}
}
- const mask_index = @intCast(u32, sema.air_values.items.len);
- try sema.air_values.append(sema.gpa, mask);
return block.addInst(.{
.tag = .shuffle,
.data = .{ .ty_pl = .{
@@ -21733,7 +21724,7 @@ fn analyzeShuffle(
.payload = try block.sema.addExtra(Air.Shuffle{
.a = a,
.b = b,
- .mask = mask_index,
+ .mask = mask.toIntern(),
.mask_len = mask_len,
}),
} },
@@ -33311,7 +33302,6 @@ pub fn getTmpAir(sema: Sema) Air {
return .{
.instructions = sema.air_instructions.slice(),
.extra = sema.air_extra.items,
- .values = sema.air_values.items,
};
}
@@ -33371,7 +33361,8 @@ pub fn addExtraAssumeCapacity(sema: *Sema, extra: anytype) u32 {
u32 => @field(extra, field.name),
Air.Inst.Ref => @enumToInt(@field(extra, field.name)),
i32 => @bitCast(u32, @field(extra, field.name)),
- else => @compileError("bad field type"),
+ InternPool.Index => @enumToInt(@field(extra, field.name)),
+ else => @compileError("bad field type: " ++ @typeName(field.type)),
});
}
return result;