authorgravatar for liljaanton2001@gmail.comantlilja <liljaanton2001@gmail.com> 2024-01-20 00:39:15+01:00
committergravatar for liljaanton2001@gmail.comantlilja <liljaanton2001@gmail.com> 2024-02-21 16:24:59+01:00
log7cb8813743731c81ffd551ced84a2d9dacf6d086
treee266925bcd0ff281f5af896d1a0b97ccd65d63df
parent423c2c3a27d875e907b739204cdf44beea2a4064

Added value_indices and valueIndex to Function

value_indices keeps track of the value index of each instruction in the function (i.e skips instruction which do not have a result)

1 files changed, 17 insertions(+), 0 deletions(-)

src/codegen/llvm/Builder.zig+17
......@@ -3899,6 +3899,7 @@ pub const Function = struct {
38993899 blocks: []const Block = &.{},
39003900 instructions: std.MultiArrayList(Instruction) = .{},
39013901 names: [*]const String = &[0]String{},
3902 value_indices: [*]const u32 = &[0]u32{},
39023903 metadata: ?[*]const Metadata = null,
39033904 extra: []const u32 = &.{},
39043905
......@@ -4335,6 +4336,10 @@ pub const Function = struct {
43354336 return function.names[@intFromEnum(self)];
43364337 }
43374338
4339 pub fn valueIndex(self: Instruction.Index, function: *const Function) u32 {
4340 return function.value_indices[@intFromEnum(self)];
4341 }
4342
43384343 pub fn toValue(self: Instruction.Index) Value {
43394344 return @enumFromInt(@intFromEnum(self));
43404345 }
......@@ -4993,6 +4998,7 @@ pub const Function = struct {
49934998 pub fn deinit(self: *Function, gpa: Allocator) void {
49944999 gpa.free(self.extra);
49955000 if (self.metadata) |metadata| gpa.free(metadata[0..self.instructions.len]);
5001 gpa.free(self.value_indices[0..self.instructions.len]);
49965002 gpa.free(self.names[0..self.instructions.len]);
49975003 self.instructions.deinit(gpa);
49985004 gpa.free(self.blocks);
......@@ -6382,6 +6388,9 @@ pub const WipFunction = struct {
63826388 const names = try gpa.alloc(String, final_instructions_len);
63836389 errdefer gpa.free(names);
63846390
6391 const value_indices = try gpa.alloc(u32, final_instructions_len);
6392 errdefer gpa.free(value_indices);
6393
63856394 const metadata =
63866395 if (self.builder.strip) null else try gpa.alloc(Metadata, final_instructions_len);
63876396 errdefer if (metadata) |new_metadata| gpa.free(new_metadata);
......@@ -6475,12 +6484,15 @@ pub const WipFunction = struct {
64756484 return new_name;
64766485 }
64776486 } = .{};
6487 var value_index: u32 = 0;
64786488 for (0..params_len) |param_index| {
64796489 const old_argument_index: Instruction.Index = @enumFromInt(param_index);
64806490 const new_argument_index: Instruction.Index = @enumFromInt(function.instructions.len);
64816491 const argument = self.instructions.get(@intFromEnum(old_argument_index));
64826492 assert(argument.tag == .arg);
64836493 assert(argument.data == param_index);
6494 value_indices[function.instructions.len] = value_index;
6495 value_index += 1;
64846496 function.instructions.appendAssumeCapacity(argument);
64856497 names[@intFromEnum(new_argument_index)] = wip_name.map(
64866498 if (self.builder.strip) .empty else self.names.items[@intFromEnum(old_argument_index)],
......@@ -6488,6 +6500,7 @@ pub const WipFunction = struct {
64886500 }
64896501 for (self.blocks.items) |current_block| {
64906502 const new_block_index: Instruction.Index = @enumFromInt(function.instructions.len);
6503 value_indices[function.instructions.len] = value_index;
64916504 function.instructions.appendAssumeCapacity(.{
64926505 .tag = .block,
64936506 .data = current_block.incoming,
......@@ -6797,6 +6810,9 @@ pub const WipFunction = struct {
67976810 if (old_instruction_index.hasResultWip(self)) .empty else .none
67986811 else
67996812 self.names.items[@intFromEnum(old_instruction_index)]);
6813
6814 value_indices[@intFromEnum(new_instruction_index)] = value_index;
6815 if (old_instruction_index.hasResultWip(self)) value_index += 1;
68006816 }
68016817 }
68026818
......@@ -6804,6 +6820,7 @@ pub const WipFunction = struct {
68046820 function.extra = wip_extra.finish();
68056821 function.blocks = blocks;
68066822 function.names = names.ptr;
6823 function.value_indices = value_indices.ptr;
68076824 function.metadata = if (metadata) |new_metadata| new_metadata.ptr else null;
68086825 }
68096826