authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2022-04-25 19:08:39+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-04-26 17:52:21-04:00
logcea310c9082a985b103953dd84579aa1a6dce6ea
treeca107880795aca1ed9be4fe0f4d6e4e929a4e9c4
parent18f30346291bd2471e07924af161de080935dd60

Remove usage of inline for from print_targets.cmdTargets

This function was one of the biggest zig functions in a debug build of the compiler. $ bloaty stage3-debug/bin/zig -d symbols --tsv -n 10000000 | rg -v '(llvm|clang|std|lld|\(anonymous namespace\))::|\[section ' | sort -h -k 3 ... translate_c.ast.renderNode 86168 86219 main.buildOutputType 177959 178004 InfoTable 184832 184870 AArch64SVEIntrinsicMap 188544 188596 print_targets.cmdTargets__anon_4735 319156 319216 __static_initialization_and_destruction_0() 486666 489582 MatchTable1 621884 621997 OperandMatchTable 1139622 1139861 MatchTable0 1899764 1900141

2 files changed, 39 insertions(+), 15 deletions(-)

lib/std/meta.zig+27
...@@ -568,6 +568,33 @@ test "std.meta.fieldNames" {...@@ -568,6 +568,33 @@ test "std.meta.fieldNames" {
568 try testing.expectEqualSlices(u8, u1names[1], "b");568 try testing.expectEqualSlices(u8, u1names[1], "b");
569}569}
570570
571/// Given an enum or error set type, returns a pointer to an array containing all tags for that
572/// enum or error set.
573pub fn tags(comptime T: type) *const [fields(T).len]T {
574 comptime {
575 const fieldInfos = fields(T);
576 var res: [fieldInfos.len]T = undefined;
577 for (fieldInfos) |field, i| {
578 res[i] = @field(T, field.name);
579 }
580 return &res;
581 }
582}
583
584test "std.meta.tags" {
585 const E1 = enum { A, B };
586 const E2 = error{A};
587
588 const e1_tags = tags(E1);
589 const e2_tags = tags(E2);
590
591 try testing.expect(e1_tags.len == 2);
592 try testing.expectEqual(E1.A, e1_tags[0]);
593 try testing.expectEqual(E1.B, e1_tags[1]);
594 try testing.expect(e2_tags.len == 1);
595 try testing.expectEqual(E2.A, e2_tags[0]);
596}
597
571pub fn FieldEnum(comptime T: type) type {598pub fn FieldEnum(comptime T: type) type {
572 const field_infos = fields(T);599 const field_infos = fields(T);
573 var enumFields: [field_infos.len]std.builtin.Type.EnumField = undefined;600 var enumFields: [field_infos.len]std.builtin.Type.EnumField = undefined;
src/print_targets.zig+12-15
...@@ -2,6 +2,7 @@ const std = @import("std");...@@ -2,6 +2,7 @@ const std = @import("std");
2const fs = std.fs;2const fs = std.fs;
3const io = std.io;3const io = std.io;
4const mem = std.mem;4const mem = std.mem;
5const meta = std.meta;
5const Allocator = mem.Allocator;6const Allocator = mem.Allocator;
6const Target = std.Target;7const Target = std.Target;
7const target = @import("target.zig");8const target = @import("target.zig");
...@@ -35,27 +36,25 @@ pub fn cmdTargets(...@@ -35,27 +36,25 @@ pub fn cmdTargets(
3536
36 try jws.objectField("arch");37 try jws.objectField("arch");
37 try jws.beginArray();38 try jws.beginArray();
38 {39 for (meta.fieldNames(Target.Cpu.Arch)) |field| {
39 inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {40 try jws.arrayElem();
40 try jws.arrayElem();41 try jws.emitString(field);
41 try jws.emitString(field.name);
42 }
43 }42 }
44 try jws.endArray();43 try jws.endArray();
4544
46 try jws.objectField("os");45 try jws.objectField("os");
47 try jws.beginArray();46 try jws.beginArray();
48 inline for (@typeInfo(Target.Os.Tag).Enum.fields) |field| {47 for (meta.fieldNames(Target.Os.Tag)) |field| {
49 try jws.arrayElem();48 try jws.arrayElem();
50 try jws.emitString(field.name);49 try jws.emitString(field);
51 }50 }
52 try jws.endArray();51 try jws.endArray();
5352
54 try jws.objectField("abi");53 try jws.objectField("abi");
55 try jws.beginArray();54 try jws.beginArray();
56 inline for (@typeInfo(Target.Abi).Enum.fields) |field| {55 for (meta.fieldNames(Target.Abi)) |field| {
57 try jws.arrayElem();56 try jws.arrayElem();
58 try jws.emitString(field.name);57 try jws.emitString(field);
59 }58 }
60 try jws.endArray();59 try jws.endArray();
6160
...@@ -84,10 +83,9 @@ pub fn cmdTargets(...@@ -84,10 +83,9 @@ pub fn cmdTargets(
8483
85 try jws.objectField("cpus");84 try jws.objectField("cpus");
86 try jws.beginObject();85 try jws.beginObject();
87 inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {86 for (meta.tags(Target.Cpu.Arch)) |arch| {
88 try jws.objectField(field.name);87 try jws.objectField(@tagName(arch));
89 try jws.beginObject();88 try jws.beginObject();
90 const arch = @field(Target.Cpu.Arch, field.name);
91 for (arch.allCpuModels()) |model| {89 for (arch.allCpuModels()) |model| {
92 try jws.objectField(model.name);90 try jws.objectField(model.name);
93 try jws.beginArray();91 try jws.beginArray();
...@@ -105,10 +103,9 @@ pub fn cmdTargets(...@@ -105,10 +103,9 @@ pub fn cmdTargets(
105103
106 try jws.objectField("cpuFeatures");104 try jws.objectField("cpuFeatures");
107 try jws.beginObject();105 try jws.beginObject();
108 inline for (@typeInfo(Target.Cpu.Arch).Enum.fields) |field| {106 for (meta.tags(Target.Cpu.Arch)) |arch| {
109 try jws.objectField(field.name);107 try jws.objectField(@tagName(arch));
110 try jws.beginArray();108 try jws.beginArray();
111 const arch = @field(Target.Cpu.Arch, field.name);
112 for (arch.allFeaturesList()) |feature| {109 for (arch.allFeaturesList()) |feature| {
113 try jws.arrayElem();110 try jws.arrayElem();
114 try jws.emitString(feature.name);111 try jws.emitString(feature.name);