aboutsummaryrefslogtreecommitdiff
path: root/src/InternPool.zig
diff options
context:
space:
mode:
authorkcbanner <kcbanner@gmail.com>2023-07-25 23:29:55 -0400
committerAndrew Kelley <andrew@ziglang.org>2023-07-26 02:20:29 -0700
commita8a2f2b58bd6f876258bb01b370a66c31d82f330 (patch)
tree436b43c06157e63d7f5b3cec31a932fd566a0b78 /src/InternPool.zig
parent6cee98eb3074fcb99297f23f30e3a230a14e8db7 (diff)
downloadzig-a8a2f2b58bd6f876258bb01b370a66c31d82f330.tar.gz
zig-a8a2f2b58bd6f876258bb01b370a66c31d82f330.zip
Add --verbose-generic-instances to provide visibility on the number of generic function instantiations
Diffstat (limited to 'src/InternPool.zig')
-rw-r--r--src/InternPool.zig57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/InternPool.zig b/src/InternPool.zig
index 0c01c9988c..178bc6870c 100644
--- a/src/InternPool.zig
+++ b/src/InternPool.zig
@@ -6266,6 +6266,59 @@ fn dumpAllFallible(ip: *const InternPool) anyerror!void {
try bw.flush();
}
+pub fn dumpGenericInstances(ip: *const InternPool, allocator: Allocator) void {
+ ip.dumpGenericInstancesFallible(allocator) catch return;
+}
+
+pub fn dumpGenericInstancesFallible(ip: *const InternPool, allocator: Allocator) anyerror!void {
+ var arena_allocator = std.heap.ArenaAllocator.init(allocator);
+ defer arena_allocator.deinit();
+ const arena = arena_allocator.allocator();
+
+ var bw = std.io.bufferedWriter(std.io.getStdErr().writer());
+ const w = bw.writer();
+
+ var instances: std.AutoArrayHashMapUnmanaged(Index, std.ArrayListUnmanaged(Index)) = .{};
+ const datas = ip.items.items(.data);
+ for (ip.items.items(.tag), 0..) |tag, i| {
+ if (tag != .func_instance) continue;
+ const info = ip.extraData(Tag.FuncInstance, datas[i]);
+
+ const gop = try instances.getOrPut(arena, info.generic_owner);
+ if (!gop.found_existing) gop.value_ptr.* = .{};
+
+ try gop.value_ptr.append(arena, @enumFromInt(i));
+ }
+
+ const SortContext = struct {
+ values: []std.ArrayListUnmanaged(Index),
+ pub fn lessThan(ctx: @This(), a_index: usize, b_index: usize) bool {
+ return ctx.values[a_index].items.len > ctx.values[b_index].items.len;
+ }
+ };
+
+ instances.sort(SortContext{ .values = instances.values() });
+ var it = instances.iterator();
+ while (it.next()) |entry| {
+ const generic_fn_owner_decl = ip.declPtrConst(ip.funcDeclOwner(entry.key_ptr.*));
+ try w.print("{} ({}): \n", .{ generic_fn_owner_decl.name.fmt(ip), entry.value_ptr.items.len });
+ for (entry.value_ptr.items) |index| {
+ const func = ip.extraFuncInstance(datas[@intFromEnum(index)]);
+ const owner_decl = ip.declPtrConst(func.owner_decl);
+ try w.print(" {}: (", .{owner_decl.name.fmt(ip)});
+ for (func.comptime_args.get(ip)) |arg| {
+ if (arg != .none) {
+ const key = ip.indexToKey(arg);
+ try w.print(" {} ", .{key});
+ }
+ }
+ try w.writeAll(")\n");
+ }
+ }
+
+ try bw.flush();
+}
+
pub fn structPtr(ip: *InternPool, index: Module.Struct.Index) *Module.Struct {
return ip.allocated_structs.at(@intFromEnum(index));
}
@@ -6290,6 +6343,10 @@ pub fn declPtr(ip: *InternPool, index: Module.Decl.Index) *Module.Decl {
return ip.allocated_decls.at(@intFromEnum(index));
}
+pub fn declPtrConst(ip: *const InternPool, index: Module.Decl.Index) *const Module.Decl {
+ return ip.allocated_decls.at(@intFromEnum(index));
+}
+
pub fn namespacePtr(ip: *InternPool, index: Module.Namespace.Index) *Module.Namespace {
return ip.allocated_namespaces.at(@intFromEnum(index));
}