@zigc/lib 0.17.0-dev.633 → 0.17.0-dev.657

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/compiler/Maker/PkgConfig.zig +1 -0
  2. package/compiler/Maker/ScannedConfig.zig +4 -3
  3. package/compiler/Maker/Step/Compile.zig +1 -3
  4. package/compiler/Maker/Step/FindProgram.zig +2 -2
  5. package/compiler/Maker/Step/Run.zig +18 -3
  6. package/compiler/Maker/Step/TranslateC.zig +5 -4
  7. package/compiler/Maker/Watch/FsEvents.zig +3 -2
  8. package/compiler/aro/aro/Attribute.zig +52 -51
  9. package/compiler/aro/aro/Compilation.zig +5 -5
  10. package/compiler/aro/aro/Diagnostics.zig +7 -7
  11. package/compiler/aro/aro/Parser.zig +2 -2
  12. package/compiler/aro/aro/Tree.zig +11 -11
  13. package/compiler/aro/aro/features.zig +4 -4
  14. package/compiler/aro/aro/text_literal.zig +2 -2
  15. package/compiler/aro/backend/Interner.zig +14 -13
  16. package/compiler/configurer.zig +2 -2
  17. package/compiler/resinator/bmp.zig +3 -2
  18. package/compiler/resinator/code_pages.zig +14 -12
  19. package/compiler/resinator/cvtres.zig +11 -10
  20. package/compiler/resinator/errors.zig +18 -22
  21. package/compiler/resinator/lang.zig +7 -7
  22. package/compiler/resinator/parse.zig +1 -1
  23. package/compiler/translate-c/ast.zig +6 -6
  24. package/docs/wasm/markdown/Document.zig +3 -3
  25. package/docs/wasm/markdown/Parser.zig +3 -3
  26. package/package.json +1 -1
  27. package/std/Build/Cache.zig +2 -2
  28. package/std/Build/Configuration.zig +88 -37
  29. package/std/Build/Step/ConfigHeader.zig +3 -2
  30. package/std/Build/Step/Options.zig +28 -22
  31. package/std/Build.zig +85 -56
  32. package/std/Io/Kqueue.zig +2 -2
  33. package/std/Io/Reader.zig +1 -1
  34. package/std/Io/Threaded.zig +18 -15
  35. package/std/Io/Uring.zig +4 -2
  36. package/std/Io/Writer.zig +18 -18
  37. package/std/Io/net.zig +3 -1
  38. package/std/Io.zig +7 -6
  39. package/std/Progress.zig +2 -2
  40. package/std/Target/aarch64.zig +2 -2
  41. package/std/Target/alpha.zig +2 -2
  42. package/std/Target/amdgcn.zig +2 -2
  43. package/std/Target/arc.zig +2 -2
  44. package/std/Target/arm.zig +2 -2
  45. package/std/Target/avr.zig +2 -2
  46. package/std/Target/bpf.zig +2 -2
  47. package/std/Target/csky.zig +2 -2
  48. package/std/Target/hexagon.zig +2 -2
  49. package/std/Target/hppa.zig +2 -2
  50. package/std/Target/kvx.zig +2 -2
  51. package/std/Target/lanai.zig +2 -2
  52. package/std/Target/loongarch.zig +2 -2
  53. package/std/Target/m68k.zig +2 -2
  54. package/std/Target/mips.zig +2 -2
  55. package/std/Target/msp430.zig +2 -2
  56. package/std/Target/nvptx.zig +2 -2
  57. package/std/Target/powerpc.zig +2 -2
  58. package/std/Target/propeller.zig +2 -2
  59. package/std/Target/riscv.zig +2 -2
  60. package/std/Target/s390x.zig +2 -2
  61. package/std/Target/sparc.zig +2 -2
  62. package/std/Target/spirv.zig +2 -2
  63. package/std/Target/ve.zig +2 -2
  64. package/std/Target/wasm.zig +2 -2
  65. package/std/Target/x86.zig +2 -2
  66. package/std/Target/xcore.zig +2 -2
  67. package/std/Target/xtensa.zig +2 -2
  68. package/std/Target.zig +4 -4
  69. package/std/c/darwin.zig +1 -1
  70. package/std/coff.zig +1 -1
  71. package/std/crypto/codecs/asn1/Oid.zig +8 -8
  72. package/std/crypto/codecs/asn1/der/Decoder.zig +7 -7
  73. package/std/crypto/codecs/asn1/der/Encoder.zig +10 -8
  74. package/std/crypto/phc_encoding.zig +23 -20
  75. package/std/crypto/timing_safe.zig +1 -1
  76. package/std/crypto/tls/Client.zig +3 -3
  77. package/std/crypto/tls.zig +1 -1
  78. package/std/debug/Dwarf/Unwind/VirtualMachine.zig +11 -5
  79. package/std/debug/ElfFile.zig +12 -8
  80. package/std/debug/MachOFile.zig +2 -2
  81. package/std/debug/SelfInfo/MachO.zig +2 -2
  82. package/std/debug/SelfInfo/Windows.zig +2 -2
  83. package/std/elf.zig +7 -7
  84. package/std/enums.zig +66 -67
  85. package/std/gpu.zig +1 -1
  86. package/std/hash/auto_hash.zig +8 -8
  87. package/std/hash/verify.zig +3 -3
  88. package/std/http/Client.zig +2 -2
  89. package/std/json/Stringify.zig +14 -14
  90. package/std/json/static.zig +47 -31
  91. package/std/lang.zig +65 -97
  92. package/std/math.zig +2 -2
  93. package/std/mem/Allocator.zig +9 -9
  94. package/std/mem.zig +86 -102
  95. package/std/meta/trailer_flags.zig +26 -19
  96. package/std/meta.zig +131 -171
  97. package/std/multi_array_list.zig +49 -57
  98. package/std/os/uefi/protocol/device_path.zig +8 -7
  99. package/std/os/uefi/tables/boot_services.zig +1 -1
  100. package/std/os/windows.zig +9 -15
  101. package/std/start.zig +6 -6
  102. package/std/testing/Smith.zig +35 -21
  103. package/std/testing.zig +15 -15
  104. package/std/zig/Ast.zig +4 -4
  105. package/std/zig/AstGen.zig +42 -42
  106. package/std/zig/ErrorBundle.zig +16 -13
  107. package/std/zig/LibCInstallation.zig +11 -11
  108. package/std/zig/Parse.zig +6 -6
  109. package/std/zig/Zir.zig +10 -10
  110. package/std/zig/c_translation/helpers.zig +2 -2
  111. package/std/zig/llvm/BitcodeReader.zig +3 -3
  112. package/std/zig/llvm/Builder.zig +124 -93
  113. package/std/zig/llvm/bitcode_writer.zig +4 -4
  114. package/std/zig/system/windows.zig +11 -11
  115. package/std/zig/system.zig +4 -4
  116. package/std/zig.zig +4 -4
  117. package/std/zon/Serializer.zig +28 -23
  118. package/std/zon/parse.zig +58 -61
@@ -178,19 +178,20 @@ pub const UnsupportedCodePage = enum(u16) {
178
178
  };
179
179
 
180
180
  pub const CodePage = blk: {
181
- const fields = @typeInfo(SupportedCodePage).@"enum".fields ++ @typeInfo(UnsupportedCodePage).@"enum".fields;
182
- var field_names: [fields.len][]const u8 = undefined;
183
- var field_values: [fields.len]u16 = undefined;
184
- for (fields, &field_names, &field_values) |field, *name, *val| {
185
- name.* = field.name;
186
- val.* = field.value;
181
+ const field_names = @typeInfo(SupportedCodePage).@"enum".field_names ++ @typeInfo(UnsupportedCodePage).@"enum".field_names;
182
+ const field_values = @typeInfo(SupportedCodePage).@"enum".field_values ++ @typeInfo(UnsupportedCodePage).@"enum".field_values;
183
+ var cp_field_names: [field_names.len][]const u8 = undefined;
184
+ var cp_field_values: [field_names.len]u16 = undefined;
185
+ for (field_names, field_values, &cp_field_names, &cp_field_values) |field_name, field_value, *name, *val| {
186
+ name.* = field_name;
187
+ val.* = field_value;
187
188
  }
188
- break :blk @Enum(u16, .exhaustive, &field_names, &field_values);
189
+ break :blk @Enum(u16, .exhaustive, &cp_field_names, &cp_field_values);
189
190
  };
190
191
 
191
192
  pub fn isSupported(code_page: CodePage) bool {
192
- inline for (@typeInfo(SupportedCodePage).@"enum".fields) |enumField| {
193
- if (@intFromEnum(code_page) == @intFromEnum(@field(SupportedCodePage, enumField.name))) {
193
+ inline for (@typeInfo(SupportedCodePage).@"enum".field_names) |field_name| {
194
+ if (@intFromEnum(code_page) == @intFromEnum(@field(SupportedCodePage, field_name))) {
194
195
  return true;
195
196
  }
196
197
  }
@@ -200,9 +201,10 @@ pub fn isSupported(code_page: CodePage) bool {
200
201
  pub fn getByIdentifier(identifier: u16) !CodePage {
201
202
  // There's probably a more efficient way to do this (e.g. ComptimeHashMap?) but
202
203
  // this should be fine, especially since this function likely won't be called much.
203
- inline for (@typeInfo(CodePage).@"enum".fields) |enumField| {
204
- if (identifier == enumField.value) {
205
- return @field(CodePage, enumField.name);
204
+ const info = @typeInfo(CodePage).@"enum";
205
+ inline for (info.field_names, info.field_values) |field_name, field_value| {
206
+ if (identifier == field_value) {
207
+ return @field(CodePage, field_name);
206
208
  }
207
209
  }
208
210
  return error.InvalidCodePage;
@@ -1054,17 +1054,18 @@ pub const supported_targets = struct {
1054
1054
  .ebc,
1055
1055
  };
1056
1056
  comptime {
1057
- for (@typeInfo(Arch).@"enum".fields) |enum_field| {
1058
- _ = std.mem.indexOfScalar(Arch, ordered_for_display, @enumFromInt(enum_field.value)) orelse {
1059
- @compileError(std.fmt.comptimePrint("'{s}' missing from ordered_for_display", .{enum_field.name}));
1057
+ const info = @typeInfo(Arch).@"enum";
1058
+ for (info.field_names, info.field_values) |field_name, field_value| {
1059
+ _ = std.mem.indexOfScalar(Arch, ordered_for_display, @enumFromInt(field_value)) orelse {
1060
+ @compileError(std.fmt.comptimePrint("'{s}' missing from ordered_for_display", .{field_name}));
1060
1061
  };
1061
1062
  }
1062
1063
  }
1063
1064
 
1064
1065
  pub const longest_name = blk: {
1065
1066
  var len = 0;
1066
- for (@typeInfo(Arch).@"enum".fields) |field| {
1067
- if (field.name.len > len) len = field.name.len;
1067
+ for (@typeInfo(Arch).@"enum".field_names) |field_name| {
1068
+ if (field_name.len > len) len = field_name.len;
1068
1069
  }
1069
1070
  break :blk len;
1070
1071
  };
@@ -1106,14 +1107,14 @@ pub const supported_targets = struct {
1106
1107
  // Enforce two things:
1107
1108
  // 1. Arch enum field names are all lowercase (necessary for how fromStringIgnoreCase is implemented)
1108
1109
  // 2. All enum fields in Arch have an associated RVA relocation type when converted to a coff.IMAGE.FILE.MACHINE
1109
- for (@typeInfo(Arch).@"enum".fields) |enum_field| {
1110
- const all_lower = all_lower: for (enum_field.name) |c| {
1110
+ for (@typeInfo(Arch).@"enum".field_names) |field_name| {
1111
+ const all_lower = all_lower: for (field_name) |c| {
1111
1112
  if (std.ascii.isUpper(c)) break :all_lower false;
1112
1113
  } else break :all_lower true;
1113
- if (!all_lower) @compileError(std.fmt.comptimePrint("Arch field is not all lowercase: {s}", .{enum_field.name}));
1114
- const coff_machine = @field(Arch, enum_field.name).toCoffMachineType();
1114
+ if (!all_lower) @compileError(std.fmt.comptimePrint("Arch field is not all lowercase: {s}", .{field_name}));
1115
+ const coff_machine = @field(Arch, field_name).toCoffMachineType();
1115
1116
  _ = rvaRelocationTypeIndicator(coff_machine) orelse {
1116
- @compileError(std.fmt.comptimePrint("No RVA relocation for Arch: {s}", .{enum_field.name}));
1117
+ @compileError(std.fmt.comptimePrint("No RVA relocation for Arch: {s}", .{field_name}));
1117
1118
  };
1118
1119
  }
1119
1120
  }
@@ -145,8 +145,8 @@ pub const ErrorDetails = struct {
145
145
 
146
146
  comptime {
147
147
  // all fields in the extra union should be 32 bits or less
148
- for (std.meta.fields(Extra)) |field| {
149
- std.debug.assert(@bitSizeOf(field.type) <= 32);
148
+ for (std.meta.fieldTypes(Extra)) |field_type| {
149
+ std.debug.assert(@bitSizeOf(field_type) <= 32);
150
150
  }
151
151
  }
152
152
 
@@ -257,18 +257,18 @@ pub const ErrorDetails = struct {
257
257
 
258
258
  pub fn writeCommaSeparated(self: ExpectedTypes, writer: *std.Io.Writer) !void {
259
259
  const struct_info = @typeInfo(ExpectedTypes).@"struct";
260
- const num_real_fields = struct_info.fields.len - 1;
260
+ const num_real_fields = struct_info.field_names.len - 1;
261
261
  const num_padding_bits = @bitSizeOf(ExpectedTypes) - num_real_fields;
262
262
  const mask = std.math.maxInt(struct_info.backing_integer.?) >> num_padding_bits;
263
263
  const relevant_bits_only = @as(struct_info.backing_integer.?, @bitCast(self)) & mask;
264
264
  const num_set_bits = @popCount(relevant_bits_only);
265
265
 
266
266
  var i: usize = 0;
267
- inline for (struct_info.fields) |field_info| {
268
- if (field_info.type != bool) continue;
267
+ inline for (struct_info.field_names, struct_info.field_types) |field_name, field_type| {
268
+ if (field_type != bool) continue;
269
269
  if (i == num_set_bits) return;
270
- if (@field(self, field_info.name)) {
271
- try writer.writeAll(strings.get(field_info.name).?);
270
+ if (@field(self, field_name)) {
271
+ try writer.writeAll(strings.get(field_name).?);
272
272
  i += 1;
273
273
  if (num_set_bits > 2 and i != num_set_bits) {
274
274
  try writer.writeAll(", ");
@@ -857,24 +857,20 @@ pub const ErrorDetails = struct {
857
857
 
858
858
  /// Convenience struct only useful when the code page can be inferred from the token
859
859
  pub const ErrorDetailsWithoutCodePage = blk: {
860
- const details_info = @typeInfo(ErrorDetails);
861
- const fields = details_info.@"struct".fields;
862
- var field_names: [fields.len - 1][]const u8 = undefined;
863
- var field_types: [fields.len - 1]type = undefined;
864
- var field_attrs: [fields.len - 1]std.builtin.Type.StructField.Attributes = undefined;
860
+ const details_info = @typeInfo(ErrorDetails).@"struct";
861
+ const field_count = details_info.field_names.len;
862
+ var field_names: [field_count - 1][]const u8 = undefined;
863
+ var field_types: [field_count - 1]type = undefined;
864
+ var field_attrs: [field_count - 1]std.builtin.Type.Struct.FieldAttributes = undefined;
865
865
  var i: usize = 0;
866
- for (fields) |field| {
867
- if (std.mem.eql(u8, field.name, "code_page")) continue;
868
- field_names[i] = field.name;
869
- field_types[i] = field.type;
870
- field_attrs[i] = .{
871
- .@"comptime" = field.is_comptime,
872
- .@"align" = field.alignment,
873
- .default_value_ptr = field.default_value_ptr,
874
- };
866
+ for (details_info.field_names, details_info.field_types, details_info.field_attrs) |field_name, field_type, field_attr| {
867
+ if (std.mem.eql(u8, field_name, "code_page")) continue;
868
+ field_names[i] = field_name;
869
+ field_types[i] = field_type;
870
+ field_attrs[i] = field_attr;
875
871
  i += 1;
876
872
  }
877
- std.debug.assert(i == fields.len - 1);
873
+ std.debug.assert(i == field_count - 1);
878
874
  break :blk @Struct(.auto, null, &field_names, &field_types, &field_attrs);
879
875
  };
880
876
 
@@ -87,8 +87,8 @@ pub fn tagToId(tag: []const u8) error{InvalidLanguageTag}!?LanguageId {
87
87
  if (parsed.multiple_suffixes) return null;
88
88
  const longest_known_tag = comptime blk: {
89
89
  var len = 0;
90
- for (@typeInfo(LanguageId).@"enum".fields) |field| {
91
- if (field.name.len > len) len = field.name.len;
90
+ for (@typeInfo(LanguageId).@"enum".field_names) |field_name| {
91
+ if (field_name.len > len) len = field_name.len;
92
92
  }
93
93
  break :blk len;
94
94
  };
@@ -120,13 +120,13 @@ test tagToId {
120
120
 
121
121
  test "exhaustive tagToId" {
122
122
  @setEvalBranchQuota(2000);
123
- inline for (@typeInfo(LanguageId).@"enum".fields) |field| {
124
- const id = tagToId(field.name) catch |err| {
125
- std.debug.print("tag: {s}\n", .{field.name});
123
+ inline for (@typeInfo(LanguageId).@"enum".field_names) |field_name| {
124
+ const id = tagToId(field_name) catch |err| {
125
+ std.debug.print("tag: {s}\n", .{field_name});
126
126
  return err;
127
127
  };
128
- try std.testing.expectEqual(@field(LanguageId, field.name), id orelse {
129
- std.debug.print("tag: {s}, got null\n", .{field.name});
128
+ try std.testing.expectEqual(@field(LanguageId, field_name), id orelse {
129
+ std.debug.print("tag: {s}, got null\n", .{field_name});
130
130
  return error.TestExpectedEqual;
131
131
  });
132
132
  }
@@ -137,7 +137,7 @@ pub const Parser = struct {
137
137
  fn parseOptionalStatements(self: *Self, resource: ResourceType) ![]*Node {
138
138
  var optional_statements: std.ArrayList(*Node) = .empty;
139
139
 
140
- const num_statement_types = @typeInfo(rc.OptionalStatements).@"enum".fields.len;
140
+ const num_statement_types = @typeInfo(rc.OptionalStatements).@"enum".field_names.len;
141
141
  var statement_type_has_duplicates: [num_statement_types]bool = @splat(false);
142
142
  var last_statement_per_type: [num_statement_types]?*Node = @splat(null);
143
143
 
@@ -925,18 +925,18 @@ const Context = struct {
925
925
  }
926
926
 
927
927
  fn addExtra(c: *Context, extra: anytype) Allocator.Error!std.zig.Ast.ExtraIndex {
928
- const fields = std.meta.fields(@TypeOf(extra));
929
- try c.extra_data.ensureUnusedCapacity(c.gpa, fields.len);
928
+ const info = @typeInfo(@TypeOf(extra)).@"struct";
929
+ try c.extra_data.ensureUnusedCapacity(c.gpa, info.field_names.len);
930
930
  const result: std.zig.Ast.ExtraIndex = @enumFromInt(c.extra_data.items.len);
931
- inline for (fields) |field| {
932
- const data: u32 = switch (field.type) {
931
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
932
+ const data: u32 = switch (field_type) {
933
933
  NodeIndex,
934
934
  std.zig.Ast.Node.OptionalIndex,
935
935
  std.zig.Ast.OptionalTokenIndex,
936
936
  std.zig.Ast.ExtraIndex,
937
- => @intFromEnum(@field(extra, field.name)),
937
+ => @intFromEnum(@field(extra, field_name)),
938
938
  TokenIndex,
939
- => @field(extra, field.name),
939
+ => @field(extra, field_name),
940
940
  else => @compileError("unexpected field type"),
941
941
  };
942
942
  c.extra_data.appendAssumeCapacity(data);
@@ -170,11 +170,11 @@ pub fn ExtraData(comptime T: type) type {
170
170
  }
171
171
 
172
172
  pub fn extraData(doc: Document, comptime T: type, index: ExtraIndex) ExtraData(T) {
173
- const fields = @typeInfo(T).@"struct".fields;
173
+ const info = @typeInfo(T).@"struct";
174
174
  var i: usize = @intFromEnum(index);
175
175
  var result: T = undefined;
176
- inline for (fields) |field| {
177
- @field(result, field.name) = switch (field.type) {
176
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
177
+ @field(result, field_name) = switch (field_type) {
178
178
  u32 => doc.extra[i],
179
179
  else => @compileError("bad field type"),
180
180
  };
@@ -1574,11 +1574,11 @@ fn parseInlines(p: *Parser, content: []const u8) !ExtraIndex {
1574
1574
  }
1575
1575
 
1576
1576
  pub fn extraData(p: Parser, comptime T: type, index: ExtraIndex) ExtraData(T) {
1577
- const fields = @typeInfo(T).@"struct".fields;
1577
+ const info = @typeInfo(T).@"struct";
1578
1578
  var i: usize = @intFromEnum(index);
1579
1579
  var result: T = undefined;
1580
- inline for (fields) |field| {
1581
- @field(result, field.name) = switch (field.type) {
1580
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
1581
+ @field(result, field_name) = switch (field_type) {
1582
1582
  u32 => p.extra.items[i],
1583
1583
  else => @compileError("bad field type"),
1584
1584
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zigc/lib",
3
- "version": "0.17.0-dev.633",
3
+ "version": "0.17.0-dev.657",
4
4
  "description": "Zig standard library and libc headers (shared across all platforms)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1241,7 +1241,7 @@ pub const Manifest = struct {
1241
1241
  }
1242
1242
 
1243
1243
  pub fn populateFileSystemInputs(man: *Manifest, buf: *std.ArrayList(u8)) Allocator.Error!void {
1244
- assert(@typeInfo(std.zig.Server.Message.PathPrefix).@"enum".fields.len == man.cache.prefixes_len);
1244
+ assert(@typeInfo(std.zig.Server.Message.PathPrefix).@"enum".field_names.len == man.cache.prefixes_len);
1245
1245
  buf.clearRetainingCapacity();
1246
1246
  const gpa = man.cache.gpa;
1247
1247
  const files = man.files.keys();
@@ -1259,7 +1259,7 @@ pub const Manifest = struct {
1259
1259
 
1260
1260
  pub fn populateOtherManifest(man: *Manifest, other: *Manifest, prefix_map: [4]u8) Allocator.Error!void {
1261
1261
  const gpa = other.cache.gpa;
1262
- assert(@typeInfo(std.zig.Server.Message.PathPrefix).@"enum".fields.len == man.cache.prefixes_len);
1262
+ assert(@typeInfo(std.zig.Server.Message.PathPrefix).@"enum".field_names.len == man.cache.prefixes_len);
1263
1263
  assert(man.cache.prefixes_len == 4);
1264
1264
  for (man.files.keys()) |file| {
1265
1265
  const prefixed_path: PrefixedPath = .{
@@ -2144,6 +2144,33 @@ pub const ResolvedTarget = struct {
2144
2144
  return (unwrap(this) orelse return null).get(c);
2145
2145
  }
2146
2146
  };
2147
+
2148
+ pub fn unwrapQuery(rt: *const ResolvedTarget, c: *const Configuration) ?std.Target.Query {
2149
+ const tq = rt.query.get(c) orelse return null;
2150
+ const cpu_arch = tq.flags.cpu_arch.unwrap() orelse rt.result.get(c).flags.cpu_arch.unwrap().?;
2151
+ return .{
2152
+ .cpu_arch = cpu_arch,
2153
+ .cpu_model = switch (tq.flags.cpu_model) {
2154
+ .native => .native,
2155
+ .baseline => .baseline,
2156
+ .determined_by_arch_os => .determined_by_arch_os,
2157
+ .explicit => .{ .explicit = cpu_arch.parseCpuModel(tq.cpu_name.value.?.slice(c)).? },
2158
+ },
2159
+ .cpu_features_add = tq.cpu_features_add.value orelse .empty,
2160
+ .cpu_features_sub = tq.cpu_features_sub.value orelse .empty,
2161
+ .os_tag = tq.flags.os_tag.unwrap(),
2162
+ .os_version_min = tq.os_version_min.u.unwrap(c),
2163
+ .os_version_max = tq.os_version_max.u.unwrap(c),
2164
+ .glibc_version = if (tq.glibc_version.value) |s|
2165
+ std.SemanticVersion.parse(s.slice(c)) catch unreachable
2166
+ else
2167
+ null,
2168
+ .android_api_level = tq.android_api_level.value,
2169
+ .abi = tq.flags.abi.unwrap(),
2170
+ .dynamic_linker = if (tq.dynamic_linker.value) |s| .init(s.slice(c)) else null,
2171
+ .ofmt = tq.flags.object_format.unwrap(),
2172
+ };
2173
+ }
2147
2174
  };
2148
2175
 
2149
2176
  pub const TargetQuery = struct {
@@ -2731,29 +2758,50 @@ pub const TargetQuery = struct {
2731
2758
  dynamic_linker: bool,
2732
2759
  };
2733
2760
 
2734
- pub fn unwrap(tq: *const TargetQuery, c: *const Configuration) std.Target.Query {
2735
- const cpu_arch = tq.flags.cpu_arch.unwrap();
2761
+ pub fn unwrapTarget(tq: *const TargetQuery, c: *const Configuration) std.Target {
2762
+ const cpu_arch = tq.flags.cpu_arch.unwrap().?;
2763
+ const os_tag = tq.flags.os_tag.unwrap().?;
2736
2764
  return .{
2737
- .cpu_arch = cpu_arch,
2738
- .cpu_model = switch (tq.flags.cpu_model) {
2739
- .native => .native,
2740
- .baseline => .baseline,
2741
- .determined_by_arch_os => .determined_by_arch_os,
2742
- .explicit => .{ .explicit = cpu_arch.?.parseCpuModel(tq.cpu_name.value.?.slice(c)).? },
2765
+ .cpu = .{
2766
+ .arch = cpu_arch,
2767
+ .model = cpu_arch.parseCpuModel(tq.cpu_name.value.?.slice(c)).?,
2768
+ .features = tq.cpu_features_add.value.?,
2743
2769
  },
2744
- .cpu_features_add = tq.cpu_features_add.value orelse .empty,
2745
- .cpu_features_sub = tq.cpu_features_sub.value orelse .empty,
2746
- .os_tag = tq.flags.os_tag.unwrap(),
2747
- .os_version_min = tq.os_version_min.u.unwrap(c),
2748
- .os_version_max = tq.os_version_max.u.unwrap(c),
2749
- .glibc_version = if (tq.glibc_version.value) |s|
2750
- std.SemanticVersion.parse(s.slice(c)) catch unreachable
2751
- else
2752
- null,
2753
- .android_api_level = tq.android_api_level.value,
2754
- .abi = tq.flags.abi.unwrap(),
2755
- .dynamic_linker = if (tq.dynamic_linker.value) |s| .init(s.slice(c)) else null,
2756
- .ofmt = tq.flags.object_format.unwrap(),
2770
+ .os = .{
2771
+ .tag = os_tag,
2772
+ .version_range = switch (os_tag) {
2773
+ .linux => .{ .linux = .{
2774
+ .range = .{
2775
+ .min = tq.os_version_min.u.unwrap(c).?.semver,
2776
+ .max = tq.os_version_max.u.unwrap(c).?.semver,
2777
+ },
2778
+ .glibc = std.SemanticVersion.parse(tq.glibc_version.value.?.slice(c)) catch unreachable,
2779
+ .android = tq.android_api_level.value.?,
2780
+ } },
2781
+ .hurd => .{ .hurd = .{
2782
+ .range = .{
2783
+ .min = tq.os_version_min.u.unwrap(c).?.semver,
2784
+ .max = tq.os_version_max.u.unwrap(c).?.semver,
2785
+ },
2786
+ .glibc = std.SemanticVersion.parse(tq.glibc_version.value.?.slice(c)) catch unreachable,
2787
+ } },
2788
+ .windows => .{ .windows = .{
2789
+ .min = tq.os_version_min.u.unwrap(c).?.windows,
2790
+ .max = tq.os_version_max.u.unwrap(c).?.windows,
2791
+ } },
2792
+ else => switch (tq.os_version_min.u.unwrap(c).?) {
2793
+ .none => .{ .none = {} },
2794
+ .semver => |min| .{ .semver = .{
2795
+ .min = min,
2796
+ .max = tq.os_version_max.u.unwrap(c).?.semver,
2797
+ } },
2798
+ .windows => unreachable,
2799
+ },
2800
+ },
2801
+ },
2802
+ .abi = tq.flags.abi.unwrap().?,
2803
+ .ofmt = tq.flags.object_format.unwrap().?,
2804
+ .dynamic_linker = .init(if (tq.dynamic_linker.value) |s| s.slice(c) else null),
2757
2805
  };
2758
2806
  }
2759
2807
  };
@@ -2836,7 +2884,10 @@ pub const Storage = enum {
2836
2884
  }
2837
2885
 
2838
2886
  pub fn cast(this: @This(), c: *const Configuration, comptime S: type) ?S {
2839
- const wanted_tag = @typeInfo(S.Flags).@"struct".fields[0].defaultValue().?;
2887
+ const wanted_tag = blk: {
2888
+ const info = @typeInfo(S.Flags).@"struct";
2889
+ break :blk info.field_attrs[0].defaultValue(info.field_types[0]).?;
2890
+ };
2840
2891
  const base_flags: BaseFlags = @bitCast(c.extra[@intFromEnum(this)]);
2841
2892
  if (base_flags.tag != wanted_tag) return null;
2842
2893
  var i: usize = @intFromEnum(this);
@@ -2999,8 +3050,8 @@ pub const Storage = enum {
2999
3050
  switch (@typeInfo(T)) {
3000
3051
  .@"struct" => |info| {
3001
3052
  var result: T = undefined;
3002
- inline for (info.fields) |field| {
3003
- @field(result, field.name) = dataField(buffer, i, &result, field.type);
3053
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
3054
+ @field(result, field_name) = dataField(buffer, i, &result, field_type);
3004
3055
  }
3005
3056
  return result;
3006
3057
  },
@@ -3010,7 +3061,7 @@ pub const Storage = enum {
3010
3061
  inline else => |comptime_tag| @unionInit(
3011
3062
  T,
3012
3063
  @tagName(comptime_tag),
3013
- data(buffer, i, info.fields[@intFromEnum(comptime_tag)].type),
3064
+ data(buffer, i, info.field_types[@intFromEnum(comptime_tag)]),
3014
3065
  ),
3015
3066
  };
3016
3067
  },
@@ -3077,7 +3128,7 @@ pub const Storage = enum {
3077
3128
  buffer,
3078
3129
  i,
3079
3130
  container,
3080
- @typeInfo(Field.Union).@"union".fields[@intFromEnum(comptime_tag)].type,
3131
+ @typeInfo(Field.Union).@"union".field_types[@intFromEnum(comptime_tag)],
3081
3132
  ),
3082
3133
  ),
3083
3134
  },
@@ -3119,7 +3170,7 @@ pub const Storage = enum {
3119
3170
  .multi_list => {
3120
3171
  const data_start = i.* + 1;
3121
3172
  const len = buffer[data_start - 1];
3122
- defer i.* = data_start + len * @typeInfo(Field.Elem).@"struct".fields.len;
3173
+ defer i.* = data_start + len * @typeInfo(Field.Elem).@"struct".field_names.len;
3123
3174
  return .{ .mal = .{
3124
3175
  .bytes = @ptrCast(@constCast(buffer[data_start..][0..len])),
3125
3176
  .len = len,
@@ -3157,10 +3208,10 @@ pub const Storage = enum {
3157
3208
 
3158
3209
  /// Returns new end index.
3159
3210
  fn setExtra(buffer: []u32, index: usize, extra: anytype) usize {
3160
- const fields = @typeInfo(@TypeOf(extra)).@"struct".fields;
3211
+ const info = @typeInfo(@TypeOf(extra)).@"struct";
3161
3212
  var i = index;
3162
- inline for (fields) |field| {
3163
- i += setExtraField(buffer, i, field.type, @field(extra, field.name));
3213
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
3214
+ i += setExtraField(buffer, i, field_type, @field(extra, field_name));
3164
3215
  }
3165
3216
  return i;
3166
3217
  }
@@ -3188,7 +3239,7 @@ pub const Storage = enum {
3188
3239
  .flag_length_prefixed_list,
3189
3240
  .flag_list,
3190
3241
  => 1 + @divExact(@sizeOf(Field.Elem), @sizeOf(u32)) * field.slice.len,
3191
- .multi_list => 1 + field.mal.len * @typeInfo(Field.Elem).@"struct".fields.len,
3242
+ .multi_list => 1 + field.mal.len * @typeInfo(Field.Elem).@"struct".field_names.len,
3192
3243
  .union_list => Field.extraLen(field.len),
3193
3244
  .flag_union => switch (field.u) {
3194
3245
  inline else => |v| extraFieldLen(v),
@@ -3201,10 +3252,10 @@ pub const Storage = enum {
3201
3252
  }
3202
3253
 
3203
3254
  fn extraLen(extra: anytype) usize {
3204
- const fields = @typeInfo(@TypeOf(extra)).@"struct".fields;
3255
+ const field_names = @typeInfo(@TypeOf(extra)).@"struct".field_names;
3205
3256
  var i: usize = 0;
3206
- inline for (fields) |field| {
3207
- i += Storage.extraFieldLen(@field(extra, field.name));
3257
+ inline for (field_names) |name| {
3258
+ i += Storage.extraFieldLen(@field(extra, name));
3208
3259
  }
3209
3260
  return i;
3210
3261
  }
@@ -3276,12 +3327,12 @@ pub const Storage = enum {
3276
3327
  .multi_list => {
3277
3328
  const len: u32 = @intCast(value.mal.len);
3278
3329
  buffer[i] = len;
3279
- const fields = @typeInfo(Field.Elem).@"struct".fields;
3280
- inline for (0..fields.len) |field_i| @memcpy(
3330
+ const field_names = @typeInfo(Field.Elem).@"struct".field_names;
3331
+ inline for (0..field_names.len) |field_i| @memcpy(
3281
3332
  buffer[i + 1 + field_i * len ..][0..len],
3282
3333
  @as([]const u32, @ptrCast(value.mal.items(@enumFromInt(field_i)))),
3283
3334
  );
3284
- return 1 + fields.len * len;
3335
+ return 1 + field_names.len * len;
3285
3336
  },
3286
3337
  .union_list => {
3287
3338
  if (value.len == 0) return 0;
@@ -173,8 +173,9 @@ fn addValueInner(config_header: *ConfigHeader, name: []const u8, comptime T: typ
173
173
  }
174
174
 
175
175
  pub fn addValues(config_header: *ConfigHeader, values: anytype) void {
176
- inline for (@typeInfo(@TypeOf(values)).@"struct".fields) |field| {
177
- addValue(config_header, field.name, field.type, @field(values, field.name));
176
+ const info = @typeInfo(@TypeOf(values)).@"struct";
177
+ inline for (info.field_names, info.field_types) |field_name, field_type| {
178
+ addValue(config_header, field_name, field_type, @field(values, field_name));
178
179
  }
179
180
  }
180
181
 
@@ -299,14 +299,14 @@ fn printEnum(
299
299
  try out.appendNTimes(gpa, ' ', indent);
300
300
  try out.print(gpa, "pub const {f} = enum ({s}) {{\n", .{ std.zig.fmtId(@typeName(T)), @typeName(val.tag_type) });
301
301
 
302
- inline for (val.fields) |field| {
302
+ inline for (val.field_names, val.field_values) |field_name, field_value| {
303
303
  try out.appendNTimes(gpa, ' ', indent);
304
304
  try out.print(gpa, " {f} = {d},\n", .{
305
- std.zig.fmtIdFlags(field.name, .{ .allow_primitive = true }), field.value,
305
+ std.zig.fmtIdFlags(field_name, .{ .allow_primitive = true }), field_value,
306
306
  });
307
307
  }
308
308
 
309
- if (!val.is_exhaustive) {
309
+ if (val.mode == .nonexhaustive) {
310
310
  try out.appendNTimes(gpa, ' ', indent);
311
311
  try out.appendSlice(gpa, " _,\n");
312
312
  }
@@ -315,7 +315,13 @@ fn printEnum(
315
315
  try out.appendSlice(gpa, "};\n");
316
316
  }
317
317
 
318
- fn printStruct(options: *Options, out: *std.ArrayList(u8), comptime T: type, comptime val: std.builtin.Type.Struct, indent: u8) !void {
318
+ fn printStruct(
319
+ options: *Options,
320
+ out: *std.ArrayList(u8),
321
+ comptime T: type,
322
+ comptime val: std.builtin.Type.Struct,
323
+ indent: u8,
324
+ ) !void {
319
325
  const gpa = options.step.owner.allocator;
320
326
  const gop = try options.encountered_types.getOrPut(gpa, @typeName(T));
321
327
  if (gop.found_existing) return;
@@ -331,32 +337,32 @@ fn printStruct(options: *Options, out: *std.ArrayList(u8), comptime T: type, com
331
337
 
332
338
  try out.appendSlice(gpa, " {\n");
333
339
 
334
- inline for (val.fields) |field| {
340
+ inline for (val.field_names, val.field_types, val.field_attrs) |field_name, field_type, field_attrs| {
335
341
  try out.appendNTimes(gpa, ' ', indent);
336
342
 
337
- const type_name = @typeName(field.type);
343
+ const type_name = @typeName(field_type);
338
344
 
339
345
  // If the type name doesn't contains a '.' the type is from zig builtins.
340
346
  if (std.mem.containsAtLeast(u8, type_name, 1, ".")) {
341
347
  try out.print(gpa, " {f}: {f}", .{
342
- std.zig.fmtIdFlags(field.name, .{ .allow_underscore = true, .allow_primitive = true }),
348
+ std.zig.fmtIdFlags(field_name, .{ .allow_underscore = true, .allow_primitive = true }),
343
349
  std.zig.fmtId(type_name),
344
350
  });
345
351
  } else {
346
352
  try out.print(gpa, " {f}: {s}", .{
347
- std.zig.fmtIdFlags(field.name, .{ .allow_underscore = true, .allow_primitive = true }),
353
+ std.zig.fmtIdFlags(field_name, .{ .allow_underscore = true, .allow_primitive = true }),
348
354
  type_name,
349
355
  });
350
356
  }
351
357
 
352
- if (field.defaultValue()) |default_value| {
358
+ if (field_attrs.defaultValue(field_type)) |default_value| {
353
359
  try out.appendSlice(gpa, " = ");
354
- switch (@typeInfo(@TypeOf(default_value))) {
360
+ switch (@typeInfo(field_type)) {
355
361
  .@"enum" => try out.print(gpa, ".{s},\n", .{@tagName(default_value)}),
356
362
  .@"struct" => |info| {
357
363
  try printStructValue(options, out, info, default_value, indent + 4);
358
364
  },
359
- else => try printType(options, out, @TypeOf(default_value), default_value, indent, null),
365
+ else => try printType(options, out, field_type, default_value, indent, null),
360
366
  }
361
367
  } else {
362
368
  try out.appendSlice(gpa, ",\n");
@@ -368,8 +374,8 @@ fn printStruct(options: *Options, out: *std.ArrayList(u8), comptime T: type, com
368
374
  try out.appendNTimes(gpa, ' ', indent);
369
375
  try out.appendSlice(gpa, "};\n");
370
376
 
371
- inline for (val.fields) |field| {
372
- try printUserDefinedType(options, out, field.type, 0);
377
+ inline for (val.field_types) |field_type| {
378
+ try printUserDefinedType(options, out, field_type, 0);
373
379
  }
374
380
  }
375
381
 
@@ -384,24 +390,24 @@ fn printStructValue(
384
390
  try out.appendSlice(gpa, ".{\n");
385
391
 
386
392
  if (struct_val.is_tuple) {
387
- inline for (struct_val.fields) |field| {
393
+ inline for (struct_val.field_names) |field_name| {
388
394
  try out.appendNTimes(gpa, ' ', indent);
389
- try printType(options, out, @TypeOf(@field(val, field.name)), @field(val, field.name), indent, null);
395
+ try printType(options, out, @TypeOf(@field(val, field_name)), @field(val, field_name), indent, null);
390
396
  }
391
397
  } else {
392
- inline for (struct_val.fields) |field| {
398
+ inline for (struct_val.field_names) |field_name| {
393
399
  try out.appendNTimes(gpa, ' ', indent);
394
400
  try out.print(gpa, " .{f} = ", .{
395
- std.zig.fmtIdFlags(field.name, .{ .allow_primitive = true, .allow_underscore = true }),
401
+ std.zig.fmtIdFlags(field_name, .{ .allow_primitive = true, .allow_underscore = true }),
396
402
  });
397
403
 
398
- const field_name = @field(val, field.name);
399
- switch (@typeInfo(@TypeOf(field_name))) {
400
- .@"enum" => try out.print(gpa, ".{s},\n", .{@tagName(field_name)}),
404
+ const field_val = @field(val, field_name);
405
+ switch (@typeInfo(@TypeOf(field_val))) {
406
+ .@"enum" => try out.print(gpa, ".{s},\n", .{@tagName(field_val)}),
401
407
  .@"struct" => |struct_info| {
402
- try printStructValue(options, out, struct_info, field_name, indent + 4);
408
+ try printStructValue(options, out, struct_info, field_val, indent + 4);
403
409
  },
404
- else => try printType(options, out, @TypeOf(field_name), field_name, indent, null),
410
+ else => try printType(options, out, @TypeOf(field_val), field_val, indent, null),
405
411
  }
406
412
  }
407
413
  }