| author | |
| committer | |
| log | 8f36a83b45eedef92b3fcda605e0ccb3828ddbd3 |
| tree | 90027cc2968f3930f296c8e46785cbaf72b74cd9 |
| parent | 6c61803d8b7281ffb4517cfbc335e4e0dfcdea66 |
3 files changed, 74 insertions(+), 24 deletions(-)
lib/compiler/Maker/ScannedConfig.zig+2-1| ... | ... | @@ -103,6 +103,7 @@ fn printValue(sc: *const ScannedConfig, s: *Serializer, comptime Field: type, fi |
| 103 | 103 | .enum_optional => comptime unreachable, |
| 104 | 104 | .union_list => comptime unreachable, |
| 105 | 105 | .length_prefixed_list => comptime unreachable, |
| 106 | .flag_list => comptime unreachable, | |
| 106 | 107 | .flag_union => comptime unreachable, |
| 107 | 108 | .multi_list => comptime unreachable, |
| 108 | 109 | } else if (std.enums.tagName(Field, field_value)) |name| { |
| ... | ... | @@ -128,7 +129,7 @@ fn printValue(sc: *const ScannedConfig, s: *Serializer, comptime Field: type, fi |
| 128 | 129 | try s.value(null, .{}); |
| 129 | 130 | } |
| 130 | 131 | }, |
| 131 | .length_prefixed_list, .flag_length_prefixed_list => { | |
| 132 | .length_prefixed_list, .flag_length_prefixed_list, .flag_list => { | |
| 132 | 133 | try printValue(sc, s, @TypeOf(field_value.slice), field_value.slice); |
| 133 | 134 | }, |
| 134 | 135 | .extended => @compileError("TODO"), |
lib/compiler/configurer.zig+23-11| ... | ... | @@ -308,40 +308,54 @@ const Serialize = struct { |
| 308 | 308 | } |
| 309 | 309 | |
| 310 | 310 | fn addCSourceFile(s: *Serialize, csf: *const std.Build.Module.CSourceFile) !Configuration.CSourceFile.Index { |
| 311 | log.err("TODO addCSourceFile trailing data", .{}); | |
| 312 | 311 | const wc = s.wc; |
| 312 | const args = try initStringList(s, csf.flags); | |
| 313 | 313 | return @enumFromInt(try wc.addExtra(@as(Configuration.CSourceFile, .{ |
| 314 | 314 | .flags = .{ |
| 315 | .args_len = @intCast(csf.flags.len), | |
| 315 | .args_len = @intCast(args.len), | |
| 316 | 316 | .lang = .init(csf.language), |
| 317 | 317 | }, |
| 318 | 318 | .file = try addLazyPath(s, csf.file), |
| 319 | .args = .{ .slice = args }, | |
| 319 | 320 | }))); |
| 320 | 321 | } |
| 321 | 322 | |
| 322 | 323 | fn addCSourceFiles(s: *Serialize, csf: *const std.Build.Module.CSourceFiles) !Configuration.CSourceFiles.Index { |
| 323 | log.err("TODO addCSourceFiles trailing data", .{}); | |
| 324 | 324 | const wc = s.wc; |
| 325 | const sub_paths = try initStringList(s, csf.files); | |
| 326 | const args = try initStringList(s, csf.flags); | |
| 325 | 327 | return @enumFromInt(try wc.addExtra(@as(Configuration.CSourceFiles, .{ |
| 326 | 328 | .flags = .{ |
| 327 | .args_len = @intCast(csf.flags.len), | |
| 329 | .args_len = @intCast(args.len), | |
| 328 | 330 | .lang = .init(csf.language), |
| 329 | 331 | }, |
| 330 | 332 | .root = try addLazyPath(s, csf.root), |
| 331 | .files_len = @intCast(csf.files.len), | |
| 333 | .sub_paths = .{ .slice = sub_paths }, | |
| 334 | .args = .{ .slice = args }, | |
| 332 | 335 | }))); |
| 333 | 336 | } |
| 334 | 337 | |
| 335 | 338 | fn addRcSourceFile(s: *Serialize, rsf: *const std.Build.Module.RcSourceFile) !Configuration.RcSourceFile.Index { |
| 336 | log.err("TODO addRcSourceFile trailing data", .{}); | |
| 337 | 339 | const wc = s.wc; |
| 340 | const include_paths = try initLazyPathList(s, rsf.include_paths); | |
| 341 | const args = try initStringList(s, rsf.flags); | |
| 338 | 342 | return @enumFromInt(try wc.addExtra(@as(Configuration.RcSourceFile, .{ |
| 343 | .flags = .{ | |
| 344 | .args_len = @intCast(args.len), | |
| 345 | .include_paths = include_paths.len != 0, | |
| 346 | }, | |
| 339 | 347 | .file = try addLazyPath(s, rsf.file), |
| 340 | .args_len = @intCast(rsf.flags.len), | |
| 341 | .include_paths_len = @intCast(rsf.include_paths.len), | |
| 348 | .include_paths = .{ .slice = include_paths }, | |
| 349 | .args = .{ .slice = args }, | |
| 342 | 350 | }))); |
| 343 | 351 | } |
| 344 | 352 | |
| 353 | fn initLazyPathList(s: *Serialize, list: []const std.Build.LazyPath) ![]const Configuration.LazyPath { | |
| 354 | const result = try s.arena.alloc(Configuration.LazyPath, list.len); | |
| 355 | for (result, list) |*dest, src| dest.* = try addLazyPath(s, src); | |
| 356 | return result; | |
| 357 | } | |
| 358 | ||
| 345 | 359 | fn initStringList(s: *Serialize, list: []const []const u8) ![]const Configuration.String { |
| 346 | 360 | const wc = s.wc; |
| 347 | 361 | const result = try s.arena.alloc(Configuration.String, list.len); |
| ... | ... | @@ -400,9 +414,7 @@ const Serialize = struct { |
| 400 | 414 | .name = try wc.addString(name), |
| 401 | 415 | }; |
| 402 | 416 | |
| 403 | const lib_paths = try arena.alloc(Configuration.LazyPath, m.lib_paths.items.len); | |
| 404 | for (lib_paths, m.lib_paths.items) |*dest, src| dest.* = try addLazyPath(s, src); | |
| 405 | ||
| 417 | const lib_paths = try initLazyPathList(s, m.lib_paths.items); | |
| 406 | 418 | const c_macros = try initStringList(s, m.c_macros.items); |
| 407 | 419 | const export_symbol_names = try initStringList(s, m.export_symbol_names); |
| 408 | 420 |
lib/std/zig/Configuration.zig+49-12| ... | ... | @@ -1388,13 +1388,11 @@ pub const SystemLib = struct { |
| 1388 | 1388 | pub const SearchStrategy = enum(u2) { paths_first, mode_first, no_fallback }; |
| 1389 | 1389 | }; |
| 1390 | 1390 | |
| 1391 | /// Trailing: | |
| 1392 | /// * arg: String, // for each args_len | |
| 1393 | /// * sub_path: String, // for each files_len | |
| 1394 | 1391 | pub const CSourceFiles = struct { |
| 1395 | 1392 | flags: Flags, |
| 1396 | 1393 | root: LazyPath, |
| 1397 | files_len: u32, | |
| 1394 | args: Storage.FlagList(.flags, .args_len, String), | |
| 1395 | sub_paths: Storage.LengthPrefixedList(String), | |
| 1398 | 1396 | |
| 1399 | 1397 | pub const Index = enum(u32) { |
| 1400 | 1398 | _, |
| ... | ... | @@ -1407,11 +1405,10 @@ pub const CSourceFiles = struct { |
| 1407 | 1405 | }; |
| 1408 | 1406 | }; |
| 1409 | 1407 | |
| 1410 | /// Trailing: | |
| 1411 | /// * arg: String, // for each args_len | |
| 1412 | 1408 | pub const CSourceFile = struct { |
| 1413 | 1409 | flags: Flags, |
| 1414 | 1410 | file: LazyPath, |
| 1411 | args: Storage.FlagList(.flags, .args_len, String), | |
| 1415 | 1412 | |
| 1416 | 1413 | pub const Index = enum(u32) { |
| 1417 | 1414 | _, |
| ... | ... | @@ -1424,17 +1421,21 @@ pub const CSourceFile = struct { |
| 1424 | 1421 | }; |
| 1425 | 1422 | }; |
| 1426 | 1423 | |
| 1427 | /// Trailing: | |
| 1428 | /// * arg: String, // for each args_len | |
| 1429 | /// * include_path: String, // for each include_paths_len | |
| 1430 | 1424 | pub const RcSourceFile = struct { |
| 1425 | flags: Flags, | |
| 1431 | 1426 | file: LazyPath, |
| 1432 | args_len: u32, | |
| 1433 | include_paths_len: u32, | |
| 1427 | args: Storage.FlagList(.flags, .args_len, String), | |
| 1428 | include_paths: Storage.FlagLengthPrefixedList(.flags, .include_paths, LazyPath), | |
| 1434 | 1429 | |
| 1435 | 1430 | pub const Index = enum(u32) { |
| 1436 | 1431 | _, |
| 1437 | 1432 | }; |
| 1433 | ||
| 1434 | pub const Flags = packed struct(u32) { | |
| 1435 | /// C compiler CLI flags. | |
| 1436 | args_len: u31, | |
| 1437 | include_paths: bool, | |
| 1438 | }; | |
| 1438 | 1439 | }; |
| 1439 | 1440 | |
| 1440 | 1441 | pub const OptionalCSourceLanguage = enum(u3) { |
| ... | ... | @@ -1779,6 +1780,7 @@ pub const Storage = enum { |
| 1779 | 1780 | union_list, |
| 1780 | 1781 | flag_union, |
| 1781 | 1782 | multi_list, |
| 1783 | flag_list, | |
| 1782 | 1784 | |
| 1783 | 1785 | /// The presence of the field is determined by a boolean within a packed |
| 1784 | 1786 | /// struct. |
| ... | ... | @@ -1887,6 +1889,26 @@ pub const Storage = enum { |
| 1887 | 1889 | }; |
| 1888 | 1890 | } |
| 1889 | 1891 | |
| 1892 | /// The field is a list whose length is an integer inside flags. | |
| 1893 | pub fn FlagList( | |
| 1894 | comptime flags_arg: @EnumLiteral(), | |
| 1895 | comptime flag_arg: @EnumLiteral(), | |
| 1896 | comptime ElemArg: type, | |
| 1897 | ) type { | |
| 1898 | return struct { | |
| 1899 | slice: []const Elem, | |
| 1900 | ||
| 1901 | pub const storage: Storage = .flag_list; | |
| 1902 | pub const flags = flags_arg; | |
| 1903 | pub const flag = flag_arg; | |
| 1904 | pub const Elem = ElemArg; | |
| 1905 | ||
| 1906 | pub fn initErased(s: []const u32) @This() { | |
| 1907 | return .{ .slice = @ptrCast(s) }; | |
| 1908 | } | |
| 1909 | }; | |
| 1910 | } | |
| 1911 | ||
| 1890 | 1912 | /// The field contains a u32 length followed by that many items for the |
| 1891 | 1913 | /// first field, that many items for the second field, etc. |
| 1892 | 1914 | pub fn MultiList(comptime ElemArg: type) type { |
| ... | ... | @@ -2059,6 +2081,13 @@ pub const Storage = enum { |
| 2059 | 2081 | defer i.* = data_start + len; |
| 2060 | 2082 | return .{ .slice = @ptrCast(buffer[data_start..][0..len]) }; |
| 2061 | 2083 | }, |
| 2084 | .flag_list => { | |
| 2085 | const flags = @field(container, @tagName(Field.flags)); | |
| 2086 | const len: u32 = @field(flags, @tagName(Field.flag)); | |
| 2087 | const data_start = i.*; | |
| 2088 | defer i.* = data_start + len; | |
| 2089 | return .{ .slice = @ptrCast(buffer[data_start..][0..len]) }; | |
| 2090 | }, | |
| 2062 | 2091 | .multi_list => { |
| 2063 | 2092 | const data_start = i.* + 1; |
| 2064 | 2093 | const len = buffer[data_start - 1]; |
| ... | ... | @@ -2122,7 +2151,10 @@ pub const Storage = enum { |
| 2122 | 2151 | }, |
| 2123 | 2152 | .auto => switch (Field.storage) { |
| 2124 | 2153 | .flag_optional, .enum_optional, .extended => 1, |
| 2125 | .length_prefixed_list, .flag_length_prefixed_list => 1 + @divExact(@sizeOf(Field.Elem), @sizeOf(u32)) * field.slice.len, | |
| 2154 | .length_prefixed_list, | |
| 2155 | .flag_length_prefixed_list, | |
| 2156 | .flag_list, | |
| 2157 | => 1 + @divExact(@sizeOf(Field.Elem), @sizeOf(u32)) * field.slice.len, | |
| 2126 | 2158 | .multi_list => 1 + field.mal.len * @typeInfo(Field.Elem).@"struct".fields.len, |
| 2127 | 2159 | .union_list => Field.extraLen(field.len), |
| 2128 | 2160 | .flag_union => switch (field.u) { |
| ... | ... | @@ -2195,6 +2227,11 @@ pub const Storage = enum { |
| 2195 | 2227 | @memcpy(buffer[i + 1 ..][0..len], @as([]const u32, @ptrCast(value.slice))); |
| 2196 | 2228 | return len + 1; |
| 2197 | 2229 | }, |
| 2230 | .flag_list => { | |
| 2231 | const len: u32 = @intCast(value.slice.len); | |
| 2232 | @memcpy(buffer[i..][0..len], @as([]const u32, @ptrCast(value.slice))); | |
| 2233 | return len; | |
| 2234 | }, | |
| 2198 | 2235 | .multi_list => { |
| 2199 | 2236 | const len: u32 = @intCast(value.mal.len); |
| 2200 | 2237 | if (len == 0) return 0; |