authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-04-12 07:28:18+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-04-12 07:28:18+02:00
log8da2f93bd0d11cb1cd5e7380230226df1c45b950
tree7a27a6ed2135aba536951aaea1360773ece0e2b2
parent06ab4f702e29d173919ab8e4471467e5bab05af5
parentc463bdb93d1a73b8f334a45cedce140ca41b757a

Merge pull request 'update aro and translate-c to latest' (#31826) from aro-sync into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/31826

42 files changed, 4298 insertions(+), 2734 deletions(-)

lib/compiler/aro/aro/Attribute.zig+202-116
......@@ -7,7 +7,9 @@ const Diagnostics = @import("Diagnostics.zig");
77const Parser = @import("Parser.zig");
88const Tree = @import("Tree.zig");
99const TokenIndex = Tree.TokenIndex;
10const QualType = @import("TypeStore.zig").QualType;
10const TypeStore = @import("TypeStore.zig");
11const Type = TypeStore.Type;
12const QualType = TypeStore.QualType;
1113const Value = @import("Value.zig");
1214
1315const Attribute = @This();
......@@ -341,7 +343,6 @@ fn diagnoseField(
341343
342344pub fn diagnose(attr: Tag, arguments: *Arguments, arg_idx: u32, res: Parser.Result, arg_start: TokenIndex, node: Tree.Node, p: *Parser) !bool {
343345 switch (attr) {
344 .nonnull => return false,
345346 inline else => |tag| {
346347 const decl = @typeInfo(attributes).@"struct".decls[@intFromEnum(tag)];
347348 const max_arg_count = comptime maxArgCount(tag);
......@@ -529,7 +530,10 @@ const attributes = struct {
529530 pub const @"noinline" = struct {};
530531 pub const noipa = struct {};
531532 // TODO: arbitrary number of arguments
532 pub const nonnull = struct {};
533 // const nonnull = struct {
534 // // arg_index: []const u32,
535 // };
536 // };
533537 pub const nonstring = struct {};
534538 pub const noplt = struct {};
535539 pub const @"noreturn" = struct {};
......@@ -577,6 +581,7 @@ const attributes = struct {
577581 };
578582 } = null,
579583 };
584 pub const single = struct {};
580585 pub const spectre = struct {
581586 arg: enum {
582587 nomitigation,
......@@ -618,6 +623,7 @@ const attributes = struct {
618623 __name_tok: TokenIndex,
619624 };
620625 pub const uninitialized = struct {};
626 pub const unsafe_indexable = struct {};
621627 pub const unsequenced = struct {};
622628 pub const unused = struct {};
623629 pub const used = struct {};
......@@ -723,6 +729,7 @@ pub const Arguments = blk: {
723729 name.* = decl.name;
724730 T.* = @field(attributes, decl.name);
725731 }
732
726733 break :blk @Union(.auto, null, &names, &types, &@splat(.{}));
727734};
728735
......@@ -784,15 +791,8 @@ fn ignoredAttrErr(p: *Parser, tok: TokenIndex, attr: Attribute.Tag, context: []c
784791 try p.err(tok, .ignored_attribute, .{ @tagName(attr), context });
785792}
786793
787pub fn applyParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic) !QualType {
788 return applyVariableOrParameterAttributes(p, qt, attr_buf_start, diagnostic, .parameter);
789}
790
794pub const applyParameterAttributes = applyVariableAttributes;
791795pub fn applyVariableAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic) !QualType {
792 return applyVariableOrParameterAttributes(p, qt, attr_buf_start, diagnostic, .variable);
793}
794
795fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diagnostic: ?Parser.Diagnostic, context: enum { parameter, variable }) !QualType {
796796 const gpa = p.comp.gpa;
797797 const attrs = p.attr_buf.items(.attr)[attr_buf_start..];
798798 const toks = p.attr_buf.items(.tok)[attr_buf_start..];
......@@ -804,6 +804,7 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start:
804804 // zig fmt: off
805805 .alias, .may_alias, .deprecated, .unavailable, .unused, .warn_if_not_aligned, .weak, .used,
806806 .noinit, .retain, .persistent, .section, .mode, .asm_label, .nullability, .unaligned, .selectany, .internal_linkage,
807 .visibility,
807808 => try p.attr_application_buf.append(gpa, attr),
808809 // zig fmt: on
809810 .common => if (nocommon) {
......@@ -820,12 +821,6 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start:
820821 },
821822 .vector_size => try attr.applyVectorSize(p, tok, &base_qt),
822823 .aligned => try attr.applyAligned(p, base_qt, diagnostic),
823 .nonnull => {
824 switch (context) {
825 .parameter => try p.err(tok, .attribute_todo, .{ "nonnull", "parameters" }),
826 .variable => try p.err(tok, .nonnull_not_applicable, .{}),
827 }
828 },
829824 .nonstring => {
830825 if (base_qt.get(p.comp, .array)) |array_ty| {
831826 if (array_ty.elem.get(p.comp, .int)) |int_ty| switch (int_ty) {
......@@ -848,11 +843,28 @@ fn applyVariableOrParameterAttributes(p: *Parser, qt: QualType, attr_buf_start:
848843 } else {
849844 try p.attr_application_buf.append(gpa, attr);
850845 },
851 .calling_convention => try applyCallingConvention(attr, p, tok, base_qt),
846 .single,
847 .unsafe_indexable,
848 => try applyBoundsSafetyAttr(.fromTag(attr.tag), p, tok, &base_qt),
849
850 .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt),
851
852 .fastcall,
853 .stdcall,
854 .thiscall,
855 .vectorcall,
856 .cdecl,
857 .pcs,
858 .riscv_vector_cc,
859 .aarch64_sve_pcs,
860 .aarch64_vector_pcs,
861 .sysv_abi,
862 .ms_abi,
863 => try applyGnuAttrCallingConvention(attr, p, tok, base_qt),
864
852865 .alloc_size,
853866 .copy,
854867 .tls_model,
855 .visibility,
856868 => |t| try p.err(tok, .attribute_todo, .{ @tagName(t), "variables" }),
857869 // There is already an error in Parser for _Noreturn keyword
858870 .noreturn => if (attr.syntax != .keyword) try ignoredAttrErr(p, tok, attr.tag, "variables"),
......@@ -903,7 +915,25 @@ pub fn applyTypeAttributes(p: *Parser, qt: QualType, attr_buf_start: usize, diag
903915 } else {
904916 try p.err(tok, .designated_init_invalid, .{});
905917 },
906 .calling_convention => try applyCallingConvention(attr, p, tok, base_qt),
918 .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt),
919
920 .fastcall,
921 .stdcall,
922 .thiscall,
923 .vectorcall,
924 .cdecl,
925 .pcs,
926 .riscv_vector_cc,
927 .aarch64_sve_pcs,
928 .aarch64_vector_pcs,
929 .sysv_abi,
930 .ms_abi,
931 => try applyGnuAttrCallingConvention(attr, p, tok, base_qt),
932
933 .single,
934 .unsafe_indexable,
935 => try applyBoundsSafetyAttr(.fromTag(attr.tag), p, tok, &base_qt),
936
907937 .alloc_size,
908938 .copy,
909939 .scalar_storage_order,
......@@ -931,6 +961,7 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)
931961 .@"const", .warn_unused_result, .section, .returns_nonnull, .returns_twice, .@"error",
932962 .externally_visible, .retain, .flatten, .gnu_inline, .alias, .asm_label, .nodiscard,
933963 .reproducible, .unsequenced, .nothrow, .nullability, .unaligned, .internal_linkage,
964 .visibility,
934965 => try p.attr_application_buf.append(gpa, attr),
935966 // zig fmt: on
936967 .hot => if (cold) {
......@@ -959,97 +990,21 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)
959990 },
960991 .aligned => try attr.applyAligned(p, base_qt, null),
961992 .format => try attr.applyFormat(p, base_qt),
962 .calling_convention => try applyCallingConvention(attr, p, tok, base_qt),
963 .fastcall => if (p.comp.target.cpu.arch == .x86) {
964 try p.attr_application_buf.append(gpa, .{
965 .tag = .calling_convention,
966 .args = .{ .calling_convention = .{ .cc = .fastcall } },
967 .syntax = attr.syntax,
968 });
969 } else {
970 try p.err(tok, .callconv_not_supported, .{"fastcall"});
971 },
972 .stdcall => if (p.comp.target.cpu.arch == .x86) {
973 try p.attr_application_buf.append(gpa, .{
974 .tag = .calling_convention,
975 .args = .{ .calling_convention = .{ .cc = .stdcall } },
976 .syntax = attr.syntax,
977 });
978 } else {
979 try p.err(tok, .callconv_not_supported, .{"stdcall"});
980 },
981 .thiscall => if (p.comp.target.cpu.arch == .x86) {
982 try p.attr_application_buf.append(gpa, .{
983 .tag = .calling_convention,
984 .args = .{ .calling_convention = .{ .cc = .thiscall } },
985 .syntax = attr.syntax,
986 });
987 } else {
988 try p.err(tok, .callconv_not_supported, .{"thiscall"});
989 },
990 .vectorcall => if (p.comp.target.cpu.arch == .x86 or p.comp.target.cpu.arch.isAARCH64()) {
991 try p.attr_application_buf.append(gpa, .{
992 .tag = .calling_convention,
993 .args = .{ .calling_convention = .{ .cc = .vectorcall } },
994 .syntax = attr.syntax,
995 });
996 } else {
997 try p.err(tok, .callconv_not_supported, .{"vectorcall"});
998 },
999 .cdecl => {},
1000 .pcs => if (p.comp.target.cpu.arch.isArm()) {
1001 try p.attr_application_buf.append(gpa, .{
1002 .tag = .calling_convention,
1003 .args = .{ .calling_convention = .{ .cc = switch (attr.args.pcs.kind) {
1004 .aapcs => .arm_aapcs,
1005 .@"aapcs-vfp" => .arm_aapcs_vfp,
1006 } } },
1007 .syntax = attr.syntax,
1008 });
1009 } else {
1010 try p.err(tok, .callconv_not_supported, .{"pcs"});
1011 },
1012 .riscv_vector_cc => if (p.comp.target.cpu.arch.isRISCV()) {
1013 try p.attr_application_buf.append(gpa, .{
1014 .tag = .calling_convention,
1015 .args = .{ .calling_convention = .{ .cc = .riscv_vector } },
1016 .syntax = attr.syntax,
1017 });
1018 } else {
1019 try p.err(tok, .callconv_not_supported, .{"pcs"});
1020 },
1021 .aarch64_sve_pcs => if (p.comp.target.cpu.arch.isAARCH64()) {
1022 try p.attr_application_buf.append(gpa, .{
1023 .tag = .calling_convention,
1024 .args = .{ .calling_convention = .{ .cc = .aarch64_sve_pcs } },
1025 .syntax = attr.syntax,
1026 });
1027 } else {
1028 try p.err(tok, .callconv_not_supported, .{"pcs"});
1029 },
1030 .aarch64_vector_pcs => if (p.comp.target.cpu.arch.isAARCH64()) {
1031 try p.attr_application_buf.append(gpa, .{
1032 .tag = .calling_convention,
1033 .args = .{ .calling_convention = .{ .cc = .aarch64_vector_pcs } },
1034 .syntax = attr.syntax,
1035 });
1036 } else {
1037 try p.err(tok, .callconv_not_supported, .{"pcs"});
1038 },
1039 .sysv_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag == .windows) {
1040 try p.attr_application_buf.append(gpa, .{
1041 .tag = .calling_convention,
1042 .args = .{ .calling_convention = .{ .cc = .x86_64_sysv } },
1043 .syntax = attr.syntax,
1044 });
1045 },
1046 .ms_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag != .windows) {
1047 try p.attr_application_buf.append(gpa, .{
1048 .tag = .calling_convention,
1049 .args = .{ .calling_convention = .{ .cc = .x86_64_win } },
1050 .syntax = attr.syntax,
1051 });
1052 },
993 .calling_convention => try applyKeywordCallingConvention(attr, p, tok, base_qt),
994
995 .fastcall,
996 .stdcall,
997 .thiscall,
998 .vectorcall,
999 .cdecl,
1000 .pcs,
1001 .riscv_vector_cc,
1002 .aarch64_sve_pcs,
1003 .aarch64_vector_pcs,
1004 .sysv_abi,
1005 .ms_abi,
1006 => try applyGnuAttrCallingConvention(attr, p, tok, base_qt),
1007
10531008 .malloc => {
10541009 if (base_qt.get(p.comp, .func).?.return_type.isPointer(p.comp)) {
10551010 try p.attr_application_buf.append(gpa, attr);
......@@ -1102,7 +1057,7 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)
11021057 .no_stack_protector,
11031058 .noclone,
11041059 .noipa,
1105 .nonnull,
1060 // .nonnull,
11061061 .noplt,
11071062 // .optimize,
11081063 .patchable_function_entry,
......@@ -1112,7 +1067,6 @@ pub fn applyFunctionAttributes(p: *Parser, qt: QualType, attr_buf_start: usize)
11121067 .symver,
11131068 .target,
11141069 .target_clones,
1115 .visibility,
11161070 .weakref,
11171071 .zero_call_used_regs,
11181072 => |t| try p.err(tok, .attribute_todo, .{ @tagName(t), "functions" }),
......@@ -1262,9 +1216,129 @@ fn applyFormat(attr: Attribute, p: *Parser, qt: QualType) !void {
12621216 try p.attr_application_buf.append(p.comp.gpa, attr);
12631217}
12641218
1265fn applyCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void {
1266 if (!qt.is(p.comp, .func)) {
1267 return p.err(tok, .callconv_non_func, .{ p.tok_ids[tok].symbol(), qt });
1219/// These come from GNU attributes like __attribute__((sysv_abi))
1220fn applyGnuAttrCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void {
1221 if (!qt.isCallable(p.comp)) {
1222 return p.err(tok, .callconv_non_func, .{ p.tokSlice(tok), qt });
1223 }
1224 const gpa = p.comp.gpa;
1225 switch (attr.tag) {
1226 .fastcall => if (p.comp.target.cpu.arch == .x86) {
1227 try p.attr_application_buf.append(gpa, .{
1228 .tag = .calling_convention,
1229 .args = .{ .calling_convention = .{ .cc = .fastcall } },
1230 .syntax = attr.syntax,
1231 });
1232 } else {
1233 try p.err(tok, .callconv_not_supported, .{"fastcall"});
1234 },
1235 .stdcall => if (p.comp.target.cpu.arch == .x86) {
1236 try p.attr_application_buf.append(gpa, .{
1237 .tag = .calling_convention,
1238 .args = .{ .calling_convention = .{ .cc = .stdcall } },
1239 .syntax = attr.syntax,
1240 });
1241 } else {
1242 try p.err(tok, .callconv_not_supported, .{"stdcall"});
1243 },
1244 .thiscall => if (p.comp.target.cpu.arch == .x86) {
1245 try p.attr_application_buf.append(gpa, .{
1246 .tag = .calling_convention,
1247 .args = .{ .calling_convention = .{ .cc = .thiscall } },
1248 .syntax = attr.syntax,
1249 });
1250 } else {
1251 try p.err(tok, .callconv_not_supported, .{"thiscall"});
1252 },
1253 .vectorcall => if (p.comp.target.cpu.arch == .x86 or p.comp.target.cpu.arch.isAARCH64()) {
1254 try p.attr_application_buf.append(gpa, .{
1255 .tag = .calling_convention,
1256 .args = .{ .calling_convention = .{ .cc = .vectorcall } },
1257 .syntax = attr.syntax,
1258 });
1259 } else {
1260 try p.err(tok, .callconv_not_supported, .{"vectorcall"});
1261 },
1262 .cdecl => {},
1263 .pcs => if (p.comp.target.cpu.arch.isArm()) {
1264 try p.attr_application_buf.append(gpa, .{
1265 .tag = .calling_convention,
1266 .args = .{ .calling_convention = .{ .cc = switch (attr.args.pcs.kind) {
1267 .aapcs => .arm_aapcs,
1268 .@"aapcs-vfp" => .arm_aapcs_vfp,
1269 } } },
1270 .syntax = attr.syntax,
1271 });
1272 } else {
1273 try p.err(tok, .callconv_not_supported, .{"pcs"});
1274 },
1275 .riscv_vector_cc => if (p.comp.target.cpu.arch.isRISCV()) {
1276 try p.attr_application_buf.append(gpa, .{
1277 .tag = .calling_convention,
1278 .args = .{ .calling_convention = .{ .cc = .riscv_vector } },
1279 .syntax = attr.syntax,
1280 });
1281 } else {
1282 try p.err(tok, .callconv_not_supported, .{"pcs"});
1283 },
1284 .aarch64_sve_pcs => if (p.comp.target.cpu.arch.isAARCH64()) {
1285 try p.attr_application_buf.append(gpa, .{
1286 .tag = .calling_convention,
1287 .args = .{ .calling_convention = .{ .cc = .aarch64_sve_pcs } },
1288 .syntax = attr.syntax,
1289 });
1290 } else {
1291 try p.err(tok, .callconv_not_supported, .{"pcs"});
1292 },
1293 .aarch64_vector_pcs => if (p.comp.target.cpu.arch.isAARCH64()) {
1294 try p.attr_application_buf.append(gpa, .{
1295 .tag = .calling_convention,
1296 .args = .{ .calling_convention = .{ .cc = .aarch64_vector_pcs } },
1297 .syntax = attr.syntax,
1298 });
1299 } else {
1300 try p.err(tok, .callconv_not_supported, .{"pcs"});
1301 },
1302 .sysv_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag == .windows) {
1303 try p.attr_application_buf.append(gpa, .{
1304 .tag = .calling_convention,
1305 .args = .{ .calling_convention = .{ .cc = .x86_64_sysv } },
1306 .syntax = attr.syntax,
1307 });
1308 },
1309 .ms_abi => if (p.comp.target.cpu.arch == .x86_64 and p.comp.target.os.tag != .windows) {
1310 try p.attr_application_buf.append(gpa, .{
1311 .tag = .calling_convention,
1312 .args = .{ .calling_convention = .{ .cc = .x86_64_win } },
1313 .syntax = attr.syntax,
1314 });
1315 },
1316 else => unreachable,
1317 }
1318}
1319
1320fn applyBoundsSafetyAttr(bounds: Type.Pointer.Bounds, p: *Parser, tok: TokenIndex, qt: *QualType) !void {
1321 if (qt.isInvalid()) return;
1322 const pointer = qt.get(p.comp, .pointer) orelse {
1323 return p.err(tok, .attribute_requires_pointer, .{@tagName(bounds)});
1324 };
1325 if (pointer.bounds == bounds) {
1326 return p.err(tok, .redundant_bounds_annotation, .{@tagName(bounds)});
1327 }
1328 if (pointer.bounds != .c) {
1329 return p.err(tok, .multiple_bounds_annotations, .{});
1330 }
1331 qt.* = try p.comp.type_store.put(p.comp.gpa, .{ .pointer = .{
1332 .child = pointer.child,
1333 .decayed = pointer.decayed,
1334 .bounds = bounds,
1335 } });
1336}
1337
1338/// These come from explicit MSVC keywords like __stdcall, __fastcall, etc
1339fn applyKeywordCallingConvention(attr: Attribute, p: *Parser, tok: TokenIndex, qt: QualType) !void {
1340 if (!qt.isCallable(p.comp)) {
1341 return p.err(tok, .callconv_non_func, .{ p.tokSlice(tok), qt });
12681342 }
12691343 switch (attr.args.calling_convention.cc) {
12701344 .c => {},
......@@ -1295,3 +1369,15 @@ fn applySelected(qt: QualType, p: *Parser) !QualType {
12951369 .attributes = p.attr_application_buf.items,
12961370 } })).withQualifiers(qt);
12971371}
1372
1373pub fn visibilityFromString(s: []const u8) ?std.builtin.SymbolVisibility {
1374 if (mem.eql(u8, s, "internal")) {
1375 return .hidden;
1376 }
1377 const visibility = std.meta.stringToEnum(std.builtin.SymbolVisibility, s) orelse return null;
1378 // compiler will notify us if .internal is added as a visibility type
1379 switch (visibility) {
1380 .default, .hidden, .protected => {},
1381 }
1382 return visibility;
1383}
lib/compiler/aro/aro/Attribute/names.zig+604-589
......@@ -99,6 +99,7 @@ pub const Tag = enum(u16) { aarch64_sve_pcs,
9999 selectany,
100100 sentinel,
101101 simd,
102 single,
102103 spectre,
103104 stack_protect,
104105 stdcall,
......@@ -112,6 +113,7 @@ pub const Tag = enum(u16) { aarch64_sve_pcs,
112113 transparent_union,
113114 unavailable,
114115 uninitialized,
116 unsafe_indexable,
115117 unsequenced,
116118 unused,
117119 used,
......@@ -181,7 +183,7 @@ pub const longest_name = 30;
181183/// If found, returns the index of the node within the `dafsa` array.
182184/// Otherwise, returns `null`.
183185pub fn findInList(first_child_index: u16, char: u8) ?u16 {
184 @setEvalBranchQuota(234);
186 @setEvalBranchQuota(238);
185187 var index = first_child_index;
186188 while (true) {
187189 if (dafsa[index].char == char) return index;
......@@ -290,9 +292,9 @@ const dafsa = [_]Node{
290292 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 25, .child_index = 47 },
291293 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 49 },
292294 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 54 },
293 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 11, .child_index = 56 },
295 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 56 },
294296 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 63 },
295 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 67 },
297 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 7, .child_index = 67 },
296298 .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 70 },
297299 .{ .char = 'w', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 72 },
298300 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 74 },
......@@ -334,642 +336,653 @@ const dafsa = [_]Node{
334336 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 130 },
335337 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 131 },
336338 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 132 },
337 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 135 },
338 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 136 },
339 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 137 },
340 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 139 },
341 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 141 },
342 .{ .char = 'h', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 142 },
343 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 144 },
344 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 145 },
345 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 146 },
346 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 150 },
347 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
348 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 152 },
349 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 153 },
350 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 154 },
351 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 155 },
352 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 156 },
353 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 157 },
354 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 158 },
355 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 159 },
356 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 161 },
357 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 162 },
358 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 163 },
359 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 164 },
360 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 165 },
361 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 166 },
362 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 167 },
339 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 135 },
340 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 137 },
341 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 138 },
342 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 140 },
343 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 142 },
344 .{ .char = 'h', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 143 },
345 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 145 },
346 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 146 },
347 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 147 },
348 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 151 },
349 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 152 },
350 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 153 },
351 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 154 },
352 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 155 },
353 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 156 },
354 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 157 },
355 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 158 },
356 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 159 },
357 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 160 },
358 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 162 },
359 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 163 },
360 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 164 },
361 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 165 },
362 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 166 },
363 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 167 },
363364 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 168 },
364 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 169 },
365 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 170 },
366 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 },
367 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 172 },
368 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 },
369 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 },
370 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 175 },
371 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 177 },
372 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 179 },
373 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 },
374 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 181 },
375 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 182 },
376 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 183 },
377 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 184 },
378 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 185 },
379 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
365 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 169 },
366 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 170 },
367 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 },
368 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 172 },
369 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 173 },
370 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 },
371 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 175 },
372 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 176 },
373 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 178 },
374 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 },
375 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 181 },
376 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 182 },
377 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 183 },
378 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 184 },
379 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 185 },
380380 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 186 },
381 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 187 },
382 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 188 },
383 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 },
384 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 190 },
385 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 191 },
386 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },
387 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
388 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },
389 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 13, .child_index = 195 },
390 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 200 },
391 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 201 },
392 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 203 },
393 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 204 },
394 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 206 },
395 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 207 },
396 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 208 },
397 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 209 },
398 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 110 },
381 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
382 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 187 },
383 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 188 },
384 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 },
385 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 190 },
386 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 191 },
387 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 192 },
388 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
389 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 195 },
390 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
391 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 13, .child_index = 196 },
392 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 201 },
393 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 202 },
394 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 204 },
395 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 205 },
396 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 207 },
397 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 208 },
398 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 209 },
399399 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 210 },
400 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 110 },
401 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 211 },
400402 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
401 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 211 },
403 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 212 },
402404 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 76 },
403 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },
404 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 212 },
405 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 213 },
406 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 214 },
407 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 216 },
408 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 217 },
409 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 218 },
410 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 219 },
411 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 220 },
412 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 221 },
413 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },
414 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 222 },
415 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 223 },
416 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 },
417 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 225 },
418 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 },
419 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 227 },
420 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 228 },
421 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 229 },
422 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 230 },
423 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 },
424 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 232 },
425 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 233 },
426 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 234 },
427 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 235 },
428 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },
429 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },
430 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 236 },
431 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 237 },
432 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 238 },
433 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 239 },
434 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 240 },
435 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 241 },
436 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 242 },
405 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
406 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 213 },
407 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 214 },
408 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 215 },
409 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 217 },
410 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 218 },
411 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 219 },
412 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 220 },
413 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 221 },
414 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 222 },
415 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 171 },
416 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 223 },
417 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 },
418 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 225 },
419 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 },
420 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 227 },
421 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 228 },
422 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 229 },
423 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 230 },
424 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 },
425 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 232 },
426 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 233 },
427 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 234 },
428 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 235 },
429 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 236 },
430 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 },
431 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
432 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
433 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 239 },
434 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 240 },
435 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 241 },
436 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 242 },
437 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 243 },
438 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 244 },
439 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 245 },
437440 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 122 },
438 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 243 },
439 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 244 },
440 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 245 },
441 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 246 },
442 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 247 },
443 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 248 },
444 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 249 },
445 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },
446 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 251 },
447 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 252 },
441 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 246 },
442 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 247 },
443 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 248 },
444 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 249 },
445 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },
446 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 251 },
447 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 252 },
448 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
449 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 254 },
450 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 255 },
448451 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
449 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
450 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 254 },
452 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 256 },
453 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 257 },
451454 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
452 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 255 },
453 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 256 },
454 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 257 },
455 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 258 },
456 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 259 },
457 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 },
458 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 261 },
459 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 262 },
460 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 },
461 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 },
462 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 264 },
463 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 265 },
464 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },
465 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 267 },
466 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 268 },
455 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 258 },
456 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 259 },
457 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 },
458 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 261 },
459 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 262 },
460 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 },
461 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 264 },
462 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 265 },
463 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 },
464 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },
465 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 267 },
466 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 268 },
467 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
468 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 270 },
469 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 271 },
467470 .{ .char = 'f', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
468 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
469 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 270 },
470 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 271 },
471 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 272 },
472 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 273 },
473 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 274 },
471474 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
472 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 272 },
473 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 273 },
474 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 274 },
475 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 },
476 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 277 },
477 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 278 },
478 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },
479 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 282 },
480 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 283 },
481 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 284 },
482 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 285 },
483 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 287 },
484 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 288 },
475 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 275 },
476 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 },
477 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 277 },
478 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 279 },
479 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 280 },
480 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 281 },
481 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 284 },
482 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 285 },
483 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 286 },
484 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 287 },
485 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 288 },
486 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 290 },
487 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 291 },
485488 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
486 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 289 },
487 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 290 },
488 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 291 },
489 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 292 },
490 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 293 },
491 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 294 },
492 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 295 },
493 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 296 },
494 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 297 },
495 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 298 },
496 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 299 },
497 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 },
489 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 292 },
490 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 293 },
491 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 294 },
492 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 295 },
493 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 296 },
494 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 297 },
495 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 298 },
496 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 299 },
497 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 },
498498 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },
499 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 302 },
500 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 },
501 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 304 },
502 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 },
503 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },
499 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 302 },
500 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 },
501 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 304 },
502 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 },
503 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },
504 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 307 },
505 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 308 },
506 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 },
507 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 },
504508 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 109 },
505 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 307 },
506 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 224 },
507 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 308 },
508 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 },
509 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 },
510 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 311 },
511 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 312 },
512 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 313 },
513 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },
514 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 314 },
515 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 },
516 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 316 },
517 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 318 },
518 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 319 },
519 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 320 },
509 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 311 },
510 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 226 },
511 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 312 },
512 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 313 },
513 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 },
514 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 },
515 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 316 },
516 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 317 },
517 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 318 },
518 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
519 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 319 },
520 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 320 },
521 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 321 },
522 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 323 },
523 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 324 },
524 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 325 },
520525 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
521 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 321 },
522 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 322 },
523 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 324 },
524 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 325 },
525 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 326 },
526 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 327 },
527 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 328 },
526 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 326 },
527 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 327 },
528 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 329 },
529 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 330 },
530 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },
531 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 332 },
532 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 333 },
528533 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
529 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 329 },
530 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 330 },
531 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },
532 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 332 },
533 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 333 },
534 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 334 },
535 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
536 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
537 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
534 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 334 },
535 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
536 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
537 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 337 },
538 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 338 },
539 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 339 },
540 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 340 },
541 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 },
542 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 },
538543 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
539 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 337 },
540 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 338 },
541 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 339 },
542 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 340 },
543 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 341 },
544 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 342 },
545 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 343 },
546 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 344 },
547 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 345 },
548 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 346 },
544549 .{ .char = 'c', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
545 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 342 },
546 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 344 },
547 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },
548 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 200 },
549 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 345 },
550 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 346 },
551 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 347 },
552 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 189 },
553 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 348 },
554 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 349 },
550 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 347 },
551 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 349 },
552 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
553 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 201 },
555554 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 350 },
556 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 351 },
557 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 352 },
558 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 353 },
559 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 354 },
560 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 },
561 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
562 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 356 },
555 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 351 },
556 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 352 },
557 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 190 },
558 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 353 },
559 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 354 },
560 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 },
561 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 356 },
562 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 357 },
563 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 358 },
564 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 359 },
565 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 },
566 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 172 },
567 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 361 },
563568 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 101 },
564 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 357 },
569 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 },
565570 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
566 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 358 },
567 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 359 },
568 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 },
569 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 361 },
570 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 },
571 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 363 },
572 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 364 },
573 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },
574 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 365 },
575 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 366 },
576 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 367 },
577 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 368 },
578 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
579 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 369 },
580 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 370 },
571 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 363 },
572 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 364 },
573 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 365 },
574 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 366 },
575 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 367 },
576 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 368 },
577 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 369 },
578 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
579 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 370 },
580 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 371 },
581 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 },
582 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 373 },
583 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 256 },
584 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 374 },
585 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 375 },
586 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
581587 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 125 },
582 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 371 },
583 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 },
584 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 },
585 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 373 },
586 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },
587 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 374 },
588 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 375 },
589 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 376 },
590 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 },
591 .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 378 },
592 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 379 },
593 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 380 },
594 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 381 },
595 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 },
596 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 384 },
597 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 385 },
598 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 386 },
599 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },
588 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 376 },
589 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 },
590 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 },
591 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 378 },
592 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
593 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 379 },
594 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 380 },
595 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 381 },
596 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 382 },
597 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 },
598 .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 384 },
599 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 385 },
600 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 386 },
600601 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 387 },
601 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 389 },
602 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 185 },
603 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 390 },
604 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 391 },
605 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 392 },
606 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 315 },
607 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 393 },
608 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 394 },
602 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 389 },
603 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 390 },
604 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 391 },
605 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 392 },
606 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
607 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 393 },
608 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 395 },
609 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 186 },
610 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 396 },
611 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 },
612 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 },
613 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 320 },
614 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 399 },
615 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 400 },
609616 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
610 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
611 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 395 },
612 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 396 },
613 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 },
614 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 },
615 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 399 },
616 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 400 },
617 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },
618 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 401 },
617 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 340 },
618 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 401 },
619619 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 402 },
620 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 403 },
621 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 404 },
622 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 405 },
623 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 406 },
620 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 403 },
621 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 404 },
622 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 405 },
623 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 406 },
624 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
625 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 407 },
626 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 408 },
627 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 409 },
628 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 410 },
629 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 411 },
630 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 412 },
624631 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
625 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 407 },
626 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 408 },
627 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 409 },
628 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 410 },
629 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 411 },
630 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 412 },
631 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 413 },
632 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 413 },
633 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 414 },
634 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 415 },
635 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 416 },
636 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 417 },
637 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 418 },
638 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 419 },
632639 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
633 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },
634 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 414 },
635 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 },
636 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 415 },
637 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 416 },
638 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 417 },
639 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 418 },
640 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 },
641 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 420 },
642 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 },
643 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 422 },
644 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 423 },
645 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 424 },
646 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 425 },
647 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 426 },
648 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 },
649 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 428 },
650 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },
651 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 429 },
652 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 430 },
653 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 431 },
654 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 432 },
655 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 },
656 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 434 },
657 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 435 },
658 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
659 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 438 },
660 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 439 },
661 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 },
662 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 189 },
663 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 441 },
664 .{ .char = '4', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 442 },
665 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 443 },
666 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 },
667 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 445 },
668 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 295 },
669 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
670 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
671 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
640 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
641 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 420 },
642 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 360 },
643 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 },
644 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 422 },
645 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 423 },
646 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 424 },
647 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 425 },
648 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 426 },
649 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 },
650 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 428 },
651 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 429 },
652 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 430 },
653 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 431 },
654 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 432 },
655 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 },
656 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 434 },
657 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
658 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 435 },
659 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 436 },
660 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
661 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 438 },
662 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 439 },
672663 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 },
673 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 449 },
674 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 },
675 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 },
676 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 452 },
677 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 453 },
678 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 454 },
664 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 441 },
665 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 442 },
666 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 },
667 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 445 },
668 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 446 },
669 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
670 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 190 },
671 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
672 .{ .char = '4', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 449 },
673 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 450 },
674 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 },
675 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 452 },
676 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 298 },
677 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 454 },
679678 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 455 },
680 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 357 },
679 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
680 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
681681 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 456 },
682 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 457 },
683 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 458 },
684 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 459 },
685 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 460 },
686 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 },
687 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 462 },
688 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 463 },
689 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 464 },
690 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 465 },
691 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 466 },
692 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 467 },
693 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 383 },
694 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },
682 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 457 },
683 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 458 },
684 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 459 },
685 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 460 },
686 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 },
687 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 462 },
688 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 362 },
689 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 463 },
690 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 464 },
691 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 465 },
692 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 466 },
693 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 467 },
694 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 468 },
695 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 469 },
696 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 470 },
697 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 471 },
698 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 472 },
699 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 473 },
700 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 474 },
701 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 389 },
702 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
695703 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
696 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 468 },
697 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 469 },
698 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 470 },
704 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 475 },
705 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 },
706 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 477 },
699707 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
700 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 471 },
701 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 472 },
702 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 473 },
703 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 474 },
704 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 475 },
705 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },
706 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 },
707 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 477 },
708 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 },
709 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 478 },
710 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 479 },
711 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 480 },
712 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 481 },
713 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 482 },
714 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 305 },
715 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 483 },
716 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 484 },
717 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 485 },
708 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 478 },
709 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 479 },
710 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 480 },
711 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 481 },
712 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 482 },
713 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
714 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 483 },
715 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 484 },
716 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 433 },
717 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 485 },
718 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
719 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 487 },
720 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 488 },
721 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 489 },
722 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 490 },
723 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 309 },
724 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 491 },
725 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 492 },
726 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 493 },
718727 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
719 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
720 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 487 },
721 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 489 },
722 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 490 },
723 .{ .char = 'e', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
724 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 260 },
725 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 491 },
726 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 492 },
727 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },
728 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 493 },
729 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 179 },
730 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
731 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 494 },
732 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 495 },
733 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 496 },
728 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 494 },
729 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 495 },
734730 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 497 },
735 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 498 },
731 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 498 },
732 .{ .char = 'e', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
733 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 263 },
736734 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 499 },
737 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 500 },
738 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 501 },
739 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 502 },
740 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 },
741 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },
742 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 504 },
743 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 505 },
744 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 506 },
745 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 170 },
746 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 507 },
747 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 508 },
748 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 },
749 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 510 },
750 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },
751 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 513 },
752 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 514 },
753 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 },
754 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 515 },
755 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 516 },
756 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 },
757 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 518 },
758 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 519 },
759 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 520 },
760 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 444 },
761 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 521 },
762 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 522 },
763 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 },
764 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 },
765 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 525 },
766 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 },
767 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 527 },
768 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },
769 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 250 },
770 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 528 },
771 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 },
772 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 530 },
773 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 531 },
774 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 440 },
775 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 532 },
776 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 533 },
777 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 534 },
778 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 235 },
779 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 535 },
780 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 536 },
735 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 500 },
736 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
737 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 501 },
738 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 180 },
739 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
740 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 502 },
741 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 },
742 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 504 },
743 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 505 },
744 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 506 },
745 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 507 },
746 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 508 },
747 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 },
748 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 510 },
749 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 511 },
750 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 },
751 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 512 },
752 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 513 },
753 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 514 },
754 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 171 },
755 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 515 },
756 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 516 },
757 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 },
758 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 518 },
759 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 520 },
760 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 521 },
761 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 522 },
762 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 },
763 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 },
764 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 },
765 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 525 },
766 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 },
767 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 527 },
768 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 528 },
769 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 },
770 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 451 },
771 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 530 },
772 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 531 },
773 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 532 },
774 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 533 },
775 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 534 },
776 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 535 },
777 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 536 },
778 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
779 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 253 },
781780 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 537 },
782 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 538 },
783 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 539 },
784 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 540 },
785 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 542 },
781 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 538 },
782 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 539 },
783 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 540 },
784 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
785 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 541 },
786 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 542 },
787 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 543 },
788 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 },
789 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 544 },
790 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 545 },
791 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 546 },
792 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 547 },
793 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 548 },
794 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 549 },
795 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 551 },
786796 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
787 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 518 },
788 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 543 },
789 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 544 },
790 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 545 },
791 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 546 },
792 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 547 },
793 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 548 },
794 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 549 },
795 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 550 },
796 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 551 },
797 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 552 },
798 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },
799 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 },
800 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 553 },
801 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },
802 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 },
803 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 556 },
804 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 557 },
805 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 331 },
806 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 558 },
807 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
808 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 560 },
809 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },
810 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 562 },
811 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 563 },
812 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 564 },
813 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 565 },
814 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 },
815 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
816 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 568 },
817 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 },
818 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 570 },
819 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 },
797 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 526 },
798 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 552 },
799 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 553 },
800 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },
801 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 },
802 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 556 },
803 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 557 },
804 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 558 },
805 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
806 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },
807 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 560 },
808 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },
809 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
810 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 },
811 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 562 },
812 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 563 },
813 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 564 },
814 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 565 },
815 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 },
816 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 336 },
817 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
818 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 568 },
819 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 },
820 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 570 },
821 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 },
820822 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
821 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 573 },
822 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 574 },
823 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 575 },
823 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 573 },
824 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 574 },
825 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 575 },
826 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 576 },
827 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 577 },
828 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 578 },
829 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 579 },
830 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 580 },
831 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 581 },
832 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 582 },
833 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 583 },
834 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 },
824835 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
825 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 576 },
826 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 577 },
827 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 578 },
828 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 579 },
829 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },
830 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 580 },
831 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 581 },
832 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 582 },
833 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 583 },
834 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 },
835 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 585 },
836 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 },
837 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 587 },
838 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 588 },
839 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
836 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 585 },
837 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 },
838 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 587 },
839 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 588 },
840840 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 589 },
841 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 590 },
842 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },
843 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 591 },
841 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 590 },
842 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 591 },
844843 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 592 },
845844 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 593 },
846 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 594 },
847 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 595 },
848 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 },
849 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 597 },
850 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 598 },
851 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 599 },
852 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 600 },
853 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 601 },
854 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 602 },
855 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 421 },
856 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 603 },
857 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 604 },
858 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },
859 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 392 },
860 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 605 },
861 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 606 },
862 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 607 },
863 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 608 },
864 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 150 },
865 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 609 },
866 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 },
867 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 },
868 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 612 },
869 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 613 },
870 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 614 },
871 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 615 },
872 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 616 },
873 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 620 },
874 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 },
875 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 622 },
876 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 623 },
877 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 624 },
878 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },
879 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 625 },
880 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 626 },
845 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 594 },
846 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 595 },
847 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 },
848 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 597 },
849 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 598 },
850 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
851 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 599 },
852 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 600 },
853 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
854 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 601 },
855 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 602 },
856 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 603 },
857 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 604 },
858 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 605 },
859 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 606 },
860 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 607 },
861 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 608 },
862 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 609 },
863 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 },
864 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 },
865 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 612 },
866 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 427 },
867 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 613 },
868 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 614 },
869 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
870 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 615 },
871 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 398 },
872 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 616 },
873 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 617 },
874 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 618 },
875 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 619 },
876 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 151 },
877 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 620 },
878 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 },
879 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 622 },
880 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 623 },
881 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 624 },
882 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 625 },
883 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 626 },
884 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 627 },
885 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 631 },
886 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },
887 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
888 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 634 },
889 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 635 },
890 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
891 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 636 },
892 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 637 },
881893 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
882 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 627 },
883 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 628 },
884 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 629 },
885 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 630 },
886 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 631 },
887 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 621 },
888 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },
889 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
890 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 634 },
891 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 635 },
892 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 636 },
893 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 348 },
894 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 637 },
895 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 638 },
896 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 639 },
897 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
898 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 },
894 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 638 },
895 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
896 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 639 },
897 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
898 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 },
899 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 642 },
900 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },
901 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 643 },
902 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 },
903 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 645 },
904 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 646 },
905 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 647 },
906 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 353 },
907 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 648 },
908 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 649 },
909 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 650 },
910 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 651 },
911 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 652 },
899912 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 101 },
900 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 642 },
901 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 643 },
902 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 372 },
903 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 },
904 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 645 },
905 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 646 },
906 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 647 },
907 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 648 },
908 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
909 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 584 },
910 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 509 },
911 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
912 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 650 },
913 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 651 },
914 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 652 },
915 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 653 },
916 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 654 },
917 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 655 },
918 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 656 },
919 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
920 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 397 },
921 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 },
922 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 266 },
923 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 },
924 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 300 },
913 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 653 },
914 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 654 },
915 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 377 },
916 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 655 },
917 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 656 },
918 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 },
919 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 },
925920 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 659 },
926 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 660 },
927 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 193 },
928 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 306 },
929 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 661 },
921 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
922 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 594 },
923 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 517 },
924 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 660 },
925 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 661 },
930926 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 662 },
931 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 },
932 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 664 },
933 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 229 },
934 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 665 },
935 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 666 },
936 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 350 },
937 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 667 },
938 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 668 },
939 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 669 },
940 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 670 },
941 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 158 },
942 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 671 },
927 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 },
928 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 664 },
929 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 665 },
930 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 666 },
931 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 667 },
932 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
933 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 403 },
934 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 668 },
935 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 269 },
936 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 669 },
937 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 303 },
938 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 670 },
939 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 671 },
940 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 194 },
941 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 310 },
943942 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 672 },
944 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 673 },
945 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 207 },
946 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 674 },
947 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 675 },
948 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 676 },
949 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
950 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 677 },
951 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 678 },
952 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 679 },
953 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 680 },
954 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 219 },
955 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 586 },
956 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 681 },
957 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
958 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 682 },
959 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 683 },
960 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 684 },
961 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 685 },
962 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 686 },
943 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 673 },
944 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 674 },
945 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 675 },
946 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 231 },
947 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 676 },
948 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 677 },
949 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 355 },
950 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 678 },
951 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 679 },
952 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 680 },
953 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 681 },
954 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 159 },
955 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 682 },
956 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 683 },
957 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 684 },
958 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 208 },
959 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 685 },
960 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 686 },
963961 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 687 },
964 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 688 },
965 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 689 },
966 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 690 },
967 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 173 },
968 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 691 },
962 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 644 },
963 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 688 },
964 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 689 },
965 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 690 },
966 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 691 },
967 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 220 },
968 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 596 },
969 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 692 },
970 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
971 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 693 },
972 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 694 },
973 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 695 },
974 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 696 },
975 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 697 },
976 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 698 },
977 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 699 },
978 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 700 },
979 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 701 },
980 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 174 },
981 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 702 },
969982 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 122 },
970983};
971984pub const data = blk: {
972 @setEvalBranchQuota(1053);
985 @setEvalBranchQuota(1071);
973986 break :blk [_]Properties{
974987 .{ .tag = .aarch64_sve_pcs, .gnu = true },
975988 .{ .tag = .aarch64_vector_pcs, .gnu = true },
......@@ -1062,6 +1075,7 @@ pub const data = blk: {
10621075 .{ .tag = .selectany, .gnu = true, .declspec = true },
10631076 .{ .tag = .sentinel, .gnu = true },
10641077 .{ .tag = .simd, .gnu = true },
1078 .{ .tag = .single, .gnu = true },
10651079 .{ .tag = .spectre, .declspec = true },
10661080 .{ .tag = .stack_protect, .gnu = true },
10671081 .{ .tag = .stdcall, .gnu = true },
......@@ -1075,6 +1089,7 @@ pub const data = blk: {
10751089 .{ .tag = .transparent_union, .gnu = true },
10761090 .{ .tag = .unavailable, .gnu = true },
10771091 .{ .tag = .uninitialized, .gnu = true },
1092 .{ .tag = .unsafe_indexable, .gnu = true },
10781093 .{ .tag = .unsequenced, .c23 = true },
10791094 .{ .tag = .unused, .gnu = true },
10801095 .{ .tag = .used, .gnu = true },
lib/compiler/aro/aro/Builtins.zig-1
......@@ -264,7 +264,6 @@ fn createType(desc: TypeDescription, it: *TypeDescription.TypeIterator, comp: *C
264264 _ = address_space; // TODO: handle address space
265265 const pointer_qt = try comp.type_store.put(comp.gpa, .{ .pointer = .{
266266 .child = builder.finish() catch unreachable,
267 .decayed = null,
268267 } });
269268
270269 builder.@"const" = null;
lib/compiler/aro/aro/Builtins/common.zig+874-863
......@@ -751,6 +751,8 @@ pub const Tag = enum(u16) { _Block_object_assign,
751751 __builtin_usubl_overflow,
752752 __builtin_usubll_overflow,
753753 __builtin_va_arg,
754 __builtin_va_arg_pack,
755 __builtin_va_arg_pack_len,
754756 __builtin_va_copy,
755757 __builtin_va_end,
756758 __builtin_va_start,
......@@ -1436,7 +1438,7 @@ pub const longest_name = 41;
14361438/// If found, returns the index of the node within the `dafsa` array.
14371439/// Otherwise, returns `null`.
14381440pub fn findInList(first_child_index: u16, char: u8) ?u16 {
1439 @setEvalBranchQuota(2744);
1441 @setEvalBranchQuota(2748);
14401442 var index = first_child_index;
14411443 while (true) {
14421444 if (dafsa[index].char == char) return index;
......@@ -1531,7 +1533,7 @@ const Node = packed struct {
15311533
15321534const dafsa = [_]Node{
15331535 .{ .char = 0, .end_of_word = false, .end_of_list = true, .number = 0, .child_index = 1 },
1534 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1016, .child_index = 19 },
1536 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1018, .child_index = 19 },
15351537 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 25, .child_index = 31 },
15361538 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 36 },
15371539 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 82, .child_index = 38 },
......@@ -1553,7 +1555,7 @@ const dafsa = [_]Node{
15531555 .{ .char = 'E', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 102 },
15541556 .{ .char = 'I', .end_of_word = false, .end_of_list = false, .number = 29, .child_index = 103 },
15551557 .{ .char = 'R', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 104 },
1556 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 938, .child_index = 105 },
1558 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 940, .child_index = 105 },
15571559 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 123 },
15581560 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 11, .child_index = 125 },
15591561 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 127 },
......@@ -1637,7 +1639,7 @@ const dafsa = [_]Node{
16371639 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 238 },
16381640 .{ .char = 'G', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 239 },
16391641 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 34, .child_index = 240 },
1640 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 694, .child_index = 245 },
1642 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 696, .child_index = 245 },
16411643 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 19, .child_index = 246 },
16421644 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 248 },
16431645 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 249 },
......@@ -1775,7 +1777,7 @@ const dafsa = [_]Node{
17751777 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 398 },
17761778 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 399 },
17771779 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 400 },
1778 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 401 },
1780 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 401 },
17791781 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 17, .child_index = 402 },
17801782 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 403 },
17811783 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 404 },
......@@ -1931,7 +1933,7 @@ const dafsa = [_]Node{
19311933 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 523 },
19321934 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 524 },
19331935 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 525 },
1934 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 526 },
1936 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 526 },
19351937 .{ .char = '1', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 527 },
19361938 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 528 },
19371939 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 529 },
......@@ -2056,7 +2058,7 @@ const dafsa = [_]Node{
20562058 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 610 },
20572059 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 611 },
20582060 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 612 },
2059 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 613 },
2061 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 613 },
20602062 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 614 },
20612063 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 615 },
20622064 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 616 },
......@@ -2143,7 +2145,7 @@ const dafsa = [_]Node{
21432145 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 658 },
21442146 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
21452147 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 659 },
2146 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 660 },
2148 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 660 },
21472149 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 661 },
21482150 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 662 },
21492151 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 663 },
......@@ -2190,7 +2192,7 @@ const dafsa = [_]Node{
21902192 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 700 },
21912193 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 701 },
21922194 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 702 },
2193 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 703 },
2195 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 703 },
21942196 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 704 },
21952197 .{ .char = 'f', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
21962198 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 705 },
......@@ -2233,7 +2235,7 @@ const dafsa = [_]Node{
22332235 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 740 },
22342236 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 741 },
22352237 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 30, .child_index = 742 },
2236 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 754 },
2238 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 754 },
22372239 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 755 },
22382240 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 756 },
22392241 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
......@@ -2284,7 +2286,7 @@ const dafsa = [_]Node{
22842286 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 799 },
22852287 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 802 },
22862288 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 804 },
2287 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 694, .child_index = 805 },
2289 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 696, .child_index = 805 },
22882290 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 825 },
22892291 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 826 },
22902292 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 12, .child_index = 827 },
......@@ -2353,7 +2355,7 @@ const dafsa = [_]Node{
23532355 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 76, .child_index = 940 },
23542356 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 23, .child_index = 952 },
23552357 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 957 },
2356 .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 961 },
2358 .{ .char = 'v', .end_of_word = false, .end_of_list = false, .number = 14, .child_index = 961 },
23572359 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 99 },
23582360 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 17, .child_index = 966 },
23592361 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },
......@@ -2491,7 +2493,7 @@ const dafsa = [_]Node{
24912493 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1140 },
24922494 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1154 },
24932495 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1157 },
2494 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1158 },
2496 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 1158 },
24952497 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1159 },
24962498 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1160 },
24972499 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 },
......@@ -2688,7 +2690,7 @@ const dafsa = [_]Node{
26882690 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1387 },
26892691 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1388 },
26902692 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1371 },
2691 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1389 },
2693 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1389 },
26922694 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1393 },
26932695 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 174 },
26942696 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 176 },
......@@ -2919,7 +2921,7 @@ const dafsa = [_]Node{
29192921 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1574 },
29202922 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1575 },
29212923 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1576 },
2922 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1577 },
2924 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1577 },
29232925 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 509 },
29242926 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 510 },
29252927 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 511 },
......@@ -3107,1047 +3109,1054 @@ const dafsa = [_]Node{
31073109 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1728 },
31083110 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1729 },
31093111 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1730 },
3110 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1604 },
3111 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1731 },
3112 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1732 },
3113 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1733 },
3112 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1731 },
3113 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1732 },
3114 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1733 },
3115 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1734 },
31143116 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 236 },
31153117 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 857 },
3116 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1734 },
3118 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 },
31173119 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 863 },
3118 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 },
3120 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1736 },
31193121 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 867 },
3120 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1736 },
3121 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1735 },
3122 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1737 },
3123 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1739 },
3124 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1740 },
3125 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1741 },
3126 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1742 },
3127 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1743 },
3128 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1744 },
3129 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 },
3130 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1746 },
3131 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1747 },
3122 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1737 },
3123 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1736 },
3124 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1738 },
3125 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1740 },
3126 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1741 },
3127 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1742 },
3128 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1743 },
3129 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1744 },
3130 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1745 },
3131 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 },
3132 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1747 },
3133 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1748 },
31323134 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
3133 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1748 },
3134 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1749 },
3135 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1749 },
3136 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1750 },
31353137 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
31363138 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
31373139 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3138 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1750 },
3139 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 },
3140 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
3141 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1753 },
3142 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1754 },
3143 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1755 },
3140 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1751 },
3141 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
3142 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1753 },
3143 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1754 },
3144 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1755 },
3145 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1756 },
31443146 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 569 },
3145 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1756 },
3147 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1757 },
31463148 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1208 },
3147 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 },
3148 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 },
3149 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1761 },
3149 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 },
3150 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 },
3151 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 },
31503152 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },
3151 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 },
3153 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1763 },
31523154 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
3153 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1763 },
3155 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1764 },
31543156 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 641 },
3155 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1764 },
3156 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1765 },
3157 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1766 },
3158 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1767 },
3159 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1768 },
3160 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1770 },
3161 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1771 },
3162 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1772 },
3163 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1773 },
3164 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1774 },
3165 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1771 },
3166 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1775 },
3167 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1777 },
3168 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1777 },
3169 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1778 },
3170 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1779 },
3171 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1780 },
3172 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1782 },
3173 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1783 },
3174 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1784 },
3175 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1785 },
3176 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1786 },
3157 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1765 },
3158 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1766 },
3159 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1767 },
3160 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1768 },
3161 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1769 },
3162 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1771 },
3163 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1772 },
3164 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1773 },
3165 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1774 },
3166 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1775 },
3167 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1772 },
3168 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1776 },
3169 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1778 },
3170 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1778 },
3171 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1779 },
3172 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1780 },
3173 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1781 },
3174 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1783 },
3175 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1784 },
3176 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1785 },
3177 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1786 },
3178 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1787 },
31773179 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },
3178 .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1787 },
3180 .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1788 },
31793181 .{ .char = '6', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 633 },
3180 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1788 },
3181 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1789 },
3182 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1790 },
3183 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1791 },
3184 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1792 },
3185 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1793 },
3186 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1794 },
3187 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1795 },
3188 .{ .char = '2', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1796 },
3182 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1789 },
3183 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1790 },
3184 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1791 },
3185 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1792 },
3186 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1793 },
3187 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1794 },
3188 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1795 },
3189 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1796 },
3190 .{ .char = '2', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1797 },
31893191 .{ .char = '6', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3190 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1797 },
3192 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1798 },
31913193 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 236 },
31923194 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3193 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1798 },
3194 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1799 },
3195 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1800 },
3196 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1801 },
3197 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1803 },
3198 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1804 },
3199 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1805 },
3200 .{ .char = '2', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1796 },
3201 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1806 },
3202 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1807 },
3203 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1808 },
3204 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1809 },
3205 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1810 },
3206 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1811 },
3207 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1812 },
3208 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1813 },
3209 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1814 },
3210 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1815 },
3211 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1816 },
3212 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1817 },
3213 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1818 },
3214 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1819 },
3215 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 },
3216 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1820 },
3217 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1822 },
3218 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 },
3195 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1799 },
3196 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1800 },
3197 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1801 },
3198 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1802 },
3199 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1804 },
3200 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1805 },
3201 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1806 },
3202 .{ .char = '2', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1797 },
3203 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1807 },
3204 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1808 },
3205 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1809 },
3206 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1810 },
3207 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1811 },
3208 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1812 },
3209 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1813 },
3210 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1814 },
3211 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1815 },
3212 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1816 },
3213 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1817 },
3214 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1818 },
3215 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1819 },
3216 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1820 },
3217 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
3218 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1821 },
3219 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 },
32193220 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1824 },
3220 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1825 },
3221 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1825 },
3222 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1826 },
32213223 .{ .char = 'a', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
32223224 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
3223 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1826 },
3224 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1827 },
3225 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1827 },
3226 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1828 },
3227 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1829 },
3228 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1830 },
3229 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1831 },
3230 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1832 },
3231 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1833 },
3232 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 },
3225 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1827 },
3226 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1828 },
3227 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 1828 },
3228 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1829 },
3229 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1830 },
3230 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1831 },
3231 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1832 },
3232 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1833 },
3233 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 },
32333234 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 },
3234 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1836 },
3235 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1837 },
3235 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1836 },
3236 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1837 },
3237 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1838 },
32363238 .{ .char = 'y', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1278 },
3237 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1838 },
3238 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1839 },
3239 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1840 },
3240 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1841 },
3241 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1842 },
3242 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1843 },
3243 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1844 },
3239 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1839 },
3240 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1840 },
3241 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1841 },
3242 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1842 },
3243 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1843 },
3244 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1844 },
3245 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1845 },
32443246 .{ .char = 'o', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
32453247 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1674 },
3246 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1845 },
3247 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 1847 },
3248 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1846 },
3249 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 1848 },
32483250 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 3, .child_index = 1489 },
32493251 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
32503252 .{ .char = '_', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1458 },
32513253 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1327 },
3252 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1848 },
3254 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1849 },
32533255 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
3254 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1849 },
32553256 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1850 },
3257 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1851 },
32563258 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 287 },
3257 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 1851 },
3259 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 1852 },
32583260 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 },
3259 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1854 },
3260 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1855 },
3261 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1856 },
3262 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1857 },
3263 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1858 },
3264 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1859 },
3265 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1860 },
3266 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1861 },
3261 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1855 },
3262 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1856 },
3263 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1857 },
3264 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1858 },
3265 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1859 },
3266 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1860 },
3267 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1861 },
3268 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1862 },
3269 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1863 },
32673270 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
3268 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1862 },
3269 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1863 },
3270 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1864 },
3271 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1865 },
3272 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1866 },
3273 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1872 },
3274 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1883 },
3275 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1884 },
3276 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1885 },
3271 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1864 },
3272 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1865 },
3273 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1866 },
3274 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1867 },
3275 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 13, .child_index = 1868 },
3276 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 25, .child_index = 1874 },
3277 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1885 },
32773278 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1886 },
3278 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1887 },
3279 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1888 },
3280 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1889 },
3279 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1887 },
3280 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1888 },
3281 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1889 },
3282 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1890 },
3283 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1891 },
32813284 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 657 },
3282 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1890 },
3283 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1891 },
3285 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1892 },
3286 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 1893 },
32843287 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 571 },
3285 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1892 },
3286 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1893 },
3287 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1894 },
3288 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1895 },
3289 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1896 },
3288 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1894 },
3289 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1895 },
3290 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1896 },
3291 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 1897 },
3292 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1898 },
32903293 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 448 },
32913294 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
32923295 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 453 },
32933296 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
32943297 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 510 },
3295 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1897 },
3296 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1898 },
3297 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1899 },
3298 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1900 },
3299 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1901 },
3300 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1902 },
3301 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1774 },
3302 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 },
3303 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1904 },
3304 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1774 },
3305 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 },
3306 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1906 },
3307 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 },
3308 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1905 },
3309 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 },
3310 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1775 },
3298 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1899 },
3299 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1900 },
3300 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1901 },
3301 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1902 },
3302 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1903 },
3303 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1904 },
3304 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1775 },
3305 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 },
3306 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1906 },
3307 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1775 },
33113308 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1907 },
3312 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 },
3313 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1908 },
3309 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1908 },
3310 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 },
3311 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1907 },
3312 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1905 },
3313 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1776 },
3314 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1909 },
3315 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1836 },
3316 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1910 },
33143317 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },
3315 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1909 },
3316 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1911 },
3317 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1912 },
3318 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1911 },
3319 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1913 },
3320 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1914 },
33183321 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },
3319 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1915 },
3322 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1917 },
33203323 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3321 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1916 },
3322 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1917 },
3323 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1918 },
3324 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1919 },
3325 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1920 },
3326 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1921 },
3327 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 },
3328 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1923 },
3324 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1918 },
3325 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1919 },
3326 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1920 },
3327 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1921 },
3328 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 },
3329 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1923 },
3330 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 },
3331 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1925 },
33293332 .{ .char = '8', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3330 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 },
3331 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1925 },
3332 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1926 },
3333 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1927 },
3334 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1928 },
3335 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1929 },
3336 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1930 },
3337 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1931 },
3338 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1932 },
3339 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1933 },
3340 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1934 },
3333 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1926 },
3334 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1927 },
3335 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1928 },
3336 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1929 },
3337 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1930 },
3338 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1931 },
3339 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1932 },
3340 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1933 },
3341 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1934 },
3342 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1935 },
3343 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1936 },
33413344 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1513 },
3342 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1935 },
3343 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1936 },
3344 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1937 },
3345 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1937 },
3346 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1938 },
3347 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1939 },
33453348 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 698 },
3346 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1938 },
3347 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1939 },
3349 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1940 },
3350 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1941 },
33483351 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1241 },
3349 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1940 },
3350 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1941 },
3352 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1942 },
3353 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1943 },
33513354 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 998 },
3352 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1942 },
3353 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1943 },
3354 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1944 },
3355 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1944 },
3356 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1945 },
3357 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1946 },
33553358 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
3356 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1945 },
3359 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1947 },
33573360 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1525 },
3358 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1946 },
3359 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1947 },
3360 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1949 },
3361 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1948 },
3362 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1949 },
3363 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1951 },
33613364 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1318 },
3362 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1950 },
3363 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1951 },
3364 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1952 },
3365 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1953 },
3365 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1952 },
3366 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1953 },
33663367 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1954 },
3367 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1955 },
3368 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1955 },
3369 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1956 },
3370 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1957 },
33683371 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
3369 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1956 },
3370 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1957 },
3371 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1958 },
3372 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1959 },
3373 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1960 },
3374 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1961 },
3375 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1962 },
3376 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1963 },
3377 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1950 },
3378 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1967 },
3379 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1968 },
3380 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1969 },
3372 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1958 },
3373 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1959 },
3374 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1960 },
3375 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1961 },
3376 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 1962 },
3377 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1963 },
3378 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1964 },
3379 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 9, .child_index = 1965 },
3380 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1952 },
3381 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 1969 },
3382 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1970 },
3383 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1971 },
33813384 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
33823385 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1280 },
3383 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1922 },
3386 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1924 },
33843387 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 3, .child_index = 1489 },
33853388 .{ .char = 'l', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
3386 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1970 },
3387 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1971 },
3388 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1972 },
3389 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 },
3390 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 },
3391 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 },
3392 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 },
3393 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1977 },
3394 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1978 },
3389 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1972 },
3390 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 },
3391 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 },
3392 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 },
3393 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 },
3394 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1977 },
3395 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1978 },
3396 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1979 },
3397 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1980 },
3398 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1981 },
33953399 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3396 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1979 },
3397 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1980 },
3398 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1981 },
3400 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 1982 },
3401 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1983 },
3402 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1984 },
33993403 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1579 },
34003404 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1580 },
34013405 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 7, .child_index = 1587 },
3402 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1982 },
3406 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1985 },
34033407 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1583 },
34043408 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1588 },
3405 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1983 },
3406 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1985 },
3409 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1986 },
3410 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1988 },
34073411 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 791 },
34083412 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 792 },
34093413 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 794 },
34103414 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 795 },
34113415 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 797 },
34123416 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 798 },
3413 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1986 },
3417 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 1989 },
34143418 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1586 },
34153419 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 804 },
3416 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1988 },
3417 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1995 },
3418 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1996 },
3419 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1997 },
3420 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 1991 },
3421 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1998 },
3422 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1999 },
3423 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2000 },
34203424 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3421 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 1998 },
3422 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1999 },
3423 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2000 },
3424 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2001 },
3425 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2002 },
3426 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2003 },
3427 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2004 },
3428 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2005 },
3425 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2001 },
3426 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2002 },
3427 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2003 },
3428 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2004 },
3429 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2005 },
3430 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2006 },
3431 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2007 },
3432 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2008 },
34293433 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 791 },
34303434 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3431 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2006 },
3432 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2007 },
3433 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2008 },
3434 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2009 },
3435 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2010 },
3436 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },
3437 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2012 },
3438 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },
3439 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },
3440 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2013 },
3441 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3442 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2015 },
3443 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2016 },
3444 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2017 },
3435 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2009 },
3436 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2010 },
3437 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },
3438 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2012 },
3439 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2013 },
3440 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3441 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2015 },
3442 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3443 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3444 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2016 },
3445 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2017 },
3446 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2018 },
3447 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2019 },
3448 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2020 },
34453449 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1519 },
3446 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2018 },
3447 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2019 },
3448 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2020 },
3449 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2021 },
3450 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2022 },
3450 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2021 },
3451 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2022 },
3452 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2023 },
3453 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2024 },
3454 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2025 },
34513455 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 503 },
3452 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2023 },
3453 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2024 },
3454 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2025 },
3455 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2026 },
3456 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2026 },
3457 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2027 },
3458 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 },
3459 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2029 },
34563460 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 1295 },
3457 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2027 },
3458 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 },
3461 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2030 },
3462 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2031 },
34593463 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },
3460 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2029 },
3464 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2032 },
34613465 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },
3462 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2030 },
3463 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2031 },
3464 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2032 },
3465 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2033 },
3466 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2034 },
3467 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2035 },
3468 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2036 },
3469 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2037 },
3470 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2038 },
3471 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2039 },
3466 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2033 },
3467 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2034 },
3468 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2035 },
3469 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2036 },
3470 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2037 },
3471 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2038 },
3472 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2039 },
3473 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2040 },
3474 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },
3475 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2042 },
34723476 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 419 },
3473 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2040 },
3474 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },
3475 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2042 },
3476 .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2043 },
3477 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
3478 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2045 },
3479 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2046 },
3480 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2047 },
3481 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 },
3482 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2049 },
3483 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2050 },
3484 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2051 },
3485 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2052 },
3486 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2053 },
3487 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2054 },
3488 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 },
3489 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2055 },
3490 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2056 },
3491 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2057 },
3492 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2059 },
3493 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2060 },
3494 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2063 },
3495 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2064 },
3496 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 },
3497 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2065 },
3477 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2043 },
3478 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
3479 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2045 },
3480 .{ .char = 'q', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2046 },
3481 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2047 },
3482 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 },
3483 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2049 },
3484 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2050 },
3485 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2051 },
3486 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2052 },
3487 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2053 },
3488 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2054 },
3489 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2055 },
3490 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2056 },
3491 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2057 },
3492 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 },
3493 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2058 },
3494 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2059 },
3495 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2060 },
3496 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2062 },
3497 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2063 },
3498 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2066 },
3499 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2067 },
3500 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 },
3501 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2068 },
34983502 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },
34993503 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
3500 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2068 },
3501 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2069 },
3502 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1923 },
3504 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2071 },
3505 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2072 },
3506 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 1925 },
35033507 .{ .char = 'i', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 352 },
3504 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2070 },
3505 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2071 },
3506 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2072 },
3507 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2073 },
3508 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1982 },
3508 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2073 },
3509 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2074 },
3510 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 },
3511 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2076 },
3512 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1985 },
3513 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2077 },
35093514 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1661 },
3510 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2074 },
3511 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 },
3512 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2076 },
3513 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2077 },
3514 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2078 },
3515 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2078 },
3516 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2079 },
3517 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2080 },
3518 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2081 },
3519 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2082 },
35153520 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 236 },
35163521 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 851 },
35173522 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 851 },
35183523 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 854 },
35193524 .{ .char = 't', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 864 },
35203525 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 865 },
3521 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 2079 },
3522 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 },
3523 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2081 },
3524 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2082 },
3525 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2083 },
3526 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2084 },
3527 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2085 },
3528 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2086 },
3529 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2087 },
3530 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2088 },
3531 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2089 },
3532 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2090 },
3533 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2091 },
3534 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2092 },
3535 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2093 },
3536 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2094 },
3537 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2095 },
3538 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2096 },
3539 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 },
3526 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 12, .child_index = 2083 },
3527 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 },
3528 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2085 },
3529 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2086 },
3530 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2087 },
3531 .{ .char = 'u', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2088 },
3532 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2089 },
3533 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2090 },
3534 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2091 },
3535 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2092 },
3536 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2093 },
3537 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2094 },
3538 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2095 },
3539 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2096 },
3540 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 },
3541 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2098 },
3542 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2099 },
3543 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 10, .child_index = 2100 },
3544 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2101 },
35403545 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 476 },
3541 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2098 },
3542 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2099 },
3543 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2100 },
3544 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2101 },
3545 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2011 },
3546 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2102 },
3546 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2102 },
3547 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2103 },
3548 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2104 },
3549 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2105 },
3550 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2014 },
3551 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2106 },
35473552 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
3548 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2103 },
3549 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2104 },
3550 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2105 },
3551 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2106 },
3552 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2107 },
3553 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2108 },
3554 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2109 },
3555 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2110 },
3556 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2111 },
3557 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2112 },
3553 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2107 },
3554 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2108 },
3555 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2109 },
3556 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2110 },
3557 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2111 },
3558 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2112 },
3559 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2113 },
3560 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2114 },
3561 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2115 },
3562 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2116 },
35583563 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 281 },
3559 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2113 },
3560 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2114 },
3561 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2115 },
3564 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2117 },
3565 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2118 },
3566 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2119 },
35623567 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 568 },
3563 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2116 },
3564 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2117 },
3565 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2118 },
3566 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2119 },
3567 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2120 },
3568 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2120 },
35683569 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2121 },
3570 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2122 },
3571 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2123 },
3572 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2124 },
3573 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2125 },
35693574 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
3570 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2122 },
3575 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2126 },
35713576 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
3572 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2123 },
3573 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2124 },
3577 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2127 },
3578 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2128 },
35743579 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
3575 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2125 },
3576 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1822 },
3577 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2126 },
3580 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2129 },
3581 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1823 },
3582 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2130 },
35783583 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1423 },
3579 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },
3580 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2127 },
3581 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2128 },
3582 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2129 },
3584 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
3585 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2131 },
3586 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2132 },
3587 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2133 },
35833588 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 1479 },
35843589 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 1689 },
3585 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2130 },
3586 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2131 },
3587 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2132 },
3588 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2133 },
3589 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2135 },
3590 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2134 },
3591 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2135 },
3592 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2136 },
3593 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2137 },
3594 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2139 },
35903595 .{ .char = 'g', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
35913596 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 695 },
3592 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2136 },
3593 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2137 },
3594 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2138 },
3595 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2139 },
3596 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2141 },
3597 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2142 },
3598 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2143 },
3599 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2144 },
3597 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2140 },
3598 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2141 },
3599 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2142 },
3600 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2143 },
3601 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2145 },
3602 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2146 },
3603 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2147 },
3604 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2148 },
36003605 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
3601 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2145 },
3602 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2146 },
3603 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2147 },
3604 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2148 },
3605 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 },
3606 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2149 },
3607 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2150 },
3608 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 },
3609 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2152 },
3610 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 },
3611 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2108 },
3612 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2161 },
3613 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2161 },
3614 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2162 },
3606 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2149 },
3607 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2150 },
3608 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 },
3609 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2152 },
3610 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 },
3611 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2153 },
3612 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2154 },
3613 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2155 },
3614 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2156 },
3615 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 7, .child_index = 2157 },
3616 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 },
3617 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2112 },
3618 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2166 },
3619 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2166 },
3620 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2167 },
36153621 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3616 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2163 },
3617 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1759 },
3618 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2082 },
3622 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2168 },
3623 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1760 },
3624 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2086 },
36193625 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3620 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2164 },
3626 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2169 },
36213627 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3622 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2165 },
3623 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2166 },
3624 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2167 },
3625 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2168 },
3628 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2170 },
3629 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2171 },
3630 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2172 },
3631 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2173 },
36263632 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3627 .{ .char = 'E', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2169 },
3628 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2170 },
3629 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 10, .child_index = 2171 },
3633 .{ .char = 'E', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2174 },
3634 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2175 },
3635 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 10, .child_index = 2176 },
36303636 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3631 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2176 },
3632 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2177 },
3633 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2178 },
3634 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2179 },
3635 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2180 },
3636 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2181 },
3637 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2182 },
3638 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2183 },
3639 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2184 },
3640 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2185 },
3641 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 },
3642 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2186 },
3643 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2187 },
3644 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
3637 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2181 },
3638 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2182 },
3639 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2183 },
3640 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2184 },
3641 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2185 },
3642 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2186 },
3643 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2187 },
36453644 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2188 },
3646 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 },
3647 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2190 },
3648 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2191 },
3649 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2192 },
3650 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2193 },
3651 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 },
3652 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2195 },
3653 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2196 },
3654 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 },
3655 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2198 },
3656 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2199 },
3657 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2200 },
3658 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1943 },
3659 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 },
3660 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2202 },
3661 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2203 },
3662 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2204 },
3663 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2205 },
3664 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2206 },
3665 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2207 },
3666 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2208 },
3667 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2209 },
3668 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2210 },
3669 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2211 },
3670 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2212 },
3671 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2213 },
3672 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2214 },
3673 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2215 },
3674 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2216 },
3675 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2141 },
3676 .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2217 },
3677 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2217 },
3678 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2157 },
3679 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2145 },
3680 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2218 },
3681 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2219 },
3645 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 },
3646 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2190 },
3647 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 },
3648 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2191 },
3649 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2192 },
3650 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
3651 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2193 },
3652 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 },
3653 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2195 },
3654 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2196 },
3655 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 },
3656 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2198 },
3657 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2199 },
3658 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2200 },
3659 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 },
3660 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2202 },
3661 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2203 },
3662 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2204 },
3663 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2205 },
3664 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1945 },
3665 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2206 },
3666 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2207 },
3667 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2208 },
3668 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2209 },
3669 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2210 },
3670 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2211 },
3671 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2212 },
3672 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2213 },
3673 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2214 },
3674 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2215 },
3675 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2216 },
3676 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2217 },
3677 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2218 },
3678 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2219 },
3679 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2220 },
3680 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2221 },
3681 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2145 },
3682 .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2222 },
3683 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2222 },
3684 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2162 },
3685 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2149 },
3686 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2223 },
3687 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2224 },
36823688 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3683 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2220 },
3689 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2225 },
3690 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2226 },
36843691 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3685 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1757 },
3686 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1759 },
3692 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1758 },
3693 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 1760 },
36873694 .{ .char = 'o', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 572 },
3688 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1762 },
3695 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1763 },
36893696 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
36903697 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },
3691 .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1787 },
3698 .{ .char = '3', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1788 },
36923699 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 633 },
36933700 .{ .char = '8', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
36943701 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3695 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2161 },
3702 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2166 },
36963703 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3697 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2221 },
3698 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2222 },
3704 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2227 },
3705 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2228 },
36993706 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 },
37003707 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 1421 },
3701 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2223 },
3702 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2224 },
3703 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2225 },
3708 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2229 },
3709 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2230 },
3710 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2231 },
37043711 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },
37053712 .{ .char = '8', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
3706 .{ .char = 'A', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2226 },
3707 .{ .char = 'P', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2035 },
3708 .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2227 },
3709 .{ .char = 'M', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2228 },
3710 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2229 },
3711 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2230 },
3713 .{ .char = 'A', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2232 },
3714 .{ .char = 'P', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2038 },
3715 .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2233 },
3716 .{ .char = 'M', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2234 },
3717 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2235 },
3718 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2236 },
37123719 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },
3713 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2231 },
3714 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2232 },
3715 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2233 },
3716 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2234 },
3717 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2235 },
3718 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2236 },
3719 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 },
3720 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2238 },
3721 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2239 },
3720 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 },
3721 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2238 },
3722 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2239 },
3723 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2240 },
3724 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2241 },
3725 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2242 },
3726 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2243 },
3727 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2244 },
3728 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2245 },
37223729 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
3723 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2240 },
3730 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2246 },
37243731 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
3725 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2241 },
3726 .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2242 },
3727 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2243 },
3728 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2244 },
3729 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2245 },
3730 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2201 },
3731 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2246 },
3732 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2247 },
3733 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2248 },
3732 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2247 },
3733 .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2248 },
3734 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2249 },
3735 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2250 },
3736 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2251 },
3737 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2206 },
3738 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 5, .child_index = 2252 },
3739 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2253 },
3740 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2254 },
37343741 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 566 },
3735 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2249 },
3736 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
3737 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2250 },
3738 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2251 },
3739 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2252 },
3740 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2253 },
3741 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2254 },
3742 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2231 },
3743 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2255 },
3744 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2256 },
3745 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2257 },
3746 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2258 },
3747 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2259 },
3748 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2260 },
3749 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2261 },
3750 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2262 },
3751 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2263 },
3752 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2264 },
3753 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2265 },
3754 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2266 },
3755 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2267 },
3756 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2268 },
3757 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2269 },
3742 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2255 },
3743 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1753 },
3744 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2256 },
3745 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2257 },
3746 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2258 },
3747 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2259 },
3748 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2260 },
3749 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2237 },
3750 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2261 },
3751 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2262 },
3752 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2263 },
3753 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2264 },
3754 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2265 },
3755 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2266 },
3756 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2267 },
3757 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2268 },
3758 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2269 },
3759 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2270 },
3760 .{ .char = 'k', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2271 },
3761 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2272 },
3762 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2273 },
3763 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2274 },
3764 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2275 },
3765 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2276 },
37583766 .{ .char = '1', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 632 },
37593767 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 1430 },
3760 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2270 },
3761 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2271 },
3768 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2277 },
3769 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2278 },
37623770 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3763 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2272 },
3771 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2279 },
37643772 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3765 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2273 },
3766 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2274 },
3767 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2275 },
3768 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2276 },
3769 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2277 },
3770 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2278 },
3771 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2279 },
3773 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2280 },
3774 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2281 },
3775 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2282 },
3776 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2283 },
3777 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2284 },
3778 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2285 },
3779 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2286 },
37723780 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3773 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2281 },
3774 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2282 },
3781 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2288 },
3782 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2289 },
37753783 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1546 },
3776 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2283 },
3777 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2284 },
3778 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2296 },
3784 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2290 },
3785 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 40, .child_index = 2291 },
3786 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2303 },
37793787 .{ .char = 'm', .end_of_word = true, .end_of_list = true, .number = 5, .child_index = 1295 },
3780 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2297 },
3781 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2298 },
3782 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2299 },
3788 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2304 },
3789 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2305 },
3790 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2306 },
37833791 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
3784 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2300 },
3785 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2301 },
3786 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2303 },
3787 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2304 },
3788 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2305 },
3789 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2306 },
3790 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2307 },
3791 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2308 },
3792 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2309 },
3793 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2310 },
3794 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2197 },
3792 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2307 },
3793 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2308 },
3794 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2310 },
3795 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2311 },
3796 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2312 },
3797 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2313 },
3798 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2314 },
3799 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2315 },
3800 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2316 },
3801 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2317 },
3802 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2202 },
37953803 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },
3796 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2312 },
3797 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2313 },
3798 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2314 },
3799 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2315 },
3800 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2316 },
3801 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2317 },
3802 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2319 },
3804 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2319 },
3805 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2320 },
3806 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2171 },
3807 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2321 },
3808 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2322 },
3809 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2323 },
3810 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 16, .child_index = 2324 },
3811 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2326 },
38033812 .{ .char = 'b', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 1434 },
3804 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2320 },
3805 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2321 },
3806 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2322 },
3807 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2323 },
3808 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2324 },
3809 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2325 },
3810 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2326 },
3811 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2327 },
3812 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 2, .child_index = 2225 },
3813 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2327 },
3814 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2328 },
3815 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2329 },
3816 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2330 },
3817 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2331 },
3818 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2332 },
3819 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2333 },
3820 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2334 },
3821 .{ .char = 'f', .end_of_word = true, .end_of_list = false, .number = 2, .child_index = 2231 },
38133822 .{ .char = 'l', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
38143823 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 486 },
3815 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2328 },
3816 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2329 },
3817 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2330 },
3818 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2335 },
3819 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2336 },
3820 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2339 },
3821 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2340 },
3822 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2342 },
3823 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2343 },
3824 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2345 },
3825 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2346 },
3826 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2347 },
3827 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2349 },
3828 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2352 },
3829 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2354 },
3830 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2355 },
3831 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2356 },
3832 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2357 },
3833 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2358 },
3824 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2335 },
3825 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2336 },
3826 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2337 },
3827 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2342 },
3828 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 5, .child_index = 2343 },
3829 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2346 },
3830 .{ .char = 'f', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2347 },
3831 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2349 },
3832 .{ .char = 'm', .end_of_word = false, .end_of_list = false, .number = 6, .child_index = 2350 },
3833 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2352 },
3834 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2353 },
3835 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2354 },
3836 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2356 },
3837 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2359 },
3838 .{ .char = 'p', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2361 },
3839 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2362 },
3840 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 },
3841 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2364 },
3842 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2365 },
38343843 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 1583 },
38353844 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1588 },
3836 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2359 },
3845 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2366 },
38373846 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 },
3838 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2360 },
3839 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2361 },
3840 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2362 },
3841 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 },
3842 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2364 },
3843 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2367 },
3847 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2367 },
3848 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2368 },
3849 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2369 },
3850 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2370 },
3851 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2371 },
3852 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2374 },
38443853 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3845 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2368 },
3846 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2369 },
3847 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2370 },
3848 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2371 },
3849 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2372 },
3850 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 2373 },
3851 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2374 },
3852 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2375 },
3853 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2376 },
3854 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2377 },
3855 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2378 },
3856 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2379 },
3857 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2380 },
3858 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2381 },
3859 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2382 },
3860 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2383 },
3854 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2375 },
3855 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2376 },
3856 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2377 },
3857 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2378 },
3858 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2379 },
3859 .{ .char = 'r', .end_of_word = false, .end_of_list = false, .number = 8, .child_index = 2380 },
3860 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2381 },
3861 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2382 },
3862 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2383 },
3863 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2384 },
3864 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2385 },
3865 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2386 },
3866 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2387 },
3867 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2388 },
3868 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2389 },
3869 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2390 },
38613870 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
3862 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2384 },
3871 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2391 },
38633872 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 335 },
3864 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2385 },
3865 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2386 },
3866 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2387 },
3867 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2388 },
3868 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2389 },
3869 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2390 },
3873 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2392 },
3874 .{ .char = 'd', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2393 },
3875 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2394 },
3876 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2395 },
3877 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2396 },
3878 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2397 },
38703879 .{ .char = 'e', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 706 },
3871 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2391 },
3872 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2393 },
3873 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2394 },
3874 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2395 },
3875 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2397 },
3876 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2398 },
3877 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2399 },
3878 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2400 },
3879 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2401 },
3880 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2398 },
3881 .{ .char = 'x', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2400 },
3882 .{ .char = 'l', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2401 },
3883 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2402 },
3884 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2404 },
3885 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 3, .child_index = 2405 },
3886 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2406 },
3887 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2407 },
3888 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2408 },
38803889 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 567 },
3881 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2403 },
3882 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2404 },
3890 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2410 },
3891 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2411 },
38833892 .{ .char = 'q', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 276 },
3884 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2405 },
3885 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2404 },
3886 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2406 },
3887 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2407 },
3888 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2408 },
3889 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2409 },
3890 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2410 },
3891 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2411 },
3892 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2412 },
3893 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2413 },
3894 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2414 },
3895 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2415 },
3896 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2416 },
3897 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2417 },
3898 .{ .char = 'g', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2418 },
3899 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2419 },
3900 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2363 },
3901 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2420 },
3902 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2421 },
3903 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2422 },
3893 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2412 },
3894 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 2, .child_index = 2411 },
3895 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2413 },
3896 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2414 },
3897 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2415 },
3898 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2416 },
3899 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2417 },
3900 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2418 },
3901 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2419 },
3902 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2420 },
3903 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2421 },
3904 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2422 },
3905 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2423 },
3906 .{ .char = 'c', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2424 },
3907 .{ .char = 'g', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2425 },
3908 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2426 },
3909 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2370 },
3910 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2427 },
3911 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2428 },
3912 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2429 },
39043913 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 974 },
3905 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2423 },
3906 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2424 },
3907 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2425 },
3908 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2426 },
3909 .{ .char = 'C', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2427 },
3910 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2428 },
3911 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2429 },
3912 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2430 },
3913 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2431 },
3914 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2432 },
3915 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2433 },
3916 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2434 },
3917 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2435 },
3914 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2430 },
3915 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2431 },
3916 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2432 },
3917 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2433 },
3918 .{ .char = 'C', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2434 },
3919 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2435 },
3920 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 },
3921 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2437 },
3922 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2438 },
3923 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2439 },
3924 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2440 },
3925 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2441 },
3926 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2442 },
39183927 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 335 },
3919 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 },
3928 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2443 },
39203929 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 447 },
3921 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2437 },
3922 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2438 },
3923 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2439 },
3924 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2440 },
3925 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2441 },
3926 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2442 },
3930 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2444 },
3931 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2445 },
3932 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2446 },
3933 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2447 },
3934 .{ .char = 's', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2448 },
3935 .{ .char = 'p', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2449 },
39273936 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 649 },
39283937 .{ .char = 'a', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
39293938 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 448 },
3930 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2442 },
3931 .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2444 },
3932 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2444 },
3933 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2446 },
3934 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2447 },
3939 .{ .char = 'g', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2449 },
3940 .{ .char = 'x', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2451 },
3941 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 3, .child_index = 2451 },
3942 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2453 },
3943 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2454 },
39353944 .{ .char = 'w', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3936 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2448 },
3937 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2441 },
3938 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2436 },
3939 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2449 },
3940 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2450 },
3945 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2455 },
3946 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2448 },
3947 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2443 },
3948 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2456 },
3949 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2457 },
39413950 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
3942 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2451 },
3943 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2452 },
3944 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2453 },
3945 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2454 },
3946 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2455 },
3947 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2456 },
3948 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2457 },
3949 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2458 },
3950 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2459 },
3951 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2460 },
3952 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2461 },
3953 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2462 },
3954 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2463 },
3955 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2464 },
3956 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 768 },
3957 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2374 },
3958 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 2465 },
3959 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2467 },
3960 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2468 },
3961 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2469 },
3951 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2458 },
3952 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2459 },
3953 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2460 },
3954 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2461 },
3955 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2462 },
3956 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2463 },
3957 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2464 },
3958 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2465 },
3959 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2466 },
3960 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2467 },
3961 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2468 },
3962 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2469 },
39623963 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2470 },
3963 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2471 },
3964 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2472 },
3965 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2473 },
3966 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2474 },
3967 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2475 },
3968 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2476 },
3969 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2477 },
3970 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2478 },
3971 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2479 },
3972 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2480 },
3973 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 },
3964 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2471 },
3965 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 768 },
3966 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 8, .child_index = 2381 },
3967 .{ .char = 't', .end_of_word = true, .end_of_list = true, .number = 8, .child_index = 2472 },
3968 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 6, .child_index = 2474 },
3969 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2475 },
3970 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2476 },
3971 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2477 },
3972 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2478 },
3973 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2479 },
3974 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2480 },
3975 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2481 },
3976 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2482 },
3977 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2483 },
3978 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2484 },
3979 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2485 },
3980 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2486 },
3981 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2487 },
3982 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
39743983 .{ .char = 'h', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3975 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2481 },
3984 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2488 },
39763985 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
3977 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2262 },
3986 .{ .char = 'i', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2268 },
39783987 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 561 },
3979 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2482 },
3980 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2483 },
3981 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2484 },
3988 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2489 },
3989 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2490 },
3990 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2491 },
39823991 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 555 },
3983 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2485 },
3984 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2486 },
3985 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2487 },
3986 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2488 },
3987 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2489 },
3988 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2490 },
3989 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2491 },
3990 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2492 },
3991 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2493 },
3992 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2494 },
3993 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2495 },
3994 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2496 },
3992 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2492 },
3993 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2493 },
3994 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2494 },
3995 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2495 },
3996 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2496 },
3997 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2497 },
3998 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2498 },
3999 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2499 },
4000 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2500 },
4001 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2501 },
4002 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2502 },
4003 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2503 },
39954004 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 450 },
3996 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2025 },
3997 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2497 },
3998 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2498 },
3999 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2499 },
4000 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 2502 },
4001 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2506 },
4002 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2507 },
4003 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2508 },
4004 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2509 },
4005 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2510 },
4006 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2511 },
4007 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2512 },
4008 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2513 },
4009 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2514 },
4010 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2515 },
4005 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2028 },
4006 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2504 },
4007 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 4, .child_index = 2505 },
4008 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2506 },
4009 .{ .char = 'e', .end_of_word = true, .end_of_list = true, .number = 6, .child_index = 2509 },
4010 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2513 },
4011 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2514 },
4012 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2515 },
4013 .{ .char = 'n', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2516 },
4014 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2517 },
4015 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2518 },
4016 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2519 },
4017 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2520 },
4018 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2521 },
4019 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2522 },
40114020 .{ .char = '2', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
4012 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2516 },
4013 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2517 },
4021 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2523 },
4022 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2524 },
40144023 .{ .char = '0', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
4015 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2518 },
4016 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2519 },
4017 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2520 },
4018 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2521 },
4019 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2522 },
4020 .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2523 },
4021 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2524 },
4022 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2525 },
4023 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2526 },
4024 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2527 },
4025 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2528 },
4026 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2529 },
4027 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2530 },
4028 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2531 },
4029 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2532 },
4030 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2533 },
4031 .{ .char = '4', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2534 },
4032 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2535 },
4024 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2525 },
4025 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2526 },
4026 .{ .char = 'd', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2527 },
4027 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2528 },
4028 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2529 },
4029 .{ .char = 'j', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2530 },
4030 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2531 },
4031 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2532 },
4032 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2533 },
4033 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2534 },
4034 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2535 },
4035 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2536 },
4036 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2537 },
4037 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2538 },
4038 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2539 },
4039 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2540 },
4040 .{ .char = '4', .end_of_word = true, .end_of_list = true, .number = 4, .child_index = 2541 },
4041 .{ .char = 'a', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2542 },
40334042 .{ .char = 'n', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 486 },
4034 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2536 },
4043 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2543 },
40354044 .{ .char = '1', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 632 },
40364045 .{ .char = '6', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 633 },
40374046 .{ .char = '8', .end_of_word = true, .end_of_list = false, .number = 1, .child_index = 0 },
4038 .{ .char = 'P', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2537 },
4039 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2538 },
4040 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2539 },
4041 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },
4042 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2540 },
4047 .{ .char = 'P', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2544 },
4048 .{ .char = 's', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2545 },
4049 .{ .char = 'k', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2546 },
4050 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
4051 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2547 },
40434052 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 512 },
4044 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1974 },
4045 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2541 },
4046 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2542 },
4047 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2543 },
4053 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1976 },
4054 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2548 },
4055 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2549 },
4056 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2550 },
40484057 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 301 },
4049 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2544 },
4050 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2545 },
4058 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2551 },
4059 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2552 },
40514060 .{ .char = 'y', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 461 },
40524061 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
4053 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2546 },
4054 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2547 },
4055 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2548 },
4056 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2549 },
4057 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2550 },
4058 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1973 },
4059 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2551 },
4062 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2553 },
4063 .{ .char = 'b', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2554 },
4064 .{ .char = 'z', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2555 },
4065 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2556 },
4066 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2557 },
4067 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1975 },
4068 .{ .char = 'f', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2558 },
40604069 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 181 },
4061 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2552 },
4062 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2553 },
4063 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2554 },
4064 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2555 },
4065 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2556 },
4066 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2557 },
4067 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2499 },
4068 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2558 },
4070 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2559 },
4071 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2560 },
4072 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2561 },
4073 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2562 },
4074 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2563 },
4075 .{ .char = 'g', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2564 },
4076 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 3, .child_index = 2506 },
4077 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2565 },
40694078 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 640 },
4070 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2559 },
4071 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2560 },
4072 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2561 },
4073 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2015 },
4074 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2565 },
4075 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2566 },
4079 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2566 },
4080 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2567 },
4081 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 4, .child_index = 2568 },
4082 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2018 },
4083 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2572 },
4084 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2573 },
40764085 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 438 },
4077 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2567 },
4078 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2568 },
4086 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2574 },
4087 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2575 },
40794088 .{ .char = 'v', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 314 },
4080 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2569 },
4081 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2570 },
4082 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2252 },
4083 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2571 },
4084 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2572 },
4085 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1751 },
4086 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2573 },
4089 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2576 },
4090 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2577 },
4091 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2258 },
4092 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2578 },
4093 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2579 },
4094 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1752 },
4095 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2580 },
40874096 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 567 },
4088 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2574 },
4089 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2575 },
4090 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2576 },
4097 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2581 },
4098 .{ .char = 'h', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2582 },
4099 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2583 },
40914100 .{ .char = 'q', .end_of_word = true, .end_of_list = true, .number = 1, .child_index = 0 },
4092 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2577 },
4093 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2578 },
4094 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2579 },
4095 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2580 },
4101 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2584 },
4102 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2585 },
4103 .{ .char = 'b', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2586 },
4104 .{ .char = 'p', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2587 },
40964105 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 511 },
40974106 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 411 },
4098 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2581 },
4099 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2387 },
4100 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2093 },
4101 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2582 },
4102 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2583 },
4103 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2072 },
4104 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2584 },
4105 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1834 },
4106 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2585 },
4107 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2586 },
4108 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2587 },
4109 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2588 },
4110 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2590 },
4111 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2591 },
4112 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2592 },
4107 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2588 },
4108 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2394 },
4109 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2097 },
4110 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2589 },
4111 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2590 },
4112 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2075 },
4113 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2591 },
4114 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1835 },
4115 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2592 },
4116 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2593 },
4117 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2594 },
4118 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2595 },
4119 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2597 },
4120 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2598 },
4121 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2599 },
41134122 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 572 },
4114 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2151 },
4115 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1745 },
4116 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2593 },
4123 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2156 },
4124 .{ .char = 'l', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1746 },
4125 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2600 },
41174126 .{ .char = 'u', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 559 },
4118 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2594 },
4119 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2595 },
4120 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2596 },
4121 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2597 },
4127 .{ .char = 'm', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2601 },
4128 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2602 },
4129 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2603 },
4130 .{ .char = 's', .end_of_word = false, .end_of_list = false, .number = 1, .child_index = 2604 },
41224131 .{ .char = 'w', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 756 },
4123 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2598 },
4124 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2599 },
4125 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2600 },
4126 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
4127 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2601 },
4128 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2602 },
4129 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2603 },
4130 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2604 },
4131 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2605 },
4132 .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2606 },
4132 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2605 },
4133 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2606 },
41334134 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2607 },
4134 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2608 },
4135 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2609 },
4136 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2610 },
4135 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 437 },
4136 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2608 },
4137 .{ .char = 'd', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2609 },
4138 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2610 },
4139 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2611 },
4140 .{ .char = 'e', .end_of_word = false, .end_of_list = true, .number = 2, .child_index = 2612 },
4141 .{ .char = 'S', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2613 },
4142 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2614 },
4143 .{ .char = 'n', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2615 },
4144 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2616 },
4145 .{ .char = 'i', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2617 },
41374146 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 1185 },
4138 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2611 },
4139 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2612 },
4147 .{ .char = 'r', .end_of_word = true, .end_of_list = true, .number = 2, .child_index = 2618 },
4148 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2619 },
41404149 .{ .char = 'o', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 639 },
4141 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2189 },
4150 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2194 },
41424151 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 554 },
4143 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2613 },
4152 .{ .char = 'c', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2620 },
41444153 .{ .char = '_', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 449 },
4145 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2045 },
4146 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2614 },
4147 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2041 },
4154 .{ .char = 'r', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2048 },
4155 .{ .char = 'a', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2621 },
4156 .{ .char = 't', .end_of_word = false, .end_of_list = true, .number = 1, .child_index = 2044 },
41484157};
41494158pub const data = blk: {
4150 @setEvalBranchQuota(12348);
4159 @setEvalBranchQuota(12366);
41514160 break :blk [_]Properties{
41524161 .{ .param_str = "vv*vC*iC", .header = .blocks, .language = .all_languages, .attributes = .{ .lib_function_without_prefix = true } },
41534162 .{ .param_str = "vvC*iC", .header = .blocks, .language = .all_languages, .attributes = .{ .lib_function_without_prefix = true } },
......@@ -4892,6 +4901,8 @@ pub const data = blk: {
48924901 .{ .param_str = "bULiCULiCULi*", .attributes = .{ .const_evaluable = true } },
48934902 .{ .param_str = "bULLiCULLiCULLi*", .attributes = .{ .const_evaluable = true } },
48944903 .{ .param_str = "v.", .attributes = .{ .custom_typecheck = true } },
4904 .{ .param_str = "v", .attributes = .{ .custom_typecheck = true } },
4905 .{ .param_str = "i", .attributes = .{ .custom_typecheck = true } },
48954906 .{ .param_str = "vAA", .attributes = .{ .lib_function_with_builtin_prefix = true } },
48964907 .{ .param_str = "vA", .attributes = .{ .lib_function_with_builtin_prefix = true } },
48974908 .{ .param_str = "vA.", .attributes = .{ .custom_typecheck = true } },
lib/compiler/aro/aro/Builtins/eval.zig+15-7
......@@ -1,16 +1,19 @@
11const std = @import("std");
2const assert = std.debug.assert;
3
24const backend = @import("../../backend.zig");
35const Interner = backend.Interner;
6
47const Builtins = @import("../Builtins.zig");
58const Parser = @import("../Parser.zig");
69const Tree = @import("../Tree.zig");
710const TypeStore = @import("../TypeStore.zig");
8const Type = TypeStore.Type;
911const QualType = TypeStore.QualType;
12const Type = TypeStore.Type;
1013const Value = @import("../Value.zig");
1114
1215fn makeNan(comptime T: type, str: []const u8) T {
13 const UnsignedSameSize = std.meta.Int(.unsigned, @bitSizeOf(T));
16 const UnsignedSameSize = @Int(.unsigned, @bitSizeOf(T));
1417 const parsed = std.fmt.parseUnsigned(UnsignedSameSize, str[0 .. str.len - 1], 0) catch 0;
1518 const bits: switch (T) {
1619 f32 => u23,
......@@ -24,7 +27,6 @@ fn makeNan(comptime T: type, str: []const u8) T {
2427
2528pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Index) !Value {
2629 if (!expanded.attributes.const_evaluable) return .{};
27
2830 switch (expanded.tag) {
2931 .common => |tag| switch (tag) {
3032 .__builtin_inff,
......@@ -47,12 +49,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind
4749 return Value.intern(p.comp, .{ .float = f });
4850 },
4951 .__builtin_isinf => blk: {
50 if (args.len == 0) break :blk;
52 assert(args.len == 1);
5153 const val = p.tree.value_map.get(args[0]) orelse break :blk;
5254 return Value.fromBool(val.isInf(p.comp));
5355 },
5456 .__builtin_isinf_sign => blk: {
55 if (args.len == 0) break :blk;
57 assert(args.len == 1);
5658 const val = p.tree.value_map.get(args[0]) orelse break :blk;
5759 switch (val.isInfSign(p.comp)) {
5860 .unknown => {},
......@@ -62,12 +64,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind
6264 }
6365 },
6466 .__builtin_isnan => blk: {
65 if (args.len == 0) break :blk;
67 assert(args.len == 1);
6668 const val = p.tree.value_map.get(args[0]) orelse break :blk;
6769 return Value.fromBool(val.isNan(p.comp));
6870 },
6971 .__builtin_nan => blk: {
70 if (args.len == 0) break :blk;
72 assert(args.len == 1);
7173 const val = p.getDecayedStringLiteral(args[0]) orelse break :blk;
7274 const bytes = p.comp.interner.get(val.ref()).bytes;
7375
......@@ -80,6 +82,12 @@ pub fn eval(expanded: Builtins.Expanded, p: *Parser, args: []const Tree.Node.Ind
8082 };
8183 return Value.intern(p.comp, .{ .float = f });
8284 },
85 .__builtin_constant_p => {
86 assert(args.len == 1);
87 const arg = args[0];
88 const val = p.tree.value_map.get(arg) orelse return Value.fromBool(p.isAddressOfStringLiteral(arg));
89 return Value.fromBool(!val.isPointer(p.comp));
90 },
8391 else => {},
8492 },
8593 else => {},
lib/compiler/aro/aro/CodeGen.zig+3-1
......@@ -2,7 +2,7 @@ const std = @import("std");
22const Allocator = std.mem.Allocator;
33const assert = std.debug.assert;
44
5const backend = @import("backend");
5const backend = @import("../backend.zig");
66const Interner = backend.Interner;
77const Ir = backend.Ir;
88const Builder = Ir.Builder;
......@@ -867,6 +867,8 @@ fn genExpr(c: *CodeGen, node_index: Node.Index) Error!Ir.Ref {
867867 .imag_expr,
868868 .real_expr,
869869 .sizeof_expr,
870 .builtin_va_arg_pack,
871 .builtin_va_arg_pack_len,
870872 => return c.fail("TODO CodeGen.genExpr {s}\n", .{@tagName(node)}),
871873 else => unreachable, // Not an expression.
872874 }
lib/compiler/aro/aro/Compilation.zig+120-97
......@@ -71,34 +71,23 @@ pub const Environment = struct {
7171 /// used for __DATE__, __TIME__, and __TIMESTAMP__
7272 provided: u64,
7373
74 pub const default: @This() = .{ .provided = 0 };
74 pub const default: SourceEpoch = .{ .provided = 0 };
7575 };
7676
77 pub fn loadAll(allocator: std.mem.Allocator, environ_map: *const std.process.Environ.Map) !Environment {
77 /// Load all of the environment variables from an environ map. Does not copy values.
78 pub fn loadAll(environ_map: *const std.process.Environ.Map) Environment {
7879 var env: Environment = .{};
79 errdefer env.deinit(allocator);
8080
8181 inline for (@typeInfo(@TypeOf(env)).@"struct".fields) |field| {
8282 std.debug.assert(@field(env, field.name) == null);
8383
8484 var env_var_buf: [field.name.len]u8 = undefined;
8585 const env_var_name = std.ascii.upperString(&env_var_buf, field.name);
86 const val: ?[]const u8 = if (environ_map.get(env_var_name)) |v| try allocator.dupe(u8, v) else null;
87 @field(env, field.name) = val;
86 @field(env, field.name) = environ_map.get(env_var_name);
8887 }
8988 return env;
9089 }
9190
92 /// Use this only if environment slices were allocated with `allocator` (such as via `loadAll`)
93 pub fn deinit(self: *Environment, allocator: std.mem.Allocator) void {
94 inline for (@typeInfo(@TypeOf(self.*)).@"struct".fields) |field| {
95 if (@field(self, field.name)) |slice| {
96 allocator.free(slice);
97 }
98 }
99 self.* = undefined;
100 }
101
10291 pub fn sourceEpoch(self: *const Environment, io: Io) !SourceEpoch {
10392 const max_timestamp = 253402300799; // Dec 31 9999 23:59:59
10493
......@@ -148,7 +137,7 @@ gpa: Allocator,
148137/// Allocations in this arena live all the way until `Compilation.deinit`.
149138arena: Allocator,
150139io: Io,
151cwd: Io.Dir,
140cwd: std.Io.Dir,
152141diagnostics: *Diagnostics,
153142
154143sources: std.StringArrayHashMapUnmanaged(Source) = .empty,
......@@ -175,37 +164,48 @@ pragma_handlers: std.StringArrayHashMapUnmanaged(*Pragma) = .empty,
175164/// Used by MS extensions which allow searching for includes relative to the directory of the main source file.
176165ms_cwd_source_id: ?Source.Id = null,
177166
178pub fn init(gpa: Allocator, arena: Allocator, io: Io, diagnostics: *Diagnostics, cwd: Io.Dir) Compilation {
179 return .{
180 .gpa = gpa,
181 .arena = arena,
182 .io = io,
183 .diagnostics = diagnostics,
184 .cwd = cwd,
185 };
186}
187
188/// Initialize Compilation with default environment,
189/// pragma handlers and emulation mode set to target.
190pub fn initDefault(
167pub const InitOptions = struct {
191168 gpa: Allocator,
192169 arena: Allocator,
193170 io: Io,
194171 diagnostics: *Diagnostics,
195 cwd: Io.Dir,
196 environ_map: *const std.process.Environ.Map,
197) !Compilation {
172
173 /// Used to initiate `Compilation.Environment`, values are not copied.
174 environ_map: ?*const std.process.Environ.Map,
175 /// Defaults to `std.Io.Dir.cwd()`
176 cwd: ?std.Io.Dir = null,
177
178 add_default_pragma_handlers: bool = true,
179
180 pub const testing: InitOptions = .{
181 .gpa = std.testing.allocator,
182 .arena = undefined,
183 .io = std.testing.io,
184 .diagnostics = undefined,
185 .environ_map = null,
186 .add_default_pragma_handlers = false,
187 };
188};
189
190/// Initialize Compilation with default environment,
191/// pragma handlers and emulation mode set to target.
192pub fn init(options: InitOptions) !Compilation {
198193 var comp: Compilation = .{
199 .gpa = gpa,
200 .arena = arena,
201 .io = io,
202 .diagnostics = diagnostics,
203 .environment = try Environment.loadAll(gpa, environ_map),
204 .cwd = cwd,
194 .gpa = options.gpa,
195 .arena = options.arena,
196 .io = options.io,
197 .diagnostics = options.diagnostics,
198 .cwd = options.cwd orelse .cwd(),
205199 };
206200 errdefer comp.deinit();
207 try comp.addDefaultPragmaHandlers();
208 comp.langopts.setEmulatedCompiler(comp.target.systemCompiler());
201
202 if (options.environ_map) |map| {
203 comp.environment = .loadAll(map);
204 }
205
206 if (options.add_default_pragma_handlers) {
207 try comp.addDefaultPragmaHandlers();
208 }
209209 return comp;
210210}
211211
......@@ -228,7 +228,6 @@ pub fn deinit(comp: *Compilation) void {
228228 comp.builtins.deinit(gpa);
229229 comp.string_interner.deinit(gpa);
230230 comp.interner.deinit(gpa);
231 comp.environment.deinit(gpa);
232231 comp.type_store.deinit(gpa);
233232 comp.* = undefined;
234233}
......@@ -275,17 +274,18 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
275274 }
276275
277276 try w.writeAll(
277 \\#define __ARO_EMULATE_NO__ 0
278278 \\#define __ARO_EMULATE_CLANG__ 1
279279 \\#define __ARO_EMULATE_GCC__ 2
280280 \\#define __ARO_EMULATE_MSVC__ 3
281281 \\
282282 );
283 const emulated = switch (comp.langopts.emulate) {
283 try w.print("#define __ARO_EMULATE__ {s}\n", .{switch (comp.langopts.emulate) {
284 .no => "__ARO_EMULATE_NO__",
284285 .clang => "__ARO_EMULATE_CLANG__",
285286 .gcc => "__ARO_EMULATE_GCC__",
286287 .msvc => "__ARO_EMULATE_MSVC__",
287 };
288 try w.print("#define __ARO_EMULATE__ {s}\n", .{emulated});
288 }});
289289
290290 if (comp.langopts.emulate == .msvc) {
291291 try w.writeAll("#define _MSC_VER 1933\n");
......@@ -375,6 +375,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
375375 .watchos,
376376 => {
377377 try define(w, "__APPLE__");
378 try w.writeAll("#define __APPLE_CC__ 6000\n");
378379
379380 const version = target.os.version_range.semver.min;
380381 var version_buf: [8]u8 = undefined;
......@@ -647,6 +648,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
647648 try define(w, "__ppc__");
648649 try define(w, "__PPC__");
649650 try define(w, "_ARCH_PPC");
651 try w.print("#define _CALL_ELF {d}\n", .{target.ppcElfVersion()});
650652 },
651653 .powerpc64,
652654 .powerpc64le,
......@@ -661,7 +663,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
661663 try define(w, "__PPC64__");
662664 try define(w, "_ARCH_PPC");
663665 try define(w, "_ARCH_PPC64");
664 try w.writeAll("#define _CALL_ELF 2\n");
666 try w.print("#define _CALL_ELF {d}\n", .{target.ppcElfVersion()});
665667 },
666668 .sparc64 => {
667669 try defineStd(w, "sparc", is_gnu);
......@@ -686,8 +688,19 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
686688 try define(w, "__thumb__");
687689 }
688690 },
689 .aarch64, .aarch64_be => {
691 .aarch64, .aarch64_be => |arch| {
690692 try define(w, "__aarch64__");
693 switch (arch) {
694 .aarch64 => {
695 try define(w, "__AARCH64EL__");
696 },
697 .aarch64_be => {
698 try define(w, "__AARCH64EB__");
699 try define(w, "__AARCH_BIG_ENDIAN");
700 try define(w, "__ARM_BIG_ENDIAN");
701 },
702 else => unreachable,
703 }
691704 if (target.os.tag.isDarwin()) {
692705 try define(w, "__AARCH64_SIMD__");
693706 if (ptr_width == 32) {
......@@ -839,6 +852,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
839852 }
840853 },
841854 .riscv32, .riscv32be, .riscv64, .riscv64be => {
855 try define(w, "__riscv");
842856 try w.print("#define __riscv_xlen {d}\n", .{ptr_width});
843857 },
844858 else => {},
......@@ -910,6 +924,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
910924 \\#define __ATOMIC_CHAR16_T_LOCK_FREE 1
911925 \\#define __ATOMIC_CHAR32_T_LOCK_FREE 1
912926 \\#define __ATOMIC_WCHAR_T_LOCK_FREE 1
927 \\#define __ATOMIC_WINT_T_LOCK_FREE 1
913928 \\#define __ATOMIC_SHORT_LOCK_FREE 1
914929 \\#define __ATOMIC_INT_LOCK_FREE 1
915930 \\#define __ATOMIC_LONG_LOCK_FREE 1
......@@ -922,7 +937,15 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
922937 }
923938
924939 // types
925 if (comp.getCharSignedness() == .unsigned) try w.writeAll("#define __CHAR_UNSIGNED__ 1\n");
940 if (comp.getCharSignedness() == .unsigned) {
941 try w.writeAll("#define __CHAR_UNSIGNED__ 1\n");
942 }
943 if (comp.type_store.wchar.signedness(comp) == .unsigned) {
944 try w.writeAll("#define __WCHAR_UNSIGNED__ 1\n");
945 }
946 if (comp.type_store.wint.signedness(comp) == .unsigned) {
947 try w.writeAll("#define __WINT_UNSIGNED__ 1\n");
948 }
926949 try w.writeAll("#define __CHAR_BIT__ 8\n");
927950
928951 // int maxs
......@@ -933,7 +956,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
933956 try comp.generateIntMaxAndWidth(w, "LONG", .long);
934957 try comp.generateIntMaxAndWidth(w, "LONG_LONG", .long_long);
935958 try comp.generateIntMaxAndWidth(w, "WCHAR", comp.type_store.wchar);
936 // try comp.generateIntMax(w, "WINT", comp.type_store.wchar);
959 try comp.generateIntMaxAndWidth(w, "WINT", comp.type_store.wint);
937960 try comp.generateIntMaxAndWidth(w, "INTMAX", comp.type_store.intmax);
938961 try comp.generateIntMaxAndWidth(w, "SIZE", comp.type_store.size);
939962 try comp.generateIntMaxAndWidth(w, "UINTMAX", try comp.type_store.intmax.makeIntUnsigned(comp));
......@@ -957,7 +980,7 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
957980 try comp.generateSizeofType(w, "__SIZEOF_PTRDIFF_T__", comp.type_store.ptrdiff);
958981 try comp.generateSizeofType(w, "__SIZEOF_SIZE_T__", comp.type_store.size);
959982 try comp.generateSizeofType(w, "__SIZEOF_WCHAR_T__", comp.type_store.wchar);
960 // try comp.generateSizeofType(w, "__SIZEOF_WINT_T__", .void_pointer);
983 try comp.generateSizeofType(w, "__SIZEOF_WINT_T__", comp.type_store.wint);
961984
962985 if (target.hasInt128()) {
963986 try comp.generateSizeofType(w, "__SIZEOF_INT128__", .int128);
......@@ -968,14 +991,15 @@ fn generateSystemDefines(comp: *Compilation, w: *Io.Writer) !void {
968991 try comp.generateTypeMacro(w, "__UINTPTR_TYPE__", try comp.type_store.intptr.makeIntUnsigned(comp));
969992
970993 try comp.generateTypeMacro(w, "__INTMAX_TYPE__", comp.type_store.intmax);
971 try comp.generateSuffixMacro("__INTMAX", w, comp.type_store.intptr);
994 try comp.generateIntLiteralMacros("__INTMAX", w, comp.type_store.intptr);
972995
973996 try comp.generateTypeMacro(w, "__UINTMAX_TYPE__", try comp.type_store.intmax.makeIntUnsigned(comp));
974 try comp.generateSuffixMacro("__UINTMAX", w, try comp.type_store.intptr.makeIntUnsigned(comp));
997 try comp.generateIntLiteralMacros("__UINTMAX", w, try comp.type_store.intptr.makeIntUnsigned(comp));
975998
976999 try comp.generateTypeMacro(w, "__PTRDIFF_TYPE__", comp.type_store.ptrdiff);
9771000 try comp.generateTypeMacro(w, "__SIZE_TYPE__", comp.type_store.size);
9781001 try comp.generateTypeMacro(w, "__WCHAR_TYPE__", comp.type_store.wchar);
1002 try comp.generateTypeMacro(w, "__WINT_TYPE__", comp.type_store.wint);
9791003 try comp.generateTypeMacro(w, "__CHAR16_TYPE__", comp.type_store.uint_least16_t);
9801004 try comp.generateTypeMacro(w, "__CHAR32_TYPE__", comp.type_store.uint_least32_t);
9811005
......@@ -1167,8 +1191,10 @@ fn generateTypeMacro(comp: *const Compilation, w: *Io.Writer, name: []const u8,
11671191}
11681192
11691193pub fn float80Type(comp: *const Compilation) ?QualType {
1170 if (comp.langopts.emulate != .gcc) return null;
1171 return comp.target.float80Type();
1194 return switch (comp.langopts.emulate) {
1195 .no, .gcc => comp.target.float80Type(),
1196 .msvc, .clang => null,
1197 };
11721198}
11731199
11741200/// Smallest integer type with at least N bits
......@@ -1292,8 +1318,14 @@ fn generateFmt(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt:
12921318 }
12931319}
12941320
1295fn generateSuffixMacro(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt: QualType) !void {
1296 return w.print("#define {s}_C_SUFFIX__ {s}\n", .{ prefix, qt.intValueSuffix(comp) });
1321fn generateIntLiteralMacros(comp: *const Compilation, prefix: []const u8, w: *Io.Writer, qt: QualType) !void {
1322 const suffix = qt.intValueSuffix(comp);
1323 try w.print("#define {s}_C_SUFFIX__ {s}\n", .{ prefix, suffix });
1324 if (suffix.len == 0) {
1325 try w.print("#define {s}_C(c) c\n", .{prefix});
1326 } else {
1327 try w.print("#define {s}_C(c) c##{s}\n", .{ prefix, suffix });
1328 }
12971329}
12981330
12991331/// Generate the following for a type:
......@@ -1322,7 +1354,7 @@ fn generateExactWidthType(comp: *Compilation, w: *Io.Writer, original_qt: QualTy
13221354 const prefix = full[0 .. full.len - suffix.len]; // remove "_TYPE__"
13231355
13241356 try comp.generateFmt(prefix, w, qt);
1325 try comp.generateSuffixMacro(prefix, w, qt);
1357 try comp.generateIntLiteralMacros(prefix, w, qt);
13261358}
13271359
13281360pub fn hasFloat128(comp: *const Compilation) bool {
......@@ -1414,7 +1446,7 @@ pub fn maxArrayBytes(comp: *const Compilation) u64 {
14141446pub fn fixedEnumTagType(comp: *const Compilation) ?QualType {
14151447 switch (comp.langopts.emulate) {
14161448 .msvc => return .int,
1417 .clang => if (comp.target.os.tag == .windows and comp.target.abi == .msvc) return .int,
1449 .no, .clang => if (comp.target.os.tag == .windows and comp.target.abi == .msvc) return .int,
14181450 .gcc => {},
14191451 }
14201452 return null;
......@@ -1424,6 +1456,10 @@ pub fn getCharSignedness(comp: *const Compilation) std.builtin.Signedness {
14241456 return comp.langopts.char_signedness_override orelse comp.target.cCharSignedness();
14251457}
14261458
1459pub fn hasClangStyleBoundsSafety(comp: *const Compilation) bool {
1460 return comp.langopts.bounds_safety == .clang;
1461}
1462
14271463pub fn getSource(comp: *const Compilation, id: Source.Id) Source {
14281464 if (id.alias) {
14291465 return comp.source_aliases.items[@intFromEnum(id.index)];
......@@ -1643,14 +1679,12 @@ fn addSourceFromPathExtra(comp: *Compilation, path: []const u8, kind: Source.Kin
16431679 return error.FileNotFound;
16441680 }
16451681
1646 const io = comp.io;
1647
1648 const file = try comp.cwd.openFile(io, path, .{});
1649 defer file.close(io);
1682 const file = try comp.cwd.openFile(comp.io, path, .{});
1683 defer file.close(comp.io);
16501684 return comp.addSourceFromFile(file, path, kind);
16511685}
16521686
1653pub fn addSourceFromFile(comp: *Compilation, file: Io.File, path: []const u8, kind: Source.Kind) !Source {
1687pub fn addSourceFromFile(comp: *Compilation, file: std.Io.File, path: []const u8, kind: Source.Kind) !Source {
16541688 const contents = try comp.getFileContents(file, .unlimited);
16551689 errdefer comp.gpa.free(contents);
16561690 return comp.addSourceFromOwnedBuffer(path, contents, kind);
......@@ -1718,8 +1752,7 @@ pub fn initSearchPath(comp: *Compilation, includes: []const Include, verbose: bo
17181752 }
17191753}
17201754fn addToSearchPath(comp: *Compilation, include: Include, verbose: bool) !void {
1721 const io = comp.io;
1722 comp.cwd.access(io, include.path, .{}) catch {
1755 comp.cwd.access(comp.io, include.path, .{}) catch {
17231756 if (verbose) {
17241757 std.debug.print("ignoring nonexistent directory \"{s}\"\n", .{include.path});
17251758 return;
......@@ -1979,14 +2012,12 @@ fn getPathContents(comp: *Compilation, path: []const u8, limit: Io.Limit) ![]u8
19792012 return error.FileNotFound;
19802013 }
19812014
1982 const io = comp.io;
1983
1984 const file = try comp.cwd.openFile(io, path, .{});
1985 defer file.close(io);
2015 const file = try comp.cwd.openFile(comp.io, path, .{});
2016 defer file.close(comp.io);
19862017 return comp.getFileContents(file, limit);
19872018}
19882019
1989fn getFileContents(comp: *Compilation, file: Io.File, limit: Io.Limit) ![]u8 {
2020fn getFileContents(comp: *Compilation, file: std.Io.File, limit: Io.Limit) ![]u8 {
19902021 var file_buf: [4096]u8 = undefined;
19912022 var file_reader = file.reader(comp.io, &file_buf);
19922023
......@@ -2168,9 +2199,8 @@ pub fn locSlice(comp: *const Compilation, loc: Source.Location) []const u8 {
21682199}
21692200
21702201pub fn getSourceMTimeUncached(comp: *const Compilation, source_id: Source.Id) ?u64 {
2171 const io = comp.io;
21722202 const source = comp.getSource(source_id);
2173 if (comp.cwd.statFile(io, source.path, .{})) |stat| {
2203 if (comp.cwd.statFile(comp.io, source.path, .{})) |stat| {
21742204 return std.math.cast(u64, stat.mtime.toSeconds());
21752205 } else |_| {
21762206 return null;
......@@ -2257,10 +2287,9 @@ pub const Diagnostic = struct {
22572287test "addSourceFromBuffer" {
22582288 const Test = struct {
22592289 fn addSourceFromBuffer(str: []const u8, expected: []const u8, warning_count: u32, splices: []const u32) !void {
2260 var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
2261 defer arena.deinit();
22622290 var diagnostics: Diagnostics = .{ .output = .ignore };
2263 var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());
2291 var comp = try Compilation.init(.testing);
2292 comp.diagnostics = &diagnostics;
22642293 defer comp.deinit();
22652294
22662295 const source = try comp.addSourceFromBuffer("path", str);
......@@ -2271,10 +2300,8 @@ test "addSourceFromBuffer" {
22712300 }
22722301
22732302 fn withAllocationFailures(allocator: std.mem.Allocator) !void {
2274 var arena: std.heap.ArenaAllocator = .init(allocator);
2275 defer arena.deinit();
2276 var diagnostics: Diagnostics = .{ .output = .ignore };
2277 var comp = Compilation.init(allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());
2303 var comp = try Compilation.init(.testing);
2304 comp.gpa = allocator;
22782305 defer comp.deinit();
22792306
22802307 _ = try comp.addSourceFromBuffer("path", "spliced\\\nbuffer\n");
......@@ -2320,7 +2347,8 @@ test "addSourceFromBuffer - exhaustive check for carriage return elimination" {
23202347 var buf: [alphabet.len]u8 = @splat(alphabet[0]);
23212348
23222349 var diagnostics: Diagnostics = .{ .output = .ignore };
2323 var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());
2350 var comp = try Compilation.init(.testing);
2351 comp.diagnostics = &diagnostics;
23242352 defer comp.deinit();
23252353
23262354 var source_count: u32 = 0;
......@@ -2346,9 +2374,8 @@ test "addSourceFromBuffer - exhaustive check for carriage return elimination" {
23462374test "ignore BOM at beginning of file" {
23472375 const BOM = "\xEF\xBB\xBF";
23482376 const Test = struct {
2349 fn run(arena: Allocator, buf: []const u8) !void {
2350 var diagnostics: Diagnostics = .{ .output = .ignore };
2351 var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, &diagnostics, Io.Dir.cwd());
2377 fn run(buf: []const u8) !void {
2378 var comp = try Compilation.init(.testing);
23522379 defer comp.deinit();
23532380
23542381 const source = try comp.addSourceFromBuffer("file.c", buf);
......@@ -2357,19 +2384,15 @@ test "ignore BOM at beginning of file" {
23572384 }
23582385 };
23592386
2360 var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator);
2361 defer arena_state.deinit();
2362 const arena = arena_state.allocator();
2363
2364 try Test.run(arena, BOM);
2365 try Test.run(arena, BOM ++ "x");
2366 try Test.run(arena, "x" ++ BOM);
2367 try Test.run(arena, BOM ++ " ");
2368 try Test.run(arena, BOM ++ "\n");
2369 try Test.run(arena, BOM ++ "\\");
2370
2371 try Test.run(arena, BOM[0..1] ++ "x");
2372 try Test.run(arena, BOM[0..2] ++ "x");
2373 try Test.run(arena, BOM[1..] ++ "x");
2374 try Test.run(arena, BOM[2..] ++ "x");
2387 try Test.run(BOM);
2388 try Test.run(BOM ++ "x");
2389 try Test.run("x" ++ BOM);
2390 try Test.run(BOM ++ " ");
2391 try Test.run(BOM ++ "\n");
2392 try Test.run(BOM ++ "\\");
2393
2394 try Test.run(BOM[0..1] ++ "x");
2395 try Test.run(BOM[0..2] ++ "x");
2396 try Test.run(BOM[1..] ++ "x");
2397 try Test.run(BOM[2..] ++ "x");
23752398}
lib/compiler/aro/aro/Diagnostics.zig+21-17
......@@ -24,21 +24,21 @@ pub const Message = struct {
2424 @"fatal error",
2525 };
2626
27 pub fn write(msg: Message, t: std.Io.Terminal, details: bool) std.Io.Terminal.SetColorError!void {
28 const w = t.writer;
29 try t.setColor(.bold);
27 pub fn write(msg: Message, term: std.Io.Terminal, details: bool) std.Io.Terminal.SetColorError!void {
28 const w = term.writer;
29 try term.setColor(.bold);
3030 if (msg.location) |loc| {
3131 try w.print("{s}:{d}:{d}: ", .{ loc.path, loc.line_no, loc.col });
3232 }
3333 switch (msg.effective_kind) {
34 .@"fatal error", .@"error" => try t.setColor(.bright_red),
35 .note => try t.setColor(.bright_cyan),
36 .warning => try t.setColor(.bright_magenta),
34 .@"fatal error", .@"error" => try term.setColor(.bright_red),
35 .note => try term.setColor(.bright_cyan),
36 .warning => try term.setColor(.bright_magenta),
3737 .off => unreachable,
3838 }
3939 try w.print("{s}: ", .{@tagName(msg.effective_kind)});
4040
41 try t.setColor(.white);
41 try term.setColor(.white);
4242 try w.writeAll(msg.text);
4343 if (msg.opt) |some| {
4444 if (msg.effective_kind == .@"error" and msg.kind != .@"error") {
......@@ -56,17 +56,17 @@ pub const Message = struct {
5656
5757 if (!details or msg.location == null) {
5858 try w.writeAll("\n");
59 try t.setColor(.reset);
59 try term.setColor(.reset);
6060 } else {
6161 const loc = msg.location.?;
6262 const trailer = if (loc.end_with_splice) "\\ " else "";
63 try t.setColor(.reset);
63 try term.setColor(.reset);
6464 try w.print("\n{s}{s}\n", .{ loc.line, trailer });
6565 try w.splatByteAll(' ', loc.width);
66 try t.setColor(.bold);
67 try t.setColor(.bright_green);
66 try term.setColor(.bold);
67 try term.setColor(.bright_green);
6868 try w.writeAll("^\n");
69 try t.setColor(.reset);
69 try term.setColor(.reset);
7070 }
7171 try w.flush();
7272 }
......@@ -199,6 +199,10 @@ pub const Option = enum {
199199 @"pragma-once-outside-header",
200200 @"underlying-atomic-qualifier-ignored",
201201 @"underlying-cv-qualifier-ignored",
202 @"bounds-attributes-redundant",
203 @"file-name-extension",
204 @"base-file-extension",
205 @"include-level-extension",
202206
203207 /// GNU extensions
204208 pub const gnu = [_]Option{
......@@ -541,11 +545,11 @@ fn addMessage(d: *Diagnostics, msg: Message) Compilation.Error!void {
541545
542546 switch (d.output) {
543547 .ignore => {},
544 .to_writer => |t| {
545 var new_mode = t.mode;
546 if (d.color == false) new_mode = .no_color;
547 if (d.color == true and new_mode == .no_color) new_mode = .escape_codes;
548 msg.write(.{ .writer = t.writer, .mode = new_mode }, d.details) catch {
548 .to_writer => |terminal| {
549 var mode = terminal.mode;
550 if (d.color == false) mode = .no_color;
551 if (d.color == true and mode == .no_color) mode = .escape_codes;
552 msg.write(.{ .mode = mode, .writer = terminal.writer }, d.details) catch {
549553 return error.FatalError;
550554 };
551555 },
lib/compiler/aro/aro/Driver.zig+124-50
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const Io = std.Io;
32const mem = std.mem;
43const Allocator = mem.Allocator;
54const process = std.process;
......@@ -9,6 +8,7 @@ const Assembly = backend.Assembly;
98const Ir = backend.Ir;
109const Object = backend.Object;
1110
11const Attribute = @import("Attribute.zig");
1212const Compilation = @import("Compilation.zig");
1313const Diagnostics = @import("Diagnostics.zig");
1414const DepFile = @import("DepFile.zig");
......@@ -52,6 +52,7 @@ implicit_includes: std.ArrayList(Source) = .empty,
5252/// List of includes that will be used to construct the compilation's search path
5353includes: std.ArrayList(Compilation.Include) = .empty,
5454link_objects: std.ArrayList([]const u8) = .empty,
55macro_prefix_map: std.ArrayList(struct { []const u8, []const u8 }) = .empty,
5556output_name: ?[]const u8 = null,
5657sysroot: ?[]const u8 = null,
5758resource_dir: ?[]const u8 = null,
......@@ -134,9 +135,8 @@ strip: bool = false,
134135unwindlib: ?[]const u8 = null,
135136
136137pub fn deinit(d: *Driver) void {
137 const io = d.comp.io;
138138 for (d.link_objects.items[d.link_objects.items.len - d.temp_file_count ..]) |obj| {
139 Io.Dir.deleteFileAbsolute(io, obj) catch {};
139 std.Io.Dir.deleteFileAbsolute(d.comp.io, obj) catch {};
140140 d.comp.gpa.free(obj);
141141 }
142142 d.inputs.deinit(d.comp.gpa);
......@@ -144,6 +144,7 @@ pub fn deinit(d: *Driver) void {
144144 d.implicit_includes.deinit(d.comp.gpa);
145145 d.includes.deinit(d.comp.gpa);
146146 d.link_objects.deinit(d.comp.gpa);
147 d.macro_prefix_map.deinit(d.comp.gpa);
147148 d.* = undefined;
148149}
149150
......@@ -177,6 +178,10 @@ pub const usage =
177178 \\ -darwin-target-variant-triple
178179 \\ Specify the darwin target variant triple
179180 \\ -fapple-kext Use Apple's kernel extensions ABI
181 \\ -fexperimental-bounds-safety
182 \\ Enable experimental clang-style bounds safety attributes (INCOMPLETE)
183 \\ -fno-experimental-bounds-safety
184 \\ Disable experimental clang-style bounds safety attributes
180185 \\ -fchar8_t Enable char8_t (enabled by default in C23 and later)
181186 \\ -fno-char8_t Disable char8_t (disabled by default for pre-C23)
182187 \\ -fcolor-diagnostics Enable colors in diagnostics
......@@ -218,6 +223,8 @@ pub const usage =
218223 \\ -fuse-line-directives Use `#line <num>` linemarkers in preprocessed output
219224 \\ -fno-use-line-directives
220225 \\ Use `# <num>` linemarkers in preprocessed output
226 \\ -fvisibility=[default|hidden|internal|protected]
227 \\ Set the default ELF image symbol visibility to the specified option—all symbols are marked with this unless overridden within the code
221228 \\ -iquote <dir> Add directory to QUOTE include search path
222229 \\ -I <dir> Add directory to include search path
223230 \\ -idirafter <dir> Add directory to AFTER include search path
......@@ -375,6 +382,17 @@ pub fn parseArgs(
375382 d.use_line_directives = false;
376383 } else if (mem.eql(u8, arg, "-fapple-kext")) {
377384 d.apple_kext = true;
385 } else if (option(arg, "-fvisibility=")) |visibility| {
386 d.comp.langopts.default_symbol_visibility = Attribute.visibilityFromString(visibility) orelse
387 return d.fatal("unsupported value '{s}'' in '{s}'", .{ visibility, arg });
388 } else if (option(arg, "-frandom-seed=")) |_| {
389 // Ignore
390 } else if (option(arg, "-fmacro-prefix-map=")) |kv| {
391 const pair = mem.cutScalar(u8, kv, '=') orelse {
392 try d.err("invalid argument '{s}' to '-fmacro-prefix-map=", .{kv});
393 continue;
394 };
395 try d.macro_prefix_map.append(gpa, pair);
378396 } else if (option(arg, "-mcmodel=")) |cmodel| {
379397 d.comp.cmodel = std.meta.stringToEnum(std.builtin.CodeModel, cmodel) orelse
380398 return d.fatal("unsupported machine code model: '{s}'", .{arg});
......@@ -415,6 +433,10 @@ pub fn parseArgs(
415433 d.dependencies.file = path;
416434 } else if (mem.eql(u8, arg, "-MV")) {
417435 d.dependencies.format = .nmake;
436 } else if (mem.eql(u8, arg, "-fexperimental-bounds-safety")) {
437 d.comp.langopts.bounds_safety = .clang;
438 } else if (mem.eql(u8, arg, "-fno-experimental-bounds-safety")) {
439 d.comp.langopts.bounds_safety = .none;
418440 } else if (mem.eql(u8, arg, "-fchar8_t")) {
419441 d.comp.langopts.has_char8_t_override = true;
420442 } else if (mem.eql(u8, arg, "-fno-char8_t")) {
......@@ -635,6 +657,42 @@ pub fn parseArgs(
635657 d.output_name = file;
636658 } else if (option(arg, "--sysroot=")) |sysroot| {
637659 d.sysroot = sysroot;
660 } else if (mem.eql(u8, arg, "--sysroot")) {
661 i += 1;
662 if (i >= args.len) {
663 try d.err("expected argument after --sysroot", .{});
664 continue;
665 }
666 d.sysroot = args[i];
667 } else if (mem.startsWith(u8, arg, "-isysroot")) {
668 var path = arg["-isysroot".len..];
669 if (path.len == 0) {
670 i += 1;
671 if (i >= args.len) {
672 try d.err("expected argument after -isysroot", .{});
673 continue;
674 }
675 path = args[i];
676 }
677 d.sysroot = path;
678 } else if (mem.eql(u8, arg, "-rpath")) {
679 i += 1;
680 if (i >= args.len) {
681 try d.err("expected argument after -rpath", .{});
682 continue;
683 }
684 // ignore for now
685 } else if (mem.startsWith(u8, arg, "-L")) {
686 var path = arg["-L".len..];
687 if (path.len == 0) {
688 i += 1;
689 if (i >= args.len) {
690 try d.err("expected argument after -L", .{});
691 continue;
692 }
693 path = args[i];
694 }
695 // ignore for now
638696 } else if (mem.eql(u8, arg, "-Wp,-v")) {
639697 // TODO this is not how this argument should work
640698 d.verbose_search_path = true;
......@@ -706,6 +764,10 @@ pub fn parseArgs(
706764 d.comp.langopts.preserve_comments = true;
707765 d.comp.langopts.preserve_comments_in_macros = true;
708766 comment_arg = arg;
767 } else if (option(arg, "-fuse-ld=")) |linker_name| {
768 d.use_linker = linker_name;
769 } else if (mem.eql(u8, arg, "-fuse-ld=")) {
770 d.use_linker = null;
709771 } else if (option(arg, "--ld-path=")) |linker_path| {
710772 d.linker_path = linker_path;
711773 } else if (mem.eql(u8, arg, "-r")) {
......@@ -810,6 +872,7 @@ pub fn parseArgs(
810872 .clang => try d.diagnostics.set("clang", .off),
811873 .gcc => try d.diagnostics.set("gnu", .off),
812874 .msvc => try d.diagnostics.set("microsoft", .off),
875 .no => {},
813876 }
814877 }
815878 if (d.comp.langopts.preserve_comments and !d.only_preprocess) {
......@@ -1063,20 +1126,22 @@ pub fn printDiagnosticsStats(d: *Driver) void {
10631126 }
10641127}
10651128
1066pub fn detectConfig(d: *Driver, file: Io.File) std.Io.tty.Config {
1129pub fn detectMode(d: *Driver, file: std.Io.File) std.Io.Cancelable!std.Io.Terminal.Mode {
10671130 if (d.diagnostics.color == false) return .no_color;
10681131 const force_color = d.diagnostics.color == true;
10691132
1070 if (file.supportsAnsiEscapeCodes()) return .escape_codes;
1071 if (@import("builtin").os.tag == .windows and file.isTty()) {
1072 var info: std.os.windows.CONSOLE_SCREEN_BUFFER_INFO = undefined;
1073 if (std.os.windows.kernel32.GetConsoleScreenBufferInfo(file.handle, &info) == std.os.windows.FALSE) {
1074 return if (force_color) .escape_codes else .no_color;
1133 const io = d.comp.io;
1134 if (try file.supportsAnsiEscapeCodes(io)) return .escape_codes;
1135 if (@import("builtin").os.tag == .windows and try file.isTty(io)) {
1136 var get_console_info = std.os.windows.CONSOLE.USER_IO.GET_SCREEN_BUFFER_INFO;
1137 switch (try get_console_info.operate(io, file)) {
1138 .SUCCESS => return .{ .windows_api = .{
1139 .io = io,
1140 .file = file,
1141 .reset_attributes = get_console_info.Data.wAttributes,
1142 } },
1143 else => {},
10751144 }
1076 return .{ .windows_api = .{
1077 .handle = file.handle,
1078 .reset_attributes = info.wAttributes,
1079 } };
10801145 }
10811146
10821147 return if (force_color) .escape_codes else .no_color;
......@@ -1105,13 +1170,13 @@ pub fn errorDescription(e: anyerror) []const u8 {
11051170
11061171/// The entry point of the Aro compiler.
11071172/// **MAY call `exit` if `fast_exit` is set.**
1108pub fn main(d: *Driver, tc: *Toolchain, args: []const []const u8, comptime fast_exit: bool, asm_gen_fn: ?AsmCodeGenFn) Compilation.Error!void {
1173pub fn main(d: *Driver, tc: *Toolchain, args: []const []const u8, comptime fast_exit: bool, asm_gen_fn: ?AsmCodeGenFn) (Compilation.Error || std.Io.Cancelable)!void {
11091174 const user_macros = macros: {
11101175 var macro_buf: std.ArrayList(u8) = .empty;
11111176 defer macro_buf.deinit(d.comp.gpa);
11121177
11131178 var stdout_buf: [256]u8 = undefined;
1114 var stdout = Io.File.stdout().writer(&stdout_buf);
1179 var stdout = std.Io.File.stdout().writer(d.comp.io, &stdout_buf);
11151180 if (parseArgs(d, &stdout.interface, &macro_buf, args) catch |er| switch (er) {
11161181 error.WriteFailed => return d.fatal("failed to write to stdout: {s}", .{errorDescription(er)}),
11171182 error.OutOfMemory => return error.OutOfMemory,
......@@ -1217,14 +1282,13 @@ pub fn getDepFileName(d: *Driver, source: Source, buf: *[std.fs.max_name_bytes]u
12171282}
12181283
12191284fn getRandomFilename(d: *Driver, buf: *[std.fs.max_name_bytes]u8, extension: []const u8) ![]const u8 {
1220 const io = d.comp.io;
12211285 const random_bytes_count = 12;
1222 const sub_path_len = comptime std.base64.url_safe.Encoder.calcSize(random_bytes_count);
1286 const sub_path_len = comptime std.fs.base64_encoder.calcSize(random_bytes_count);
12231287
12241288 var random_bytes: [random_bytes_count]u8 = undefined;
1225 io.random(&random_bytes);
1289 d.comp.io.random(&random_bytes);
12261290 var random_name: [sub_path_len]u8 = undefined;
1227 _ = std.base64.url_safe.Encoder.encode(&random_name, &random_bytes);
1291 _ = std.fs.base64_encoder.encode(&random_name, &random_bytes);
12281292
12291293 const fmt_template = "/tmp/{s}{s}";
12301294 const fmt_args = .{
......@@ -1251,12 +1315,11 @@ fn getOutFileName(d: *Driver, source: Source, buf: *[std.fs.max_name_bytes]u8) !
12511315}
12521316
12531317fn invokeAssembler(d: *Driver, tc: *Toolchain, input_path: []const u8, output_path: []const u8) !void {
1254 const io = d.comp.io;
12551318 var assembler_path_buf: [std.fs.max_path_bytes]u8 = undefined;
12561319 const assembler_path = try tc.getAssemblerPath(&assembler_path_buf);
12571320 const argv = [_][]const u8{ assembler_path, input_path, "-o", output_path };
12581321
1259 var child = std.process.spawn(io, .{
1322 var child = std.process.spawn(d.comp.io, .{
12601323 .argv = &argv,
12611324 // TODO handle better
12621325 .stdin = .inherit,
......@@ -1265,8 +1328,8 @@ fn invokeAssembler(d: *Driver, tc: *Toolchain, input_path: []const u8, output_pa
12651328 }) catch |er| {
12661329 return d.fatal("unable to spawn linker: {s}", .{errorDescription(er)});
12671330 };
1268 const term = child.wait(io) catch |er| {
1269 return d.fatal("unable to wait linker: {s}", .{errorDescription(er)});
1331 const term = child.wait(d.comp.io) catch |er| {
1332 return d.fatal("error waiting for linker: {s}", .{errorDescription(er)});
12701333 };
12711334 switch (term) {
12721335 .exited => |code| if (code != 0) {
......@@ -1289,13 +1352,16 @@ fn processSource(
12891352 comptime fast_exit: bool,
12901353 asm_gen_fn: ?AsmCodeGenFn,
12911354) !void {
1292 const gpa = d.comp.gpa;
1293 d.comp.generated_buf.items.len = 0;
1355 const comp = d.comp;
1356 const io = comp.io;
1357 const gpa = comp.gpa;
1358 comp.generated_buf.items.len = 0;
12941359 const prev_total = d.diagnostics.errors;
12951360
1296 const io = d.comp.io;
1297
1298 var pp = try Preprocessor.initDefault(d.comp);
1361 var pp = try Preprocessor.init(comp, .{
1362 .base_file = source.id,
1363 .path_replacements = d.macro_prefix_map.items,
1364 });
12991365 defer pp.deinit();
13001366
13011367 var name_buf: [std.fs.max_name_bytes]u8 = undefined;
......@@ -1304,8 +1370,8 @@ fn processSource(
13041370
13051371 if (opt_dep_file) |*dep_file| pp.dep_file = dep_file;
13061372
1307 if (d.comp.langopts.ms_extensions) {
1308 d.comp.ms_cwd_source_id = source.id;
1373 if (comp.langopts.ms_extensions) {
1374 comp.ms_cwd_source_id = source.id;
13091375 }
13101376 const dump_mode = d.debug_dump_letters.getPreprocessorDumpMode();
13111377 if (d.verbose_pp) pp.verbose = true;
......@@ -1333,10 +1399,10 @@ fn processSource(
13331399 const dep_file_name = try d.getDepFileName(source, writer_buf[0..std.fs.max_name_bytes]);
13341400
13351401 const file = if (dep_file_name) |path|
1336 d.comp.cwd.createFile(io, path, .{}) catch |er|
1402 comp.cwd.createFile(io, path, .{}) catch |er|
13371403 return d.fatal("unable to create dependency file '{s}': {s}", .{ path, errorDescription(er) })
13381404 else
1339 Io.File.stdout();
1405 std.Io.File.stdout();
13401406 defer if (dep_file_name != null) file.close(io);
13411407
13421408 var file_writer = file.writer(io, &writer_buf);
......@@ -1358,10 +1424,10 @@ fn processSource(
13581424 }
13591425
13601426 const file = if (d.output_name) |some|
1361 d.comp.cwd.createFile(io, some, .{}) catch |er|
1427 comp.cwd.createFile(io, some, .{}) catch |er|
13621428 return d.fatal("unable to create output file '{s}': {s}", .{ some, errorDescription(er) })
13631429 else
1364 Io.File.stdout();
1430 std.Io.File.stdout();
13651431 defer if (d.output_name != null) file.close(io);
13661432
13671433 var file_writer = file.writer(io, &writer_buf);
......@@ -1376,8 +1442,11 @@ fn processSource(
13761442 defer tree.deinit();
13771443
13781444 if (d.verbose_ast) {
1379 var stdout = Io.File.stdout().writer(&writer_buf);
1380 tree.dump(d.detectConfig(stdout.file), &stdout.interface) catch {};
1445 var stdout = std.Io.File.stdout().writer(io, &writer_buf);
1446 tree.dump(.{
1447 .mode = try d.detectMode(stdout.file),
1448 .writer = &stdout.interface,
1449 }) catch {};
13811450 }
13821451
13831452 d.printDiagnosticsStats();
......@@ -1392,10 +1461,10 @@ fn processSource(
13921461 return;
13931462 }
13941463
1395 if (d.comp.target.ofmt != .elf or d.comp.target.cpu.arch != .x86_64) {
1464 if (comp.target.ofmt != .elf or comp.target.cpu.arch != .x86_64) {
13961465 return d.fatal(
13971466 "unsupported target {s}-{s}-{s}, currently only x86-64 elf is supported",
1398 .{ @tagName(d.comp.target.cpu.arch), @tagName(d.comp.target.os.tag), @tagName(d.comp.target.abi) },
1467 .{ @tagName(comp.target.cpu.arch), @tagName(comp.target.os.tag), @tagName(comp.target.abi) },
13991468 );
14001469 }
14011470
......@@ -1407,15 +1476,15 @@ fn processSource(
14071476 .{},
14081477 );
14091478
1410 const assembly = try asm_fn(d.comp.target.toZigTarget(), &tree);
1479 const assembly = try asm_fn(comp.target.toZigTarget(), &tree);
14111480 defer assembly.deinit(gpa);
14121481
14131482 if (d.only_preprocess_and_compile) {
1414 const out_file = d.comp.cwd.createFile(io, out_file_name, .{}) catch |er|
1483 const out_file = comp.cwd.createFile(io, out_file_name, .{}) catch |er|
14151484 return d.fatal("unable to create output file '{s}': {s}", .{ out_file_name, errorDescription(er) });
14161485 defer out_file.close(io);
14171486
1418 assembly.writeToFile(out_file) catch |er|
1487 assembly.writeToFile(io, out_file) catch |er|
14191488 return d.fatal("unable to write to output file '{s}': {s}", .{ out_file_name, errorDescription(er) });
14201489 if (fast_exit) std.process.exit(0); // Not linking, no need for cleanup.
14211490 return;
......@@ -1425,10 +1494,10 @@ fn processSource(
14251494 // then assemble to out_file_name
14261495 var assembly_name_buf: [std.fs.max_name_bytes]u8 = undefined;
14271496 const assembly_out_file_name = try d.getRandomFilename(&assembly_name_buf, ".s");
1428 const out_file = d.comp.cwd.createFile(io, assembly_out_file_name, .{}) catch |er|
1497 const out_file = comp.cwd.createFile(io, assembly_out_file_name, .{}) catch |er|
14291498 return d.fatal("unable to create output file '{s}': {s}", .{ assembly_out_file_name, errorDescription(er) });
14301499 defer out_file.close(io);
1431 assembly.writeToFile(out_file) catch |er|
1500 assembly.writeToFile(io, out_file) catch |er|
14321501 return d.fatal("unable to write to output file '{s}': {s}", .{ assembly_out_file_name, errorDescription(er) });
14331502 try d.invokeAssembler(tc, assembly_out_file_name, out_file_name);
14341503 if (d.only_compile) {
......@@ -1440,8 +1509,11 @@ fn processSource(
14401509 defer ir.deinit(gpa);
14411510
14421511 if (d.verbose_ir) {
1443 var stdout = Io.File.stdout().writer(&writer_buf);
1444 ir.dump(gpa, d.detectConfig(stdout.file), &stdout.interface) catch {};
1512 var stdout = std.Io.File.stdout().writer(io, &writer_buf);
1513 ir.dump(gpa, .{
1514 .mode = try d.detectMode(stdout.file),
1515 .writer = &stdout.interface,
1516 }) catch {};
14451517 }
14461518
14471519 var render_errors: Ir.Renderer.ErrorList = .{};
......@@ -1494,8 +1566,9 @@ fn dumpLinkerArgs(w: *std.Io.Writer, items: []const []const u8) !void {
14941566/// The entry point of the Aro compiler.
14951567/// **MAY call `exit` if `fast_exit` is set.**
14961568pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compilation.Error!void {
1497 const gpa = d.comp.gpa;
1498 const io = d.comp.io;
1569 const comp = d.comp;
1570 const io = comp.io;
1571 const gpa = comp.gpa;
14991572 var argv: std.ArrayList([]const u8) = .empty;
15001573 defer argv.deinit(gpa);
15011574
......@@ -1507,7 +1580,7 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil
15071580
15081581 if (d.verbose_linker_args) {
15091582 var stdout_buf: [4096]u8 = undefined;
1510 var stdout = Io.File.stdout().writer(&stdout_buf);
1583 var stdout = std.Io.File.stdout().writer(io, &stdout_buf);
15111584 dumpLinkerArgs(&stdout.interface, argv.items) catch {
15121585 return d.fatal("unable to dump linker args: {s}", .{errorDescription(stdout.err.?)});
15131586 };
......@@ -1521,8 +1594,9 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil
15211594 }) catch |er| {
15221595 return d.fatal("unable to spawn linker: {s}", .{errorDescription(er)});
15231596 };
1597
15241598 const term = child.wait(io) catch |er| {
1525 return d.fatal("unable to wait linker: {s}", .{errorDescription(er)});
1599 return d.fatal("error waiting for linker: {s}", .{errorDescription(er)});
15261600 };
15271601 switch (term) {
15281602 .exited => |code| if (code != 0) {
......@@ -1541,7 +1615,7 @@ pub fn invokeLinker(d: *Driver, tc: *Toolchain, comptime fast_exit: bool) Compil
15411615
15421616fn exitWithCleanup(d: *Driver, code: u8) noreturn {
15431617 for (d.link_objects.items[d.link_objects.items.len - d.temp_file_count ..]) |obj| {
1544 std.fs.deleteFileAbsolute(obj) catch {};
1618 std.Io.Dir.deleteFileAbsolute(d.comp.io, obj) catch {};
15451619 }
15461620 std.process.exit(code);
15471621}
lib/compiler/aro/aro/Driver/Filesystem.zig deleted-241
......@@ -1,241 +0,0 @@
1const builtin = @import("builtin");
2const is_windows = builtin.os.tag == .windows;
3
4const std = @import("std");
5const Io = std.Io;
6const mem = std.std.mem;
7
8fn readFileFake(entries: []const Filesystem.Entry, path: []const u8, buf: []u8) ?[]const u8 {
9 @branchHint(.cold);
10 for (entries) |entry| {
11 if (mem.eql(u8, entry.path, path)) {
12 const len = @min(entry.contents.len, buf.len);
13 @memcpy(buf[0..len], entry.contents[0..len]);
14 return buf[0..len];
15 }
16 }
17 return null;
18}
19
20fn findProgramByNameFake(entries: []const Filesystem.Entry, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 {
21 @branchHint(.cold);
22 if (mem.indexOfScalar(u8, name, '/') != null) {
23 @memcpy(buf[0..name.len], name);
24 return buf[0..name.len];
25 }
26 const path_env = path orelse return null;
27 var fib = std.heap.FixedBufferAllocator.init(buf);
28
29 var it = mem.tokenizeScalar(u8, path_env, std.fs.path.delimiter);
30 while (it.next()) |path_dir| {
31 defer fib.reset();
32 const full_path = std.fs.path.join(fib.allocator(), &.{ path_dir, name }) catch continue;
33 if (canExecuteFake(entries, full_path)) return full_path;
34 }
35
36 return null;
37}
38
39fn canExecuteFake(entries: []const Filesystem.Entry, path: []const u8) bool {
40 @branchHint(.cold);
41 for (entries) |entry| {
42 if (mem.eql(u8, entry.path, path)) {
43 return entry.executable;
44 }
45 }
46 return false;
47}
48
49fn existsFake(entries: []const Filesystem.Entry, path: []const u8) bool {
50 @branchHint(.cold);
51 var buf: [std.fs.max_path_bytes]u8 = undefined;
52 var fib = std.heap.FixedBufferAllocator.init(&buf);
53 const resolved = std.fs.path.resolvePosix(fib.allocator(), &.{path}) catch return false;
54 for (entries) |entry| {
55 if (mem.eql(u8, entry.path, resolved)) return true;
56 }
57 return false;
58}
59
60fn canExecutePosix(io: Io, path: []const u8) bool {
61 Io.Dir.accessAbsolute(io, path, .{ .execute = true }) catch return false;
62 // Todo: ensure path is not a directory
63 return true;
64}
65
66/// TODO
67fn canExecuteWindows(path: []const u8) bool {
68 _ = path;
69 return true;
70}
71
72/// TODO
73fn findProgramByNameWindows(allocator: std.mem.Allocator, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 {
74 _ = path;
75 _ = buf;
76 _ = name;
77 _ = allocator;
78 return null;
79}
80
81/// TODO: does WASI need special handling?
82fn findProgramByNamePosix(name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 {
83 if (mem.indexOfScalar(u8, name, '/') != null) {
84 @memcpy(buf[0..name.len], name);
85 return buf[0..name.len];
86 }
87 const path_env = path orelse return null;
88 var fib = std.heap.FixedBufferAllocator.init(buf);
89
90 var it = mem.tokenizeScalar(u8, path_env, std.fs.path.delimiter);
91 while (it.next()) |path_dir| {
92 defer fib.reset();
93 const full_path = std.fs.path.join(fib.allocator(), &.{ path_dir, name }) catch continue;
94 if (canExecutePosix(full_path)) return full_path;
95 }
96
97 return null;
98}
99
100pub const Filesystem = union(enum) {
101 real: std.Io.Dir,
102 fake: []const Entry,
103
104 const Entry = struct {
105 path: []const u8,
106 contents: []const u8 = "",
107 executable: bool = false,
108 };
109
110 const FakeDir = struct {
111 entries: []const Entry,
112 path: []const u8,
113
114 fn iterate(self: FakeDir) FakeDir.Iterator {
115 return .{
116 .entries = self.entries,
117 .base = self.path,
118 };
119 }
120
121 const Iterator = struct {
122 entries: []const Entry,
123 base: []const u8,
124 i: usize = 0,
125
126 fn next(self: *@This()) !?std.Io.Dir.Entry {
127 while (self.i < self.entries.len) {
128 const entry = self.entries[self.i];
129 self.i += 1;
130 if (entry.path.len == self.base.len) continue;
131 if (std.mem.startsWith(u8, entry.path, self.base)) {
132 const remaining = entry.path[self.base.len + 1 ..];
133 if (std.mem.indexOfScalar(u8, remaining, std.fs.path.sep) != null) continue;
134 const extension = std.fs.path.extension(remaining);
135 const kind: std.Io.Dir.Entry.Kind = if (extension.len == 0) .directory else .file;
136 return .{ .name = remaining, .kind = kind };
137 }
138 }
139 return null;
140 }
141 };
142 };
143
144 const Dir = union(enum) {
145 dir: std.Io.Dir,
146 fake: FakeDir,
147
148 pub fn iterate(self: Dir) Iterator {
149 return switch (self) {
150 .dir => |dir| .{ .iterator = dir.iterate() },
151 .fake => |fake| .{ .fake = fake.iterate() },
152 };
153 }
154
155 pub fn close(self: *Dir, io: Io) void {
156 switch (self.*) {
157 .dir => |*d| d.close(io),
158 .fake => {},
159 }
160 }
161 };
162
163 const Iterator = union(enum) {
164 iterator: std.Io.Dir.Iterator,
165 fake: FakeDir.Iterator,
166
167 pub fn next(self: *Iterator) std.Io.Dir.Iterator.Error!?std.Io.Dir.Entry {
168 return switch (self.*) {
169 .iterator => |*it| it.next(),
170 .fake => |*it| it.next(),
171 };
172 }
173 };
174
175 pub fn exists(fs: Filesystem, io: Io, path: []const u8) bool {
176 switch (fs) {
177 .real => |cwd| {
178 cwd.access(io, path, .{}) catch return false;
179 return true;
180 },
181 .fake => |paths| return existsFake(paths, path),
182 }
183 }
184
185 pub fn joinedExists(fs: Filesystem, parts: []const []const u8) bool {
186 var buf: [std.fs.max_path_bytes]u8 = undefined;
187 var fib = std.heap.FixedBufferAllocator.init(&buf);
188 const joined = std.fs.path.join(fib.allocator(), parts) catch return false;
189 return fs.exists(joined);
190 }
191
192 pub fn canExecute(fs: Filesystem, path: []const u8) bool {
193 return switch (fs) {
194 .real => if (is_windows) canExecuteWindows(path) else canExecutePosix(path),
195 .fake => |entries| canExecuteFake(entries, path),
196 };
197 }
198
199 /// Search for an executable named `name` using platform-specific logic
200 /// If it's found, write the full path to `buf` and return a slice of it
201 /// Otherwise retun null
202 pub fn findProgramByName(fs: Filesystem, allocator: std.mem.Allocator, name: []const u8, path: ?[]const u8, buf: []u8) ?[]const u8 {
203 std.debug.assert(name.len > 0);
204 return switch (fs) {
205 .real => if (is_windows) findProgramByNameWindows(allocator, name, path, buf) else findProgramByNamePosix(name, path, buf),
206 .fake => |entries| findProgramByNameFake(entries, name, path, buf),
207 };
208 }
209
210 /// Read the file at `path` into `buf`.
211 /// Returns null if any errors are encountered
212 /// Otherwise returns a slice of `buf`. If the file is larger than `buf` partial contents are returned
213 pub fn readFile(fs: Filesystem, io: Io, path: []const u8, buf: []u8) ?[]const u8 {
214 return switch (fs) {
215 .real => |cwd| {
216 const file = cwd.openFile(io, path, .{}) catch return null;
217 defer file.close(io);
218
219 const bytes_read = file.readAll(buf) catch return null;
220 return buf[0..bytes_read];
221 },
222 .fake => |entries| readFileFake(entries, path, buf),
223 };
224 }
225
226 pub fn openDir(fs: Filesystem, io: Io, dir_name: []const u8) std.Io.Dir.OpenError!Dir {
227 return switch (fs) {
228 .real => |cwd| .{ .dir = try cwd.openDir(io, dir_name, .{ .access_sub_paths = false, .iterate = true }) },
229 .fake => |entries| .{ .fake = .{ .entries = entries, .path = dir_name } },
230 };
231 }
232};
233
234test "Fake filesystem" {
235 const fs: Filesystem = .{ .fake = &.{
236 .{ .path = "/usr/bin" },
237 } };
238 try std.testing.expect(fs.exists("/usr/bin"));
239 try std.testing.expect(fs.exists("/usr/bin/foo/.."));
240 try std.testing.expect(!fs.exists("/usr/bin/bar"));
241}
lib/compiler/aro/aro/Driver/GCCDetector.zig created+635
......@@ -0,0 +1,635 @@
1const std = @import("std");
2
3const system_defaults = @import("system_defaults");
4
5const GCCVersion = @import("GCCVersion.zig");
6const Multilib = @import("Multilib.zig");
7const Target = @import("../Target.zig");
8const Toolchain = @import("../Toolchain.zig");
9
10const GCCDetector = @This();
11
12is_valid: bool = false,
13install_path: []const u8 = "",
14parent_lib_path: []const u8 = "",
15version: GCCVersion = .{},
16gcc_triple: []const u8 = "",
17selected: Multilib = .{},
18biarch_sibling: ?Multilib = null,
19
20pub fn deinit(self: *GCCDetector) void {
21 if (!self.is_valid) return;
22}
23
24pub fn appendToolPath(self: *const GCCDetector, tc: *Toolchain) !void {
25 if (!self.is_valid) return;
26 return tc.addPathFromComponents(&.{
27 self.parent_lib_path,
28 "..",
29 self.gcc_triple,
30 "bin",
31 }, .program);
32}
33
34fn addDefaultGCCPrefixes(prefixes: *std.ArrayList([]const u8), tc: *const Toolchain) !void {
35 const sysroot = tc.getSysroot();
36 const target = tc.getTarget();
37 if (sysroot.len == 0 and target.os.tag == .linux and tc.exists("/opt/rh")) {
38 prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-12/root/usr");
39 prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-11/root/usr");
40 prefixes.appendAssumeCapacity("/opt/rh/gcc-toolset-10/root/usr");
41 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-12/root/usr");
42 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-11/root/usr");
43 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-10/root/usr");
44 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-9/root/usr");
45 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-8/root/usr");
46 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-7/root/usr");
47 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-6/root/usr");
48 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-4/root/usr");
49 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-3/root/usr");
50 prefixes.appendAssumeCapacity("/opt/rh/devtoolset-2/root/usr");
51 }
52 if (sysroot.len == 0) {
53 prefixes.appendAssumeCapacity("/usr");
54 } else {
55 var usr_path = try tc.driver.comp.arena.alloc(u8, 4 + sysroot.len);
56 @memcpy(usr_path[0..4], "/usr");
57 @memcpy(usr_path[4..], sysroot);
58 prefixes.appendAssumeCapacity(usr_path);
59 }
60}
61
62fn collectLibDirsAndTriples(
63 tc: *Toolchain,
64 lib_dirs: *std.ArrayList([]const u8),
65 triple_aliases: *std.ArrayList([]const u8),
66 biarch_libdirs: *std.ArrayList([]const u8),
67 biarch_triple_aliases: *std.ArrayList([]const u8),
68) !void {
69 const AArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
70 const AArch64Triples: [4][]const u8 = .{ "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-redhat-linux", "aarch64-suse-linux" };
71 const AArch64beLibDirs: [1][]const u8 = .{"/lib"};
72 const AArch64beTriples: [2][]const u8 = .{ "aarch64_be-none-linux-gnu", "aarch64_be-linux-gnu" };
73
74 const ARMLibDirs: [1][]const u8 = .{"/lib"};
75 const ARMTriples: [1][]const u8 = .{"arm-linux-gnueabi"};
76 const ARMHFTriples: [4][]const u8 = .{ "arm-linux-gnueabihf", "armv7hl-redhat-linux-gnueabi", "armv6hl-suse-linux-gnueabi", "armv7hl-suse-linux-gnueabi" };
77
78 const ARMebLibDirs: [1][]const u8 = .{"/lib"};
79 const ARMebTriples: [1][]const u8 = .{"armeb-linux-gnueabi"};
80 const ARMebHFTriples: [2][]const u8 = .{ "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi" };
81
82 const AVRLibDirs: [1][]const u8 = .{"/lib"};
83 const AVRTriples: [1][]const u8 = .{"avr"};
84
85 const CSKYLibDirs: [1][]const u8 = .{"/lib"};
86 const CSKYTriples: [3][]const u8 = .{ "csky-linux-gnuabiv2", "csky-linux-uclibcabiv2", "csky-elf-noneabiv2" };
87
88 const X86_64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
89 const X86_64Triples: [11][]const u8 = .{
90 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
91 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
92 "x86_64-redhat-linux", "x86_64-suse-linux",
93 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
94 "x86_64-slackware-linux", "x86_64-unknown-linux",
95 "x86_64-amazon-linux",
96 };
97 const X32Triples: [2][]const u8 = .{ "x86_64-linux-gnux32", "x86_64-pc-linux-gnux32" };
98 const X32LibDirs: [2][]const u8 = .{ "/libx32", "/lib" };
99 const X86LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
100 const X86Triples: [9][]const u8 = .{
101 "i586-linux-gnu", "i686-linux-gnu", "i686-pc-linux-gnu",
102 "i386-redhat-linux6E", "i686-redhat-linux", "i386-redhat-linux",
103 "i586-suse-linux", "i686-montavista-linux", "i686-gnu",
104 };
105
106 const LoongArch64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
107 const LoongArch64Triples: [2][]const u8 = .{ "loongarch64-linux-gnu", "loongarch64-unknown-linux-gnu" };
108
109 const M68kLibDirs: [1][]const u8 = .{"/lib"};
110 const M68kTriples: [3][]const u8 = .{ "m68k-linux-gnu", "m68k-unknown-linux-gnu", "m68k-suse-linux" };
111
112 const MIPSLibDirs: [2][]const u8 = .{ "/libo32", "/lib" };
113 const MIPSTriples: [5][]const u8 = .{
114 "mips-linux-gnu", "mips-mti-linux",
115 "mips-mti-linux-gnu", "mips-img-linux-gnu",
116 "mipsisa32r6-linux-gnu",
117 };
118 const MIPSELLibDirs: [2][]const u8 = .{ "/libo32", "/lib" };
119 const MIPSELTriples: [3][]const u8 = .{ "mipsel-linux-gnu", "mips-img-linux-gnu", "mipsisa32r6el-linux-gnu" };
120
121 const MIPS64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
122 const MIPS64Triples: [6][]const u8 = .{
123 "mips64-linux-gnu", "mips-mti-linux-gnu",
124 "mips-img-linux-gnu", "mips64-linux-gnuabi64",
125 "mipsisa64r6-linux-gnu", "mipsisa64r6-linux-gnuabi64",
126 };
127 const MIPS64ELLibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
128 const MIPS64ELTriples: [6][]const u8 = .{
129 "mips64el-linux-gnu", "mips-mti-linux-gnu",
130 "mips-img-linux-gnu", "mips64el-linux-gnuabi64",
131 "mipsisa64r6el-linux-gnu", "mipsisa64r6el-linux-gnuabi64",
132 };
133
134 const MIPSN32LibDirs: [1][]const u8 = .{"/lib32"};
135 const MIPSN32Triples: [2][]const u8 = .{ "mips64-linux-gnuabin32", "mipsisa64r6-linux-gnuabin32" };
136 const MIPSN32ELLibDirs: [1][]const u8 = .{"/lib32"};
137 const MIPSN32ELTriples: [2][]const u8 = .{ "mips64el-linux-gnuabin32", "mipsisa64r6el-linux-gnuabin32" };
138
139 const MSP430LibDirs: [1][]const u8 = .{"/lib"};
140 const MSP430Triples: [1][]const u8 = .{"msp430-elf"};
141
142 const PPCLibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
143 const PPCTriples: [5][]const u8 = .{
144 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
145 // On 32-bit PowerPC systems running SUSE Linux, gcc is configured as a
146 // 64-bit compiler which defaults to "-m32", hence "powerpc64-suse-linux".
147 "powerpc64-suse-linux", "powerpc-montavista-linuxspe",
148 };
149 const PPCLELibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
150 const PPCLETriples: [3][]const u8 = .{ "powerpcle-linux-gnu", "powerpcle-unknown-linux-gnu", "powerpcle-linux-musl" };
151
152 const PPC64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
153 const PPC64Triples: [4][]const u8 = .{
154 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
155 "powerpc64-suse-linux", "ppc64-redhat-linux",
156 };
157 const PPC64LELibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
158 const PPC64LETriples: [5][]const u8 = .{
159 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
160 "powerpc64le-none-linux-gnu", "powerpc64le-suse-linux",
161 "ppc64le-redhat-linux",
162 };
163
164 const RISCV32LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
165 const RISCV32Triples: [3][]const u8 = .{ "riscv32-unknown-linux-gnu", "riscv32-linux-gnu", "riscv32-unknown-elf" };
166 const RISCV64LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
167 const RISCV64Triples: [3][]const u8 = .{
168 "riscv64-unknown-linux-gnu",
169 "riscv64-linux-gnu",
170 "riscv64-unknown-elf",
171 };
172
173 const SPARCv8LibDirs: [2][]const u8 = .{ "/lib32", "/lib" };
174 const SPARCv8Triples: [2][]const u8 = .{ "sparc-linux-gnu", "sparcv8-linux-gnu" };
175 const SPARCv9LibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
176 const SPARCv9Triples: [2][]const u8 = .{ "sparc64-linux-gnu", "sparcv9-linux-gnu" };
177
178 const SystemZLibDirs: [2][]const u8 = .{ "/lib64", "/lib" };
179 const SystemZTriples: [5][]const u8 = .{
180 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
181 "s390x-suse-linux", "s390x-redhat-linux",
182 };
183 const target = tc.getTarget();
184 if (target.os.tag == .illumos) {
185 // TODO
186 return;
187 }
188 if (target.abi.isAndroid()) {
189 const AArch64AndroidTriples: [1][]const u8 = .{"aarch64-linux-android"};
190 const ARMAndroidTriples: [1][]const u8 = .{"arm-linux-androideabi"};
191 const MIPSELAndroidTriples: [1][]const u8 = .{"mipsel-linux-android"};
192 const MIPS64ELAndroidTriples: [1][]const u8 = .{"mips64el-linux-android"};
193 const X86AndroidTriples: [1][]const u8 = .{"i686-linux-android"};
194 const X86_64AndroidTriples: [1][]const u8 = .{"x86_64-linux-android"};
195
196 switch (target.cpu.arch) {
197 .aarch64 => {
198 lib_dirs.appendSliceAssumeCapacity(&AArch64LibDirs);
199 triple_aliases.appendSliceAssumeCapacity(&AArch64AndroidTriples);
200 },
201 .arm,
202 .thumb,
203 => {
204 lib_dirs.appendSliceAssumeCapacity(&ARMLibDirs);
205 triple_aliases.appendSliceAssumeCapacity(&ARMAndroidTriples);
206 },
207 .mipsel => {
208 lib_dirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
209 triple_aliases.appendSliceAssumeCapacity(&MIPSELAndroidTriples);
210 biarch_libdirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
211 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64ELAndroidTriples);
212 },
213 .mips64el => {
214 lib_dirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
215 triple_aliases.appendSliceAssumeCapacity(&MIPS64ELAndroidTriples);
216 biarch_libdirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
217 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSELAndroidTriples);
218 },
219 .x86_64 => {
220 lib_dirs.appendSliceAssumeCapacity(&X86_64LibDirs);
221 triple_aliases.appendSliceAssumeCapacity(&X86_64AndroidTriples);
222 biarch_libdirs.appendSliceAssumeCapacity(&X86LibDirs);
223 biarch_triple_aliases.appendSliceAssumeCapacity(&X86AndroidTriples);
224 },
225 .x86 => {
226 lib_dirs.appendSliceAssumeCapacity(&X86LibDirs);
227 triple_aliases.appendSliceAssumeCapacity(&X86AndroidTriples);
228 biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs);
229 biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64AndroidTriples);
230 },
231 else => {},
232 }
233 return;
234 }
235 switch (target.cpu.arch) {
236 .aarch64 => {
237 lib_dirs.appendSliceAssumeCapacity(&AArch64LibDirs);
238 triple_aliases.appendSliceAssumeCapacity(&AArch64Triples);
239 biarch_libdirs.appendSliceAssumeCapacity(&AArch64LibDirs);
240 biarch_triple_aliases.appendSliceAssumeCapacity(&AArch64Triples);
241 },
242 .aarch64_be => {
243 lib_dirs.appendSliceAssumeCapacity(&AArch64beLibDirs);
244 triple_aliases.appendSliceAssumeCapacity(&AArch64beTriples);
245 biarch_libdirs.appendSliceAssumeCapacity(&AArch64beLibDirs);
246 biarch_triple_aliases.appendSliceAssumeCapacity(&AArch64beTriples);
247 },
248 .arm, .thumb => {
249 lib_dirs.appendSliceAssumeCapacity(&ARMLibDirs);
250 if (target.abi == .gnueabihf) {
251 triple_aliases.appendSliceAssumeCapacity(&ARMHFTriples);
252 } else {
253 triple_aliases.appendSliceAssumeCapacity(&ARMTriples);
254 }
255 },
256 .armeb, .thumbeb => {
257 lib_dirs.appendSliceAssumeCapacity(&ARMebLibDirs);
258 if (target.abi == .gnueabihf) {
259 triple_aliases.appendSliceAssumeCapacity(&ARMebHFTriples);
260 } else {
261 triple_aliases.appendSliceAssumeCapacity(&ARMebTriples);
262 }
263 },
264 .avr => {
265 lib_dirs.appendSliceAssumeCapacity(&AVRLibDirs);
266 triple_aliases.appendSliceAssumeCapacity(&AVRTriples);
267 },
268 .csky => {
269 lib_dirs.appendSliceAssumeCapacity(&CSKYLibDirs);
270 triple_aliases.appendSliceAssumeCapacity(&CSKYTriples);
271 },
272 .x86_64 => {
273 if (target.abi == .gnux32 or target.abi == .muslx32) {
274 lib_dirs.appendSliceAssumeCapacity(&X32LibDirs);
275 triple_aliases.appendSliceAssumeCapacity(&X32Triples);
276 biarch_libdirs.appendSliceAssumeCapacity(&X86_64LibDirs);
277 biarch_triple_aliases.appendSliceAssumeCapacity(&X86_64Triples);
278 } else {
279 lib_dirs.appendSliceAssumeCapacity(&X86_64LibDirs);
280 triple_aliases.appendSliceAssumeCapacity(&X86_64Triples);
281 biarch_libdirs.appendSliceAssumeCapacity(&X32LibDirs);
282 biarch_triple_aliases.appendSliceAssumeCapacity(&X32Triples);
283 }
284 biarch_libdirs.appendSliceAssumeCapacity(&X86LibDirs);
285 biarch_triple_aliases.appendSliceAssumeCapacity(&X86Triples);
286 },
287 .x86 => {
288 lib_dirs.appendSliceAssumeCapacity(&X86LibDirs);
289 },
290 .loongarch64 => {
291 lib_dirs.appendSliceAssumeCapacity(&LoongArch64LibDirs);
292 triple_aliases.appendSliceAssumeCapacity(&LoongArch64Triples);
293 },
294 .m68k => {
295 lib_dirs.appendSliceAssumeCapacity(&M68kLibDirs);
296 triple_aliases.appendSliceAssumeCapacity(&M68kTriples);
297 },
298 .mips => {
299 lib_dirs.appendSliceAssumeCapacity(&MIPSLibDirs);
300 triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
301 biarch_libdirs.appendSliceAssumeCapacity(&MIPS64LibDirs);
302 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64Triples);
303 biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32LibDirs);
304 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32Triples);
305 },
306 .mipsel => {
307 lib_dirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
308 triple_aliases.appendSliceAssumeCapacity(&MIPSELTriples);
309 triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
310 biarch_libdirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
311 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPS64ELTriples);
312 biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32ELLibDirs);
313 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32ELTriples);
314 },
315 .mips64 => {
316 lib_dirs.appendSliceAssumeCapacity(&MIPS64LibDirs);
317 triple_aliases.appendSliceAssumeCapacity(&MIPS64Triples);
318 biarch_libdirs.appendSliceAssumeCapacity(&MIPSLibDirs);
319 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
320 biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32LibDirs);
321 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32Triples);
322 },
323 .mips64el => {
324 lib_dirs.appendSliceAssumeCapacity(&MIPS64ELLibDirs);
325 triple_aliases.appendSliceAssumeCapacity(&MIPS64ELTriples);
326 biarch_libdirs.appendSliceAssumeCapacity(&MIPSELLibDirs);
327 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSELTriples);
328 biarch_libdirs.appendSliceAssumeCapacity(&MIPSN32ELLibDirs);
329 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSN32ELTriples);
330 biarch_triple_aliases.appendSliceAssumeCapacity(&MIPSTriples);
331 },
332 .msp430 => {
333 lib_dirs.appendSliceAssumeCapacity(&MSP430LibDirs);
334 triple_aliases.appendSliceAssumeCapacity(&MSP430Triples);
335 },
336 .powerpc => {
337 lib_dirs.appendSliceAssumeCapacity(&PPCLibDirs);
338 triple_aliases.appendSliceAssumeCapacity(&PPCTriples);
339 biarch_libdirs.appendSliceAssumeCapacity(&PPC64LibDirs);
340 biarch_triple_aliases.appendSliceAssumeCapacity(&PPC64Triples);
341 },
342 .powerpcle => {
343 lib_dirs.appendSliceAssumeCapacity(&PPCLELibDirs);
344 triple_aliases.appendSliceAssumeCapacity(&PPCLETriples);
345 biarch_libdirs.appendSliceAssumeCapacity(&PPC64LELibDirs);
346 biarch_triple_aliases.appendSliceAssumeCapacity(&PPC64LETriples);
347 },
348 .powerpc64 => {
349 lib_dirs.appendSliceAssumeCapacity(&PPC64LibDirs);
350 triple_aliases.appendSliceAssumeCapacity(&PPC64Triples);
351 biarch_libdirs.appendSliceAssumeCapacity(&PPCLibDirs);
352 biarch_triple_aliases.appendSliceAssumeCapacity(&PPCTriples);
353 },
354 .powerpc64le => {
355 lib_dirs.appendSliceAssumeCapacity(&PPC64LELibDirs);
356 triple_aliases.appendSliceAssumeCapacity(&PPC64LETriples);
357 biarch_libdirs.appendSliceAssumeCapacity(&PPCLELibDirs);
358 biarch_triple_aliases.appendSliceAssumeCapacity(&PPCLETriples);
359 },
360 .riscv32 => {
361 lib_dirs.appendSliceAssumeCapacity(&RISCV32LibDirs);
362 triple_aliases.appendSliceAssumeCapacity(&RISCV32Triples);
363 biarch_libdirs.appendSliceAssumeCapacity(&RISCV64LibDirs);
364 biarch_triple_aliases.appendSliceAssumeCapacity(&RISCV64Triples);
365 },
366 .riscv64 => {
367 lib_dirs.appendSliceAssumeCapacity(&RISCV64LibDirs);
368 triple_aliases.appendSliceAssumeCapacity(&RISCV64Triples);
369 biarch_libdirs.appendSliceAssumeCapacity(&RISCV32LibDirs);
370 biarch_triple_aliases.appendSliceAssumeCapacity(&RISCV32Triples);
371 },
372 .sparc => {
373 lib_dirs.appendSliceAssumeCapacity(&SPARCv8LibDirs);
374 triple_aliases.appendSliceAssumeCapacity(&SPARCv8Triples);
375 biarch_libdirs.appendSliceAssumeCapacity(&SPARCv9LibDirs);
376 biarch_triple_aliases.appendSliceAssumeCapacity(&SPARCv9Triples);
377 },
378 .sparc64 => {
379 lib_dirs.appendSliceAssumeCapacity(&SPARCv9LibDirs);
380 triple_aliases.appendSliceAssumeCapacity(&SPARCv9Triples);
381 biarch_libdirs.appendSliceAssumeCapacity(&SPARCv8LibDirs);
382 biarch_triple_aliases.appendSliceAssumeCapacity(&SPARCv8Triples);
383 },
384 .s390x => {
385 lib_dirs.appendSliceAssumeCapacity(&SystemZLibDirs);
386 triple_aliases.appendSliceAssumeCapacity(&SystemZTriples);
387 },
388 else => {},
389 }
390}
391
392pub fn discover(self: *GCCDetector, tc: *Toolchain) !void {
393 var path_buf: [std.fs.max_path_bytes]u8 = undefined;
394 var fib = std.heap.FixedBufferAllocator.init(&path_buf);
395
396 const target = tc.getTarget();
397 const biarch_variant_target = if (target.ptrBitWidth() == 32)
398 target.get64BitArchVariant()
399 else
400 target.get32BitArchVariant();
401
402 var candidate_lib_dirs_buffer: [16][]const u8 = undefined;
403 var candidate_lib_dirs = std.ArrayList([]const u8).initBuffer(&candidate_lib_dirs_buffer);
404
405 var candidate_triple_aliases_buffer: [16][]const u8 = undefined;
406 var candidate_triple_aliases = std.ArrayList([]const u8).initBuffer(&candidate_triple_aliases_buffer);
407
408 var candidate_biarch_lib_dirs_buffer: [16][]const u8 = undefined;
409 var candidate_biarch_lib_dirs = std.ArrayList([]const u8).initBuffer(&candidate_biarch_lib_dirs_buffer);
410
411 var candidate_biarch_triple_aliases_buffer: [20][]const u8 = undefined;
412 var candidate_biarch_triple_aliases = std.ArrayList([]const u8).initBuffer(&candidate_biarch_triple_aliases_buffer);
413
414 try collectLibDirsAndTriples(
415 tc,
416 &candidate_lib_dirs,
417 &candidate_triple_aliases,
418 &candidate_biarch_lib_dirs,
419 &candidate_biarch_triple_aliases,
420 );
421
422 var target_buf: [64]u8 = undefined;
423 const triple_str = target.toLLVMTriple(&target_buf);
424 candidate_triple_aliases.appendAssumeCapacity(triple_str);
425
426 // Also include the multiarch variant if it's different.
427 var biarch_buf: [64]u8 = undefined;
428 if (biarch_variant_target) |*biarch_target| {
429 const biarch_triple_str = biarch_target.toLLVMTriple(&biarch_buf);
430 if (!std.mem.eql(u8, biarch_triple_str, triple_str)) {
431 candidate_triple_aliases.appendAssumeCapacity(biarch_triple_str);
432 }
433 }
434
435 var prefixes_buf: [16][]const u8 = undefined;
436 var prefixes = std.ArrayList([]const u8).initBuffer(&prefixes_buf);
437 const gcc_toolchain_dir = gccToolchainDir(tc);
438 if (gcc_toolchain_dir.len != 0) {
439 const adjusted = if (gcc_toolchain_dir[gcc_toolchain_dir.len - 1] == '/')
440 gcc_toolchain_dir[0 .. gcc_toolchain_dir.len - 1]
441 else
442 gcc_toolchain_dir;
443 prefixes.appendAssumeCapacity(adjusted);
444 } else {
445 const sysroot = tc.getSysroot();
446 if (sysroot.len > 0) {
447 prefixes.appendAssumeCapacity(sysroot);
448 try addDefaultGCCPrefixes(&prefixes, tc);
449 }
450
451 if (sysroot.len == 0) {
452 try addDefaultGCCPrefixes(&prefixes, tc);
453 }
454 // TODO: Special-case handling for Gentoo
455 }
456
457 const v0 = GCCVersion.parse("0.0.0");
458 for (prefixes.items) |prefix| {
459 if (!tc.exists(prefix)) continue;
460
461 for (candidate_lib_dirs.items) |suffix| {
462 defer fib.reset();
463 const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue;
464 if (!tc.exists(lib_dir)) continue;
465
466 const gcc_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc" });
467 const gcc_cross_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc-cross" });
468
469 try self.scanLibDirForGCCTriple(tc, target, lib_dir, triple_str, false, gcc_dir_exists, gcc_cross_dir_exists);
470 for (candidate_triple_aliases.items) |candidate| {
471 try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, false, gcc_dir_exists, gcc_cross_dir_exists);
472 }
473 }
474 for (candidate_biarch_lib_dirs.items) |suffix| {
475 const lib_dir = std.fs.path.join(fib.allocator(), &.{ prefix, suffix }) catch continue;
476 if (!tc.exists(lib_dir)) continue;
477
478 const gcc_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc" });
479 const gcc_cross_dir_exists = tc.joinedExists(&.{ lib_dir, "/gcc-cross" });
480 for (candidate_biarch_triple_aliases.items) |candidate| {
481 try self.scanLibDirForGCCTriple(tc, target, lib_dir, candidate, true, gcc_dir_exists, gcc_cross_dir_exists);
482 }
483 }
484 if (self.version.order(v0) == .gt) break;
485 }
486}
487
488fn findBiarchMultilibs(
489 tc: *const Toolchain,
490 result: *Multilib.Detected,
491 target: *const Target,
492 path: [2][]const u8,
493 needs_biarch_suffix: bool,
494) !bool {
495 const suff64 = if (target.os.tag == .illumos) switch (target.cpu.arch) {
496 .x86, .x86_64 => "/amd64",
497 .sparc => "/sparcv9",
498 else => "/64",
499 } else "/64";
500
501 const alt_64 = Multilib.init(suff64, suff64, &.{ "-m32", "+m64", "-mx32" });
502 const alt_32 = Multilib.init("/32", "/32", &.{ "+m32", "-m64", "-mx32" });
503 const alt_x32 = Multilib.init("/x32", "/x32", &.{ "-m32", "-m64", "+mx32" });
504
505 const multilib_filter = Multilib.Filter{
506 .base = path,
507 .file = "crtbegin.o",
508 };
509
510 const Want = enum {
511 want32,
512 want64,
513 wantx32,
514 };
515 const is_x32 = target.abi == .gnux32 or target.abi == .muslx32;
516 const target_ptr_width = target.ptrBitWidth();
517 const want: Want = if (target_ptr_width == 32 and multilib_filter.exists(alt_32, tc))
518 .want64
519 else if (target_ptr_width == 64 and is_x32 and multilib_filter.exists(alt_x32, tc))
520 .want64
521 else if (target_ptr_width == 64 and !is_x32 and multilib_filter.exists(alt_64, tc))
522 .want32
523 else if (target_ptr_width == 32)
524 if (needs_biarch_suffix) .want64 else .want32
525 else if (is_x32)
526 if (needs_biarch_suffix) .want64 else .wantx32
527 else if (needs_biarch_suffix) .want32 else .want64;
528
529 const default = switch (want) {
530 .want32 => Multilib.init("", "", &.{ "+m32", "-m64", "-mx32" }),
531 .want64 => Multilib.init("", "", &.{ "-m32", "+m64", "-mx32" }),
532 .wantx32 => Multilib.init("", "", &.{ "-m32", "-m64", "+mx32" }),
533 };
534 result.multilib_buf[result.multilib_count..][0..4].* = .{
535 default,
536 alt_64,
537 alt_32,
538 alt_x32,
539 };
540 result.multilib_count += 4;
541
542 result.filter(multilib_filter, tc);
543 return result.select(&.{
544 if (target_ptr_width == 64 and !is_x32) "+m64" else "-m64",
545 if (target_ptr_width == 32) "+m32" else "-m32",
546 if (target_ptr_width == 64 and is_x32) "+mx32" else "-mx32",
547 });
548}
549
550fn scanGCCForMultilibs(
551 self: *GCCDetector,
552 tc: *const Toolchain,
553 target: *const Target,
554 path: [2][]const u8,
555 needs_biarch_suffix: bool,
556) !bool {
557 var detected: Multilib.Detected = .{};
558 if (target.cpu.arch == .csky) {
559 // TODO
560 } else if (target.cpu.arch.isMIPS()) {
561 // TODO
562 } else if (target.cpu.arch.isRISCV()) {
563 // TODO
564 } else if (target.cpu.arch == .msp430) {
565 // TODO
566 } else if (target.cpu.arch == .avr) {
567 // No multilibs
568 } else if (!try findBiarchMultilibs(tc, &detected, target, path, needs_biarch_suffix)) {
569 return false;
570 }
571 self.selected = detected.selected;
572 self.biarch_sibling = detected.biarch_sibling;
573 return true;
574}
575
576fn scanLibDirForGCCTriple(
577 self: *GCCDetector,
578 tc: *const Toolchain,
579 target: *const Target,
580 lib_dir: []const u8,
581 candidate_triple: []const u8,
582 needs_biarch_suffix: bool,
583 gcc_dir_exists: bool,
584 gcc_cross_dir_exists: bool,
585) !void {
586 var path_buf: [std.fs.max_path_bytes]u8 = undefined;
587 var fib = std.heap.FixedBufferAllocator.init(&path_buf);
588 const comp = tc.driver.comp;
589 const arena = comp.arena;
590 const io = comp.io;
591 for (0..2) |i| {
592 if (i == 0 and !gcc_dir_exists) continue;
593 if (i == 1 and !gcc_cross_dir_exists) continue;
594 defer fib.reset();
595
596 const base: []const u8 = if (i == 0) "gcc" else "gcc-cross";
597 var lib_suffix_buf: [64]u8 = undefined;
598 var suffix_buf_fib = std.heap.FixedBufferAllocator.init(&lib_suffix_buf);
599 const lib_suffix = std.fs.path.join(suffix_buf_fib.allocator(), &.{ base, candidate_triple }) catch continue;
600
601 const dir_name = std.fs.path.join(fib.allocator(), &.{ lib_dir, lib_suffix }) catch continue;
602 var parent_dir = comp.cwd.openDir(io, dir_name, .{ .access_sub_paths = false, .iterate = true }) catch continue;
603 defer parent_dir.close(io);
604
605 var it = parent_dir.iterate();
606 while (it.next(io) catch continue) |entry| {
607 if (entry.kind != .directory) continue;
608
609 const version_text = entry.name;
610 const candidate_version = GCCVersion.parse(version_text);
611 if (candidate_version.major != -1) {
612 // TODO: cache path so we're not repeatedly scanning
613 }
614 if (candidate_version.isLessThan(4, 1, 1, "")) continue;
615 switch (candidate_version.order(self.version)) {
616 .lt, .eq => continue,
617 .gt => {},
618 }
619
620 if (!try self.scanGCCForMultilibs(tc, target, .{ dir_name, version_text }, needs_biarch_suffix)) continue;
621
622 self.version = candidate_version;
623 self.gcc_triple = try arena.dupe(u8, candidate_triple);
624 self.install_path = try std.fs.path.join(arena, &.{ lib_dir, lib_suffix, version_text });
625 self.parent_lib_path = try std.fs.path.join(arena, &.{ self.install_path, "..", "..", ".." });
626 self.is_valid = true;
627 }
628 }
629}
630
631fn gccToolchainDir(tc: *const Toolchain) []const u8 {
632 const sysroot = tc.getSysroot();
633 if (sysroot.len != 0) return "";
634 return system_defaults.gcc_install_prefix;
635}
lib/compiler/aro/aro/LangOpts.zig+12-2
......@@ -7,16 +7,22 @@ pub const Compiler = enum {
77 clang,
88 gcc,
99 msvc,
10 no,
1011
1112 pub fn defaultGccVersion(self: Compiler) u32 {
1213 return switch (self) {
1314 .clang => 4 * 10_000 + 2 * 100 + 1,
14 .gcc => 7 * 10_000 + 1 * 100 + 0,
15 .no, .gcc => 7 * 10_000 + 1 * 100 + 0,
1516 .msvc => 0,
1617 };
1718 }
1819};
1920
21pub const BoundsSafety = enum {
22 none,
23 clang,
24};
25
2026/// The floating-point evaluation method for intermediate results within a single expression
2127pub const FPEvalMethod = enum(i8) {
2228 /// The evaluation method cannot be determined or is inconsistent for this target.
......@@ -116,7 +122,7 @@ pub const Standard = enum {
116122
117123const LangOpts = @This();
118124
119emulate: Compiler = .clang,
125emulate: Compiler = .no,
120126standard: Standard = .default,
121127/// -fshort-enums option, makes enums only take up as much space as they need to hold all the values.
122128short_enums: bool = false,
......@@ -149,6 +155,10 @@ preserve_comments_in_macros: bool = false,
149155/// e.g. 4.2.1 == 40201
150156gnuc_version: ?u32 = null,
151157
158bounds_safety: BoundsSafety = .none,
159
160default_symbol_visibility: std.builtin.SymbolVisibility = .default,
161
152162pub fn setStandard(self: *LangOpts, name: []const u8) error{InvalidStandard}!void {
153163 self.standard = Standard.NameMap.get(name) orelse return error.InvalidStandard;
154164}
lib/compiler/aro/aro/Parser.zig+336-142
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const Io = std.Io;
32const mem = std.mem;
43const Allocator = mem.Allocator;
54const assert = std.debug.assert;
......@@ -204,6 +203,11 @@ string_ids: struct {
204203 sigjmp_buf: StringId,
205204 ucontext_t: StringId,
206205},
206va_arg_pack_ctx: packed struct {
207 valid: bool = false,
208 variadic: bool = false,
209 typed: bool = false,
210} = .{},
207211
208212/// Checks codepoint for various pedantic warnings
209213/// Returns true if diagnostic issued
......@@ -212,7 +216,7 @@ fn checkIdentifierCodepointWarnings(p: *Parser, codepoint: u21, loc: Source.Loca
212216
213217 const prev_total = p.diagnostics.total;
214218 var sf = std.heap.stackFallback(1024, p.comp.gpa);
215 var allocating: Io.Writer.Allocating = .init(sf.get());
219 var allocating: std.Io.Writer.Allocating = .init(sf.get());
216220 defer allocating.deinit();
217221
218222 if (!char_info.isC99IdChar(codepoint)) {
......@@ -426,7 +430,7 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype)
426430 if (p.diagnostics.effectiveKind(diagnostic) == .off) return;
427431
428432 var sf = std.heap.stackFallback(1024, p.comp.gpa);
429 var allocating: Io.Writer.Allocating = .init(sf.get());
433 var allocating: std.Io.Writer.Allocating = .init(sf.get());
430434 defer allocating.deinit();
431435
432436 p.formatArgs(&allocating.writer, diagnostic.fmt, args) catch return error.OutOfMemory;
......@@ -448,7 +452,7 @@ pub fn err(p: *Parser, tok_i: TokenIndex, diagnostic: Diagnostic, args: anytype)
448452 }, p.pp.expansionSlice(tok_i), true);
449453}
450454
451fn formatArgs(p: *Parser, w: *Io.Writer, fmt: []const u8, args: anytype) !void {
455fn formatArgs(p: *Parser, w: *std.Io.Writer, fmt: []const u8, args: anytype) !void {
452456 var i: usize = 0;
453457 inline for (std.meta.fields(@TypeOf(args))) |arg_info| {
454458 const arg = @field(args, arg_info.name);
......@@ -477,13 +481,13 @@ fn formatArgs(p: *Parser, w: *Io.Writer, fmt: []const u8, args: anytype) !void {
477481 try w.writeAll(fmt[i..]);
478482}
479483
480fn formatTokenId(w: *Io.Writer, fmt: []const u8, tok_id: Tree.Token.Id) !usize {
484fn formatTokenId(w: *std.Io.Writer, fmt: []const u8, tok_id: Tree.Token.Id) !usize {
481485 const i = Diagnostics.templateIndex(w, fmt, "{tok_id}");
482486 try w.writeAll(tok_id.symbol());
483487 return i;
484488}
485489
486fn formatQualType(p: *Parser, w: *Io.Writer, fmt: []const u8, qt: QualType) !usize {
490fn formatQualType(p: *Parser, w: *std.Io.Writer, fmt: []const u8, qt: QualType) !usize {
487491 const i = Diagnostics.templateIndex(w, fmt, "{qt}");
488492 try w.writeByte('\'');
489493 try qt.print(p.comp, w);
......@@ -502,7 +506,7 @@ fn formatQualType(p: *Parser, w: *Io.Writer, fmt: []const u8, qt: QualType) !usi
502506 return i;
503507}
504508
505fn formatResult(p: *Parser, w: *Io.Writer, fmt: []const u8, res: Result) !usize {
509fn formatResult(p: *Parser, w: *std.Io.Writer, fmt: []const u8, res: Result) !usize {
506510 const i = Diagnostics.templateIndex(w, fmt, "{value}");
507511 switch (res.val.opt_ref) {
508512 .none => try w.writeAll("(none)"),
......@@ -525,7 +529,7 @@ const Normalized = struct {
525529 return .{ .str = str };
526530 }
527531
528 pub fn format(ctx: Normalized, w: *Io.Writer, fmt: []const u8) !usize {
532 pub fn format(ctx: Normalized, w: *std.Io.Writer, fmt: []const u8) !usize {
529533 const i = Diagnostics.templateIndex(w, fmt, "{normalized}");
530534 var it: std.unicode.Utf8Iterator = .{
531535 .bytes = ctx.str,
......@@ -559,7 +563,7 @@ const Codepoint = struct {
559563 return .{ .codepoint = codepoint };
560564 }
561565
562 pub fn format(ctx: Codepoint, w: *Io.Writer, fmt: []const u8) !usize {
566 pub fn format(ctx: Codepoint, w: *std.Io.Writer, fmt: []const u8) !usize {
563567 const i = Diagnostics.templateIndex(w, fmt, "{codepoint}");
564568 try w.print("{X:0>4}", .{ctx.codepoint});
565569 return i;
......@@ -573,7 +577,7 @@ const Escaped = struct {
573577 return .{ .str = str };
574578 }
575579
576 pub fn format(ctx: Escaped, w: *Io.Writer, fmt: []const u8) !usize {
580 pub fn format(ctx: Escaped, w: *std.Io.Writer, fmt: []const u8) !usize {
577581 const i = Diagnostics.templateIndex(w, fmt, "{s}");
578582 try std.zig.stringEscape(ctx.str, w);
579583 return i;
......@@ -740,6 +744,11 @@ fn getNode(p: *Parser, node: Node.Index, comptime tag: std.meta.Tag(Tree.Node))
740744 }
741745}
742746
747pub fn isAddressOfStringLiteral(p: *Parser, node: Node.Index) bool {
748 const addr_of = p.getNode(node, .addr_of_expr) orelse return false;
749 return p.nodeIs(addr_of.operand, .string_literal_expr);
750}
751
743752fn pragma(p: *Parser) Compilation.Error!bool {
744753 var found_pragma = false;
745754 while (p.eatToken(.keyword_pragma)) |_| {
......@@ -1070,14 +1079,15 @@ fn decl(p: *Parser) Error!bool {
10701079
10711080 try p.attributeSpecifier();
10721081
1082 const decl_spec_start = p.tok_i;
10731083 var decl_spec = (try p.declSpec()) orelse blk: {
10741084 if (p.func.qt != null) {
10751085 p.tok_i = first_tok;
10761086 return false;
10771087 }
1078 switch (p.tok_ids[first_tok]) {
1088 switch (p.tok_ids[decl_spec_start]) {
10791089 .asterisk, .l_paren => {},
1080 .identifier, .extended_identifier => switch (p.tok_ids[first_tok + 1]) {
1090 .identifier, .extended_identifier => switch (p.tok_ids[decl_spec_start + 1]) {
10811091 .identifier, .extended_identifier => {
10821092 // The most likely reason for `identifier identifier` is
10831093 // an unknown type name.
......@@ -1087,7 +1097,7 @@ fn decl(p: *Parser) Error!bool {
10871097 },
10881098 else => {},
10891099 },
1090 else => if (p.tok_i != first_tok) {
1100 else => if (p.tok_i != decl_spec_start) {
10911101 try p.err(p.tok_i, .expected_ident_or_l_paren, .{});
10921102 return error.ParsingFailed;
10931103 } else return false,
......@@ -1167,6 +1177,7 @@ fn decl(p: *Parser) Error!bool {
11671177
11681178 // Collect old style parameter declarations.
11691179 if (init_d.d.old_style_func != null) {
1180 try p.err(init_d.d.name, .def_no_proto_deprecated, .{});
11701181 const param_buf_top = p.param_buf.items.len;
11711182 defer p.param_buf.items.len = param_buf_top;
11721183
......@@ -1340,7 +1351,7 @@ fn decl(p: *Parser) Error!bool {
13401351 if (init_d.d.old_style_func) |tok_i| try p.err(tok_i, .invalid_old_style_params, .{});
13411352
13421353 if (decl_spec.storage_class == .typedef) {
1343 try decl_spec.validateDecl(p);
1354 try decl_spec.validateDecl(p, init_d.asm_label);
13441355 try p.tree.setNode(.{ .typedef = .{
13451356 .name_tok = init_d.d.name,
13461357 .qt = init_d.d.qt,
......@@ -1357,7 +1368,7 @@ fn decl(p: *Parser) Error!bool {
13571368 .definition = null,
13581369 } }, @intFromEnum(decl_node));
13591370 } else {
1360 try decl_spec.validateDecl(p);
1371 try decl_spec.validateDecl(p, init_d.asm_label);
13611372 var node_qt = init_d.d.qt;
13621373 if (p.func.qt == null and decl_spec.storage_class != .@"extern") {
13631374 if (node_qt.get(p.comp, .array)) |array_ty| {
......@@ -1454,7 +1465,7 @@ fn decl(p: *Parser) Error!bool {
14541465 return true;
14551466}
14561467
1457fn staticAssertMessage(p: *Parser, cond_node: Node.Index, maybe_message: ?Result, allocating: *Io.Writer.Allocating) !?[]const u8 {
1468fn staticAssertMessage(p: *Parser, cond_node: Node.Index, maybe_message: ?Result, allocating: *std.Io.Writer.Allocating) !?[]const u8 {
14581469 const w = &allocating.writer;
14591470
14601471 const cond = cond_node.get(&p.tree);
......@@ -1527,7 +1538,7 @@ fn staticAssert(p: *Parser) Error!bool {
15271538 } else {
15281539 if (!res.val.toBool(p.comp)) {
15291540 var sf = std.heap.stackFallback(1024, gpa);
1530 var allocating: Io.Writer.Allocating = .init(sf.get());
1541 var allocating: std.Io.Writer.Allocating = .init(sf.get());
15311542 defer allocating.deinit();
15321543
15331544 if (p.staticAssertMessage(res_node, str, &allocating) catch return error.OutOfMemory) |message| {
......@@ -1597,13 +1608,16 @@ pub const DeclSpec = struct {
15971608 if (d.constexpr) |tok_i| try p.err(tok_i, .illegal_storage_on_func, .{});
15981609 }
15991610
1600 fn validateDecl(d: DeclSpec, p: *Parser) Error!void {
1611 fn validateDecl(d: DeclSpec, p: *Parser, asm_label: ?Node.Index) Error!void {
16011612 if (d.@"inline") |tok_i| try p.err(tok_i, .func_spec_non_func, .{"inline"});
16021613 // TODO move to attribute validation
16031614 if (d.noreturn) |tok_i| try p.err(tok_i, .func_spec_non_func, .{"_Noreturn"});
16041615 switch (d.storage_class) {
1605 .auto => std.debug.assert(!p.comp.langopts.standard.atLeast(.c23)),
1606 .register => if (p.func.qt == null) try p.err(p.tok_i, .illegal_storage_on_global, .{}),
1616 .auto => {
1617 std.debug.assert(!p.comp.langopts.standard.atLeast(.c23));
1618 try p.err(p.tok_i, .auto_on_global, .{});
1619 },
1620 .register => if (p.func.qt == null and asm_label == null) try p.err(p.tok_i, .register_on_global, .{}),
16071621 else => {},
16081622 }
16091623 }
......@@ -1787,7 +1801,11 @@ fn storageClassSpec(p: *Parser, d: *DeclSpec) Error!bool {
17871801 return p.tok_i != start;
17881802}
17891803
1790const InitDeclarator = struct { d: Declarator, initializer: ?Result = null };
1804const InitDeclarator = struct {
1805 d: Declarator,
1806 initializer: ?Result = null,
1807 asm_label: ?Node.Index = null,
1808};
17911809
17921810/// attribute
17931811/// : attrIdentifier
......@@ -1829,18 +1847,18 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te
18291847 if (try p.eatIdentifier()) |ident| {
18301848 if (try Attribute.diagnoseIdent(attr, &arguments, ident, p)) {
18311849 p.skipTo(.r_paren);
1832 return error.ParsingFailed;
1850 return null;
18331851 }
18341852 } else {
18351853 try p.err(name_tok, .attribute_requires_identifier, .{name});
1836 return error.ParsingFailed;
1854 return null;
18371855 }
18381856 } else {
18391857 const arg_start = p.tok_i;
18401858 const first_expr = try p.expect(assignExpr);
18411859 if (try p.diagnose(attr, &arguments, arg_idx, first_expr, arg_start)) {
18421860 p.skipTo(.r_paren);
1843 return error.ParsingFailed;
1861 return null;
18441862 }
18451863 }
18461864 arg_idx += 1;
......@@ -1851,7 +1869,7 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te
18511869 const arg_expr = try p.expect(assignExpr);
18521870 if (try p.diagnose(attr, &arguments, arg_idx, arg_expr, arg_start)) {
18531871 p.skipTo(.r_paren);
1854 return error.ParsingFailed;
1872 return null;
18551873 }
18561874 }
18571875 },
......@@ -1861,9 +1879,9 @@ fn attribute(p: *Parser, kind: Attribute.Kind, namespace: ?[]const u8) Error!?Te
18611879 try p.err(name_tok, .attribute_not_enough_args, .{
18621880 @tagName(attr), required_count,
18631881 });
1864 return error.ParsingFailed;
1882 return null;
18651883 }
1866 return TentativeAttribute{ .attr = .{ .tag = attr, .args = arguments, .syntax = kind.toSyntax() }, .tok = name_tok };
1884 return .{ .attr = .{ .tag = attr, .args = arguments, .syntax = kind.toSyntax() }, .tok = name_tok };
18671885}
18681886
18691887fn diagnose(p: *Parser, attr: Attribute.Tag, arguments: *Attribute.Arguments, arg_idx: u32, res: Result, arg_start: TokenIndex) !bool {
......@@ -1995,12 +2013,12 @@ fn initDeclarator(p: *Parser, decl_spec: *DeclSpec, attr_buf_top: usize, decl_no
19952013 defer p.attr_buf.len = this_attr_buf_top;
19962014 const gpa = p.comp.gpa;
19972015
1998 var init_d = InitDeclarator{
2016 var init_d: InitDeclarator = .{
19992017 .d = (try p.declarator(decl_spec.qt, .normal)) orelse return null,
20002018 };
20012019
20022020 try p.attributeSpecifierExtra(init_d.d.name);
2003 _ = try p.assembly(.decl_label);
2021 init_d.asm_label = try p.assembly(.decl_label);
20042022 try p.attributeSpecifierExtra(init_d.d.name);
20052023
20062024 switch (init_d.d.declarator_type) {
......@@ -2276,14 +2294,13 @@ fn typeSpec(p: *Parser, builder: *TypeStore.Builder) Error!bool {
22762294 }, .syntax = .keyword },
22772295 .tok = align_tok,
22782296 });
2279 } else {
2297 } else check: {
22802298 const arg_start = p.tok_i;
22812299 const res = try p.integerConstExpr(.no_const_decl_folding);
22822300 if (!res.val.isZero(p.comp)) {
22832301 var args = Attribute.initArguments(.aligned, align_tok);
22842302 if (try p.diagnose(.aligned, &args, 0, res, arg_start)) {
2285 p.skipTo(.r_paren);
2286 return error.ParsingFailed;
2303 break :check;
22872304 }
22882305 args.aligned.alignment.?.node = .pack(res.node);
22892306 try p.attr_buf.append(gpa, .{
......@@ -2562,7 +2579,7 @@ fn recordSpec(p: *Parser) Error!QualType {
25622579
25632580 if (!any_incomplete) {
25642581 const pragma_pack_value = switch (p.comp.langopts.emulate) {
2565 .clang => starting_pragma_pack,
2582 .clang, .no => starting_pragma_pack,
25662583 .gcc => p.pragma_pack,
25672584 // TODO: msvc considers `#pragma pack` on a per-field basis
25682585 .msvc => p.pragma_pack,
......@@ -3542,7 +3559,6 @@ fn declarator(
35423559
35433560 const pointer_qt = try p.comp.type_store.put(p.comp.gpa, .{ .pointer = .{
35443561 .child = d.qt,
3545 .decayed = null,
35463562 } });
35473563 d.qt = try builder.finishQuals(pointer_qt);
35483564 }
......@@ -4141,7 +4157,10 @@ fn designation(p: *Parser, il: *InitList, init_qt: QualType, index_list: *IndexL
41414157 const field = record_ty.fields[field_index];
41424158 if (field.name_tok == 0) if (field.qt.getRecord(p.comp)) |field_record_ty| {
41434159 // Recurse into anonymous field if it has a field by the name.
4144 if (!field_record_ty.hasField(p.comp, target_name)) continue;
4160 if (!field_record_ty.hasField(p.comp, target_name)) {
4161 field_index += 1;
4162 continue;
4163 }
41454164 try index_list.append(gpa, field_index);
41464165 cur_il = try il.find(gpa, field_index);
41474166 record_ty = field_record_ty;
......@@ -4983,31 +5002,31 @@ fn assembly(p: *Parser, kind: enum { global, decl_label, stmt }) Error!?Node.Ind
49835002 };
49845003
49855004 const l_paren = try p.expectToken(.l_paren);
4986 var result_node: ?Node.Index = null;
4987 switch (kind) {
4988 .decl_label => {
5005 const res = switch (kind) {
5006 .decl_label => blk: {
49895007 const asm_str = try p.asmStr();
49905008 const str = try p.removeNull(asm_str.val);
49915009
49925010 const attr = Attribute{ .tag = .asm_label, .args = .{ .asm_label = .{ .name = str } }, .syntax = .keyword };
49935011 try p.attr_buf.append(p.comp.gpa, .{ .attr = attr, .tok = asm_tok });
5012 break :blk asm_str.node;
49945013 },
4995 .global => {
5014 .global => blk: {
49965015 const asm_str = try p.asmStr();
49975016 try p.checkAsmStr(asm_str.val, l_paren);
4998 result_node = try p.addNode(.{
5017 break :blk try p.addNode(.{
49995018 .global_asm = .{
50005019 .asm_tok = asm_tok,
50015020 .asm_str = asm_str.node,
50025021 },
50035022 });
50045023 },
5005 .stmt => result_node = try p.gnuAsmStmt(quals, asm_tok, l_paren),
5006 }
5024 .stmt => try p.gnuAsmStmt(quals, asm_tok, l_paren),
5025 };
50075026 try p.expectClosing(l_paren, .r_paren);
50085027
50095028 if (kind != .decl_label) _ = try p.expectToken(.semicolon);
5010 return result_node;
5029 return res;
50115030}
50125031
50135032/// Same as stringLiteral but errors on unicode and wide string literals
......@@ -5253,7 +5272,6 @@ fn stmt(p: *Parser) Error!Node.Index {
52535272 if (!goto_expr.qt.isInvalid() and !goto_expr.qt.isPointer(p.comp)) {
52545273 const result_qt = try p.comp.type_store.put(gpa, .{ .pointer = .{
52555274 .child = .{ .@"const" = true, ._index = .void },
5256 .decayed = null,
52575275 } });
52585276 if (!goto_expr.qt.isRealInt(p.comp)) {
52595277 try p.err(expr_tok, .incompatible_arg, .{ goto_expr.qt, result_qt });
......@@ -5905,6 +5923,7 @@ const CallExpr = union(enum) {
59055923 .__builtin_reduce_xor,
59065924 .__builtin_reduce_max,
59075925 .__builtin_reduce_min,
5926 .__builtin_constant_p,
59085927 => 1,
59095928
59105929 .__builtin_complex,
......@@ -5922,13 +5941,15 @@ const CallExpr = union(enum) {
59225941
59235942 .__c11_atomic_store,
59245943 .__atomic_store,
5944 .__atomic_store_n,
5945 .__atomic_load,
59255946 .__c11_atomic_exchange,
5926 .__atomic_exchange,
59275947 .__c11_atomic_fetch_add,
59285948 .__c11_atomic_fetch_sub,
59295949 .__c11_atomic_fetch_or,
59305950 .__c11_atomic_fetch_xor,
59315951 .__c11_atomic_fetch_and,
5952 .__c11_atomic_fetch_nand,
59325953 .__atomic_fetch_add,
59335954 .__atomic_fetch_sub,
59345955 .__atomic_fetch_and,
......@@ -5948,6 +5969,9 @@ const CallExpr = union(enum) {
59485969 .__atomic_exchange_n,
59495970 => 3,
59505971
5972 .__atomic_exchange,
5973 => 4,
5974
59515975 .__c11_atomic_compare_exchange_strong,
59525976 .__c11_atomic_compare_exchange_weak,
59535977 => 5,
......@@ -5964,25 +5988,13 @@ const CallExpr = union(enum) {
59645988
59655989 fn returnType(self: CallExpr, p: *Parser, args: []const Node.Index, func_qt: QualType) !QualType {
59665990 if (self == .standard) {
5991 if (func_qt.isInvalid()) return .invalid;
59675992 return if (func_qt.get(p.comp, .func)) |func_ty| func_ty.return_type else .invalid;
59685993 }
59695994 const builtin = self.builtin;
59705995 const func_ty = func_qt.get(p.comp, .func).?;
59715996 return switch (builtin.expanded.tag) {
59725997 .common => |tag| switch (tag) {
5973 .__c11_atomic_exchange => {
5974 if (args.len != 4) return .invalid; // wrong number of arguments; already an error
5975 const second_param = args[2];
5976 return second_param.qt(&p.tree);
5977 },
5978 .__c11_atomic_load => {
5979 if (args.len != 3) return .invalid; // wrong number of arguments; already an error
5980 const first_param = args[1];
5981 const qt = first_param.qt(&p.tree);
5982 if (!qt.isPointer(p.comp)) return .invalid;
5983 return qt.childType(p.comp);
5984 },
5985
59865998 .__atomic_fetch_add,
59875999 .__atomic_add_fetch,
59886000 .__c11_atomic_fetch_add,
......@@ -6008,15 +6020,38 @@ const CallExpr = union(enum) {
60086020 .__c11_atomic_fetch_nand,
60096021
60106022 .__atomic_exchange_n,
6023 .__c11_atomic_exchange,
6024 => {
6025 const second_param = args[1].qt(&p.tree);
6026 return second_param;
6027 },
6028
6029 .__sync_fetch_and_add,
6030 .__sync_fetch_and_and,
6031 .__sync_fetch_and_nand,
6032 .__sync_fetch_and_or,
6033 .__sync_fetch_and_sub,
6034 .__sync_fetch_and_xor,
6035
6036 .__sync_add_and_fetch,
6037 .__sync_and_and_fetch,
6038 .__sync_nand_and_fetch,
6039 .__sync_or_and_fetch,
6040 .__sync_sub_and_fetch,
6041 .__sync_xor_and_fetch,
6042
6043 .__sync_swap,
6044 .__sync_lock_test_and_set,
6045 .__sync_val_compare_and_swap,
60116046 => {
6012 if (args.len != 3) return .invalid; // wrong number of arguments; already an error
6013 const second_param = args[2];
6014 return second_param.qt(&p.tree);
6047 if (args.len < 2) return .invalid;
6048 const second_param = args[1].qt(&p.tree);
6049 return second_param;
60156050 },
60166051 .__builtin_complex => {
6017 if (args.len < 1) return .invalid; // not enough arguments; already an error
6018 const last_param = args[args.len - 1];
6019 return try last_param.qt(&p.tree).toComplex(p.comp);
6052 const last_param = args[args.len - 1].qt(&p.tree);
6053 if (last_param.isInvalid()) return .invalid;
6054 return try last_param.toComplex(p.comp);
60206055 },
60216056 .__atomic_compare_exchange,
60226057 .__atomic_compare_exchange_n,
......@@ -6027,9 +6062,8 @@ const CallExpr = union(enum) {
60276062 .__c11_atomic_compare_exchange_strong,
60286063 .__c11_atomic_compare_exchange_weak,
60296064 => {
6030 if (args.len != 6) return .invalid; // wrong number of arguments
6031 const third_param = args[3];
6032 return third_param.qt(&p.tree);
6065 const third_param = args[2].qt(&p.tree);
6066 return third_param;
60336067 },
60346068
60356069 .__builtin_elementwise_abs,
......@@ -6058,13 +6092,12 @@ const CallExpr = union(enum) {
60586092 .__builtin_elementwise_sub_sat,
60596093 .__builtin_elementwise_fma,
60606094 .__builtin_elementwise_popcount,
6095
60616096 .__builtin_nondeterministic_value,
60626097 => {
6063 if (args.len < 1) return .invalid; // not enough arguments; already an error
6064 const last_param = args[args.len - 1];
6065 return last_param.qt(&p.tree);
6098 const first_param = args[0].qt(&p.tree);
6099 return first_param;
60666100 },
6067 .__builtin_nontemporal_load,
60686101 .__builtin_reduce_add,
60696102 .__builtin_reduce_mul,
60706103 .__builtin_reduce_and,
......@@ -6073,30 +6106,19 @@ const CallExpr = union(enum) {
60736106 .__builtin_reduce_max,
60746107 .__builtin_reduce_min,
60756108 => {
6076 if (args.len < 1) return .invalid; // not enough arguments; already an error
6077 const last_param = args[args.len - 1];
6078 return last_param.qt(&p.tree).childType(p.comp);
6109 const first_param = args[0].qt(&p.tree);
6110 if (first_param.isInvalid()) return .invalid;
6111 const vector_ty = first_param.get(p.comp, .vector) orelse return .invalid;
6112 return vector_ty.elem;
60796113 },
6080 .__sync_add_and_fetch,
6081 .__sync_and_and_fetch,
6082 .__sync_fetch_and_add,
6083 .__sync_fetch_and_and,
6084 .__sync_fetch_and_nand,
6085 .__sync_fetch_and_or,
6086 .__sync_fetch_and_sub,
6087 .__sync_fetch_and_xor,
6088 .__sync_lock_test_and_set,
6089 .__sync_nand_and_fetch,
6090 .__sync_or_and_fetch,
6091 .__sync_sub_and_fetch,
6092 .__sync_swap,
6093 .__sync_xor_and_fetch,
6094 .__sync_val_compare_and_swap,
60956114 .__atomic_load_n,
6115 .__c11_atomic_load,
6116 .__builtin_nontemporal_load,
60966117 => {
6097 if (args.len < 1) return .invalid; // not enough arguments; already an error
6098 const first_param = args[0];
6099 return first_param.qt(&p.tree).childType(p.comp);
6118 const first_param = args[0].qt(&p.tree);
6119 if (first_param.isInvalid()) return .invalid;
6120 if (!first_param.isPointer(p.comp)) return .invalid;
6121 return first_param.childType(p.comp);
61006122 },
61016123 else => func_ty.return_type,
61026124 },
......@@ -6104,9 +6126,16 @@ const CallExpr = union(enum) {
61046126 };
61056127 }
61066128
6107 fn finish(self: CallExpr, p: *Parser, func_qt: QualType, list_buf_top: usize, l_paren: TokenIndex) Error!Result {
6129 fn finish(
6130 self: CallExpr,
6131 p: *Parser,
6132 func_qt: QualType,
6133 list_buf_top: usize,
6134 l_paren: TokenIndex,
6135 args_ok: bool,
6136 ) Error!Result {
61086137 const args = p.list_buf.items[list_buf_top..];
6109 const return_qt = try self.returnType(p, args, func_qt);
6138 const return_qt: QualType = if (args_ok) try self.returnType(p, args, func_qt) else .invalid;
61106139 switch (self) {
61116140 .standard => |func_node| return .{
61126141 .qt = return_qt,
......@@ -6118,7 +6147,7 @@ const CallExpr = union(enum) {
61186147 } }),
61196148 },
61206149 .builtin => |builtin| return .{
6121 .val = try evalBuiltin(builtin.expanded, p, args),
6150 .val = if (args_ok) try evalBuiltin(builtin.expanded, p, args) else .{},
61226151 .qt = return_qt,
61236152 .node = try p.addNode(.{ .builtin_call_expr = .{
61246153 .builtin_tok = builtin.builtin_tok,
......@@ -6283,14 +6312,12 @@ pub const Result = struct {
62836312 if (!adjusted_elem_qt.eqlQualified(a_elem, p.comp)) {
62846313 a.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{
62856314 .child = adjusted_elem_qt,
6286 .decayed = null,
62876315 } });
62886316 try a.implicitCast(p, .bitcast, tok);
62896317 }
62906318 if (!adjusted_elem_qt.eqlQualified(b_elem, p.comp)) {
62916319 b.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{
62926320 .child = adjusted_elem_qt,
6293 .decayed = null,
62946321 } });
62956322 try b.implicitCast(p, .bitcast, tok);
62966323 }
......@@ -6478,6 +6505,7 @@ pub const Result = struct {
64786505 .add => {
64796506 // if both aren't arithmetic one should be pointer and the other an integer
64806507 if (a_sk.isPointer() == b_sk.isPointer() or a_sk.isInt() == b_sk.isInt()) return a.invalidBinTy(tok, b, p);
6508 try p.boundsSafetyCheckPointerArithmetic(a.qt, b.qt, tok, a.node);
64816509
64826510 if (a_sk == .void_pointer or b_sk == .void_pointer)
64836511 try p.err(tok, .gnu_pointer_arith, .{});
......@@ -6496,6 +6524,7 @@ pub const Result = struct {
64966524 .sub => {
64976525 // if both aren't arithmetic then either both should be pointers or just the left one.
64986526 if (!a_sk.isPointer() or !(b_sk.isPointer() or b_sk.isInt())) return a.invalidBinTy(tok, b, p);
6527 try p.boundsSafetyCheckPointerArithmetic(a.qt, b.qt, tok, a.node);
64996528
65006529 if (a_sk == .void_pointer)
65016530 try p.err(tok, .gnu_pointer_arith, .{});
......@@ -7087,14 +7116,14 @@ pub const Result = struct {
70877116 } else if (dest_sk.isPointer()) {
70887117 if (src_sk.isPointer()) {
70897118 cast_kind = .bitcast;
7119 } else if (src_sk == .bool) {
7120 cast_kind = .bool_to_pointer;
70907121 } else if (src_sk.isInt()) {
70917122 if (!src_sk.isReal()) {
70927123 res.qt = res.qt.toReal(p.comp);
70937124 try res.implicitCast(p, .complex_int_to_real, l_paren);
70947125 }
70957126 cast_kind = .int_to_pointer;
7096 } else if (src_sk == .bool) {
7097 cast_kind = .bool_to_pointer;
70987127 } else if (res.qt.is(p.comp, .array)) {
70997128 cast_kind = .array_to_pointer;
71007129 } else if (res.qt.is(p.comp, .func)) {
......@@ -7497,7 +7526,16 @@ fn issueDeclaredConstHereNote(p: *Parser, decl_ref: Tree.Node.DeclRef, var_name:
74977526 try p.err(location, .declared_const_here, .{var_name});
74987527}
74997528
7500fn issueConstAssignmetDiagnostics(p: *Parser, node_idx: Node.Index, tok: TokenIndex) Compilation.Error!void {
7529fn issueBoundsDeclaredHereNote(p: *Parser, decl_ref: Tree.Node.DeclRef, var_name: []const u8, bounds: Type.Pointer.Bounds) Compilation.Error!void {
7530 const location = switch (decl_ref.decl.get(&p.tree)) {
7531 .variable => |variable| variable.name_tok,
7532 .param => |param| param.name_tok,
7533 else => return,
7534 };
7535 try p.err(location, .pointer_bounds_declared_here, .{ var_name, @tagName(bounds) });
7536}
7537
7538fn issueConstAssignmentDiagnostics(p: *Parser, node_idx: Node.Index, tok: TokenIndex) Compilation.Error!void {
75017539 if (p.unwrapNestedOperation(node_idx)) |unwrapped| {
75027540 const name = p.tokSlice(unwrapped.name_tok);
75037541 try p.err(tok, .const_var_assignment, .{ name, unwrapped.qt });
......@@ -7530,7 +7568,7 @@ fn assignExpr(p: *Parser) Error!?Result {
75307568
75317569 var is_const: bool = undefined;
75327570 if (!p.tree.isLvalExtra(lhs.node, &is_const) or is_const) {
7533 try p.issueConstAssignmetDiagnostics(lhs.node, tok);
7571 try p.issueConstAssignmentDiagnostics(lhs.node, tok);
75347572 lhs.qt = .invalid;
75357573 }
75367574
......@@ -8226,7 +8264,7 @@ fn builtinChooseExpr(p: *Parser) Error!Result {
82268264 return cond;
82278265}
82288266
8229/// vaStart : __builtin_va_arg '(' assignExpr ',' typeName ')'
8267/// vaArg : __builtin_va_arg '(' assignExpr ',' typeName ')'
82308268fn builtinVaArg(p: *Parser, builtin_tok: TokenIndex) Error!Result {
82318269 const l_paren = try p.expectToken(.l_paren);
82328270 const va_list_tok = p.tok_i;
......@@ -8258,6 +8296,62 @@ fn builtinVaArg(p: *Parser, builtin_tok: TokenIndex) Error!Result {
82588296 };
82598297}
82608298
8299/// vaArgPack : __builtin_va_arg_pack '(' ')'
8300fn builtinVaArgPack(p: *Parser, builtin_tok: TokenIndex) Error!Result {
8301 const l_paren = try p.expectToken(.l_paren);
8302 try p.expectClosing(l_paren, .r_paren);
8303
8304 var res_qt: QualType = .invalid;
8305 if (!try p.checkVaPackFunc(builtin_tok, "__builtin_va_arg_pack")) {
8306 // Only add one error.
8307 } else if (!p.va_arg_pack_ctx.valid) {
8308 try p.err(builtin_tok, .va_pack_non_call, .{});
8309 } else if (!p.va_arg_pack_ctx.variadic) {
8310 try p.err(builtin_tok, .va_pack_non_variadic_call, .{});
8311 } else if (p.va_arg_pack_ctx.typed) {
8312 try p.err(builtin_tok, .va_pack_non_variadic_arg, .{});
8313 } else {
8314 res_qt = .void;
8315 }
8316 return .{
8317 .qt = res_qt,
8318 .node = try p.addNode(.{
8319 .builtin_va_arg_pack = .{ .builtin_tok = builtin_tok },
8320 }),
8321 };
8322}
8323
8324/// vaArgPackLen : __builtin_va_arg_pack_len '(' ')'
8325fn builtinVaArgPackLen(p: *Parser, builtin_tok: TokenIndex) Error!Result {
8326 const l_paren = try p.expectToken(.l_paren);
8327 try p.expectClosing(l_paren, .r_paren);
8328
8329 _ = try p.checkVaPackFunc(builtin_tok, "__builtin_va_arg_pack_len");
8330
8331 return .{
8332 .qt = .int,
8333 .node = try p.addNode(.{
8334 .builtin_va_arg_pack_len = .{
8335 .builtin_tok = builtin_tok,
8336 },
8337 }),
8338 };
8339}
8340
8341fn checkVaPackFunc(p: *Parser, builtin_tok: TokenIndex, va_func_name: []const u8) !bool {
8342 const func_qt, _ = (try p.checkVaFunc(builtin_tok, va_func_name)) orelse return false;
8343
8344 var it = Attribute.Iterator.initType(func_qt, p.comp);
8345 while (it.next()) |item| switch (item[0].tag) {
8346 .always_inline, .gnu_inline => break,
8347 else => {},
8348 } else {
8349 try p.err(builtin_tok, .va_func_not_always_inline, .{va_func_name});
8350 return false;
8351 }
8352 return true;
8353}
8354
82618355const OffsetKind = enum { bits, bytes };
82628356
82638357/// offsetof
......@@ -8504,7 +8598,6 @@ fn unExpr(p: *Parser) Error!?Result {
85048598
85058599 operand.qt = try p.comp.type_store.put(gpa, .{ .pointer = .{
85068600 .child = operand.qt,
8507 .decayed = null,
85088601 } });
85098602 }
85108603 if (p.getNode(operand.node, .decl_ref_expr)) |decl_ref| {
......@@ -8596,6 +8689,9 @@ fn unExpr(p: *Parser) Error!?Result {
85968689 try p.err(tok, .not_assignable, .{});
85978690 return error.ParsingFailed;
85988691 }
8692 if (operand.qt.get(p.comp, .pointer)) |pointer| {
8693 try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node);
8694 }
85998695 try operand.usualUnaryConversion(p, tok);
86008696
86018697 if (operand.val.is(.int, p.comp) or operand.val.is(.int, p.comp)) {
......@@ -8624,6 +8720,9 @@ fn unExpr(p: *Parser) Error!?Result {
86248720 try p.err(tok, .not_assignable, .{});
86258721 return error.ParsingFailed;
86268722 }
8723 if (operand.qt.get(p.comp, .pointer)) |pointer| {
8724 try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node);
8725 }
86278726 try operand.usualUnaryConversion(p, tok);
86288727
86298728 if (operand.val.is(.int, p.comp) or operand.val.is(.int, p.comp)) {
......@@ -8826,7 +8925,7 @@ fn unExpr(p: *Parser) Error!?Result {
88268925 } else switch (p.comp.langopts.emulate) {
88278926 .msvc => {}, // Doesn't support `_Complex` or `__imag` in the first place
88288927 .gcc => operand.val = .zero,
8829 .clang => {
8928 .clang, .no => {
88308929 if (operand.val.is(.int, p.comp) or operand.val.is(.float, p.comp)) {
88318930 operand.val = .zero;
88328931 } else {
......@@ -8886,7 +8985,7 @@ fn compoundLiteral(p: *Parser, qt_opt: ?QualType, opt_l_paren: ?TokenIndex) Erro
88868985 try p.err(tok, .invalid_compound_literal_storage_class, .{@tagName(d.storage_class)});
88878986 d.storage_class = .none;
88888987 },
8889 .register => if (p.func.qt == null) try p.err(p.tok_i, .illegal_storage_on_global, .{}),
8988 .register => if (p.func.qt == null) try p.err(p.tok_i, .register_on_global_compound_literal, .{}),
88908989 else => {},
88918990 }
88928991
......@@ -8968,6 +9067,9 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {
89689067 try p.err(p.tok_i, .not_assignable, .{});
89699068 return error.ParsingFailed;
89709069 }
9070 if (operand.qt.get(p.comp, .pointer)) |pointer| {
9071 try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node);
9072 }
89719073 try operand.usualUnaryConversion(p, p.tok_i);
89729074
89739075 try operand.un(p, .post_inc_expr, p.tok_i);
......@@ -8989,6 +9091,9 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {
89899091 try p.err(p.tok_i, .not_assignable, .{});
89909092 return error.ParsingFailed;
89919093 }
9094 if (operand.qt.get(p.comp, .pointer)) |pointer| {
9095 try p.checkPtrArithmeticAllowed(pointer, p.tok_i, operand.node);
9096 }
89929097 try operand.usualUnaryConversion(p, p.tok_i);
89939098
89949099 try operand.un(p, .post_dec_expr, p.tok_i);
......@@ -9003,6 +9108,7 @@ fn suffixExpr(p: *Parser, lhs: Result) Error!?Result {
90039108 const array_before_conversion = lhs;
90049109 const index_before_conversion = index;
90059110 var ptr = lhs;
9111
90069112 try ptr.lvalConversion(p, l_bracket);
90079113 try index.lvalConversion(p, l_bracket);
90089114 if (ptr.qt.get(p.comp, .pointer)) |pointer_ty| {
......@@ -9176,14 +9282,7 @@ fn checkVaStartArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex,
91769282 return error.ParsingFailed;
91779283 }
91789284
9179 const func_qt = p.func.qt orelse {
9180 try p.err(builtin_tok, .va_start_not_in_func, .{});
9181 return;
9182 };
9183 const func_ty = func_qt.get(p.comp, .func) orelse return;
9184 if (func_ty.kind != .variadic or func_ty.params.len == 0) {
9185 return p.err(builtin_tok, .va_start_fixed_args, .{});
9186 }
9285 _, const func_ty = (try p.checkVaFunc(builtin_tok, "va_start")) orelse return;
91879286 const last_param_name = func_ty.params[func_ty.params.len - 1].name;
91889287 const decl_ref = p.getNode(arg.node, .decl_ref_expr);
91899288 if (decl_ref == null or last_param_name != try p.comp.internString(p.tokSlice(decl_ref.?.name_tok))) {
......@@ -9191,6 +9290,19 @@ fn checkVaStartArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex,
91919290 }
91929291}
91939292
9293fn checkVaFunc(p: *Parser, builtin_tok: TokenIndex, va_func_name: []const u8) !?struct { QualType, Type.Func } {
9294 const func_qt = p.func.qt orelse {
9295 try p.err(builtin_tok, .va_func_not_in_func, .{va_func_name});
9296 return null;
9297 };
9298 const func_ty = func_qt.get(p.comp, .func) orelse return null;
9299 if (func_ty.kind != .variadic or func_ty.params.len == 0) {
9300 try p.err(builtin_tok, .va_func_fixed_args, .{va_func_name});
9301 return null;
9302 }
9303 return .{ func_qt, func_ty };
9304}
9305
91949306fn checkArithOverflowArg(p: *Parser, builtin_tok: TokenIndex, first_after: TokenIndex, param_tok: TokenIndex, arg: *Result, idx: u32) !void {
91959307 _ = builtin_tok;
91969308 _ = first_after;
......@@ -9320,7 +9432,7 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
93209432
93219433 // We cannot refer to the function type here because the pointer to
93229434 // type_store.extra might get invalidated while parsing args.
9323 const func_qt, const params_len, const func_kind = blk: {
9435 const func_qt, const typed_params_len, const func_kind_base = blk: {
93249436 var base_qt = lhs.qt;
93259437 if (base_qt.get(p.comp, .pointer)) |pointer_ty| base_qt = pointer_ty.child;
93269438 if (base_qt.isInvalid()) break :blk .{ base_qt, std.math.maxInt(usize), undefined };
......@@ -9343,9 +9455,44 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
93439455
93449456 const call_expr = CallExpr.init(p, lhs.node, func.node);
93459457
9458 const param_len_override = call_expr.paramCountOverride();
9459 const params_len = param_len_override orelse typed_params_len;
9460 const func_kind = if (param_len_override != null) .normal else func_kind_base;
9461
93469462 while (p.eatToken(.r_paren) == null) {
93479463 const param_tok = p.tok_i;
93489464 if (arg_count == params_len) first_after = p.tok_i;
9465
9466 // Check for __builtin_va_arg_pack
9467 {
9468 var i = p.tok_i;
9469 loop: switch (p.tok_ids[i]) {
9470 .l_paren => {
9471 i += 1;
9472 continue :loop p.tok_ids[i];
9473 },
9474 .identifier => if (mem.eql(u8, p.tokSlice(i), "__builtin_va_arg_pack")) {
9475 @branchHint(.cold);
9476 p.va_arg_pack_ctx = .{
9477 .valid = true,
9478 .variadic = func_kind != .normal,
9479 .typed = arg_count < typed_params_len,
9480 };
9481 defer p.va_arg_pack_ctx = .{};
9482
9483 const arg = try p.expect(assignExpr);
9484 try p.list_buf.append(gpa, arg.node);
9485 arg_count += 1;
9486 if (p.eatToken(.comma)) |_| {
9487 try p.err(i, .va_pack_non_final_arg, .{});
9488 continue;
9489 }
9490 try p.expectClosing(l_paren, .r_paren);
9491 break;
9492 },
9493 else => {},
9494 }
9495 }
93499496 var arg = try p.expect(assignExpr);
93509497
93519498 if (call_expr.shouldPerformLvalConversion(arg_count)) {
......@@ -9353,7 +9500,7 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
93539500 }
93549501 if ((arg.qt.hasIncompleteSize(p.comp) and !arg.qt.is(p.comp, .void)) or arg.qt.isInvalid()) return error.ParsingFailed;
93559502
9356 if (arg_count >= params_len) {
9503 if (arg_count >= typed_params_len) {
93579504 if (call_expr.shouldPromoteVarArg(arg_count)) switch (arg.qt.base(p.comp).type) {
93589505 .int => |int_ty| if (int_ty == .int) try arg.castToInt(p, arg.qt.promoteInt(p.comp), param_tok),
93599506 .float => |float_ty| if (float_ty == .double) try arg.castToFloat(p, .double, param_tok),
......@@ -9407,19 +9554,23 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
94079554 }
94089555 if (func_qt.isInvalid()) {
94099556 // Skip argument count checks.
9410 return try call_expr.finish(p, func_qt, list_buf_top, l_paren);
9557 return try call_expr.finish(p, func_qt, list_buf_top, l_paren, false);
94119558 }
94129559
9413 if (call_expr.paramCountOverride()) |expected| {
9414 if (expected != arg_count) {
9415 try p.err(first_after, .expected_arguments, .{ expected, arg_count });
9416 }
9417 } else switch (func_kind) {
9560 const r_paren = p.tok_i - 1;
9561 var args_ok = true;
9562 switch (func_kind) {
94189563 .normal => if (params_len != arg_count) {
9419 try p.err(first_after, .expected_arguments, .{ params_len, arg_count });
9564 try p.err(
9565 if (arg_count < params_len) r_paren else first_after,
9566 .expected_arguments,
9567 .{ params_len, arg_count },
9568 );
9569 args_ok = false;
94209570 },
94219571 .variadic => if (arg_count < params_len) {
9422 try p.err(first_after, .expected_at_least_arguments, .{ params_len, arg_count });
9572 try p.err(r_paren, .expected_at_least_arguments, .{ params_len, arg_count });
9573 args_ok = false;
94239574 },
94249575 .old_style => if (params_len != arg_count) {
94259576 if (params_len == 0)
......@@ -9429,10 +9580,60 @@ fn callExpr(p: *Parser, lhs: Result) Error!Result {
94299580 },
94309581 }
94319582
9432 return try call_expr.finish(p, func_qt, list_buf_top, l_paren);
9583 return try call_expr.finish(p, func_qt, list_buf_top, l_paren, args_ok);
9584}
9585
9586fn boundsSafetyCheckArrayAccess(p: *Parser, lhs: Result, rhs: Result, l_bracket: TokenIndex) !void {
9587 if (!p.comp.hasClangStyleBoundsSafety()) return;
9588
9589 const ptr_res, const pointer, const index = if (lhs.qt.get(p.comp, .pointer)) |pointer| .{ lhs, pointer, rhs } else .{ rhs, rhs.qt.get(p.comp, .pointer).?, lhs };
9590
9591 switch (pointer.bounds) {
9592 .c, .unsafe_indexable => {},
9593 .single => {
9594 if (!index.val.isZero(p.comp)) {
9595 try p.err(l_bracket, .single_requires_zero_index, .{});
9596 if (p.unwrapNestedOperation(ptr_res.node)) |unwrapped| {
9597 const name = p.tokSlice(unwrapped.name_tok);
9598 try p.issueBoundsDeclaredHereNote(unwrapped, name, pointer.bounds);
9599 }
9600 }
9601 },
9602 }
9603}
9604
9605fn boundsSafetyCheckPointerArithmetic(p: *Parser, lhs: QualType, rhs: QualType, tok: TokenIndex, node: Tree.Node.Index) !void {
9606 if (!p.comp.hasClangStyleBoundsSafety()) return;
9607
9608 const pointer = if (rhs.isInt(p.comp))
9609 lhs.get(p.comp, .pointer) orelse return
9610 else if (lhs.isInt(p.comp))
9611 rhs.get(p.comp, .pointer) orelse return
9612 else
9613 return;
9614
9615 try p.checkPtrArithmeticAllowed(pointer, tok, node);
9616}
9617
9618fn checkPtrArithmeticAllowed(p: *Parser, pointer: Type.Pointer, tok: TokenIndex, node: Tree.Node.Index) !void {
9619 if (!p.comp.hasClangStyleBoundsSafety()) return;
9620
9621 switch (pointer.bounds) {
9622 .c, .unsafe_indexable => {},
9623 .single => {
9624 // clang issues this diagnostic even with a constant `0` operand
9625 try p.err(tok, .pointer_arith_single, .{});
9626 if (p.unwrapNestedOperation(node)) |unwrapped| {
9627 const name = p.tokSlice(unwrapped.name_tok);
9628 try p.issueBoundsDeclaredHereNote(unwrapped, name, pointer.bounds);
9629 }
9630 },
9631 }
94339632}
94349633
94359634fn checkArrayBounds(p: *Parser, index: Result, array: Result, tok: TokenIndex) !void {
9635 try p.boundsSafetyCheckArrayAccess(array, index, tok);
9636
94369637 if (index.val.opt_ref == .none) return;
94379638
94389639 const array_len = array.qt.arrayLen(p.comp) orelse return;
......@@ -9579,6 +9780,8 @@ fn primaryExpr(p: *Parser) Error!?Result {
95799780 .common => |tag| switch (tag) {
95809781 .__builtin_choose_expr => return try p.builtinChooseExpr(),
95819782 .__builtin_va_arg => return try p.builtinVaArg(name_tok),
9783 .__builtin_va_arg_pack => return try p.builtinVaArgPack(name_tok),
9784 .__builtin_va_arg_pack_len => return try p.builtinVaArgPackLen(name_tok),
95829785 .__builtin_offsetof => return try p.builtinOffsetof(name_tok, .bytes),
95839786 .__builtin_bitoffsetof => return try p.builtinOffsetof(name_tok, .bits),
95849787 .__builtin_types_compatible_p => return try p.typesCompatible(name_tok),
......@@ -9720,7 +9923,7 @@ fn primaryExpr(p: *Parser) Error!?Result {
97209923 qt = some.qt;
97219924 } else if (p.func.qt) |func_qt| {
97229925 var sf = std.heap.stackFallback(1024, gpa);
9723 var allocating: Io.Writer.Allocating = .init(sf.get());
9926 var allocating: std.Io.Writer.Allocating = .init(sf.get());
97249927 defer allocating.deinit();
97259928
97269929 func_qt.printNamed(p.tokSlice(p.func.name), p.comp, &allocating.writer) catch return error.OutOfMemory;
......@@ -10277,16 +10480,13 @@ fn fixedSizeInt(p: *Parser, base: u8, buf: []const u8, suffix: NumberSuffix, tok
1027710480 if (res.qt.intRankOrder(suffix_qt, p.comp).compare(.lt)) continue;
1027810481 const max_int = try Value.maxInt(res.qt, p.comp);
1027910482 if (interned_val.compare(.lte, max_int, p.comp)) break;
10280 } else {
10281 if (p.comp.langopts.emulate == .gcc) {
10282 if (p.comp.target.hasInt128()) {
10283 res.qt = .int128;
10284 } else {
10285 res.qt = .long_long;
10286 }
10483 } else switch (p.comp.langopts.emulate) {
10484 .no, .gcc => if (p.comp.target.hasInt128()) {
10485 res.qt = .int128;
1028710486 } else {
10288 res.qt = .ulong_long;
10289 }
10487 res.qt = .long_long;
10488 },
10489 .msvc, .clang => res.qt = .ulong_long,
1029010490 }
1029110491
1029210492 res.node = try p.addNode(.{ .int_literal = .{ .qt = res.qt, .literal_tok = tok_i } });
......@@ -10604,12 +10804,7 @@ fn genericSelection(p: *Parser) Error!?Result {
1060410804}
1060510805
1060610806test "Node locations" {
10607 var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator);
10608 defer arena_state.deinit();
10609 const arena = arena_state.allocator();
10610
10611 var diagnostics: Diagnostics = .{ .output = .ignore };
10612 var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, &diagnostics, Io.Dir.cwd());
10807 var comp = try Compilation.init(.testing);
1061310808 defer comp.deinit();
1061410809
1061510810 const file = try comp.addSourceFromBuffer("file.c",
......@@ -10621,7 +10816,7 @@ test "Node locations" {
1062110816
1062210817 const builtin_macros = try comp.generateBuiltinMacros(.no_system_defines);
1062310818
10624 var pp = Preprocessor.init(&comp, .default);
10819 var pp = try Preprocessor.init(&comp, .testing);
1062510820 defer pp.deinit();
1062610821 try pp.addBuiltinMacros();
1062710822
......@@ -10633,7 +10828,6 @@ test "Node locations" {
1063310828 var tree = try Parser.parse(&pp);
1063410829 defer tree.deinit();
1063510830
10636 try std.testing.expectEqual(0, comp.diagnostics.total);
1063710831 for (tree.root_decls.items[tree.root_decls.items.len - 3 ..], 0..) |node, i| {
1063810832 const slice = tree.tokSlice(node.tok(&tree));
1063910833 const expected_slice = switch (i) {
lib/compiler/aro/aro/Parser/Diagnostic.zig+79-19
......@@ -79,9 +79,9 @@ pub const expected_integer_constant_expr: Diagnostic = .{
7979};
8080
8181pub const missing_type_specifier: Diagnostic = .{
82 .fmt = "type specifier missing, defaults to 'int'",
82 .fmt = "type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int",
8383 .opt = .@"implicit-int",
84 .kind = .warning,
84 .kind = .@"error",
8585};
8686
8787pub const missing_type_specifier_c23: Diagnostic = .{
......@@ -90,9 +90,9 @@ pub const missing_type_specifier_c23: Diagnostic = .{
9090};
9191
9292pub const param_not_declared: Diagnostic = .{
93 .fmt = "parameter '{s}' was not declared, defaults to 'int'",
93 .fmt = "parameter '{s}' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int",
9494 .opt = .@"implicit-int",
95 .kind = .warning,
95 .kind = .@"error",
9696 .extension = true,
9797};
9898
......@@ -216,8 +216,13 @@ pub const illegal_storage_on_func: Diagnostic = .{
216216 .kind = .@"error",
217217};
218218
219pub const illegal_storage_on_global: Diagnostic = .{
220 .fmt = "illegal storage class on global variable",
219pub const auto_on_global: Diagnostic = .{
220 .fmt = "'auto' specified on global variable",
221 .kind = .@"error",
222};
223
224pub const register_on_global: Diagnostic = .{
225 .fmt = "register name not specified for global variable",
221226 .kind = .@"error",
222227};
223228
......@@ -1507,13 +1512,38 @@ pub const builtin_must_be_called: Diagnostic = .{
15071512 .kind = .@"error",
15081513};
15091514
1510pub const va_start_not_in_func: Diagnostic = .{
1511 .fmt = "'va_start' cannot be used outside a function",
1515pub const va_func_not_in_func: Diagnostic = .{
1516 .fmt = "'{s}' cannot be used outside a function",
1517 .kind = .@"error",
1518};
1519
1520pub const va_func_fixed_args: Diagnostic = .{
1521 .fmt = "'{s}' used in a function with fixed args",
1522 .kind = .@"error",
1523};
1524
1525pub const va_func_not_always_inline: Diagnostic = .{
1526 .fmt = "'{s}' used in a function that is not always inlined",
1527 .kind = .@"error",
1528};
1529
1530pub const va_pack_non_call: Diagnostic = .{
1531 .fmt = "'__va_arg_pack' used outside a call",
1532 .kind = .@"error",
1533};
1534
1535pub const va_pack_non_variadic_call: Diagnostic = .{
1536 .fmt = "'__va_arg_pack' passed to non-variadic function",
1537 .kind = .@"error",
1538};
1539
1540pub const va_pack_non_variadic_arg: Diagnostic = .{
1541 .fmt = "'__va_arg_pack' passed as non-variadic argument",
15121542 .kind = .@"error",
15131543};
15141544
1515pub const va_start_fixed_args: Diagnostic = .{
1516 .fmt = "'va_start' used in a function with fixed args",
1545pub const va_pack_non_final_arg: Diagnostic = .{
1546 .fmt = "'__va_arg_pack' is not the final argument",
15171547 .kind = .@"error",
15181548};
15191549
......@@ -2258,11 +2288,11 @@ pub const unterminated_char_literal_error: Diagnostic = .{
22582288 .kind = .@"error",
22592289};
22602290
2261// pub const def_no_proto_deprecated: Diagnostic = .{
2262// .fmt = "a function definition without a prototype is deprecated in all versions of C and is not supported in C23",
2263// .kind = .warning,
2264// .opt = .@"deprecated-non-prototype",
2265// };
2291pub const def_no_proto_deprecated: Diagnostic = .{
2292 .fmt = "a function definition without a prototype is deprecated in all versions of C and is not supported in C23",
2293 .kind = .warning,
2294 .opt = .@"deprecated-non-prototype",
2295};
22662296
22672297pub const passing_args_to_kr: Diagnostic = .{
22682298 .fmt = "passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C23",
......@@ -2296,6 +2326,11 @@ pub const invalid_compound_literal_storage_class: Diagnostic = .{
22962326 .kind = .@"error",
22972327};
22982328
2329pub const register_on_global_compound_literal: Diagnostic = .{
2330 .fmt = "file scope compound literal specifies 'register'",
2331 .kind = .@"error",
2332};
2333
22992334pub const identifier_not_normalized: Diagnostic = .{
23002335 .fmt = "'{normalized}' is not in NFC",
23012336 .kind = .warning,
......@@ -2465,10 +2500,9 @@ pub const declared_const_here: Diagnostic = .{
24652500 .kind = .note,
24662501};
24672502
2468pub const nonnull_not_applicable: Diagnostic = .{
2469 .fmt = "'nonnull' attribute only applies to functions, methods, and parameters",
2470 .kind = .warning,
2471 .opt = .@"ignored-attributes",
2503pub const pointer_bounds_declared_here: Diagnostic = .{
2504 .fmt = "pointer '{s}' declared {s} here",
2505 .kind = .note,
24722506};
24732507
24742508pub const mixing_decimal_floats: Diagnostic = .{
......@@ -2480,3 +2514,29 @@ pub const invalid_attribute_location: Diagnostic = .{
24802514 .fmt = "{s} cannot appear here",
24812515 .kind = .@"error",
24822516};
2517
2518pub const attribute_requires_pointer: Diagnostic = .{
2519 .fmt = "'{s}' attribute only applies to pointer arguments",
2520 .kind = .@"error",
2521};
2522
2523pub const single_requires_zero_index: Diagnostic = .{
2524 .fmt = "array subscript on single pointer must use a constant index of 0 to be in bounds",
2525 .kind = .@"error",
2526};
2527
2528pub const pointer_arith_single: Diagnostic = .{
2529 .fmt = "pointer arithmetic on single pointer is out of bounds; consider adding '__counted_by'",
2530 .kind = .@"error",
2531};
2532
2533pub const redundant_bounds_annotation: Diagnostic = .{
2534 .fmt = "pointer annotated with {s} multiple times. Annotate only once to remove this warning",
2535 .kind = .warning,
2536 .opt = .@"bounds-attributes-redundant",
2537};
2538
2539pub const multiple_bounds_annotations: Diagnostic = .{
2540 .fmt = "pointer cannot have more than one bound attribute",
2541 .kind = .@"error",
2542};
lib/compiler/aro/aro/Preprocessor.zig+127-56
......@@ -1,6 +1,6 @@
11const std = @import("std");
2const Io = std.Io;
32const mem = std.mem;
3const path = std.Io.Dir.path;
44const Allocator = mem.Allocator;
55const assert = std.debug.assert;
66
......@@ -79,12 +79,15 @@ pub const Macro = struct {
7979 });
8080
8181 const Object = enum {
82 base_file,
8283 file,
84 file_basename,
8385 line,
8486 counter,
8587 date,
8688 time,
8789 timestamp,
90 include_level,
8891 };
8992
9093 const Func = enum {
......@@ -216,8 +219,6 @@ pub const Macro = struct {
216219 }
217220};
218221
219const Preprocessor = @This();
220
221222const ExpansionEntry = struct {
222223 idx: Tree.TokenIndex,
223224 locs: [*]Source.Location,
......@@ -228,6 +229,8 @@ const TokenState = struct {
228229 expansion_entries_len: usize,
229230};
230231
232const Preprocessor = @This();
233
231234comp: *Compilation,
232235diagnostics: *Diagnostics,
233236
......@@ -275,6 +278,12 @@ m_times: std.AutoHashMapUnmanaged(Source.Id, u64) = .empty,
275278/// The dependency file tracking all includes and embeds.
276279dep_file: ?*DepFile = null,
277280
281/// Path prefixes to replace when expanding __FILE__
282path_replacements: []const struct { []const u8, []const u8 } = &.{},
283
284/// File used for __BASE_FILE__ macro.
285base_file: Source.Id,
286
278287pub const parse = Parser.parse;
279288
280289pub const Linemarkers = enum {
......@@ -286,21 +295,22 @@ pub const Linemarkers = enum {
286295 numeric_directives,
287296};
288297
289pub fn init(comp: *Compilation, source_epoch: SourceEpoch) Preprocessor {
290 const pp: Preprocessor = .{
291 .comp = comp,
292 .diagnostics = comp.diagnostics,
293 .arena = .init(comp.gpa),
294 .hideset = .{ .comp = comp },
295 .source_epoch = source_epoch,
298pub const InitOptions = struct {
299 base_file: Source.Id,
300
301 source_epoch: ?SourceEpoch = null,
302 add_builtin_macros: bool = true,
303 path_replacements: []const struct { []const u8, []const u8 } = &.{},
304
305 pub const testing: InitOptions = .{
306 .base_file = undefined,
307 .source_epoch = .default,
308 .add_builtin_macros = false,
296309 };
297 comp.pragmaEvent(.before_preprocess);
298 return pp;
299}
310};
300311
301/// Initialize Preprocessor with builtin macros.
302pub fn initDefault(comp: *Compilation) !Preprocessor {
303 const source_epoch: SourceEpoch = comp.environment.sourceEpoch(comp.io) catch |er| switch (er) {
312pub fn init(comp: *Compilation, options: InitOptions) !Preprocessor {
313 const source_epoch: SourceEpoch = options.source_epoch orelse comp.environment.sourceEpoch(comp.io) catch |er| switch (er) {
304314 error.InvalidEpoch => blk: {
305315 const diagnostic: Diagnostic = .invalid_source_epoch;
306316 try comp.diagnostics.add(.{ .text = diagnostic.fmt, .kind = diagnostic.kind, .opt = diagnostic.opt, .location = null });
......@@ -308,9 +318,18 @@ pub fn initDefault(comp: *Compilation) !Preprocessor {
308318 },
309319 };
310320
311 var pp = init(comp, source_epoch);
321 var pp: Preprocessor = .{
322 .comp = comp,
323 .diagnostics = comp.diagnostics,
324 .arena = .init(comp.gpa),
325 .hideset = .{ .comp = comp },
326 .source_epoch = source_epoch,
327 .base_file = options.base_file,
328 .path_replacements = options.path_replacements,
329 };
312330 errdefer pp.deinit();
313 try pp.addBuiltinMacros();
331 comp.pragmaEvent(.before_preprocess);
332 if (options.add_builtin_macros) try pp.addBuiltinMacros();
314333 return pp;
315334}
316335
......@@ -339,7 +358,7 @@ pub fn addBuiltinMacros(pp: *Preprocessor) !void {
339358 try pp.addBuiltinMacro("__is_identifier", .{ .func = .is_identifier });
340359 try pp.addBuiltinMacro("_Pragma", .{ .func = .pragma_operator });
341360
342 if (pp.comp.langopts.emulate == .clang) {
361 if (pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) {
343362 try pp.addBuiltinMacro("__is_target_arch", .{ .func = .is_target_arch });
344363 try pp.addBuiltinMacro("__is_target_vendor", .{ .func = .is_target_vendor });
345364 try pp.addBuiltinMacro("__is_target_os", .{ .func = .is_target_os });
......@@ -359,6 +378,12 @@ pub fn addBuiltinMacros(pp: *Preprocessor) !void {
359378 try pp.addBuiltinMacro("__DATE__", .{ .obj = .date });
360379 try pp.addBuiltinMacro("__TIME__", .{ .obj = .time });
361380 try pp.addBuiltinMacro("__TIMESTAMP__", .{ .obj = .timestamp });
381
382 if (pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) {
383 try pp.addBuiltinMacro("__BASE_FILE__", .{ .obj = .base_file });
384 try pp.addBuiltinMacro("__FILE_NAME__", .{ .obj = .file_basename });
385 try pp.addBuiltinMacro("__INCLUDE_LEVEL__", .{ .obj = .include_level });
386 }
362387}
363388
364389pub fn deinit(pp: *Preprocessor) void {
......@@ -395,7 +420,7 @@ fn mTime(pp: *Preprocessor, source_id: Source.Id) !u64 {
395420 return gop.value_ptr.*;
396421}
397422
398pub fn expansionSlice(pp: *Preprocessor, tok: Tree.TokenIndex) []Source.Location {
423pub fn expansionSlice(pp: *const Preprocessor, tok: Tree.TokenIndex) []Source.Location {
399424 const S = struct {
400425 fn orderTokenIndex(context: Tree.TokenIndex, item: Tree.TokenIndex) std.math.Order {
401426 return std.math.order(context, item);
......@@ -1065,13 +1090,11 @@ fn fatalNotFound(pp: *Preprocessor, tok: TokenWithExpansionLocs, filename: []con
10651090
10661091fn verboseLog(pp: *Preprocessor, raw: RawToken, comptime fmt: []const u8, args: anytype) void {
10671092 @branchHint(.cold);
1068 const comp = pp.comp;
1069 const io = comp.io;
1070 const source = comp.getSource(raw.source);
1093 const source = pp.comp.getSource(raw.source);
10711094 const line_col = source.lineCol(.{ .id = raw.source, .line = raw.line, .byte_offset = raw.start });
10721095
10731096 var stderr_buf: [4096]u8 = undefined;
1074 var stderr = Io.File.stderr().writer(io, &stderr_buf);
1097 var stderr = std.Io.File.stderr().writer(pp.comp.io, &stderr_buf);
10751098 const w = &stderr.interface;
10761099
10771100 w.print("{s}:{d}:{d}: ", .{ source.path, line_col.line_no, line_col.col }) catch return;
......@@ -1435,7 +1458,37 @@ fn expandObjMacro(pp: *Preprocessor, simple_macro: *const Macro) Error!ExpandBuf
14351458 .file => {
14361459 const start = pp.comp.generated_buf.items.len;
14371460 const source = pp.comp.getSource(pp.expansion_source_loc.id);
1438 try pp.comp.generated_buf.print(gpa, "\"{f}\"\n", .{fmtEscapes(source.path)});
1461 for (pp.path_replacements) |replacement| {
1462 if (mem.cutPrefix(u8, source.path, replacement[0])) |rest| {
1463 try pp.comp.generated_buf.print(gpa, "\"{f}{f}\"", .{ fmtEscapes(replacement[1]), fmtEscapes(rest) });
1464 break;
1465 }
1466 } else {
1467 try pp.comp.generated_buf.print(gpa, "\"{f}\"\n", .{fmtEscapes(source.path)});
1468 }
1469
1470 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));
1471 },
1472 .base_file => {
1473 try pp.err(pp.expansion_source_loc, .base_file_is_clang_extension, .{});
1474 const start = pp.comp.generated_buf.items.len;
1475 const base_file = pp.comp.getSource(pp.base_file);
1476 for (pp.path_replacements) |replacement| {
1477 if (mem.cutPrefix(u8, base_file.path, replacement[0])) |rest| {
1478 try pp.comp.generated_buf.print(gpa, "\"{f}{f}\"", .{ fmtEscapes(replacement[1]), fmtEscapes(rest) });
1479 }
1480 } else {
1481 try pp.comp.generated_buf.print(gpa, "\"{f}\"", .{fmtEscapes(base_file.path)});
1482 }
1483
1484 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));
1485 },
1486 .file_basename => {
1487 try pp.err(pp.expansion_source_loc, .file_name_is_clang_extension, .{});
1488 const start = pp.comp.generated_buf.items.len;
1489 const source = pp.comp.getSource(pp.expansion_source_loc.id);
1490 const basename = path.basename(source.path);
1491 try pp.comp.generated_buf.print(gpa, "\"{f}\"", .{fmtEscapes(basename)});
14391492
14401493 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));
14411494 },
......@@ -1472,6 +1525,13 @@ fn expandObjMacro(pp: *Preprocessor, simple_macro: *const Macro) Error!ExpandBuf
14721525 try pp.writeDateTimeStamp(.fromBuiltin(builtin_kind), timestamp);
14731526 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .string_literal, tok));
14741527 },
1528 .include_level => {
1529 try pp.err(pp.expansion_source_loc, .include_level_is_clang_extension, .{});
1530 const start = pp.comp.generated_buf.items.len;
1531 try pp.comp.generated_buf.print(gpa, "{d}\n", .{pp.include_depth});
1532
1533 buf.appendAssumeCapacity(try pp.makeGeneratedToken(start, .pp_num, tok));
1534 },
14751535 },
14761536 else => buf.appendAssumeCapacity(tok),
14771537 }
......@@ -1828,7 +1888,11 @@ fn handleBuiltinMacro(pp: *Preprocessor, builtin: Macro.Builtin.Func, param_toks
18281888 features.hasFeature(pp.comp, ident_str)
18291889 else
18301890 features.hasExtension(pp.comp, ident_str),
1831 .has_builtin => Builtins.fromName(pp.comp, ident_str) != null or (pp.comp.langopts.emulate == .clang and Macro.Builtin.has_builtin_special_cases.has(ident_str)),
1891
1892 .has_builtin => Builtins.fromName(pp.comp, ident_str) != null or
1893 ((pp.comp.langopts.emulate == .no or pp.comp.langopts.emulate == .clang) and
1894 Macro.Builtin.has_builtin_special_cases.has(ident_str)),
1895
18321896 .is_target_arch => pp.comp.isTargetArch(ident_str),
18331897 .is_target_os => pp.comp.isTargetOs(ident_str),
18341898 .is_target_vendor => pp.comp.isTargetVendor(ident_str),
......@@ -1972,7 +2036,7 @@ fn expandFuncMacro(
19722036 },
19732037 .macro_param_no_expand => {
19742038 if (tok_i + 1 < func_macro.tokens.len and func_macro.tokens[tok_i + 1].id == .hash_hash) {
1975 hideset = pp.hideset.get(tokFromRaw(func_macro.tokens[tok_i + 1]).loc);
2039 hideset = .none;
19762040 }
19772041 const slice = getPasteArgs(args.items[raw.end]);
19782042 const raw_loc = Source.Location{ .id = raw.source, .byte_offset = raw.start, .line = raw.line };
......@@ -1980,7 +2044,7 @@ fn expandFuncMacro(
19802044 },
19812045 .macro_param => {
19822046 if (tok_i + 1 < func_macro.tokens.len and func_macro.tokens[tok_i + 1].id == .hash_hash) {
1983 hideset = pp.hideset.get(tokFromRaw(func_macro.tokens[tok_i + 1]).loc);
2047 hideset = .none;
19842048 }
19852049 const arg = expanded_args.items[raw.end];
19862050 const raw_loc = Source.Location{ .id = raw.source, .byte_offset = raw.start, .line = raw.line };
......@@ -2330,9 +2394,10 @@ fn expandFuncMacro(
23302394 for (buf.items) |*tok| {
23312395 try tok.addExpansionLocation(gpa, &.{macro_tok.loc});
23322396 try tok.addExpansionLocation(gpa, macro_expansion_locs);
2333 const tok_hidelist = pp.hideset.get(tok.loc);
2334 const new_hidelist = try pp.hideset.@"union"(tok_hidelist, hideset);
2335 try pp.hideset.put(tok.loc, new_hidelist);
2397 if (tok.id.shouldTrackHideset(.func)) {
2398 const new_hideset = try pp.hideset.@"union"(pp.hideset.get(tok.loc), hideset);
2399 try pp.hideset.put(tok.loc, new_hideset);
2400 }
23362401 }
23372402
23382403 return buf;
......@@ -2698,9 +2763,10 @@ fn expandMacroExhaustive(
26982763 try tok.addExpansionLocation(gpa, &.{macro_tok.loc});
26992764 try tok.addExpansionLocation(gpa, macro_expansion_locs);
27002765
2701 const tok_hidelist = pp.hideset.get(tok.loc);
2702 const new_hidelist = try pp.hideset.@"union"(tok_hidelist, hs);
2703 try pp.hideset.put(tok.loc, new_hidelist);
2766 if (tok.id.shouldTrackHideset(.obj)) {
2767 const new_hideset = try pp.hideset.@"union"(pp.hideset.get(tok.loc), hs);
2768 try pp.hideset.put(tok.loc, new_hideset);
2769 }
27042770
27052771 if (tok.id == .keyword_defined and eval_ctx == .expr) {
27062772 if (macro.is_func) {
......@@ -2914,7 +2980,10 @@ fn pasteTokens(pp: *Preprocessor, lhs_toks: *ExpandBuf, rhs_toks: []const TokenW
29142980 .placemarker
29152981 else
29162982 pasted_token.id;
2917 try lhs_toks.append(gpa, try pp.makeGeneratedToken(start, pasted_id, lhs));
2983
2984 const hideset = try pp.hideset.intersection(pp.hideset.get(lhs.loc), pp.hideset.get(rhs.loc));
2985 const generated_token = try pp.makeGeneratedTokenExtra(start, pasted_id, lhs, hideset);
2986 try lhs_toks.append(gpa, generated_token);
29182987
29192988 if (next.id != .nl and next.id != .eof) {
29202989 try pp.err(lhs, .pasting_formed_invalid, .{pp.comp.generated_buf.items[start..end]});
......@@ -2924,7 +2993,7 @@ fn pasteTokens(pp: *Preprocessor, lhs_toks: *ExpandBuf, rhs_toks: []const TokenW
29242993 try bufCopyTokens(gpa, lhs_toks, rhs_toks[rhs_rest..], &.{});
29252994}
29262995
2927fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs) !TokenWithExpansionLocs {
2996fn makeGeneratedTokenExtra(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs, hideset: Hideset.Index) !TokenWithExpansionLocs {
29282997 const gpa = pp.comp.gpa;
29292998 var pasted_token = TokenWithExpansionLocs{ .id = id, .loc = .{
29302999 .id = .generated,
......@@ -2934,9 +3003,15 @@ fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: Tok
29343003 pp.generated_line += 1;
29353004 try pasted_token.addExpansionLocation(gpa, &.{source.loc});
29363005 try pasted_token.addExpansionLocation(gpa, source.expansionSlice());
3006 try pp.hideset.put(pasted_token.loc, hideset);
3007
29373008 return pasted_token;
29383009}
29393010
3011fn makeGeneratedToken(pp: *Preprocessor, start: usize, id: Token.Id, source: TokenWithExpansionLocs) !TokenWithExpansionLocs {
3012 return pp.makeGeneratedTokenExtra(start, id, source, pp.hideset.get(source.loc));
3013}
3014
29403015/// Defines a new macro and warns if it is a duplicate
29413016fn defineMacro(pp: *Preprocessor, define_tok: RawToken, name_tok: TokenWithExpansionLocs, macro: Macro) Error!void {
29423017 const name_str = pp.expandedSlice(name_tok);
......@@ -3898,16 +3973,14 @@ test "Preserve pragma tokens sometimes" {
38983973 const gpa = std.testing.allocator;
38993974 const Test = struct {
39003975 fn runPreprocessor(source_text: []const u8) ![]const u8 {
3901 var arena: std.heap.ArenaAllocator = .init(gpa);
3902 defer arena.deinit();
3903
39043976 var diagnostics: Diagnostics = .{ .output = .ignore };
3905 var comp = Compilation.init(gpa, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());
3977 var comp = try Compilation.init(.testing);
3978 comp.diagnostics = &diagnostics;
39063979 defer comp.deinit();
39073980
39083981 try comp.addDefaultPragmaHandlers();
39093982
3910 var pp = Preprocessor.init(&comp, .default);
3983 var pp = try Preprocessor.init(&comp, .testing);
39113984 defer pp.deinit();
39123985
39133986 pp.preserve_whitespace = true;
......@@ -3966,12 +4039,10 @@ test "destringify" {
39664039 try std.testing.expectEqualStrings(destringified, pp.char_buf.items);
39674040 }
39684041 };
3969 var arena: std.heap.ArenaAllocator = .init(gpa);
3970 defer arena.deinit();
3971 var diagnostics: Diagnostics = .{ .output = .ignore };
3972 var comp = Compilation.init(gpa, arena.allocator(), std.testing.io, &diagnostics, Io.Dir.cwd());
4042 var comp = try Compilation.init(.testing);
39734043 defer comp.deinit();
3974 var pp = Preprocessor.init(&comp, .default);
4044
4045 var pp = try Preprocessor.init(&comp, .testing);
39754046 defer pp.deinit();
39764047
39774048 try Test.testDestringify(&pp, "hello\tworld\n", "hello\tworld\n");
......@@ -4026,20 +4097,20 @@ test "Include guards" {
40264097 };
40274098 }
40284099
4029 fn testIncludeGuard(gpa: std.mem.Allocator, comptime template: []const u8, tok_id: RawToken.Id, expected_guards: u32) !void {
4030 var arena_state: std.heap.ArenaAllocator = .init(gpa);
4031 defer arena_state.deinit();
4032 const arena = arena_state.allocator();
4100 fn testIncludeGuard(comptime template: []const u8, tok_id: RawToken.Id, expected_guards: u32) !void {
4101 const gpa = std.testing.allocator;
40334102
40344103 var diagnostics: Diagnostics = .{ .output = .ignore };
4035 var comp = Compilation.init(gpa, arena, std.testing.io, &diagnostics, Io.Dir.cwd());
4104 var comp = try Compilation.init(.testing);
4105 comp.diagnostics = &diagnostics;
40364106 defer comp.deinit();
4037 var pp = Preprocessor.init(&comp, .default);
4107 var pp = try Preprocessor.init(&comp, .testing);
40384108 defer pp.deinit();
40394109
4040 const path = try std.fs.path.join(arena, &.{ ".", "bar.h" });
4110 const file_path = try path.join(gpa, &.{ ".", "bar.h" });
4111 defer gpa.free(file_path);
40414112
4042 _ = try comp.addSourceFromBuffer(path, "int bar = 5;\n");
4113 _ = try comp.addSourceFromBuffer(file_path, "int bar = 5;\n");
40434114
40444115 var buf: std.ArrayList(u8) = .empty;
40454116 defer buf.deinit(gpa);
......@@ -4074,14 +4145,14 @@ test "Include guards" {
40744145 \\#endif
40754146 ;
40764147 const expected_guards: u32 = if (Test.pairsWithIfndef(tag)) 0 else 1;
4077 try Test.testIncludeGuard(std.testing.allocator, inside_ifndef_template, tag, expected_guards);
4148 try Test.testIncludeGuard(inside_ifndef_template, tag, expected_guards);
40784149
40794150 const outside_ifndef_template =
40804151 \\#ifndef FOO
40814152 \\#endif
40824153 \\#{s}{s}
40834154 ;
4084 try Test.testIncludeGuard(std.testing.allocator, outside_ifndef_template, tag, 0);
4155 try Test.testIncludeGuard(outside_ifndef_template, tag, 0);
40854156 }
40864157 }
40874158}
lib/compiler/aro/aro/Preprocessor/Diagnostic.zig+21
......@@ -472,3 +472,24 @@ pub const pragma_once_in_main_file: Diagnostic = .{
472472 .kind = .warning,
473473 .opt = .@"pragma-once-outside-header",
474474};
475
476pub const file_name_is_clang_extension: Diagnostic = .{
477 .fmt = "__FILE_NAME__ is a clang extension",
478 .opt = .@"file-name-extension",
479 .kind = .off,
480 .extension = true,
481};
482
483pub const base_file_is_clang_extension: Diagnostic = .{
484 .fmt = "__BASE_FILE__ is a clang extension",
485 .opt = .@"base-file-extension",
486 .kind = .off,
487 .extension = true,
488};
489
490pub const include_level_is_clang_extension: Diagnostic = .{
491 .fmt = "__INCLUDE_LEVEL__ is a clang extension",
492 .opt = .@"include-level-extension",
493 .kind = .off,
494 .extension = true,
495};
lib/compiler/aro/aro/Target.zig+17-12
......@@ -229,7 +229,7 @@ pub fn intMaxType(target: *const Target) QualType {
229229 => return .long,
230230
231231 .x86_64 => switch (target.os.tag) {
232 .windows, .openbsd => {},
232 .windows, .openbsd, .uefi => {},
233233 else => switch (target.abi) {
234234 .gnux32, .muslx32 => {},
235235 else => return .long,
......@@ -546,18 +546,10 @@ pub fn systemCompiler(target: *const Target) LangOpts.Compiler {
546546}
547547
548548pub fn hasFloat128(target: *const Target) bool {
549 if (target.cpu.arch.isWasm()) return true;
550549 if (target.os.tag.isDarwin()) return false;
551 if (target.cpu.arch.isPowerPC()) return std.Target.powerpc.featureSetHas(target.cpu.features, .float128);
552 return switch (target.os.tag) {
553 .dragonfly,
554 .haiku,
555 .linux,
556 .openbsd,
557 .illumos,
558 => target.cpu.arch.isX86(),
559 else => false,
560 };
550 if (target.os.tag == .windows) return false;
551 if (target.cpu.arch.isX86()) return true;
552 return target.cTypeBitSize(.longdouble) == 128;
561553}
562554
563555pub fn hasInt128(target: *const Target) bool {
......@@ -1238,6 +1230,7 @@ pub fn toLLVMTriple(target: *const Target, buf: []u8) []const u8 {
12381230 .other,
12391231 .plan9,
12401232 .vita,
1233 .psp,
12411234 => "unknown",
12421235 };
12431236 writer.writeAll(llvm_os) catch unreachable;
......@@ -1356,6 +1349,18 @@ pub fn isPIEDefault(target: *const Target) DefaultPIStatus {
13561349 };
13571350}
13581351
1352pub fn ppcElfVersion(target: *const Target) u32 {
1353 std.debug.assert(target.cpu.arch.isPowerPC());
1354 return switch (target.cpu.arch) {
1355 .powerpc64le => 2,
1356 .powerpc64 => if ((target.os.isAtLeast(.freebsd, .{ .major = 13, .minor = 0, .patch = 0 }) orelse false) or target.os.tag == .openbsd or target.abi.isMusl())
1357 2
1358 else
1359 1,
1360 else => 1,
1361 };
1362}
1363
13591364pub fn isPICdefault(target: *const Target) DefaultPIStatus {
13601365 return switch (target.os.tag) {
13611366 .haiku,
lib/compiler/aro/aro/Tokenizer.zig+31-14
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const Io = std.Io;
32const assert = std.debug.assert;
43
54const Compilation = @import("Compilation.zig");
......@@ -891,6 +890,14 @@ pub const Token = struct {
891890 else => false,
892891 };
893892 }
893
894 pub fn shouldTrackHideset(id: Id, context: enum { func, obj }) bool {
895 return switch (id) {
896 .identifier, .extended_identifier => true,
897 .r_paren => context == .func,
898 else => false,
899 };
900 }
894901 };
895902
896903 /// double underscore and underscore + capital letter identifiers
......@@ -938,6 +945,18 @@ pub const Token = struct {
938945 .keyword_unaligned,
939946 .keyword_unaligned2,
940947 => if (langopts.ms_extensions) kw else .identifier,
948
949 .keyword_float32,
950 .keyword_float64,
951 .keyword_float128,
952 .keyword_float32x,
953 .keyword_float64x,
954 .keyword_float128x,
955 .keyword_dfloat32,
956 .keyword_dfloat64,
957 .keyword_dfloat128,
958 .keyword_dfloat64x,
959 => if (langopts.emulate == .clang) .identifier else kw,
941960 else => kw,
942961 };
943962 }
......@@ -2008,11 +2027,11 @@ test "operators" {
20082027test "keywords" {
20092028 try expectTokens(
20102029 \\auto __auto_type break case char const continue default do
2011 \\double else enum extern float for goto if int
2012 \\long register return short signed sizeof static
2013 \\struct switch typedef union unsigned void volatile
2014 \\while _Bool _Complex _Imaginary inline restrict _Alignas
2015 \\_Alignof _Atomic _Generic _Noreturn _Static_assert _Thread_local
2030 \\double else enum extern float for goto if int
2031 \\long register return short signed sizeof static
2032 \\struct switch typedef union unsigned void volatile
2033 \\while _Bool _Complex _Imaginary inline restrict _Alignas
2034 \\_Alignof _Atomic _Generic _Noreturn _Static_assert _Thread_local
20162035 \\__attribute __attribute__
20172036 \\
20182037 , &.{
......@@ -2324,13 +2343,13 @@ test "Universal character names" {
23242343
23252344test "Tokenizer fuzz test" {
23262345 const Context = struct {
2327 fn testOne(_: @This(), input_bytes: []const u8) anyerror!void {
2328 var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
2329 defer arena.deinit();
2330 var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, undefined, Io.Dir.cwd());
2346 fn testOne(_: @This(), smith: *std.testing.Smith) anyerror!void {
2347 var comp = try Compilation.init(.testing);
23312348 defer comp.deinit();
23322349
2333 const source = try comp.addSourceFromBuffer("fuzz.c", input_bytes);
2350 var buf: [256]u8 = undefined;
2351 const contents_len = smith.slice(&buf);
2352 const source = try comp.addSourceFromBuffer("fuzz.c", buf[0..contents_len]);
23342353
23352354 var tokenizer: Tokenizer = .{
23362355 .buf = source.buf,
......@@ -2350,9 +2369,7 @@ test "Tokenizer fuzz test" {
23502369}
23512370
23522371fn expectTokensExtra(contents: []const u8, expected_tokens: []const Token.Id, langopts: ?LangOpts) !void {
2353 var arena: std.heap.ArenaAllocator = .init(std.testing.allocator);
2354 defer arena.deinit();
2355 var comp = Compilation.init(std.testing.allocator, arena.allocator(), std.testing.io, undefined, Io.Dir.cwd());
2372 var comp = try Compilation.init(.testing);
23562373 defer comp.deinit();
23572374 if (langopts) |provided| {
23582375 comp.langopts = provided;
lib/compiler/aro/aro/Toolchain.zig+4-7
......@@ -495,9 +495,9 @@ pub fn addSystemIncludeDir(tc: *const Toolchain, path: []const u8) !void {
495495pub fn addBuiltinIncludeDir(tc: *const Toolchain) !void {
496496 const d = tc.driver;
497497 const comp = d.comp;
498 const io = comp.io;
498499 const gpa = comp.gpa;
499500 const arena = comp.arena;
500 const io = comp.io;
501501 try d.includes.ensureUnusedCapacity(gpa, 1);
502502 if (d.resource_dir) |resource_dir| {
503503 const path = try std.fs.path.join(arena, &.{ resource_dir, "include" });
......@@ -524,14 +524,12 @@ pub fn addBuiltinIncludeDir(tc: *const Toolchain) !void {
524524/// Otherwise returns a slice of `buf`. If the file is larger than `buf` partial contents are returned
525525pub fn readFile(tc: *const Toolchain, path: []const u8, buf: []u8) ?[]const u8 {
526526 const comp = tc.driver.comp;
527 const io = comp.io;
528 return comp.cwd.readFile(io, path, buf) catch null;
527 return comp.cwd.readFile(comp.io, path, buf) catch null;
529528}
530529
531530pub fn exists(tc: *const Toolchain, path: []const u8) bool {
532531 const comp = tc.driver.comp;
533 const io = comp.io;
534 comp.cwd.access(io, path, .{}) catch return false;
532 comp.cwd.access(comp.io, path, .{}) catch return false;
535533 return true;
536534}
537535
......@@ -549,8 +547,7 @@ pub fn canExecute(tc: *const Toolchain, path: []const u8) bool {
549547 }
550548
551549 const comp = tc.driver.comp;
552 const io = comp.io;
553 comp.cwd.access(io, path, .{ .execute = true }) catch return false;
550 comp.cwd.access(comp.io, path, .{ .execute = true }) catch return false;
554551 // Todo: ensure path is not a directory
555552 return true;
556553}
lib/compiler/aro/aro/Tree.zig+178-148
......@@ -34,7 +34,7 @@ pub const TokenWithExpansionLocs = struct {
3434 expansion_locs: ?[*]Source.Location = null,
3535
3636 pub fn expansionSlice(tok: TokenWithExpansionLocs) []const Source.Location {
37 const locs = tok.expansion_locs orelse return &[0]Source.Location{};
37 const locs = tok.expansion_locs orelse return &.{};
3838 var i: usize = 0;
3939 while (locs[i].id.index != .unused) : (i += 1) {}
4040 return locs[0..i];
......@@ -243,6 +243,8 @@ pub const Node = union(enum) {
243243 builtin_choose_expr: Conditional,
244244 builtin_convertvector: Convertvector,
245245 builtin_shufflevector: Shufflevector,
246 builtin_va_arg_pack: VaArgPack,
247 builtin_va_arg_pack_len: VaArgPack,
246248
247249 /// C23 bool literal `true` / `false`
248250 bool_literal: Literal,
......@@ -633,6 +635,10 @@ pub const Node = union(enum) {
633635 indexes: []const Node.Index,
634636 };
635637
638 pub const VaArgPack = struct {
639 builtin_tok: TokenIndex,
640 };
641
636642 pub const Literal = struct {
637643 literal_tok: TokenIndex,
638644 qt: QualType,
......@@ -1689,6 +1695,16 @@ pub const Node = union(enum) {
16891695 .indexes = @ptrCast(tree.extra.items[node_data[1] + 2 ..][0..node_data[2]]),
16901696 },
16911697 },
1698 .builtin_va_arg_pack => .{
1699 .builtin_va_arg_pack = .{
1700 .builtin_tok = node_tok,
1701 },
1702 },
1703 .builtin_va_arg_pack_len => .{
1704 .builtin_va_arg_pack_len = .{
1705 .builtin_tok = node_tok,
1706 },
1707 },
16921708 .array_init_expr_two => .{
16931709 .array_init_expr = .{
16941710 .l_brace_tok = node_tok,
......@@ -1797,7 +1813,9 @@ pub const Node = union(enum) {
17971813 .global_asm,
17981814 .generic_association_expr,
17991815 .generic_default_expr,
1816 .builtin_va_arg_pack,
18001817 => null,
1818 .builtin_va_arg_pack_len => .int,
18011819 .builtin_types_compatible_p => .int,
18021820 else => {
18031821 // If a node is typed the type is stored in data[0].
......@@ -1963,6 +1981,8 @@ pub const Node = union(enum) {
19631981 builtin_types_compatible_p,
19641982 builtin_convertvector,
19651983 builtin_shufflevector,
1984 builtin_va_arg_pack,
1985 builtin_va_arg_pack_len,
19661986 array_init_expr,
19671987 array_init_expr_two,
19681988 struct_init_expr,
......@@ -2789,6 +2809,14 @@ pub fn setNode(tree: *Tree, node: Node, index: usize) !void {
27892809 tree.extra.appendAssumeCapacity(@intFromEnum(builtin.rhs));
27902810 tree.extra.appendSliceAssumeCapacity(@ptrCast(builtin.indexes));
27912811 },
2812 .builtin_va_arg_pack => |builtin| {
2813 repr.tag = .builtin_va_arg_pack;
2814 repr.tok = builtin.builtin_tok;
2815 },
2816 .builtin_va_arg_pack_len => |builtin| {
2817 repr.tag = .builtin_va_arg_pack_len;
2818 repr.tok = builtin.builtin_tok;
2819 },
27922820 .array_init_expr => |init| {
27932821 repr.data[0] = @bitCast(init.container_qt);
27942822 if (init.items.len > 2) {
......@@ -3000,12 +3028,12 @@ pub fn tokSlice(tree: *const Tree, tok_i: TokenIndex) []const u8 {
30003028 return tree.comp.locSlice(loc);
30013029}
30023030
3003pub fn dump(tree: *const Tree, config: std.Io.tty.Config, w: *std.Io.Writer) std.Io.tty.Config.SetColorError!void {
3031pub fn dump(tree: *const Tree, term: std.Io.Terminal) std.Io.Terminal.SetColorError!void {
30043032 for (tree.root_decls.items) |i| {
3005 try tree.dumpNode(i, 0, config, w);
3006 try w.writeByte('\n');
3033 try tree.dumpNode(i, 0, term);
3034 try term.writer.writeByte('\n');
30073035 }
3008 try w.flush();
3036 try term.writer.flush();
30093037}
30103038
30113039fn dumpFieldAttributes(tree: *const Tree, attributes: []const Attribute, level: u32, w: *std.Io.Writer) !void {
......@@ -3052,25 +3080,26 @@ fn dumpNode(
30523080 tree: *const Tree,
30533081 node_index: Node.Index,
30543082 level: u32,
3055 config: std.Io.tty.Config,
3056 w: *std.Io.Writer,
3083 term: std.Io.Terminal,
30573084) !void {
30583085 const delta = 2;
30593086 const half = delta / 2;
3060 const TYPE = std.Io.tty.Color.bright_magenta;
3061 const TAG = std.Io.tty.Color.bright_cyan;
3062 const IMPLICIT = std.Io.tty.Color.bright_blue;
3063 const NAME = std.Io.tty.Color.bright_red;
3064 const LITERAL = std.Io.tty.Color.bright_green;
3065 const ATTRIBUTE = std.Io.tty.Color.bright_yellow;
3087 const TYPE = std.Io.Terminal.Color.bright_magenta;
3088 const TAG = std.Io.Terminal.Color.bright_cyan;
3089 const IMPLICIT = std.Io.Terminal.Color.bright_blue;
3090 const NAME = std.Io.Terminal.Color.bright_red;
3091 const LITERAL = std.Io.Terminal.Color.bright_green;
3092 const ATTRIBUTE = std.Io.Terminal.Color.bright_yellow;
3093
3094 const w = term.writer;
30663095
30673096 const node = node_index.get(tree);
30683097 try w.splatByteAll(' ', level);
30693098
3070 if (config == .no_color) {
3099 if (term.mode == .no_color) {
30713100 if (node.isImplicit()) try w.writeAll("implicit ");
30723101 } else {
3073 try config.setColor(w, if (node.isImplicit()) IMPLICIT else TAG);
3102 try term.setColor(if (node.isImplicit()) IMPLICIT else TAG);
30743103 }
30753104 try w.print("{s}", .{@tagName(node)});
30763105
......@@ -3078,36 +3107,36 @@ fn dumpNode(
30783107 try w.writeAll(": ");
30793108 switch (node) {
30803109 .cast => |cast| {
3081 try config.setColor(w, .white);
3110 try term.setColor(.white);
30823111 try w.print("({s}) ", .{@tagName(cast.kind)});
30833112 },
30843113 else => {},
30853114 }
30863115
3087 try config.setColor(w, TYPE);
3116 try term.setColor(TYPE);
30883117 try w.writeByte('\'');
30893118 try qt.dump(tree.comp, w);
30903119 try w.writeByte('\'');
30913120 }
30923121
30933122 if (tree.isLval(node_index)) {
3094 try config.setColor(w, ATTRIBUTE);
3123 try term.setColor(ATTRIBUTE);
30953124 try w.writeAll(" lvalue");
30963125 }
30973126 if (tree.isBitfield(node_index)) {
3098 try config.setColor(w, ATTRIBUTE);
3127 try term.setColor(ATTRIBUTE);
30993128 try w.writeAll(" bitfield");
31003129 }
31013130 if (node == .asm_stmt) {
31023131 const quals = node.asm_stmt.quals;
3103 try config.setColor(w, ATTRIBUTE);
3132 try term.setColor(ATTRIBUTE);
31043133 if (quals.@"inline") try w.writeAll(" inline");
31053134 if (quals.@"volatile") try w.writeAll(" volatile");
31063135 if (quals.goto) try w.writeAll(" goto");
31073136 }
31083137
31093138 if (tree.value_map.get(node_index)) |val| {
3110 try config.setColor(w, LITERAL);
3139 try term.setColor(LITERAL);
31113140 try w.writeAll(" (value: ");
31123141 if (try val.print(node_index.qt(tree), tree.comp, w)) |nested| switch (nested) {
31133142 .pointer => |ptr| {
......@@ -3127,15 +3156,15 @@ fn dumpNode(
31273156 try w.writeByte(')');
31283157 }
31293158 if (node == .return_stmt and node.return_stmt.operand == .implicit and node.return_stmt.operand.implicit) {
3130 try config.setColor(w, IMPLICIT);
3159 try term.setColor(IMPLICIT);
31313160 try w.writeAll(" (value: 0)");
31323161 }
31333162
31343163 try w.writeAll("\n");
3135 try config.setColor(w, .reset);
3164 try term.setColor(.reset);
31363165
31373166 if (node_index.qtOrNull(tree)) |qt| {
3138 try config.setColor(w, ATTRIBUTE);
3167 try term.setColor(ATTRIBUTE);
31393168 var it = Attribute.Iterator.initType(qt, tree.comp);
31403169 while (it.next()) |item| {
31413170 const attr, _ = item;
......@@ -3143,56 +3172,56 @@ fn dumpNode(
31433172 try w.print("attr: {s}", .{@tagName(attr.tag)});
31443173 try tree.dumpAttribute(attr, w);
31453174 }
3146 try config.setColor(w, .reset);
3175 try term.setColor(.reset);
31473176 }
31483177
31493178 switch (node) {
31503179 .empty_decl => {},
31513180 .global_asm => |@"asm"| {
3152 try tree.dumpNode(@"asm".asm_str, level + delta, config, w);
3181 try tree.dumpNode(@"asm".asm_str, level + delta, term);
31533182 },
31543183 .static_assert => |assert| {
31553184 try w.splatByteAll(' ', level + 1);
31563185 try w.writeAll("condition:\n");
3157 try tree.dumpNode(assert.cond, level + delta, config, w);
3186 try tree.dumpNode(assert.cond, level + delta, term);
31583187 if (assert.message) |some| {
31593188 try w.splatByteAll(' ', level + 1);
31603189 try w.writeAll("diagnostic:\n");
3161 try tree.dumpNode(some, level + delta, config, w);
3190 try tree.dumpNode(some, level + delta, term);
31623191 }
31633192 },
31643193 .function => |function| {
31653194 try w.splatByteAll(' ', level + half);
31663195
3167 try config.setColor(w, ATTRIBUTE);
3196 try term.setColor(ATTRIBUTE);
31683197 if (function.static) try w.writeAll("static ");
31693198 if (function.@"inline") try w.writeAll("inline ");
31703199
3171 try config.setColor(w, .reset);
3200 try term.setColor(.reset);
31723201 try w.writeAll("name: ");
3173 try config.setColor(w, NAME);
3202 try term.setColor(NAME);
31743203 try w.print("{s}\n", .{tree.tokSlice(function.name_tok)});
3175 try config.setColor(w, .reset);
3204 try term.setColor(.reset);
31763205
31773206 if (function.body) |body| {
31783207 try w.splatByteAll(' ', level + half);
31793208 try w.writeAll("body:\n");
3180 try tree.dumpNode(body, level + delta, config, w);
3209 try tree.dumpNode(body, level + delta, term);
31813210 }
31823211 if (function.definition) |definition| {
31833212 try w.splatByteAll(' ', level + half);
31843213 try w.writeAll("definition: ");
3185 try config.setColor(w, NAME);
3214 try term.setColor(NAME);
31863215 try w.print("0x{X}\n", .{@intFromEnum(definition)});
3187 try config.setColor(w, .reset);
3216 try term.setColor(.reset);
31883217 }
31893218 },
31903219 .typedef => |typedef| {
31913220 try w.splatByteAll(' ', level + half);
31923221 try w.writeAll("name: ");
3193 try config.setColor(w, NAME);
3222 try term.setColor(NAME);
31943223 try w.print("{s}\n", .{tree.tokSlice(typedef.name_tok)});
3195 try config.setColor(w, .reset);
3224 try term.setColor(.reset);
31963225 },
31973226 .param => |param| {
31983227 try w.splatByteAll(' ', level + half);
......@@ -3200,21 +3229,21 @@ fn dumpNode(
32003229 switch (param.storage_class) {
32013230 .auto => {},
32023231 .register => {
3203 try config.setColor(w, ATTRIBUTE);
3232 try term.setColor(ATTRIBUTE);
32043233 try w.writeAll("register ");
3205 try config.setColor(w, .reset);
3234 try term.setColor(.reset);
32063235 },
32073236 }
32083237
32093238 try w.writeAll("name: ");
3210 try config.setColor(w, NAME);
3239 try term.setColor(NAME);
32113240 try w.print("{s}\n", .{tree.tokSlice(param.name_tok)});
3212 try config.setColor(w, .reset);
3241 try term.setColor(.reset);
32133242 },
32143243 .variable => |variable| {
32153244 try w.splatByteAll(' ', level + half);
32163245
3217 try config.setColor(w, ATTRIBUTE);
3246 try term.setColor(ATTRIBUTE);
32183247 switch (variable.storage_class) {
32193248 .auto => {},
32203249 .static => try w.writeAll("static "),
......@@ -3222,37 +3251,37 @@ fn dumpNode(
32223251 .register => try w.writeAll("register "),
32233252 }
32243253 if (variable.thread_local) try w.writeAll("thread_local ");
3225 try config.setColor(w, .reset);
3254 try term.setColor(.reset);
32263255
32273256 try w.writeAll("name: ");
3228 try config.setColor(w, NAME);
3257 try term.setColor(NAME);
32293258 try w.print("{s}\n", .{tree.tokSlice(variable.name_tok)});
3230 try config.setColor(w, .reset);
3259 try term.setColor(.reset);
32313260
32323261 if (variable.initializer) |some| {
3233 try config.setColor(w, .reset);
3262 try term.setColor(.reset);
32343263 try w.splatByteAll(' ', level + half);
32353264 try w.writeAll("init:\n");
3236 try tree.dumpNode(some, level + delta, config, w);
3265 try tree.dumpNode(some, level + delta, term);
32373266 }
32383267 if (variable.definition) |definition| {
32393268 try w.splatByteAll(' ', level + half);
32403269 try w.writeAll("definition: ");
3241 try config.setColor(w, NAME);
3270 try term.setColor(NAME);
32423271 try w.print("0x{X}\n", .{@intFromEnum(definition)});
3243 try config.setColor(w, .reset);
3272 try term.setColor(.reset);
32443273 }
32453274 },
32463275 .enum_field => |field| {
32473276 try w.splatByteAll(' ', level + half);
32483277 try w.writeAll("name: ");
3249 try config.setColor(w, NAME);
3278 try term.setColor(NAME);
32503279 try w.print("{s}\n", .{tree.tokSlice(field.name_tok)});
3251 try config.setColor(w, .reset);
3280 try term.setColor(.reset);
32523281 if (field.init) |some| {
32533282 try w.splatByteAll(' ', level + half);
32543283 try w.writeAll("init:\n");
3255 try tree.dumpNode(some, level + delta, config, w);
3284 try tree.dumpNode(some, level + delta, term);
32563285 }
32573286 },
32583287 .record_field => |field| {
......@@ -3260,26 +3289,26 @@ fn dumpNode(
32603289 if (name_tok_id == .identifier or name_tok_id == .extended_identifier) {
32613290 try w.splatByteAll(' ', level + half);
32623291 try w.writeAll("name: ");
3263 try config.setColor(w, NAME);
3292 try term.setColor(NAME);
32643293 try w.print("{s}\n", .{tree.tokSlice(field.name_or_first_tok)});
3265 try config.setColor(w, .reset);
3294 try term.setColor(.reset);
32663295 }
32673296 if (field.bit_width) |some| {
32683297 try w.splatByteAll(' ', level + half);
32693298 try w.writeAll("bits:\n");
3270 try tree.dumpNode(some, level + delta, config, w);
3299 try tree.dumpNode(some, level + delta, term);
32713300 }
32723301 },
32733302 .compound_stmt => |compound| {
32743303 for (compound.body, 0..) |stmt, i| {
32753304 if (i != 0) try w.writeByte('\n');
3276 try tree.dumpNode(stmt, level + delta, config, w);
3305 try tree.dumpNode(stmt, level + delta, term);
32773306 }
32783307 },
32793308 .enum_decl => |decl| {
32803309 for (decl.fields, 0..) |field, i| {
32813310 if (i != 0) try w.writeByte('\n');
3282 try tree.dumpNode(field, level + delta, config, w);
3311 try tree.dumpNode(field, level + delta, term);
32833312 }
32843313 },
32853314 .struct_decl, .union_decl => |decl| {
......@@ -3291,7 +3320,7 @@ fn dumpNode(
32913320 var field_i: u32 = 0;
32923321 for (decl.fields, 0..) |field_node, i| {
32933322 if (i != 0) try w.writeByte('\n');
3294 try tree.dumpNode(field_node, level + delta, config, w);
3323 try tree.dumpNode(field_node, level + delta, term);
32953324
32963325 if (field_node.get(tree) != .record_field) continue;
32973326 if (fields.len == 0) continue;
......@@ -3301,32 +3330,32 @@ fn dumpNode(
33013330
33023331 if (field_attributes.len == 0) continue;
33033332
3304 try config.setColor(w, ATTRIBUTE);
3333 try term.setColor(ATTRIBUTE);
33053334 try tree.dumpFieldAttributes(field_attributes, level + delta + half, w);
3306 try config.setColor(w, .reset);
3335 try term.setColor(.reset);
33073336 }
33083337 },
33093338 .array_init_expr, .struct_init_expr => |init| {
33103339 for (init.items, 0..) |item, i| {
33113340 if (i != 0) try w.writeByte('\n');
3312 try tree.dumpNode(item, level + delta, config, w);
3341 try tree.dumpNode(item, level + delta, term);
33133342 }
33143343 },
33153344 .union_init_expr => |init| {
33163345 try w.splatByteAll(' ', level + half);
33173346 try w.writeAll("field index: ");
3318 try config.setColor(w, LITERAL);
3347 try term.setColor(LITERAL);
33193348 try w.print("{d}\n", .{init.field_index});
3320 try config.setColor(w, .reset);
3349 try term.setColor(.reset);
33213350 if (init.initializer) |some| {
3322 try tree.dumpNode(some, level + delta, config, w);
3351 try tree.dumpNode(some, level + delta, term);
33233352 }
33243353 },
33253354 .compound_literal_expr => |literal| {
33263355 if (literal.storage_class != .auto or literal.thread_local) {
33273356 try w.splatByteAll(' ', level + half - 1);
33283357
3329 try config.setColor(w, ATTRIBUTE);
3358 try term.setColor(ATTRIBUTE);
33303359 switch (literal.storage_class) {
33313360 .auto => {},
33323361 .static => try w.writeAll(" static"),
......@@ -3334,137 +3363,138 @@ fn dumpNode(
33343363 }
33353364 if (literal.thread_local) try w.writeAll(" thread_local");
33363365 try w.writeByte('\n');
3337 try config.setColor(w, .reset);
3366 try term.setColor(.reset);
33383367 }
33393368
3340 try tree.dumpNode(literal.initializer, level + half, config, w);
3369 try tree.dumpNode(literal.initializer, level + half, term);
33413370 },
33423371 .labeled_stmt => |labeled| {
33433372 try w.splatByteAll(' ', level + half);
33443373 try w.writeAll("label: ");
3345 try config.setColor(w, LITERAL);
3374 try term.setColor(LITERAL);
33463375 try w.print("{s}\n", .{tree.tokSlice(labeled.label_tok)});
33473376
3348 try config.setColor(w, .reset);
3377 try term.setColor(.reset);
33493378 try w.splatByteAll(' ', level + half);
33503379 try w.writeAll("stmt:\n");
3351 try tree.dumpNode(labeled.body, level + delta, config, w);
3380 try tree.dumpNode(labeled.body, level + delta, term);
33523381 },
33533382 .case_stmt => |case| {
33543383 try w.splatByteAll(' ', level + half);
33553384
33563385 if (case.end) |some| {
33573386 try w.writeAll("range start:\n");
3358 try tree.dumpNode(case.start, level + delta, config, w);
3387 try tree.dumpNode(case.start, level + delta, term);
33593388
33603389 try w.splatByteAll(' ', level + half);
33613390 try w.writeAll("range end:\n");
3362 try tree.dumpNode(some, level + delta, config, w);
3391 try tree.dumpNode(some, level + delta, term);
33633392 } else {
33643393 try w.writeAll("value:\n");
3365 try tree.dumpNode(case.start, level + delta, config, w);
3394 try tree.dumpNode(case.start, level + delta, term);
33663395 }
33673396
33683397 try w.splatByteAll(' ', level + half);
33693398 try w.writeAll("stmt:\n");
3370 try tree.dumpNode(case.body, level + delta, config, w);
3399 try tree.dumpNode(case.body, level + delta, term);
33713400 },
33723401 .default_stmt => |default| {
33733402 try w.splatByteAll(' ', level + half);
33743403 try w.writeAll("stmt:\n");
3375 try tree.dumpNode(default.body, level + delta, config, w);
3404 try tree.dumpNode(default.body, level + delta, term);
33763405 },
33773406 .binary_cond_expr, .cond_expr, .builtin_choose_expr => |conditional| {
33783407 try w.splatByteAll(' ', level + half);
33793408 try w.writeAll("cond:\n");
3380 try tree.dumpNode(conditional.cond, level + delta, config, w);
3409 try tree.dumpNode(conditional.cond, level + delta, term);
33813410
33823411 try w.splatByteAll(' ', level + half);
33833412 try w.writeAll("then:\n");
3384 try tree.dumpNode(conditional.then_expr, level + delta, config, w);
3413 try tree.dumpNode(conditional.then_expr, level + delta, term);
33853414
33863415 try w.splatByteAll(' ', level + half);
33873416 try w.writeAll("else:\n");
3388 try tree.dumpNode(conditional.else_expr, level + delta, config, w);
3417 try tree.dumpNode(conditional.else_expr, level + delta, term);
33893418 },
33903419 .builtin_types_compatible_p => |call| {
33913420 try w.splatByteAll(' ', level + half);
33923421 try w.writeAll("lhs: ");
3393 try config.setColor(w, TYPE);
3422 try term.setColor(TYPE);
33943423 try call.lhs.dump(tree.comp, w);
33953424 try w.writeByte('\n');
3396 try config.setColor(w, .reset);
3425 try term.setColor(.reset);
33973426
33983427 try w.splatByteAll(' ', level + half);
33993428 try w.writeAll("rhs: ");
3400 try config.setColor(w, TYPE);
3429 try term.setColor(TYPE);
34013430 try call.rhs.dump(tree.comp, w);
34023431 try w.writeByte('\n');
3403 try config.setColor(w, .reset);
3432 try term.setColor(.reset);
34043433 },
34053434 .builtin_convertvector => |convert| {
34063435 try w.splatByteAll(' ', level + half);
34073436 try w.writeAll("operand:\n");
3408 try tree.dumpNode(convert.operand, level + delta, config, w);
3437 try tree.dumpNode(convert.operand, level + delta, term);
34093438 },
34103439 .builtin_shufflevector => |shuffle| {
34113440 try w.splatByteAll(' ', level + half);
34123441 try w.writeAll("lhs:\n");
3413 try tree.dumpNode(shuffle.lhs, level + delta, config, w);
3442 try tree.dumpNode(shuffle.lhs, level + delta, term);
34143443
34153444 try w.splatByteAll(' ', level + half);
34163445 try w.writeAll("rhs:\n");
3417 try tree.dumpNode(shuffle.rhs, level + delta, config, w);
3446 try tree.dumpNode(shuffle.rhs, level + delta, term);
34183447
34193448 if (shuffle.indexes.len > 0) {
34203449 try w.splatByteAll(' ', level + half);
34213450 try w.writeAll("indexes:\n");
34223451 for (shuffle.indexes) |index| {
3423 try tree.dumpNode(index, level + delta, config, w);
3452 try tree.dumpNode(index, level + delta, term);
34243453 }
34253454 }
34263455 },
3456 .builtin_va_arg_pack, .builtin_va_arg_pack_len => {},
34273457 .if_stmt => |@"if"| {
34283458 try w.splatByteAll(' ', level + half);
34293459 try w.writeAll("cond:\n");
3430 try tree.dumpNode(@"if".cond, level + delta, config, w);
3460 try tree.dumpNode(@"if".cond, level + delta, term);
34313461
34323462 try w.splatByteAll(' ', level + half);
34333463 try w.writeAll("then:\n");
3434 try tree.dumpNode(@"if".then_body, level + delta, config, w);
3464 try tree.dumpNode(@"if".then_body, level + delta, term);
34353465
34363466 if (@"if".else_body) |some| {
34373467 try w.splatByteAll(' ', level + half);
34383468 try w.writeAll("else:\n");
3439 try tree.dumpNode(some, level + delta, config, w);
3469 try tree.dumpNode(some, level + delta, term);
34403470 }
34413471 },
34423472 .switch_stmt => |@"switch"| {
34433473 try w.splatByteAll(' ', level + half);
34443474 try w.writeAll("cond:\n");
3445 try tree.dumpNode(@"switch".cond, level + delta, config, w);
3475 try tree.dumpNode(@"switch".cond, level + delta, term);
34463476
34473477 try w.splatByteAll(' ', level + half);
34483478 try w.writeAll("body:\n");
3449 try tree.dumpNode(@"switch".body, level + delta, config, w);
3479 try tree.dumpNode(@"switch".body, level + delta, term);
34503480 },
34513481 .while_stmt => |@"while"| {
34523482 try w.splatByteAll(' ', level + half);
34533483 try w.writeAll("cond:\n");
3454 try tree.dumpNode(@"while".cond, level + delta, config, w);
3484 try tree.dumpNode(@"while".cond, level + delta, term);
34553485
34563486 try w.splatByteAll(' ', level + half);
34573487 try w.writeAll("body:\n");
3458 try tree.dumpNode(@"while".body, level + delta, config, w);
3488 try tree.dumpNode(@"while".body, level + delta, term);
34593489 },
34603490 .do_while_stmt => |do| {
34613491 try w.splatByteAll(' ', level + half);
34623492 try w.writeAll("cond:\n");
3463 try tree.dumpNode(do.cond, level + delta, config, w);
3493 try tree.dumpNode(do.cond, level + delta, term);
34643494
34653495 try w.splatByteAll(' ', level + half);
34663496 try w.writeAll("body:\n");
3467 try tree.dumpNode(do.body, level + delta, config, w);
3497 try tree.dumpNode(do.body, level + delta, term);
34683498 },
34693499 .for_stmt => |@"for"| {
34703500 switch (@"for".init) {
......@@ -3472,48 +3502,48 @@ fn dumpNode(
34723502 try w.splatByteAll(' ', level + half);
34733503 try w.writeAll("decl:\n");
34743504 for (decls) |decl| {
3475 try tree.dumpNode(decl, level + delta, config, w);
3505 try tree.dumpNode(decl, level + delta, term);
34763506 try w.writeByte('\n');
34773507 }
34783508 },
34793509 .expr => |expr| if (expr) |some| {
34803510 try w.splatByteAll(' ', level + half);
34813511 try w.writeAll("init:\n");
3482 try tree.dumpNode(some, level + delta, config, w);
3512 try tree.dumpNode(some, level + delta, term);
34833513 },
34843514 }
34853515 if (@"for".cond) |some| {
34863516 try w.splatByteAll(' ', level + half);
34873517 try w.writeAll("cond:\n");
3488 try tree.dumpNode(some, level + delta, config, w);
3518 try tree.dumpNode(some, level + delta, term);
34893519 }
34903520 if (@"for".incr) |some| {
34913521 try w.splatByteAll(' ', level + half);
34923522 try w.writeAll("incr:\n");
3493 try tree.dumpNode(some, level + delta, config, w);
3523 try tree.dumpNode(some, level + delta, term);
34943524 }
34953525 try w.splatByteAll(' ', level + half);
34963526 try w.writeAll("body:\n");
3497 try tree.dumpNode(@"for".body, level + delta, config, w);
3527 try tree.dumpNode(@"for".body, level + delta, term);
34983528 },
34993529 .addr_of_label => |addr| {
35003530 try w.splatByteAll(' ', level + half);
35013531 try w.writeAll("label: ");
3502 try config.setColor(w, LITERAL);
3532 try term.setColor(LITERAL);
35033533 try w.print("{s}\n", .{tree.tokSlice(addr.label_tok)});
3504 try config.setColor(w, .reset);
3534 try term.setColor(.reset);
35053535 },
35063536 .goto_stmt => |goto| {
35073537 try w.splatByteAll(' ', level + half);
35083538 try w.writeAll("label: ");
3509 try config.setColor(w, LITERAL);
3539 try term.setColor(LITERAL);
35103540 try w.print("{s}\n", .{tree.tokSlice(goto.label_tok)});
3511 try config.setColor(w, .reset);
3541 try term.setColor(.reset);
35123542 },
35133543 .computed_goto_stmt => |goto| {
35143544 try w.splatByteAll(' ', level + half);
35153545 try w.writeAll("expr:\n");
3516 try tree.dumpNode(goto.expr, level + delta, config, w);
3546 try tree.dumpNode(goto.expr, level + delta, term);
35173547 },
35183548 .continue_stmt, .break_stmt, .null_stmt => {},
35193549 .return_stmt => |ret| {
......@@ -3521,43 +3551,43 @@ fn dumpNode(
35213551 .expr => |expr| {
35223552 try w.splatByteAll(' ', level + half);
35233553 try w.writeAll("expr:\n");
3524 try tree.dumpNode(expr, level + delta, config, w);
3554 try tree.dumpNode(expr, level + delta, term);
35253555 },
35263556 .implicit => {},
35273557 .none => {},
35283558 }
35293559 },
35303560 .asm_stmt => |@"asm"| {
3531 try tree.dumpNode(@"asm".asm_str, level + delta, config, w);
3561 try tree.dumpNode(@"asm".asm_str, level + delta, term);
35323562
35333563 const write_operand = struct {
35343564 fn write_operand(
3535 _w: *std.Io.Writer,
35363565 _level: u32,
3537 _config: std.Io.tty.Config,
3566 _term: std.Io.Terminal,
35383567 _tree: *const Tree,
35393568 operands: []const Node.AsmStmt.Operand,
3540 ) std.Io.tty.Config.SetColorError!void {
3569 ) std.Io.Terminal.SetColorError!void {
3570 const _w = _term.writer;
35413571 for (operands) |operand| {
35423572 if (operand.name != 0) {
35433573 try _w.splatByteAll(' ', _level + delta);
35443574 try _w.writeAll("asm name: ");
3545 try _config.setColor(_w, NAME);
3575 try _term.setColor(NAME);
35463576 try _w.writeAll(_tree.tokSlice(operand.name));
35473577 try _w.writeByte('\n');
3548 try _config.setColor(_w, .reset);
3578 try _term.setColor(.reset);
35493579 }
35503580
35513581 try _w.splatByteAll(' ', _level + delta);
35523582 try _w.writeAll("constraint: ");
35533583 const constraint_val = _tree.value_map.get(operand.constraint).?;
3554 try _config.setColor(_w, LITERAL);
3584 try _term.setColor(LITERAL);
35553585 _ = try constraint_val.print(operand.constraint.qt(_tree), _tree.comp, _w);
35563586 try _w.writeByte('\n');
35573587
3558 try _tree.dumpNode(operand.expr, _level + delta, _config, _w);
3588 try _tree.dumpNode(operand.expr, _level + delta, _term);
35593589 }
3560 try _config.setColor(_w, .reset);
3590 try _term.setColor(.reset);
35613591 }
35623592 }.write_operand;
35633593
......@@ -3565,18 +3595,18 @@ fn dumpNode(
35653595 try w.splatByteAll(' ', level + half);
35663596 try w.writeAll("ouputs:\n");
35673597
3568 try write_operand(w, level, config, tree, @"asm".outputs);
3598 try write_operand(level, term, tree, @"asm".outputs);
35693599 }
35703600 if (@"asm".inputs.len > 0) {
35713601 try w.splatByteAll(' ', level + half);
35723602 try w.writeAll("inputs:\n");
35733603
3574 try write_operand(w, level, config, tree, @"asm".inputs);
3604 try write_operand(level, term, tree, @"asm".inputs);
35753605 }
35763606 if (@"asm".clobbers.len > 0) {
35773607 try w.splatByteAll(' ', level + half);
35783608 try w.writeAll("clobbers:\n");
3579 try config.setColor(w, LITERAL);
3609 try term.setColor(LITERAL);
35803610 for (@"asm".clobbers) |clobber| {
35813611 const clobber_val = tree.value_map.get(clobber).?;
35823612
......@@ -3584,41 +3614,41 @@ fn dumpNode(
35843614 _ = try clobber_val.print(clobber.qt(tree), tree.comp, w);
35853615 try w.writeByte('\n');
35863616 }
3587 try config.setColor(w, .reset);
3617 try term.setColor(.reset);
35883618 }
35893619 if (@"asm".labels.len > 0) {
35903620 try w.splatByteAll(' ', level + half);
35913621 try w.writeAll("labels:\n");
35923622 for (@"asm".labels) |label| {
3593 try tree.dumpNode(label, level + delta, config, w);
3623 try tree.dumpNode(label, level + delta, term);
35943624 }
35953625 }
35963626 },
35973627 .call_expr => |call| {
35983628 try w.splatByteAll(' ', level + half);
35993629 try w.writeAll("callee:\n");
3600 try tree.dumpNode(call.callee, level + delta, config, w);
3630 try tree.dumpNode(call.callee, level + delta, term);
36013631
36023632 if (call.args.len > 0) {
36033633 try w.splatByteAll(' ', level + half);
36043634 try w.writeAll("args:\n");
36053635 for (call.args) |arg| {
3606 try tree.dumpNode(arg, level + delta, config, w);
3636 try tree.dumpNode(arg, level + delta, term);
36073637 }
36083638 }
36093639 },
36103640 .builtin_call_expr => |call| {
36113641 try w.splatByteAll(' ', level + half);
36123642 try w.writeAll("name: ");
3613 try config.setColor(w, NAME);
3643 try term.setColor(NAME);
36143644 try w.print("{s}\n", .{tree.tokSlice(call.builtin_tok)});
3615 try config.setColor(w, .reset);
3645 try term.setColor(.reset);
36163646
36173647 if (call.args.len > 0) {
36183648 try w.splatByteAll(' ', level + half);
36193649 try w.writeAll("args:\n");
36203650 for (call.args) |arg| {
3621 try tree.dumpNode(arg, level + delta, config, w);
3651 try tree.dumpNode(arg, level + delta, term);
36223652 }
36233653 }
36243654 },
......@@ -3655,13 +3685,13 @@ fn dumpNode(
36553685 => |bin| {
36563686 try w.splatByteAll(' ', level + 1);
36573687 try w.writeAll("lhs:\n");
3658 try tree.dumpNode(bin.lhs, level + delta, config, w);
3688 try tree.dumpNode(bin.lhs, level + delta, term);
36593689
36603690 try w.splatByteAll(' ', level + 1);
36613691 try w.writeAll("rhs:\n");
3662 try tree.dumpNode(bin.rhs, level + delta, config, w);
3692 try tree.dumpNode(bin.rhs, level + delta, term);
36633693 },
3664 .cast => |cast| try tree.dumpNode(cast.operand, level + delta, config, w),
3694 .cast => |cast| try tree.dumpNode(cast.operand, level + delta, term),
36653695 .addr_of_expr,
36663696 .deref_expr,
36673697 .plus_expr,
......@@ -3680,21 +3710,21 @@ fn dumpNode(
36803710 => |un| {
36813711 try w.splatByteAll(' ', level + 1);
36823712 try w.writeAll("operand:\n");
3683 try tree.dumpNode(un.operand, level + delta, config, w);
3713 try tree.dumpNode(un.operand, level + delta, term);
36843714 },
36853715 .decl_ref_expr, .enumeration_ref => |dr| {
36863716 try w.splatByteAll(' ', level + 1);
36873717 try w.writeAll("name: ");
3688 try config.setColor(w, NAME);
3718 try term.setColor(NAME);
36893719 try w.print("{s}\n", .{tree.tokSlice(dr.name_tok)});
3690 try config.setColor(w, .reset);
3720 try term.setColor(.reset);
36913721 },
36923722 .builtin_ref => |dr| {
36933723 try w.splatByteAll(' ', level + 1);
36943724 try w.writeAll("name: ");
3695 try config.setColor(w, NAME);
3725 try term.setColor(NAME);
36963726 try w.print("{s}\n", .{tree.tokSlice(dr.name_tok)});
3697 try config.setColor(w, .reset);
3727 try term.setColor(.reset);
36983728 },
36993729 .bool_literal,
37003730 .nullptr_literal,
......@@ -3706,7 +3736,7 @@ fn dumpNode(
37063736 .member_access_expr, .member_access_ptr_expr => |access| {
37073737 try w.splatByteAll(' ', level + 1);
37083738 try w.writeAll("lhs:\n");
3709 try tree.dumpNode(access.base, level + delta, config, w);
3739 try tree.dumpNode(access.base, level + delta, term);
37103740
37113741 var base_qt = access.base.qt(tree);
37123742 if (base_qt.get(tree.comp, .pointer)) |some| base_qt = some.child;
......@@ -3714,61 +3744,61 @@ fn dumpNode(
37143744
37153745 try w.splatByteAll(' ', level + 1);
37163746 try w.writeAll("name: ");
3717 try config.setColor(w, NAME);
3747 try term.setColor(NAME);
37183748 try w.print("{s}\n", .{fields[access.member_index].name.lookup(tree.comp)});
3719 try config.setColor(w, .reset);
3749 try term.setColor(.reset);
37203750 },
37213751 .array_access_expr => |access| {
37223752 try w.splatByteAll(' ', level + 1);
37233753 try w.writeAll("base:\n");
3724 try tree.dumpNode(access.base, level + delta, config, w);
3754 try tree.dumpNode(access.base, level + delta, term);
37253755
37263756 try w.splatByteAll(' ', level + 1);
37273757 try w.writeAll("index:\n");
3728 try tree.dumpNode(access.index, level + delta, config, w);
3758 try tree.dumpNode(access.index, level + delta, term);
37293759 },
37303760 .sizeof_expr, .alignof_expr => |type_info| {
37313761 if (type_info.expr) |some| {
37323762 try w.splatByteAll(' ', level + 1);
37333763 try w.writeAll("expr:\n");
3734 try tree.dumpNode(some, level + delta, config, w);
3764 try tree.dumpNode(some, level + delta, term);
37353765 } else {
37363766 try w.splatByteAll(' ', level + half);
37373767 try w.writeAll("operand type: ");
3738 try config.setColor(w, TYPE);
3768 try term.setColor(TYPE);
37393769 try type_info.operand_qt.dump(tree.comp, w);
37403770 try w.writeByte('\n');
3741 try config.setColor(w, .reset);
3771 try term.setColor(.reset);
37423772 }
37433773 },
37443774 .generic_expr => |generic| {
37453775 try w.splatByteAll(' ', level + 1);
37463776 try w.writeAll("controlling:\n");
3747 try tree.dumpNode(generic.controlling, level + delta, config, w);
3777 try tree.dumpNode(generic.controlling, level + delta, term);
37483778 try w.splatByteAll(' ', level + 1);
37493779 try w.writeAll("chosen:\n");
3750 try tree.dumpNode(generic.chosen, level + delta, config, w);
3780 try tree.dumpNode(generic.chosen, level + delta, term);
37513781
37523782 if (generic.rest.len > 0) {
37533783 try w.splatByteAll(' ', level + 1);
37543784 try w.writeAll("rest:\n");
37553785 for (generic.rest) |expr| {
3756 try tree.dumpNode(expr, level + delta, config, w);
3786 try tree.dumpNode(expr, level + delta, term);
37573787 }
37583788 }
37593789 },
37603790 .generic_association_expr => |assoc| {
3761 try tree.dumpNode(assoc.expr, level + delta, config, w);
3791 try tree.dumpNode(assoc.expr, level + delta, term);
37623792 },
37633793 .generic_default_expr => |default| {
3764 try tree.dumpNode(default.expr, level + delta, config, w);
3794 try tree.dumpNode(default.expr, level + delta, term);
37653795 },
37663796 .array_filler_expr => |filler| {
37673797 try w.splatByteAll(' ', level + 1);
37683798 try w.writeAll("count: ");
3769 try config.setColor(w, LITERAL);
3799 try term.setColor(LITERAL);
37703800 try w.print("{d}\n", .{filler.count});
3771 try config.setColor(w, .reset);
3801 try term.setColor(.reset);
37723802 },
37733803 .struct_forward_decl,
37743804 .union_forward_decl,
lib/compiler/aro/aro/TypeStore.zig+82-24
......@@ -219,9 +219,9 @@ pub const QualType = packed struct(u32) {
219219 .float_dfloat64 => return .{ .float = .dfloat64 },
220220 .float_dfloat128 => return .{ .float = .dfloat128 },
221221 .float_dfloat64x => return .{ .float = .dfloat64x },
222 .void_pointer => return .{ .pointer = .{ .child = .void, .decayed = null } },
223 .char_pointer => return .{ .pointer = .{ .child = .char, .decayed = null } },
224 .int_pointer => return .{ .pointer = .{ .child = .int, .decayed = null } },
222 .void_pointer => return .{ .pointer = .{ .child = .void } },
223 .char_pointer => return .{ .pointer = .{ .child = .char } },
224 .int_pointer => return .{ .pointer = .{ .child = .int } },
225225
226226 else => {},
227227 }
......@@ -280,7 +280,7 @@ pub const QualType = packed struct(u32) {
280280 },
281281 .pointer => .{ .pointer = .{
282282 .child = @bitCast(repr.data[0]),
283 .decayed = null,
283 .bounds = @enumFromInt(repr.data[1]),
284284 } },
285285 .pointer_decayed => .{ .pointer = .{
286286 .child = @bitCast(repr.data[0]),
......@@ -800,7 +800,6 @@ pub const QualType = packed struct(u32) {
800800
801801 return comp.type_store.put(comp.gpa, .{ .pointer = .{
802802 .child = qt,
803 .decayed = null,
804803 } });
805804 },
806805 else => return qt,
......@@ -1013,6 +1012,15 @@ pub const QualType = packed struct(u32) {
10131012 return qt.scalarKind(comp).isPointer();
10141013 }
10151014
1015 /// Function or function pointer
1016 pub fn isCallable(qt: QualType, comp: *const Compilation) bool {
1017 return switch (qt.base(comp).type) {
1018 .func => true,
1019 .pointer => |ptr| ptr.child.is(comp, .func),
1020 else => false,
1021 };
1022 }
1023
10161024 pub fn eqlQualified(a_qt: QualType, b_qt: QualType, comp: *const Compilation) bool {
10171025 if (a_qt.@"const" != b_qt.@"const") return false;
10181026 if (a_qt.@"volatile" != b_qt.@"volatile") return false;
......@@ -1632,7 +1640,25 @@ pub const Type = union(enum) {
16321640
16331641 pub const Pointer = struct {
16341642 child: QualType,
1635 decayed: ?QualType,
1643 decayed: ?QualType = null,
1644 bounds: Bounds = .c,
1645
1646 pub const Bounds = enum {
1647 /// C pointer with no bounds attribute
1648 c,
1649 /// No pointer arithmetic or non-zero indexing
1650 single,
1651 /// Explicitly specified as a traditional C pointer
1652 unsafe_indexable,
1653
1654 pub fn fromTag(tag: Attribute.Tag) Bounds {
1655 return switch (tag) {
1656 .single => .single,
1657 .unsafe_indexable => .unsafe_indexable,
1658 else => unreachable,
1659 };
1660 }
1661 };
16361662 };
16371663
16381664 pub const Array = struct {
......@@ -1784,6 +1810,7 @@ attributes: std.ArrayList(Attribute) = .empty,
17841810anon_name_arena: std.heap.ArenaAllocator.State = .{},
17851811
17861812wchar: QualType = .invalid,
1813wint: QualType = .invalid,
17871814uint_least16_t: QualType = .invalid,
17881815uint_least32_t: QualType = .invalid,
17891816ptrdiff: QualType = .invalid,
......@@ -1918,10 +1945,12 @@ pub fn set(ts: *TypeStore, gpa: std.mem.Allocator, ty: Type, index: usize) !void
19181945 .pointer => |pointer| {
19191946 repr.data[0] = @bitCast(pointer.child);
19201947 if (pointer.decayed) |array| {
1948 std.debug.assert(pointer.bounds == .c);
19211949 repr.tag = .pointer_decayed;
19221950 repr.data[1] = @bitCast(array);
19231951 } else {
19241952 repr.tag = .pointer;
1953 repr.data[1] = @intFromEnum(pointer.bounds);
19251954 }
19261955 },
19271956 .array => |array| {
......@@ -2070,17 +2099,44 @@ pub fn set(ts: *TypeStore, gpa: std.mem.Allocator, ty: Type, index: usize) !void
20702099
20712100pub fn initNamedTypes(ts: *TypeStore, comp: *Compilation) !void {
20722101 const os = comp.target.os.tag;
2073 ts.wchar = switch (comp.target.cpu.arch) {
2074 .xcore => .uchar,
2075 .ve, .msp430 => .uint,
2076 .arm, .armeb, .thumb, .thumbeb => if (os != .windows and os != .netbsd and os != .openbsd) .uint else .int,
2077 .aarch64, .aarch64_be => if (!os.isDarwin() and os != .netbsd) .uint else .int,
2078 .x86_64, .x86 => if (os == .windows) .ushort else .int,
2079 else => .int,
2102 const arch = comp.target.cpu.arch;
2103 ts.wchar = switch (os) {
2104 .openbsd, .netbsd => .int,
2105 .ps4, .ps5 => .ushort,
2106 .uefi => .ushort,
2107 .windows => .ushort,
2108 .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos => .int,
2109 else => switch (arch) {
2110 .aarch64, .aarch64_be => .uint,
2111 .arm, .armeb, .thumb, .thumbeb => .uint,
2112 .ve, .msp430 => .uint,
2113 .x86_64, .x86 => .int,
2114 .xcore => .uchar,
2115 else => .int,
2116 },
2117 };
2118
2119 ts.wint = switch (os) {
2120 .fuchsia => .uint,
2121 .linux => .uint,
2122 .openbsd => .int,
2123 .uefi => .ushort,
2124 .windows => .ushort,
2125 else => switch (arch) {
2126 .csky => .uint,
2127 .loongarch32, .loongarch64 => .uint,
2128 .riscv32, .riscv32be, .riscv64, .riscv64be => .uint,
2129 .ve => .uint,
2130 .xcore => .uint,
2131 .xtensa, .xtensaeb => .uint,
2132 else => .int,
2133 },
20802134 };
20812135
20822136 const ptr_width = comp.target.ptrBitWidth();
2083 ts.ptrdiff = if (os == .windows and ptr_width == 64)
2137 ts.ptrdiff = if (arch == .wasm32)
2138 .long
2139 else if (os == .windows and ptr_width == 64)
20842140 .long_long
20852141 else switch (ptr_width) {
20862142 16 => .int,
......@@ -2089,7 +2145,9 @@ pub fn initNamedTypes(ts: *TypeStore, comp: *Compilation) !void {
20892145 else => unreachable,
20902146 };
20912147
2092 ts.size = if (os == .windows and ptr_width == 64)
2148 ts.size = if (arch == .wasm32)
2149 .ulong
2150 else if (os == .windows and ptr_width == 64)
20932151 .ulong_long
20942152 else switch (ptr_width) {
20952153 16 => .uint,
......@@ -2206,9 +2264,9 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
22062264 };
22072265
22082266 const struct_qt = switch (kind) {
2209 .aarch64_va_list => blk: {
2267 .aarch64_va_list => {
22102268 var record: Type.Record = .{
2211 .name = try comp.internString("__va_list_tag"),
2269 .name = try comp.internString("__va_list"),
22122270 .decl_node = undefined, // TODO
22132271 .layout = null,
22142272 .fields = &.{},
......@@ -2226,11 +2284,11 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
22262284 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
22272285 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
22282286
2229 break :blk qt;
2287 return qt;
22302288 },
2231 .arm_va_list => blk: {
2289 .arm_va_list => {
22322290 var record: Type.Record = .{
2233 .name = try comp.internString("__va_list_tag"),
2291 .name = try comp.internString("__va_list"),
22342292 .decl_node = undefined, // TODO
22352293 .layout = null,
22362294 .fields = &.{},
......@@ -2244,7 +2302,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
22442302 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
22452303 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
22462304
2247 break :blk qt;
2305 return qt;
22482306 },
22492307 .hexagon_va_list => blk: {
22502308 var record: Type.Record = .{
......@@ -2330,7 +2388,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
23302388
23312389 break :blk qt;
23322390 },
2333 .xtensa_va_list => blk: {
2391 .xtensa_va_list => {
23342392 var record: Type.Record = .{
23352393 .name = try comp.internString("__va_list_tag"),
23362394 .decl_node = undefined, // TODO
......@@ -2348,7 +2406,7 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
23482406 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
23492407 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
23502408
2351 break :blk qt;
2409 return qt;
23522410 },
23532411 };
23542412
......@@ -2830,7 +2888,7 @@ pub const Builder = struct {
28302888 }
28312889
28322890 fn duplicateSpec(b: *Builder, source_tok: TokenIndex, spec: []const u8) !void {
2833 if (b.parser.comp.langopts.emulate != .clang) return b.cannotCombine(source_tok);
2891 if (b.parser.comp.langopts.emulate == .gcc) return b.cannotCombine(source_tok);
28342892 try b.parser.err(b.parser.tok_i, .duplicate_decl_spec, .{spec});
28352893 }
28362894
lib/compiler/aro/aro/Value.zig+13-17
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const Io = std.Io;
32const assert = std.debug.assert;
43const BigIntConst = std.math.big.int.Const;
54const BigIntMutable = std.math.big.int.Mutable;
......@@ -9,8 +8,8 @@ const BigIntSpace = Interner.Tag.Int.BigIntSpace;
98
109const annex_g = @import("annex_g.zig");
1110const Compilation = @import("Compilation.zig");
12const Target = @import("Target.zig");
1311const QualType = @import("TypeStore.zig").QualType;
12const Target = @import("Target.zig");
1413
1514const Value = @This();
1615
......@@ -77,11 +76,7 @@ test "minUnsignedBits" {
7776 }
7877 };
7978
80 var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator);
81 defer arena_state.deinit();
82 const arena = arena_state.allocator();
83
84 var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, undefined, Io.Dir.cwd());
79 var comp = try Compilation.init(.testing);
8580 defer comp.deinit();
8681 const target_query = try std.Target.Query.parse(.{ .arch_os_abi = "x86_64-linux-gnu" });
8782 comp.target = .fromZigTarget(try std.zig.system.resolveTargetQuery(std.testing.io, target_query));
......@@ -116,11 +111,7 @@ test "minSignedBits" {
116111 }
117112 };
118113
119 var arena_state: std.heap.ArenaAllocator = .init(std.testing.allocator);
120 defer arena_state.deinit();
121 const arena = arena_state.allocator();
122
123 var comp = Compilation.init(std.testing.allocator, arena, std.testing.io, undefined, Io.Dir.cwd());
114 var comp = try Compilation.init(.testing);
124115 defer comp.deinit();
125116 const target_query = try std.Target.Query.parse(.{ .arch_os_abi = "x86_64-linux-gnu" });
126117 comp.target = .fromZigTarget(try std.zig.system.resolveTargetQuery(std.testing.io, target_query));
......@@ -465,6 +456,11 @@ pub fn isNan(v: Value, comp: *const Compilation) bool {
465456 };
466457}
467458
459pub fn isPointer(v: Value, comp: *const Compilation) bool {
460 if (v.opt_ref == .none) return false;
461 return comp.interner.get(v.ref()) == .pointer;
462}
463
468464/// Converts value to zero or one;
469465/// `.none` value remains unchanged.
470466pub fn boolCast(v: *Value, comp: *const Compilation) void {
......@@ -1044,9 +1040,9 @@ fn twosCompIntLimit(limit: std.math.big.int.TwosCompIntLimit, qt: QualType, comp
10441040 const mag_bits: usize = @intCast(qt.bitSizeof(comp));
10451041 switch (mag_bits) {
10461042 inline 8, 16, 32, 64 => |bits| {
1047 if (limit == .min) return Value.int(@as(i64, std.math.minInt(std.meta.Int(.signed, bits))), comp);
1043 if (limit == .min) return Value.int(@as(i64, std.math.minInt(@Int(.signed, bits))), comp);
10481044 return switch (signedness) {
1049 inline else => |sign| Value.int(std.math.maxInt(std.meta.Int(sign, bits)), comp),
1045 inline else => |sign| Value.int(std.math.maxInt(@Int(sign, bits)), comp),
10501046 };
10511047 },
10521048 else => {},
......@@ -1081,7 +1077,7 @@ const NestedPrint = union(enum) {
10811077 },
10821078};
10831079
1084pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!void {
1080pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!void {
10851081 try w.writeByte('&');
10861082 try w.writeAll(base);
10871083 if (!offset.isZero(comp)) {
......@@ -1090,7 +1086,7 @@ pub fn printPointer(offset: Value, base: []const u8, comp: *const Compilation, w
10901086 }
10911087}
10921088
1093pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!?NestedPrint {
1089pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!?NestedPrint {
10941090 if (qt.is(comp, .bool)) {
10951091 try w.writeAll(if (v.isZero(comp)) "false" else "true");
10961092 return null;
......@@ -1117,7 +1113,7 @@ pub fn print(v: Value, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io
11171113 return null;
11181114}
11191115
1120pub fn printString(bytes: []const u8, qt: QualType, comp: *const Compilation, w: *Io.Writer) Io.Writer.Error!void {
1116pub fn printString(bytes: []const u8, qt: QualType, comp: *const Compilation, w: *std.Io.Writer) std.Io.Writer.Error!void {
11211117 const size: Compilation.CharUnitSize = @enumFromInt(qt.childType(comp).sizeof(comp));
11221118 const without_null = bytes[0 .. bytes.len - @intFromEnum(size)];
11231119 try w.writeByte('"');
lib/compiler/aro/aro/features.zig+1
......@@ -44,6 +44,7 @@ pub fn hasFeature(comp: *Compilation, ext: []const u8) bool {
4444 .c_generic_selections = comp.langopts.standard.atLeast(.c11),
4545 .c_static_assert = comp.langopts.standard.atLeast(.c11),
4646 .c_thread_local = comp.langopts.standard.atLeast(.c11) and comp.target.isTlsSupported(),
47 .bounds_attributes = comp.langopts.bounds_safety == .clang,
4748 };
4849 inline for (@typeInfo(@TypeOf(list)).@"struct".fields) |f| {
4950 if (std.mem.eql(u8, f.name, ext)) return @field(list, f.name);
lib/compiler/aro/aro/pragmas/once.zig-1
......@@ -35,7 +35,6 @@ fn deinit(pragma: *Pragma, comp: *Compilation) void {
3535 var self: *Once = @fieldParentPtr("pragma", pragma);
3636 self.pragma_once.deinit(comp.gpa);
3737 comp.gpa.destroy(self);
38 pragma.* = undefined;
3938}
4039
4140fn preprocessorHandler(pragma: *Pragma, pp: *Preprocessor, start_idx: TokenIndex) Pragma.Error!void {
lib/compiler/aro/aro/record_layout.zig+3-3
......@@ -332,7 +332,7 @@ const SysVContext = struct {
332332 }
333333 }
334334 } else {
335 std.debug.assert(self.comp.langopts.emulate == .clang);
335 std.debug.assert(self.comp.langopts.emulate == .no or self.comp.langopts.emulate == .clang);
336336
337337 // On Clang, the alignment requested by annotations is not respected if it is
338338 // larger than the value of #pragma pack. See test case 0083.
......@@ -569,7 +569,7 @@ const MsvcContext = struct {
569569
570570pub fn compute(fields: []Type.Record.Field, qt: QualType, comp: *const Compilation, pragma_pack: ?u8) Error!Type.Record.Layout {
571571 switch (comp.langopts.emulate) {
572 .gcc, .clang => {
572 .no, .gcc, .clang => {
573573 var context = SysVContext.init(qt, comp, pragma_pack);
574574
575575 try context.layoutFields(fields);
......@@ -620,7 +620,7 @@ fn computeLayout(qt: QualType, comp: *const Compilation) RecordLayout {
620620 else => {
621621 const type_align = qt.alignof(comp) * BITS_PER_BYTE;
622622 return .{
623 .size_bits = qt.bitSizeofOrNull(comp) orelse 0,
623 .size_bits = BITS_PER_BYTE * (qt.sizeofOrNull(comp) orelse 0),
624624 .pointer_alignment_bits = type_align,
625625 .field_alignment_bits = type_align,
626626 .required_alignment_bits = BITS_PER_BYTE,
lib/compiler/aro/assembly_backend/x86_64.zig+3-4
......@@ -5,15 +5,14 @@ const assert = std.debug.assert;
55const aro = @import("aro");
66const Assembly = aro.Assembly;
77const Compilation = aro.Compilation;
8const Node = Tree.Node;
98const Source = aro.Source;
109const Tree = aro.Tree;
1110const QualType = aro.QualType;
1211const Value = aro.Value;
13
14const AsmCodeGen = @This();
1512const Error = aro.Compilation.Error;
13const Node = Tree.Node;
1614
15const AsmCodeGen = @This();
1716tree: *const Tree,
1817comp: *Compilation,
1918text: *std.Io.Writer,
......@@ -58,7 +57,7 @@ fn serializeFloat(comptime T: type, value: T, w: *std.Io.Writer) !void {
5857 },
5958 else => {
6059 const size = @bitSizeOf(T);
61 const storage_unit = std.enums.fromInt(StorageUnit, size).?;
60 const storage_unit = std.enums.fromInt(StorageUnit, size) orelse unreachable;
6261 const IntTy = @Int(.unsigned, size);
6362 const int_val: IntTy = @bitCast(value);
6463 return serializeInt(int_val, storage_unit, w);
lib/compiler/aro/backend/Assembly.zig+1-2
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const Io = std.Io;
32const Allocator = std.mem.Allocator;
43
54data: []const u8,
......@@ -12,7 +11,7 @@ pub fn deinit(self: *const Assembly, gpa: Allocator) void {
1211 gpa.free(self.text);
1312}
1413
15pub fn writeToFile(self: Assembly, io: Io, file: Io.File) !void {
14pub fn writeToFile(self: Assembly, io: std.Io, file: std.Io.File) !void {
1615 var file_writer = file.writer(io, &.{});
1716
1817 var buffers = [_][]const u8{ self.data, self.text };
lib/compiler/aro/backend/Interner.zig+2-2
......@@ -102,13 +102,13 @@ pub const Key = union(enum) {
102102 .float => |repr| switch (repr) {
103103 inline else => |data| std.hash.autoHash(
104104 &hasher,
105 @as(std.meta.Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)),
105 @as(@Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)),
106106 ),
107107 },
108108 .complex => |repr| switch (repr) {
109109 inline else => |data| std.hash.autoHash(
110110 &hasher,
111 @as(std.meta.Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)),
111 @as(@Int(.unsigned, @bitSizeOf(@TypeOf(data))), @bitCast(data)),
112112 ),
113113 },
114114 .int => |repr| {
lib/compiler/aro/backend/Ir.zig+100-92
......@@ -374,24 +374,27 @@ pub fn deinit(ir: *Ir, gpa: std.mem.Allocator) void {
374374 ir.* = undefined;
375375}
376376
377const TYPE = std.Io.tty.Color.bright_magenta;
378const INST = std.Io.tty.Color.bright_cyan;
379const REF = std.Io.tty.Color.bright_blue;
380const LITERAL = std.Io.tty.Color.bright_green;
381const ATTRIBUTE = std.Io.tty.Color.bright_yellow;
377const TYPE = std.Io.Terminal.Color.bright_magenta;
378const INST = std.Io.Terminal.Color.bright_cyan;
379const REF = std.Io.Terminal.Color.bright_blue;
380const LITERAL = std.Io.Terminal.Color.bright_green;
381const ATTRIBUTE = std.Io.Terminal.Color.bright_yellow;
382382
383383const RefMap = std.AutoArrayHashMapUnmanaged(Ref, void);
384384
385pub fn dump(ir: *const Ir, gpa: Allocator, config: std.Io.tty.Config, w: *std.Io.Writer) !void {
385pub const DumpError = std.Io.Terminal.SetColorError || std.mem.Allocator.Error;
386
387pub fn dump(ir: *const Ir, gpa: Allocator, term: std.Io.Terminal) DumpError!void {
386388 for (ir.decls.keys(), ir.decls.values()) |name, *decl| {
387 try ir.dumpDecl(decl, gpa, name, config, w);
389 try ir.dumpDecl(decl, gpa, name, term);
388390 }
389 try w.flush();
391 try term.writer.flush();
390392}
391393
392fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, config: std.Io.tty.Config, w: *std.Io.Writer) !void {
394fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8, term: std.Io.Terminal) !void {
393395 const tags = decl.instructions.items(.tag);
394396 const data = decl.instructions.items(.data);
397 const w = term.writer;
395398
396399 var ref_map: RefMap = .empty;
397400 defer ref_map.deinit(gpa);
......@@ -402,10 +405,10 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
402405 const ret_inst = decl.body.items[decl.body.items.len - 1];
403406 const ret_operand = data[@intFromEnum(ret_inst)].un;
404407 const ret_ty = decl.instructions.items(.ty)[@intFromEnum(ret_operand)];
405 try ir.writeType(ret_ty, config, w);
406 try config.setColor(w, REF);
408 try ir.writeType(ret_ty, term);
409 try term.setColor(REF);
407410 try w.print(" @{s}", .{name});
408 try config.setColor(w, .reset);
411 try term.setColor(.reset);
409412 try w.writeAll("(");
410413
411414 var arg_count: u32 = 0;
......@@ -414,8 +417,8 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
414417 if (tags[@intFromEnum(ref)] != .arg) break;
415418 if (arg_count != 0) try w.writeAll(", ");
416419 try ref_map.put(gpa, ref, {});
417 try ir.writeRef(decl, &ref_map, ref, config, w);
418 try config.setColor(w, .reset);
420 try ir.writeRef(decl, &ref_map, ref, term);
421 try term.setColor(.reset);
419422 }
420423 try w.writeAll(") {\n");
421424 for (decl.body.items[arg_count..]) |ref| {
......@@ -432,7 +435,7 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
432435 .arg, .constant, .symbol => unreachable,
433436 .label => {
434437 const label_index = label_map.getIndex(ref).?;
435 try config.setColor(w, REF);
438 try term.setColor(REF);
436439 try w.print("{s}.{d}:\n", .{ data[i].label, label_index });
437440 },
438441 // .label_val => {
......@@ -441,35 +444,35 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
441444 // },
442445 .jmp => {
443446 const un = data[i].un;
444 try config.setColor(w, INST);
447 try term.setColor(INST);
445448 try w.writeAll(" jmp ");
446 try writeLabel(decl, &label_map, un, config, w);
449 try writeLabel(decl, &label_map, un, term);
447450 try w.writeByte('\n');
448451 },
449452 .branch => {
450453 const br = data[i].branch;
451 try config.setColor(w, INST);
454 try term.setColor(INST);
452455 try w.writeAll(" branch ");
453 try ir.writeRef(decl, &ref_map, br.cond, config, w);
454 try config.setColor(w, .reset);
456 try ir.writeRef(decl, &ref_map, br.cond, term);
457 try term.setColor(.reset);
455458 try w.writeAll(", ");
456 try writeLabel(decl, &label_map, br.then, config, w);
457 try config.setColor(w, .reset);
459 try writeLabel(decl, &label_map, br.then, term);
460 try term.setColor(.reset);
458461 try w.writeAll(", ");
459 try writeLabel(decl, &label_map, br.@"else", config, w);
462 try writeLabel(decl, &label_map, br.@"else", term);
460463 try w.writeByte('\n');
461464 },
462465 .select => {
463466 const br = data[i].branch;
464 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);
467 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
465468 try w.writeAll("select ");
466 try ir.writeRef(decl, &ref_map, br.cond, config, w);
467 try config.setColor(w, .reset);
469 try ir.writeRef(decl, &ref_map, br.cond, term);
470 try term.setColor(.reset);
468471 try w.writeAll(", ");
469 try ir.writeRef(decl, &ref_map, br.then, config, w);
470 try config.setColor(w, .reset);
472 try ir.writeRef(decl, &ref_map, br.then, term);
473 try term.setColor(.reset);
471474 try w.writeAll(", ");
472 try ir.writeRef(decl, &ref_map, br.@"else", config, w);
475 try ir.writeRef(decl, &ref_map, br.@"else", term);
473476 try w.writeByte('\n');
474477 },
475478 // .jmp_val => {
......@@ -478,91 +481,91 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
478481 // },
479482 .@"switch" => {
480483 const @"switch" = data[i].@"switch";
481 try config.setColor(w, INST);
484 try term.setColor(INST);
482485 try w.writeAll(" switch ");
483 try ir.writeRef(decl, &ref_map, @"switch".target, config, w);
484 try config.setColor(w, .reset);
486 try ir.writeRef(decl, &ref_map, @"switch".target, term);
487 try term.setColor(.reset);
485488 try w.writeAll(" {");
486489 for (@"switch".case_vals[0..@"switch".cases_len], @"switch".case_labels) |val_ref, label_ref| {
487490 try w.writeAll("\n ");
488 try ir.writeValue(val_ref, config, w);
489 try config.setColor(w, .reset);
491 try ir.writeValue(val_ref, term);
492 try term.setColor(.reset);
490493 try w.writeAll(" => ");
491 try writeLabel(decl, &label_map, label_ref, config, w);
492 try config.setColor(w, .reset);
494 try writeLabel(decl, &label_map, label_ref, term);
495 try term.setColor(.reset);
493496 }
494 try config.setColor(w, LITERAL);
497 try term.setColor(LITERAL);
495498 try w.writeAll("\n default ");
496 try config.setColor(w, .reset);
499 try term.setColor(.reset);
497500 try w.writeAll("=> ");
498 try writeLabel(decl, &label_map, @"switch".default, config, w);
499 try config.setColor(w, .reset);
501 try writeLabel(decl, &label_map, @"switch".default, term);
502 try term.setColor(.reset);
500503 try w.writeAll("\n }\n");
501504 },
502505 .call => {
503506 const call = data[i].call;
504 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);
507 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
505508 try w.writeAll("call ");
506 try ir.writeRef(decl, &ref_map, call.func, config, w);
507 try config.setColor(w, .reset);
509 try ir.writeRef(decl, &ref_map, call.func, term);
510 try term.setColor(.reset);
508511 try w.writeAll("(");
509512 for (call.args(), 0..) |arg, arg_i| {
510513 if (arg_i != 0) try w.writeAll(", ");
511 try ir.writeRef(decl, &ref_map, arg, config, w);
512 try config.setColor(w, .reset);
514 try ir.writeRef(decl, &ref_map, arg, term);
515 try term.setColor(.reset);
513516 }
514517 try w.writeAll(")\n");
515518 },
516519 .alloc => {
517520 const alloc = data[i].alloc;
518 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);
521 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
519522 try w.writeAll("alloc ");
520 try config.setColor(w, ATTRIBUTE);
523 try term.setColor(ATTRIBUTE);
521524 try w.writeAll("size ");
522 try config.setColor(w, LITERAL);
525 try term.setColor(LITERAL);
523526 try w.print("{d}", .{alloc.size});
524 try config.setColor(w, ATTRIBUTE);
527 try term.setColor(ATTRIBUTE);
525528 try w.writeAll(" align ");
526 try config.setColor(w, LITERAL);
529 try term.setColor(LITERAL);
527530 try w.print("{d}", .{alloc.@"align"});
528531 try w.writeByte('\n');
529532 },
530533 .phi => {
531 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);
534 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
532535 try w.writeAll("phi");
533 try config.setColor(w, .reset);
536 try term.setColor(.reset);
534537 try w.writeAll(" {");
535538 for (data[i].phi.inputs()) |input| {
536539 try w.writeAll("\n ");
537 try writeLabel(decl, &label_map, input.label, config, w);
538 try config.setColor(w, .reset);
540 try writeLabel(decl, &label_map, input.label, term);
541 try term.setColor(.reset);
539542 try w.writeAll(" => ");
540 try ir.writeRef(decl, &ref_map, input.value, config, w);
541 try config.setColor(w, .reset);
543 try ir.writeRef(decl, &ref_map, input.value, term);
544 try term.setColor(.reset);
542545 }
543 try config.setColor(w, .reset);
546 try term.setColor(.reset);
544547 try w.writeAll("\n }\n");
545548 },
546549 .store => {
547550 const bin = data[i].bin;
548 try config.setColor(w, INST);
551 try term.setColor(INST);
549552 try w.writeAll(" store ");
550 try ir.writeRef(decl, &ref_map, bin.lhs, config, w);
551 try config.setColor(w, .reset);
553 try ir.writeRef(decl, &ref_map, bin.lhs, term);
554 try term.setColor(.reset);
552555 try w.writeAll(", ");
553 try ir.writeRef(decl, &ref_map, bin.rhs, config, w);
556 try ir.writeRef(decl, &ref_map, bin.rhs, term);
554557 try w.writeByte('\n');
555558 },
556559 .ret => {
557 try config.setColor(w, INST);
560 try term.setColor(INST);
558561 try w.writeAll(" ret ");
559 if (data[i].un != .none) try ir.writeRef(decl, &ref_map, data[i].un, config, w);
562 if (data[i].un != .none) try ir.writeRef(decl, &ref_map, data[i].un, term);
560563 try w.writeByte('\n');
561564 },
562565 .load => {
563 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);
566 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
564567 try w.writeAll("load ");
565 try ir.writeRef(decl, &ref_map, data[i].un, config, w);
568 try ir.writeRef(decl, &ref_map, data[i].un, term);
566569 try w.writeByte('\n');
567570 },
568571 .bit_or,
......@@ -583,12 +586,12 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
583586 .mod,
584587 => {
585588 const bin = data[i].bin;
586 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);
589 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
587590 try w.print("{s} ", .{@tagName(tag)});
588 try ir.writeRef(decl, &ref_map, bin.lhs, config, w);
589 try config.setColor(w, .reset);
591 try ir.writeRef(decl, &ref_map, bin.lhs, term);
592 try term.setColor(.reset);
590593 try w.writeAll(", ");
591 try ir.writeRef(decl, &ref_map, bin.rhs, config, w);
594 try ir.writeRef(decl, &ref_map, bin.rhs, term);
592595 try w.writeByte('\n');
593596 },
594597 .bit_not,
......@@ -598,33 +601,34 @@ fn dumpDecl(ir: *const Ir, decl: *const Decl, gpa: Allocator, name: []const u8,
598601 .sext,
599602 => {
600603 const un = data[i].un;
601 try ir.writeNewRef(gpa, decl, &ref_map, ref, config, w);
604 try ir.writeNewRef(gpa, decl, &ref_map, ref, term);
602605 try w.print("{s} ", .{@tagName(tag)});
603 try ir.writeRef(decl, &ref_map, un, config, w);
606 try ir.writeRef(decl, &ref_map, un, term);
604607 try w.writeByte('\n');
605608 },
606609 .label_addr, .jmp_val => {},
607610 }
608611 }
609 try config.setColor(w, .reset);
612 try term.setColor(.reset);
610613 try w.writeAll("}\n\n");
611614}
612615
613fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {
616fn writeType(ir: Ir, ty_ref: Interner.Ref, term: std.Io.Terminal) !void {
617 const w = term.writer;
614618 const ty = ir.interner.get(ty_ref);
615 try config.setColor(w, TYPE);
619 try term.setColor(TYPE);
616620 switch (ty) {
617621 .ptr_ty, .noreturn_ty, .void_ty, .func_ty => try w.writeAll(@tagName(ty)),
618622 .int_ty => |bits| try w.print("i{d}", .{bits}),
619623 .float_ty => |bits| try w.print("f{d}", .{bits}),
620624 .array_ty => |info| {
621625 try w.print("[{d} * ", .{info.len});
622 try ir.writeType(info.child, .no_color, w);
626 try ir.writeType(info.child, .{ .mode = .no_color, .writer = w });
623627 try w.writeByte(']');
624628 },
625629 .vector_ty => |info| {
626630 try w.print("<{d} * ", .{info.len});
627 try ir.writeType(info.child, .no_color, w);
631 try ir.writeType(info.child, .{ .mode = .no_color, .writer = w });
628632 try w.writeByte('>');
629633 },
630634 .record_ty => |elems| {
......@@ -632,7 +636,7 @@ fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io
632636 try w.writeAll("{ ");
633637 for (elems, 0..) |elem, i| {
634638 if (i != 0) try w.writeAll(", ");
635 try ir.writeType(elem, config, w);
639 try ir.writeType(elem, .{ .mode = .no_color, .writer = w });
636640 }
637641 try w.writeAll(" }");
638642 },
......@@ -640,8 +644,9 @@ fn writeType(ir: Ir, ty_ref: Interner.Ref, config: std.Io.tty.Config, w: *std.Io
640644 }
641645}
642646
643fn writeValue(ir: Ir, val: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {
644 try config.setColor(w, LITERAL);
647fn writeValue(ir: Ir, val: Interner.Ref, term: std.Io.Terminal) !void {
648 const w = term.writer;
649 try term.setColor(LITERAL);
645650 const key = ir.interner.get(val);
646651 switch (key) {
647652 .null => return w.writeAll("nullptr_t"),
......@@ -656,43 +661,46 @@ fn writeValue(ir: Ir, val: Interner.Ref, config: std.Io.tty.Config, w: *std.Io.W
656661 }
657662}
658663
659fn writeRef(ir: Ir, decl: *const Decl, ref_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {
664fn writeRef(ir: Ir, decl: *const Decl, ref_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void {
665 const w = term.writer;
660666 assert(ref != .none);
661667 const index = @intFromEnum(ref);
662668 const ty_ref = decl.instructions.items(.ty)[index];
663669 if (decl.instructions.items(.tag)[index] == .constant) {
664 try ir.writeType(ty_ref, config, w);
670 try ir.writeType(ty_ref, term);
665671 const v_ref = decl.instructions.items(.data)[index].constant;
666672 try w.writeByte(' ');
667 try ir.writeValue(v_ref, config, w);
673 try ir.writeValue(v_ref, term);
668674 return;
669675 } else if (decl.instructions.items(.tag)[index] == .symbol) {
670676 const name = decl.instructions.items(.data)[index].label;
671 try ir.writeType(ty_ref, config, w);
672 try config.setColor(w, REF);
677 try ir.writeType(ty_ref, term);
678 try term.setColor(REF);
673679 try w.print(" @{s}", .{name});
674680 return;
675681 }
676 try ir.writeType(ty_ref, config, w);
677 try config.setColor(w, REF);
682 try ir.writeType(ty_ref, term);
683 try term.setColor(REF);
678684 const ref_index = ref_map.getIndex(ref).?;
679685 try w.print(" %{d}", .{ref_index});
680686}
681687
682fn writeNewRef(ir: Ir, gpa: Allocator, decl: *const Decl, ref_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {
688fn writeNewRef(ir: Ir, gpa: Allocator, decl: *const Decl, ref_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void {
689 const w = term.writer;
683690 try ref_map.put(gpa, ref, {});
684691 try w.writeAll(" ");
685 try ir.writeRef(decl, ref_map, ref, config, w);
686 try config.setColor(w, .reset);
692 try ir.writeRef(decl, ref_map, ref, term);
693 try term.setColor(.reset);
687694 try w.writeAll(" = ");
688 try config.setColor(w, INST);
695 try term.setColor(INST);
689696}
690697
691fn writeLabel(decl: *const Decl, label_map: *RefMap, ref: Ref, config: std.Io.tty.Config, w: *std.Io.Writer) !void {
698fn writeLabel(decl: *const Decl, label_map: *RefMap, ref: Ref, term: std.Io.Terminal) !void {
699 const w = term.writer;
692700 assert(ref != .none);
693701 const index = @intFromEnum(ref);
694702 const label = decl.instructions.items(.data)[index].label;
695 try config.setColor(w, REF);
703 try term.setColor(REF);
696704 const label_index = label_map.getIndex(ref).?;
697705 try w.print("{s}.{d}", .{ label, label_index });
698706}
lib/compiler/aro/backend/Ir/x86/Renderer.zig+3-3
......@@ -21,17 +21,17 @@ const RegisterManager = zig.RegisterManager(Renderer, Register, Ir.Ref, abi.allo
2121const RegisterBitSet = RegisterManager.RegisterBitSet;
2222const RegisterClass = struct {
2323 const gp: RegisterBitSet = blk: {
24 var set = RegisterBitSet.empty;
24 var set = RegisterBitSet.initEmpty();
2525 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .general_purpose) set.set(index);
2626 break :blk set;
2727 };
2828 const x87: RegisterBitSet = blk: {
29 var set = RegisterBitSet.empty;
29 var set = RegisterBitSet.initEmpty();
3030 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .x87) set.set(index);
3131 break :blk set;
3232 };
3333 const sse: RegisterBitSet = blk: {
34 var set = RegisterBitSet.empty;
34 var set = RegisterBitSet.initEmpty();
3535 for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .sse) set.set(index);
3636 break :blk set;
3737 };
lib/compiler/aro/include/ptrcheck.h created+49
......@@ -0,0 +1,49 @@
1#pragma once
2
3#if defined(__has_feature) && __has_feature(bounds_attributes)
4 #define __has_ptrcheck 1
5#else
6 #define __has_ptrcheck 0
7#endif
8
9#if __has_ptrcheck
10
11#define __single __attribute__((__single__))
12#define __unsafe_indexable __attribute__((__unsafe_indexable__))
13
14#else
15
16#define __single
17#define __unsafe_indexable
18#define __counted_by(N)
19#define __counted_by_or_null(N)
20#define __sized_by(N)
21#define __sized_by_or_null(N)
22#define __ended_by(E)
23
24#define __terminated_by(T)
25#define __null_terminated
26
27/* __ptrcheck_abi_assume_indexable and __ptrcheck_abi_assume_bidi_indexable intentionally not defined */
28#define __ptrcheck_abi_assume_single()
29#define __ptrcheck_abi_assume_unsafe_indexable()
30
31#define __unsafe_forge_bidi_indexable(T, P, S) ((T)(P))
32#define __unsafe_forge_single(T, P) ((T)(P))
33#define __unsafe_forge_terminated_by(T, P, E) ((T)(P))
34#define __unsafe_forge_null_terminated(T, P) ((T)(P))
35
36#define __terminated_by_to_indexable(P) (P)
37#define __unsafe_terminated_by_to_indexable(P) (P)
38#define __null_terminated_to_indexable(P) (P)
39#define __unsafe_null_terminated_to_indexable(P) (P)
40#define __unsafe_terminated_by_from_indexable(T, P, ...) (P)
41#define __unsafe_null_terminated_from_indexable(P, ...) (P)
42
43#define __array_decay_dicards_count_in_parameters
44
45#define __ptrcheck_unavailable
46#define __ptrcheck_unavailable_r(REPLACEMENT)
47
48
49#endif
lib/compiler/aro/main.zig+26-10
......@@ -1,8 +1,9 @@
11const std = @import("std");
2const Io = std.Io;
3const Allocator = mem.Allocator;
42const mem = std.mem;
53const process = std.process;
4const Allocator = mem.Allocator;
5const build_options = @import("build_options");
6
67const aro = @import("aro");
78const Compilation = aro.Compilation;
89const Diagnostics = aro.Diagnostics;
......@@ -11,14 +12,15 @@ const Toolchain = aro.Toolchain;
1112const assembly_backend = @import("assembly_backend");
1213
1314var debug_allocator: std.heap.DebugAllocator(.{
14 .stack_trace_frames = 0,
15 .stack_trace_frames = if (build_options.debug_allocations and std.debug.sys_can_stack_trace) 10 else 0,
16 .resize_stack_traces = build_options.debug_allocations,
1517 // A unique value so that when a default-constructed
16 // DebugAllocator is incorrectly passed to testing allocator, or
18 // GeneralPurposeAllocator is incorrectly passed to testing allocator, or
1719 // vice versa, panic occurs.
1820 .canary = @truncate(0xc647026dc6875134),
1921}) = .{};
2022
21pub fn main(init: std.process.Init.Minimal) u8 {
23pub fn main(init: process.Init.Minimal) u8 {
2224 const gpa = if (@import("builtin").link_libc)
2325 std.heap.c_allocator
2426 else
......@@ -31,7 +33,10 @@ pub fn main(init: std.process.Init.Minimal) u8 {
3133 defer arena_instance.deinit();
3234 const arena = arena_instance.allocator();
3335
34 var threaded: std.Io.Threaded = .init(gpa, .{});
36 var threaded: std.Io.Threaded = .init(gpa, .{
37 .argv0 = .init(init.args),
38 .environ = init.environ,
39 });
3540 defer threaded.deinit();
3641 const io = threaded.io();
3742
......@@ -43,7 +48,11 @@ pub fn main(init: std.process.Init.Minimal) u8 {
4348 return 1;
4449 };
4550
46 const aro_name = process.executablePathAlloc(io, gpa) catch {
51 var environ_map = std.process.Environ.createMap(init.environ, gpa) catch |err|
52 std.process.fatal("failed to parse environment variables: {t}", .{err});
53 defer environ_map.deinit();
54
55 const aro_name = std.process.executableDirPathAlloc(io, gpa) catch {
4756 std.debug.print("unable to find Aro executable path\n", .{});
4857 if (fast_exit) process.exit(1);
4958 return 1;
......@@ -51,15 +60,21 @@ pub fn main(init: std.process.Init.Minimal) u8 {
5160 defer gpa.free(aro_name);
5261
5362 var stderr_buf: [1024]u8 = undefined;
54 var stderr = Io.File.stderr().writer(&stderr_buf);
63 var stderr = std.Io.File.stderr().writer(io, &stderr_buf);
5564 var diagnostics: Diagnostics = .{
5665 .output = .{ .to_writer = .{
57 .color = .detect(stderr.file),
66 .mode = std.Io.Terminal.Mode.detect(io, stderr.file, false, false) catch .no_color,
5867 .writer = &stderr.interface,
5968 } },
6069 };
6170
62 var comp = Compilation.initDefault(gpa, arena, io, &diagnostics, Io.Dir.cwd()) catch |er| switch (er) {
71 var comp = Compilation.init(.{
72 .gpa = gpa,
73 .arena = arena,
74 .io = io,
75 .diagnostics = &diagnostics,
76 .environ_map = &environ_map,
77 }) catch |er| switch (er) {
6378 error.OutOfMemory => {
6479 std.debug.print("out of memory\n", .{});
6580 if (fast_exit) process.exit(1);
......@@ -85,6 +100,7 @@ pub fn main(init: std.process.Init.Minimal) u8 {
85100 if (fast_exit) process.exit(1);
86101 return 1;
87102 },
103 error.Canceled => unreachable,
88104 };
89105 if (fast_exit) process.exit(@intFromBool(comp.diagnostics.errors != 0));
90106 return @intFromBool(diagnostics.errors != 0);
lib/compiler/resinator/main.zig+7-1
......@@ -143,7 +143,13 @@ pub fn main(init: std.process.Init.Minimal) !void {
143143 if (!zig_integration) io.unlockStderr();
144144 }
145145
146 var comp = aro.Compilation.init(aro_arena, aro_arena, io, &diagnostics, Io.Dir.cwd());
146 var comp = try aro.Compilation.init(.{
147 .gpa = aro_arena,
148 .arena = aro_arena,
149 .io = io,
150 .diagnostics = &diagnostics,
151 .environ_map = &environ_map,
152 });
147153 defer comp.deinit();
148154
149155 var argv: std.ArrayList([]const u8) = .empty;
lib/compiler/resinator/preprocess.zig+1-3
......@@ -14,8 +14,6 @@ pub fn preprocess(
1414 argv: []const []const u8,
1515 maybe_dependencies: ?*Dependencies,
1616) PreprocessError!void {
17 try comp.addDefaultPragmaHandlers();
18
1917 var driver: aro.Driver = .{ .comp = comp, .diagnostics = comp.diagnostics, .aro_name = "arocc" };
2018 defer driver.deinit();
2119
......@@ -47,7 +45,7 @@ pub fn preprocess(
4745 if (hasAnyErrors(comp)) return error.GeneratedSourceError;
4846
4947 comp.generated_buf.items.len = 0;
50 var pp = aro.Preprocessor.initDefault(comp) catch |err| switch (err) {
48 var pp = aro.Preprocessor.init(comp, .{ .base_file = source.id }) catch |err| switch (err) {
5149 error.FatalError => return error.GeneratedSourceError,
5250 error.OutOfMemory => |e| return e,
5351 };
lib/compiler/translate-c/MacroTranslator.zig+80-11
......@@ -266,7 +266,8 @@ fn parseCNumLit(mt: *MacroTranslator) ParseError!ZigNode {
266266 const lit_bytes = mt.tokSlice();
267267 mt.i += 1;
268268
269 var bytes = try std.ArrayList(u8).initCapacity(arena, lit_bytes.len + 3);
269 // +3 for prefix and +2 for suffix
270 var bytes = try std.ArrayList(u8).initCapacity(arena, lit_bytes.len + 3 + 2);
270271
271272 const prefix = aro.Tree.Token.NumberPrefix.fromString(lit_bytes);
272273 switch (prefix) {
......@@ -350,13 +351,21 @@ fn parseCNumLit(mt: *MacroTranslator) ParseError!ZigNode {
350351 if (is_float) {
351352 const type_node = try ZigTag.type.create(arena, switch (suffix) {
352353 .F16 => "f16",
353 .F => "f32",
354 .None => "f64",
355 .L => "c_longdouble",
354 .F, .F32 => "f32",
355 .None, .F32x, .F64 => "f64",
356 .L, .F64x => "c_longdouble",
356357 .W => "f80",
357358 .Q, .F128 => "f128",
358 else => unreachable,
359 else => {
360 try mt.fail("TODO: float literal suffix: '{s}'", .{suffix_str});
361 return error.ParseError;
362 },
359363 });
364 if (bytes.getLast() == '.') {
365 bytes.appendAssumeCapacity('0');
366 } else if (mem.findAny(u8, bytes.items, ".eEpP") == null) {
367 bytes.appendSliceAssumeCapacity(".0");
368 }
360369 const rhs = try ZigTag.float_literal.create(arena, bytes.items);
361370 return ZigTag.as.create(arena, .{ .lhs = type_node, .rhs = rhs });
362371 } else {
......@@ -582,6 +591,7 @@ fn escapeUnprintables(mt: *MacroTranslator) ![]const u8 {
582591
583592fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
584593 const arena = mt.t.arena;
594 const gpa = mt.t.gpa;
585595 const tok = mt.peek();
586596 switch (tok) {
587597 .char_literal,
......@@ -646,6 +656,51 @@ fn parseCPrimaryExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
646656 }
647657 return identifier;
648658 },
659 .keyword_generic => {
660 mt.i += 1;
661
662 try mt.expect(.l_paren);
663 const param = try mt.parseCCondExpr(scope);
664 const typeof_param = try ZigTag.typeof.create(arena, param);
665 try mt.expect(.comma);
666
667 var cases: std.ArrayList(ZigNode) = .empty;
668 defer cases.deinit(gpa);
669 var has_default = false;
670 while (true) {
671 const case = if (mt.eat(.keyword_default)) blk: {
672 has_default = true;
673 try mt.expect(.colon);
674 const expr = try mt.parseCCondExpr(scope);
675 break :blk try ZigTag.switch_else.create(arena, expr);
676 } else blk: {
677 const case_type = try mt.parseCTypeName(scope) orelse {
678 try mt.fail("unable to translate C expr: expected type instead got '{s}'", .{mt.peek().symbol()});
679 return error.ParseError;
680 };
681 try mt.expect(.colon);
682 const expr = try mt.parseCCondExpr(scope);
683 break :blk try ZigTag.switch_prong.create(arena, .{
684 .cases = try arena.dupe(ZigNode, &.{case_type}),
685 .cond = expr,
686 });
687 };
688 try cases.append(gpa, case);
689 if (!mt.eat(.comma)) break;
690 }
691 try mt.expect(.r_paren);
692
693 if (!has_default) try cases.append(gpa, try ZigTag.switch_else.create(
694 arena,
695 try ZigTag.@"comptime".create(arena, ZigTag.@"unreachable".init()),
696 ));
697
698 const sw = try ZigTag.@"switch".create(arena, .{
699 .cond = typeof_param,
700 .cases = try arena.dupe(ZigNode, cases.items),
701 });
702 return sw;
703 },
649704 else => {},
650705 }
651706
......@@ -678,8 +733,10 @@ fn macroIntToBool(mt: *MacroTranslator, node: ZigNode) !ZigNode {
678733}
679734
680735fn parseCCondExpr(mt: *MacroTranslator, scope: *Scope) ParseError!ZigNode {
681 const node = try mt.parseCOrExpr(scope);
682 if (!mt.eat(.question_mark)) return node;
736 const condition = try mt.parseCOrExpr(scope);
737 if (!mt.eat(.question_mark)) return condition;
738 const bool_ty = try ZigTag.type.create(mt.t.arena, "bool");
739 const node = try mt.t.createHelperCallNode(.cast, &.{ bool_ty, condition });
683740
684741 const then_body = try mt.parseCOrExpr(scope);
685742 try mt.expect(.colon);
......@@ -1135,6 +1192,8 @@ fn parseCPostfixExpr(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNode) P
11351192 .string_literal_utf_8,
11361193 .string_literal_utf_32,
11371194 .string_literal_wide,
1195 .macro_param,
1196 .macro_param_no_expand,
11381197 => {},
11391198 .identifier, .extended_identifier => {
11401199 if (mt.t.global_scope.blank_macros.contains(mt.tokSlice())) {
......@@ -1160,8 +1219,13 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo
11601219 mt.i += 1;
11611220 const tok = mt.tokens[mt.i];
11621221 if (tok.id == .macro_param or tok.id == .macro_param_no_expand) {
1163 try mt.fail("unable to translate C expr: field access using macro parameter", .{});
1164 return error.ParseError;
1222 const param = mt.macro.params[tok.end];
1223 mt.i += 1;
1224
1225 const mangled_name = scope.getAlias(param) orelse param;
1226 const field_name = try ZigTag.identifier.create(arena, mangled_name);
1227 node = try ZigTag.field_builtin.create(arena, .{ .lhs = node, .rhs = field_name });
1228 continue;
11651229 }
11661230 const field_name = mt.tokSlice();
11671231 try mt.expect(.identifier);
......@@ -1172,8 +1236,13 @@ fn parseCPostfixExprInner(mt: *MacroTranslator, scope: *Scope, type_name: ?ZigNo
11721236 mt.i += 1;
11731237 const tok = mt.tokens[mt.i];
11741238 if (tok.id == .macro_param or tok.id == .macro_param_no_expand) {
1175 try mt.fail("unable to translate C expr: field access using macro parameter", .{});
1176 return error.ParseError;
1239 const param = mt.macro.params[tok.end];
1240 mt.i += 1;
1241
1242 const mangled_name = scope.getAlias(param) orelse param;
1243 const field_name = try ZigTag.identifier.create(arena, mangled_name);
1244 node = try ZigTag.field_builtin.create(arena, .{ .lhs = node, .rhs = field_name });
1245 continue;
11771246 }
11781247 const field_name = mt.tokSlice();
11791248 try mt.expect(.identifier);
lib/compiler/translate-c/PatternList.zig+1-9
......@@ -65,10 +65,7 @@ const templates = [_]Template{
6565 .{ "CAST_OR_CALL(X, Y) ((X)(Y))", .CAST_OR_CALL },
6666
6767 .{
68 \\wl_container_of(ptr, sample, member) \
69 \\(__typeof__(sample))((char *)(ptr) - \
70 \\ offsetof(__typeof__(*sample), member))
71 ,
68 "wl_container_of(ptr, sample, member) (__typeof__(sample))((char *)(ptr) - offsetof(__typeof__(*sample), member))",
7269 .WL_CONTAINER_OF,
7370 },
7471
......@@ -267,11 +264,6 @@ test "Macro matching" {
267264 try helper.checkMacro(allocator, pattern_list, "BAR(Z) (Z ## LL)", .LL_SUFFIX);
268265 try helper.checkMacro(allocator, pattern_list, "BAR(Z) (Z ## UL)", .UL_SUFFIX);
269266 try helper.checkMacro(allocator, pattern_list, "BAR(Z) (Z ## ULL)", .ULL_SUFFIX);
270 try helper.checkMacro(allocator, pattern_list,
271 \\container_of(a, b, c) \
272 \\(__typeof__(b))((char *)(a) - \
273 \\ offsetof(__typeof__(*b), c))
274 , .WL_CONTAINER_OF);
275267
276268 try helper.checkMacro(allocator, pattern_list, "NO_MATCH(X, Y) (X + Y)", null);
277269 try helper.checkMacro(allocator, pattern_list, "CAST_OR_CALL(X, Y) (X)(Y)", .CAST_OR_CALL);
lib/compiler/translate-c/Scope.zig+43-6
......@@ -18,7 +18,22 @@ pub const ContainerMemberFns = struct {
1818 container_decl_ptr: *ast.Node,
1919 member_fns: std.ArrayList(*ast.Payload.Func) = .empty,
2020};
21pub const ContainerMemberFnsHashMap = std.AutoArrayHashMapUnmanaged(aro.QualType, ContainerMemberFns);
21pub const ContainerMemberFnsHashMap = std.ArrayHashMapUnmanaged(
22 aro.QualType,
23 ContainerMemberFns,
24 struct {
25 pub fn hash(self: @This(), key: aro.QualType) u32 {
26 const auto_hash = std.array_hash_map.getAutoHashFn(aro.QualType, @This());
27 return auto_hash(self, key.unqualified());
28 }
29
30 pub fn eql(self: @This(), a: aro.QualType, b: aro.QualType, b_index: usize) bool {
31 const auto_eql = std.array_hash_map.getAutoEqlFn(aro.QualType, @This());
32 return auto_eql(self, a.unqualified(), b.unqualified(), b_index);
33 }
34 },
35 false,
36);
2237
2338id: Id,
2439parent: ?*Scope,
......@@ -254,7 +269,12 @@ pub const Root = struct {
254269
255270 var member_names: std.StringArrayHashMapUnmanaged(void) = .empty;
256271 defer member_names.deinit(gpa);
257 for (root.container_member_fns_map.values()) |members| {
272 for (root.container_member_fns_map.keys(), root.container_member_fns_map.values()) |container_qt, members| {
273 // Get the container name
274 const container_name = root.translator.unnamed_typedefs.get(container_qt) orelse
275 container_qt.getRecord(root.translator.comp).?.name.lookup(root.translator.comp);
276 std.debug.assert(container_name.len > 0);
277
258278 member_names.clearRetainingCapacity();
259279 const decls_ptr = switch (members.container_decl_ptr.tag()) {
260280 .@"struct", .@"union" => blk_record: {
......@@ -274,7 +294,7 @@ pub const Root = struct {
274294 members.container_decl_ptr.* = container_decl;
275295 break :blk_opaque &container_decl.castTag(.@"opaque").?.data.decls;
276296 },
277 else => return,
297 else => continue,
278298 };
279299
280300 const old_decls = decls_ptr.*;
......@@ -299,9 +319,26 @@ pub const Root = struct {
299319
300320 for (members.member_fns.items) |func| {
301321 const func_name = func.data.name.?;
302 const func_name_trimmed = std.mem.trimEnd(u8, func_name, "_");
303 const last_idx = std.mem.findLast(u8, func_name_trimmed, "_") orelse continue;
304 const func_name_alias = func_name[last_idx + 1 ..];
322 const func_name_alias = blk: {
323 // Try multiple candidate prefixes to extract the alias
324 // 1. typedef struct { ... } foo; -> foo_get_bar() extracts "get_bar"
325 // 2. typedef struct _foo foo; -> foo_get_bar() extracts "get_bar"
326 const container_name_trimmed = std.mem.trimStart(u8, container_name, "_");
327 const suffix = std.mem.cutPrefix(u8, func_name, container_name_trimmed);
328 // Check suffix starts with '_' to avoid invalid aliases like "1_get_bar" from foo1_get_bar()
329 if (suffix) |alias| if (alias.len > 0 and alias[0] == '_') {
330 const alias_trimmed = std.mem.trimStart(u8, alias, "_");
331 if (alias_trimmed.len > 0) break :blk alias_trimmed;
332 };
333
334 // Doesn't match any prefix - fallback to trimming trailing underscores and using last segment
335 const func_name_trimmed = std.mem.trimEnd(u8, func_name, "_");
336 const last_idx = std.mem.findLast(u8, func_name_trimmed, "_") orelse continue;
337 break :blk func_name[last_idx + 1 ..];
338 };
339
340 // Skip if the alias conflicts with an existing type
341 if (root.contains(func_name_alias)) continue;
305342 const member_name_slot = try member_names.getOrPutValue(gpa, func_name_alias, {});
306343 if (member_name_slot.found_existing) continue;
307344 func_ref_vars[count] = try ast.Node.Tag.pub_var_simple.create(arena, .{
lib/compiler/translate-c/Translator.zig+364-126
......@@ -19,10 +19,63 @@ const MacroTranslator = @import("MacroTranslator.zig");
1919const PatternList = @import("PatternList.zig");
2020const Scope = @import("Scope.zig");
2121
22const AnonymousRecordFieldNames = struct {
23 pub const Key = struct {
24 parent: QualType,
25 field: QualType,
26 };
27
28 pub const Context = struct {
29 pub fn hash(ctx: Context, key: Key) u64 {
30 const auto_hash = std.hash_map.getAutoHashFn(Key, Context);
31 return auto_hash(ctx, .{
32 .parent = key.parent.unqualified(),
33 .field = key.field.unqualified(),
34 });
35 }
36
37 pub fn eql(ctx: Context, a: Key, b: Key) bool {
38 const auto_eql = std.hash_map.getAutoEqlFn(Key, Context);
39 return auto_eql(ctx, .{
40 .parent = a.parent.unqualified(),
41 .field = a.field.unqualified(),
42 }, .{
43 .parent = b.parent.unqualified(),
44 .field = b.field.unqualified(),
45 });
46 }
47 };
48};
49
50pub const QualTypeHashContext = struct {
51 pub fn hash(ctx: QualTypeHashContext, key: QualType) u64 {
52 const auto_hash = std.hash_map.getAutoHashFn(QualType, QualTypeHashContext);
53 return auto_hash(ctx, key.unqualified());
54 }
55
56 pub fn eql(ctx: QualTypeHashContext, a: QualType, b: QualType) bool {
57 const auto_eql = std.hash_map.getAutoEqlFn(QualType, QualTypeHashContext);
58 return auto_eql(ctx, a.unqualified(), b.unqualified());
59 }
60};
61
2262pub const Error = std.mem.Allocator.Error;
2363pub const MacroProcessingError = Error || error{UnexpectedMacroToken};
2464pub const TypeError = Error || error{UnsupportedType};
25pub const TransError = TypeError || error{UnsupportedTranslation};
65pub const TransError = TypeError || error{ UnsupportedTranslation, SelfReferential };
66
67/// Control when to treat a trailing array as a flexible array member.
68/// Mirrors the -fstrict-flex-arrays=<n> compiler flag.
69pub const StrictFlexArraysLevel = enum {
70 /// Any trailing array member is a flexible array.
71 @"0",
72 /// Trailing arrays of size 0, 1, or undefined are flexible.
73 @"1",
74 /// Trailing arrays of size 0 or undefined are flexible (default).
75 @"2",
76 /// Only trailing arrays of undefined size are flexible.
77 @"3",
78};
2679
2780const Translator = @This();
2881
......@@ -33,6 +86,17 @@ comp: *aro.Compilation,
3386/// The Preprocessor that produced the source for `tree`.
3487pp: *const aro.Preprocessor,
3588
89/// Should static functions be translated as `pub`.
90pub_static: bool,
91/// Should function bodies be translated.
92func_bodies: bool,
93/// Should macro names of literals be preserved.
94keep_macro_literals: bool,
95/// Should struct fields be default initialized.
96default_init: bool,
97/// Control when to treat a trailing array as a flexible array member.
98strict_flex_arrays: StrictFlexArraysLevel,
99
36100gpa: mem.Allocator,
37101arena: mem.Allocator,
38102
......@@ -44,14 +108,16 @@ mangle_count: u32 = 0,
44108/// Table of declarations for enum, struct, union and typedef types.
45109type_decls: std.AutoArrayHashMapUnmanaged(Node.Index, []const u8) = .empty,
46110/// Table of record decls that have been demoted to opaques.
47opaque_demotes: std.AutoHashMapUnmanaged(QualType, void) = .empty,
111opaque_demotes: std.HashMapUnmanaged(QualType, void, QualTypeHashContext, std.hash_map.default_max_load_percentage) = .empty,
48112/// Table of unnamed enums and records that are child types of typedefs.
49unnamed_typedefs: std.AutoHashMapUnmanaged(QualType, []const u8) = .empty,
113unnamed_typedefs: std.HashMapUnmanaged(QualType, []const u8, QualTypeHashContext, std.hash_map.default_max_load_percentage) = .empty,
50114/// Table of anonymous record to generated field names.
51anonymous_record_field_names: std.AutoHashMapUnmanaged(struct {
52 parent: QualType,
53 field: QualType,
54}, []const u8) = .empty,
115anonymous_record_field_names: std.HashMapUnmanaged(
116 AnonymousRecordFieldNames.Key,
117 []const u8,
118 AnonymousRecordFieldNames.Context,
119 std.hash_map.default_max_load_percentage,
120) = .empty,
55121
56122/// This one is different than the root scope's name table. This contains
57123/// a list of names that we found by visiting all the top level decls without
......@@ -75,6 +141,10 @@ typedefs: std.StringArrayHashMapUnmanaged(void) = .empty,
75141/// The lhs lval of a compound assignment expression.
76142compound_assign_dummy: ?ZigNode = null,
77143
144/// Set of variables whose initializers are currently being translated.
145/// Used to detect self-referential initializers.
146wip_var_inits: std.AutoHashMapUnmanaged(Node.Index, void) = .empty,
147
78148pub fn getMangle(t: *Translator) u32 {
79149 t.mangle_count += 1;
80150 return t.mangle_count;
......@@ -98,10 +168,9 @@ fn maybeSuppressResult(t: *Translator, used: ResultUsed, result: ZigNode) TransE
98168
99169pub fn addTopLevelDecl(t: *Translator, name: []const u8, decl_node: ZigNode) !void {
100170 const gop = try t.global_scope.sym_table.getOrPut(t.gpa, name);
101 if (!gop.found_existing) {
102 gop.value_ptr.* = decl_node;
103 try t.global_scope.nodes.append(t.gpa, decl_node);
104 }
171 if (gop.found_existing) return; // Any duplicate decls are equivalent
172 gop.value_ptr.* = decl_node;
173 try t.global_scope.nodes.append(t.gpa, decl_node);
105174}
106175
107176fn fail(
......@@ -172,6 +241,12 @@ pub const Options = struct {
172241 comp: *aro.Compilation,
173242 pp: *const aro.Preprocessor,
174243 tree: *const aro.Tree,
244 module_libs: bool,
245 pub_static: bool,
246 func_bodies: bool,
247 keep_macro_literals: bool,
248 default_init: bool,
249 strict_flex_arrays: StrictFlexArraysLevel,
175250};
176251
177252pub fn translate(options: Options) mem.Allocator.Error![]u8 {
......@@ -188,6 +263,11 @@ pub fn translate(options: Options) mem.Allocator.Error![]u8 {
188263 .comp = options.comp,
189264 .pp = options.pp,
190265 .tree = options.tree,
266 .pub_static = options.pub_static,
267 .func_bodies = options.func_bodies,
268 .keep_macro_literals = options.keep_macro_literals,
269 .default_init = options.default_init,
270 .strict_flex_arrays = options.strict_flex_arrays,
191271 };
192272 translator.global_scope.* = Scope.Root.init(&translator);
193273 defer {
......@@ -200,6 +280,7 @@ pub fn translate(options: Options) mem.Allocator.Error![]u8 {
200280 translator.anonymous_record_field_names.deinit(gpa);
201281 translator.typedefs.deinit(gpa);
202282 translator.global_scope.deinit();
283 translator.wip_var_inits.deinit(gpa);
203284 }
204285
205286 try translator.prepopulateGlobalNameTable();
......@@ -227,7 +308,6 @@ pub fn translate(options: Options) mem.Allocator.Error![]u8 {
227308 \\pub const __builtin = @import("std").zig.c_translation.builtins;
228309 \\pub const __helpers = @import("std").zig.c_translation.helpers;
229310 \\
230 \\
231311 ) catch return error.OutOfMemory;
232312
233313 var zig_ast = try ast.render(gpa, translator.global_scope.nodes.items);
......@@ -261,10 +341,12 @@ fn prepopulateGlobalNameTable(t: *Translator) !void {
261341 const gop = try t.unnamed_typedefs.getOrPut(t.gpa, base.qt);
262342 if (gop.found_existing) {
263343 // One typedef can declare multiple names.
264 // TODO Don't put this one in `decl_table` so it's processed later.
344 // Don't put this one in `decl_table` so it's processed later.
265345 continue;
266346 }
267347 gop.value_ptr.* = decl_name;
348 try t.type_decls.put(t.gpa, decl, decl_name);
349 try t.typedefs.put(t.gpa, decl_name, {});
268350 },
269351
270352 .struct_decl,
......@@ -344,15 +426,26 @@ fn transDecl(t: *Translator, scope: *Scope, decl: Node.Index) !void {
344426 try t.transRecordDecl(scope, record_decl.container_qt);
345427 },
346428
429 .struct_forward_decl, .union_forward_decl => |record_decl| {
430 if (record_decl.definition) |some| {
431 return t.transDecl(scope, some);
432 }
433 try t.transRecordDecl(scope, record_decl.container_qt);
434 },
435
347436 .enum_decl => |enum_decl| {
348437 try t.transEnumDecl(scope, enum_decl.container_qt);
349438 },
350439
440 .enum_forward_decl => |enum_decl| {
441 if (enum_decl.definition) |some| {
442 return t.transDecl(scope, some);
443 }
444 try t.transEnumDecl(scope, enum_decl.container_qt);
445 },
446
351447 .enum_field,
352448 .record_field,
353 .struct_forward_decl,
354 .union_forward_decl,
355 .enum_forward_decl,
356449 => return,
357450
358451 .function => |function| {
......@@ -364,7 +457,7 @@ fn transDecl(t: *Translator, scope: *Scope, decl: Node.Index) !void {
364457
365458 .variable => |variable| {
366459 if (variable.definition != null) return;
367 try t.transVarDecl(scope, variable);
460 try t.transVarDecl(scope, variable, decl);
368461 },
369462 .static_assert => |static_assert| {
370463 try t.transStaticAssert(&t.global_scope.base, static_assert);
......@@ -531,13 +624,6 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
531624 break :init ZigTag.opaque_literal.init();
532625 }
533626
534 // Demote record to opaque if it contains an opaque field
535 if (t.typeWasDemotedToOpaque(field.qt)) {
536 try t.opaque_demotes.put(t.gpa, base.qt, {});
537 try t.warn(scope, field_loc, "{s} demoted to opaque type - has opaque field", .{container_kind_name});
538 break :init ZigTag.opaque_literal.init();
539 }
540
541627 var field_name = field.name.lookup(t.comp);
542628 if (field.name_tok == 0) {
543629 field_name = try std.fmt.allocPrint(t.arena, "unnamed_{d}", .{unnamed_field_count});
......@@ -548,23 +634,22 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
548634 }, field_name);
549635 }
550636
551 const field_alignment = if (has_alignment_attributes)
552 t.alignmentForField(record_ty, head_field_alignment, field_index)
553 else
554 null;
555
556637 const field_type = field_type: {
557638 // Check if this is a flexible array member.
558639 flexible: {
559640 if (field_index != record_ty.fields.len - 1 and container_kind != .@"union") break :flexible;
560641 const array_ty = field.qt.get(t.comp, .array) orelse break :flexible;
561 if (array_ty.len != .incomplete and (array_ty.len != .fixed or array_ty.len.fixed != 0)) break :flexible;
642 if (!t.isFlexibleArrayLen(array_ty.len)) break :flexible;
562643
563644 const elem_type = t.transType(scope, array_ty.elem, field_loc) catch |err| switch (err) {
564645 error.UnsupportedType => break :flexible,
565646 else => |e| return e,
566647 };
567 const zero_array = try ZigTag.array_type.create(t.arena, .{ .len = 0, .elem_type = elem_type });
648 const backing_array_len: usize = switch (array_ty.len) {
649 .fixed => |n| @intCast(n),
650 else => 0,
651 };
652 const backing_array = try ZigTag.array_type.create(t.arena, .{ .len = backing_array_len, .elem_type = elem_type });
568653
569654 const member_name = field_name;
570655 field_name = try std.fmt.allocPrint(t.arena, "_{s}", .{field_name});
......@@ -572,7 +657,7 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
572657 const member = try t.createFlexibleMemberFn(member_name, field_name);
573658 try functions.append(t.gpa, member);
574659
575 break :field_type zero_array;
660 break :field_type backing_array;
576661 }
577662
578663 break :field_type t.transType(scope, field.qt, field_loc) catch |err| switch (err) {
......@@ -588,10 +673,22 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
588673 };
589674 };
590675
676 // Demote record to opaque if it contains an opaque field
677 if (t.typeWasDemotedToOpaque(field.qt)) {
678 try t.opaque_demotes.put(t.gpa, base.qt, {});
679 try t.warn(scope, field_loc, "{s} demoted to opaque type - has opaque field", .{container_kind_name});
680 break :init ZigTag.opaque_literal.init();
681 }
682
683 const field_alignment = if (has_alignment_attributes)
684 t.alignmentForField(record_ty, head_field_alignment, field_index)
685 else
686 null;
687
591688 // C99 introduced designated initializers for structs. Omitted fields are implicitly
592689 // initialized to zero. Some C APIs are designed with this in mind. Defaulting to zero
593690 // values for translated struct fields permits Zig code to comfortably use such an API.
594 const default_value = if (container_kind == .@"struct")
691 const default_value = if (t.default_init and container_kind == .@"struct")
595692 try t.createZeroValueNode(field.qt, field_type, .no_as)
596693 else
597694 null;
......@@ -616,7 +713,7 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
616713 .name = "_padding",
617714 .type = try ZigTag.type.create(t.arena, try std.fmt.allocPrint(t.arena, "u{d}", .{padding_bits})),
618715 .alignment = @divExact(alignment_bits, 8),
619 .default_value = if (container_kind == .@"struct")
716 .default_value = if (t.default_init and container_kind == .@"struct")
620717 ZigTag.zero_literal.init()
621718 else
622719 null,
......@@ -663,14 +760,12 @@ fn transRecordDecl(t: *Translator, scope: *Scope, record_qt: QualType) Error!voi
663760fn transFnDecl(t: *Translator, scope: *Scope, function: Node.Function) Error!void {
664761 const func_ty = function.qt.get(t.comp, .func).?;
665762
666 const is_pub = scope.id == .root;
667
668763 const fn_name = t.tree.tokSlice(function.name_tok);
669764 if (scope.getAlias(fn_name) != null or t.global_scope.containsNow(fn_name))
670765 return; // Avoid processing this decl twice
671766
672767 const fn_decl_loc = function.name_tok;
673 const has_body = function.body != null and func_ty.kind != .variadic;
768 const has_body = function.body != null and func_ty.kind != .variadic and t.func_bodies;
674769 if (function.body != null and func_ty.kind == .variadic) {
675770 try t.warn(scope, function.name_tok, "TODO unable to translate variadic function, demoted to extern", .{});
676771 }
......@@ -681,7 +776,7 @@ fn transFnDecl(t: *Translator, scope: *Scope, function: Node.Function) Error!voi
681776 .is_always_inline = is_always_inline,
682777 .is_extern = !has_body,
683778 .is_export = !function.static and has_body and !is_always_inline and !function.@"inline",
684 .is_pub = is_pub,
779 .is_pub = scope.id == .root and (!function.static or t.pub_static),
685780 .has_body = has_body,
686781 .cc = if (function.qt.getAttribute(t.comp, .calling_convention)) |some| switch (some.cc) {
687782 .c => .c,
......@@ -761,6 +856,7 @@ fn transFnDecl(t: *Translator, scope: *Scope, function: Node.Function) Error!voi
761856
762857 t.transCompoundStmtInline(body_stmt, &block_scope) catch |err| switch (err) {
763858 error.OutOfMemory => |e| return e,
859 error.SelfReferential => unreachable,
764860 error.UnsupportedTranslation,
765861 error.UnsupportedType,
766862 => {
......@@ -777,7 +873,7 @@ fn transFnDecl(t: *Translator, scope: *Scope, function: Node.Function) Error!voi
777873 return t.addTopLevelDecl(fn_name, proto_node);
778874}
779875
780fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable) Error!void {
876fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable, decl_node: Node.Index) Error!void {
781877 const base_name = t.tree.tokSlice(variable.name_tok);
782878 const toplevel = scope.id == .root;
783879 const bs: *Scope.Block = if (!toplevel) try scope.findBlockScope(t) else undefined;
......@@ -815,24 +911,28 @@ fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable) Error!vo
815911 var is_const = variable.qt.@"const" or (array_ty != null and array_ty.?.elem.@"const");
816912 var is_extern = variable.storage_class == .@"extern";
817913
914 var self_referential = false;
818915 const init_node = init: {
819916 if (variable.initializer) |init| {
820917 const maybe_literal = init.get(t.tree);
918 if (!toplevel) try t.wip_var_inits.putNoClobber(t.gpa, decl_node, {});
919 defer _ = t.wip_var_inits.remove(decl_node);
920
821921 const init_node = (if (maybe_literal == .string_literal_expr)
822922 t.transStringLiteralInitializer(init, maybe_literal.string_literal_expr, type_node)
823923 else
824924 t.transExprCoercing(scope, init, .used)) catch |err| switch (err) {
925 error.SelfReferential => {
926 self_referential = true;
927 break :init ZigTag.undefined_literal.init();
928 },
825929 error.UnsupportedTranslation, error.UnsupportedType => {
826930 return t.failDecl(scope, variable.name_tok, name, "unable to resolve var init expr", .{});
827931 },
828932 else => |e| return e,
829933 };
830934
831 if (!variable.qt.is(t.comp, .bool) and init_node.isBoolRes()) {
832 break :init try ZigTag.int_from_bool.create(t.arena, init_node);
833 } else {
834 break :init init_node;
835 }
935 break :init try t.toNonBool(init_node, variable.qt);
836936 }
837937 if (variable.storage_class == .@"extern") {
838938 if (array_ty != null and array_ty.?.len == .incomplete) {
......@@ -876,7 +976,7 @@ fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable) Error!vo
876976 const alignment: ?c_uint = variable.qt.requestedAlignment(t.comp) orelse null;
877977 var node = try ZigTag.var_decl.create(t.arena, .{
878978 .is_pub = toplevel,
879 .is_const = is_const,
979 .is_const = is_const and !self_referential,
880980 .is_extern = is_extern,
881981 .is_export = toplevel and variable.storage_class == .auto and linkage == .strong,
882982 .is_threadlocal = variable.thread_local,
......@@ -894,6 +994,21 @@ fn transVarDecl(t: *Translator, scope: *Scope, variable: Node.Variable) Error!vo
894994 node = try ZigTag.wrapped_local.create(t.arena, .{ .name = name, .init = node });
895995 }
896996 try scope.appendNode(node);
997 if (self_referential) {
998 const deferred_init = t.transExprCoercing(scope, variable.initializer.?, .used) catch |err| switch (err) {
999 error.SelfReferential => unreachable,
1000 error.UnsupportedTranslation, error.UnsupportedType => {
1001 return t.failDecl(scope, variable.name_tok, name, "unable to resolve var init expr", .{});
1002 },
1003 else => |e| return e,
1004 };
1005
1006 const assign = try ZigTag.assign.create(t.arena, .{
1007 .lhs = try ZigTag.identifier.create(t.arena, name),
1008 .rhs = try t.toNonBool(deferred_init, variable.qt),
1009 });
1010 try scope.appendNode(assign);
1011 }
8971012 try bs.discardVariable(name);
8981013
8991014 if (variable.qt.getAttribute(t.comp, .cleanup)) |cleanup_attr| {
......@@ -1001,6 +1116,7 @@ fn transEnumDecl(t: *Translator, scope: *Scope, enum_qt: QualType) Error!void {
10011116
10021117fn transStaticAssert(t: *Translator, scope: *Scope, static_assert: Node.StaticAssert) Error!void {
10031118 const condition = t.transExpr(scope, static_assert.cond, .used) catch |err| switch (err) {
1119 error.SelfReferential => unreachable,
10041120 error.UnsupportedTranslation, error.UnsupportedType => {
10051121 return try t.warn(&t.global_scope.base, static_assert.cond.tok(t.tree), "unable to translate _Static_assert condition", .{});
10061122 },
......@@ -1084,21 +1200,17 @@ fn transType(t: *Translator, scope: *Scope, qt: QualType, source_loc: TokenIndex
10841200 },
10851201 .float => |float_ty| switch (float_ty) {
10861202 .fp16, .float16 => return ZigTag.type.create(t.arena, "f16"),
1087 .float => return ZigTag.type.create(t.arena, "f32"),
1088 .double => return ZigTag.type.create(t.arena, "f64"),
1089 .long_double => return ZigTag.type.create(t.arena, "c_longdouble"),
1203 .float, .float32 => return ZigTag.type.create(t.arena, "f32"),
1204 .double, .float64, .float32x => return ZigTag.type.create(t.arena, "f64"),
1205 .long_double, .float64x => return ZigTag.type.create(t.arena, "c_longdouble"),
10901206 .float128 => return ZigTag.type.create(t.arena, "f128"),
1091 .bf16,
1092 .float32,
1093 .float64,
1094 .float32x,
1095 .float64x,
1096 .float128x,
1207 .bf16 => return t.fail(error.UnsupportedType, source_loc, "TODO support bfloat16", .{}),
10971208 .dfloat32,
10981209 .dfloat64,
10991210 .dfloat128,
11001211 .dfloat64x,
1101 => return t.fail(error.UnsupportedType, source_loc, "TODO support float type: '{s}'", .{try t.getTypeStr(qt)}),
1212 => return t.fail(error.UnsupportedType, source_loc, "TODO support decimal float type: '{s}'", .{try t.getTypeStr(qt)}),
1213 .float128x => unreachable, // Unsupported on all targets
11021214 },
11031215 .pointer => |pointer_ty| {
11041216 const child_qt = pointer_ty.child;
......@@ -1173,9 +1285,21 @@ fn transType(t: *Translator, scope: *Scope, qt: QualType, source_loc: TokenIndex
11731285 return ZigTag.identifier.create(t.arena, name);
11741286 },
11751287 .attributed => |attributed_ty| continue :loop attributed_ty.base.type(t.comp),
1176 .typeof => |typeof_ty| continue :loop typeof_ty.base.type(t.comp),
1288 .typeof => |typeof_ty| {
1289 if (typeof_ty.expr) |expr| {
1290 if (t.transExpr(scope, expr, .used)) |node| {
1291 return ZigTag.typeof.create(t.arena, node);
1292 } else |err| switch (err) {
1293 error.SelfReferential => {},
1294 error.UnsupportedTranslation => {},
1295 error.UnsupportedType => {},
1296 error.OutOfMemory => return error.OutOfMemory,
1297 }
1298 }
1299 continue :loop typeof_ty.base.type(t.comp);
1300 },
11771301 .vector => |vector_ty| {
1178 const len = try t.createNumberNode(vector_ty.len, .int);
1302 const len = try t.createNumberNode(vector_ty.len);
11791303 const elem_type = try t.transType(scope, vector_ty.elem, source_loc);
11801304 return ZigTag.vector.create(t.arena, .{ .lhs = len, .rhs = elem_type });
11811305 },
......@@ -1384,7 +1508,10 @@ fn transFnType(
13841508 .is_var_args = switch (func_ty.kind) {
13851509 .normal => false,
13861510 .variadic => true,
1387 .old_style => !ctx.is_export and !ctx.is_always_inline and !ctx.has_body,
1511 .old_style => if (t.comp.target.cpu.arch.isWasm())
1512 false
1513 else
1514 !ctx.is_export and !ctx.is_always_inline and !ctx.has_body,
13881515 },
13891516 .name = ctx.fn_name,
13901517 .linksection_string = linksection_string,
......@@ -1468,7 +1595,7 @@ fn typeIsOpaque(t: *Translator, qt: QualType) bool {
14681595}
14691596
14701597fn typeWasDemotedToOpaque(t: *Translator, qt: QualType) bool {
1471 return t.opaque_demotes.contains(qt);
1598 return t.opaque_demotes.contains(qt.base(t.comp).qt);
14721599}
14731600
14741601fn typeHasWrappingOverflow(t: *Translator, qt: QualType) bool {
......@@ -1531,16 +1658,30 @@ fn transStmt(t: *Translator, scope: *Scope, stmt: Node.Index) TransError!ZigNode
15311658 try t.transRecordDecl(scope, record_decl.container_qt);
15321659 return ZigTag.declaration.init();
15331660 },
1661 .struct_forward_decl, .union_forward_decl => |record_decl| {
1662 if (record_decl.definition) |some| {
1663 return t.transStmt(scope, some);
1664 }
1665 try t.transRecordDecl(scope, record_decl.container_qt);
1666 return ZigTag.declaration.init();
1667 },
15341668 .enum_decl => |enum_decl| {
15351669 try t.transEnumDecl(scope, enum_decl.container_qt);
15361670 return ZigTag.declaration.init();
15371671 },
1672 .enum_forward_decl => |enum_decl| {
1673 if (enum_decl.definition) |some| {
1674 return t.transStmt(scope, some);
1675 }
1676 try t.transEnumDecl(scope, enum_decl.container_qt);
1677 return ZigTag.declaration.init();
1678 },
15381679 .function => |function| {
15391680 try t.transFnDecl(scope, function);
15401681 return ZigTag.declaration.init();
15411682 },
15421683 .variable => |variable| {
1543 try t.transVarDecl(scope, variable);
1684 try t.transVarDecl(scope, variable, stmt);
15441685 return ZigTag.declaration.init();
15451686 },
15461687 .switch_stmt => |switch_stmt| return t.transSwitch(scope, switch_stmt),
......@@ -1562,7 +1703,10 @@ fn transCompoundStmtInline(t: *Translator, compound: Node.CompoundStmt, block: *
15621703 const result = try t.transStmt(&block.base, stmt);
15631704 switch (result.tag()) {
15641705 .declaration, .empty_block => {},
1565 else => try block.statements.append(t.gpa, result),
1706 else => {
1707 try block.statements.append(t.gpa, result);
1708 if (result.isNoreturn()) return;
1709 },
15661710 }
15671711 }
15681712}
......@@ -1578,12 +1722,9 @@ fn transReturnStmt(t: *Translator, scope: *Scope, return_stmt: Node.ReturnStmt)
15781722 switch (return_stmt.operand) {
15791723 .none => return ZigTag.return_void.init(),
15801724 .expr => |operand| {
1581 var rhs = try t.transExprCoercing(scope, operand, .used);
1725 const rhs = try t.transExprCoercing(scope, operand, .used);
15821726 const return_qt = scope.findBlockReturnType();
1583 if (rhs.isBoolRes() and !return_qt.is(t.comp, .bool)) {
1584 rhs = try ZigTag.int_from_bool.create(t.arena, rhs);
1585 }
1586 return ZigTag.@"return".create(t.arena, rhs);
1727 return ZigTag.@"return".create(t.arena, try t.toNonBool(rhs, return_qt));
15871728 },
15881729 .implicit => |zero| {
15891730 if (zero) return ZigTag.@"return".create(t.arena, ZigTag.zero_literal.init());
......@@ -1698,7 +1839,7 @@ fn transDoWhileStmt(t: *Translator, scope: *Scope, do_stmt: Node.DoWhileStmt) Tr
16981839 };
16991840
17001841 var body_node = try t.transStmt(&loop_scope, do_stmt.body);
1701 if (body_node.isNoreturn(true)) {
1842 if (body_node.isNoreturn()) {
17021843 // The body node ends in a noreturn statement. Simply put it in a while (true)
17031844 // in case it contains breaks or continues.
17041845 } else if (do_stmt.body.get(t.tree) == .compound_stmt) {
......@@ -1918,8 +2059,6 @@ fn transSwitchProngStmt(
19182059 body: []const Node.Index,
19192060) TransError!ZigNode {
19202061 switch (stmt.get(t.tree)) {
1921 .break_stmt => return ZigTag.@"break".init(),
1922 .return_stmt => return t.transStmt(scope, stmt),
19232062 .case_stmt, .default_stmt => unreachable,
19242063 else => {
19252064 var block_scope = try Scope.Block.init(t, scope, false);
......@@ -1940,15 +2079,6 @@ fn transSwitchProngStmtInline(
19402079) TransError!void {
19412080 for (body) |stmt| {
19422081 switch (stmt.get(t.tree)) {
1943 .return_stmt => {
1944 const result = try t.transStmt(&block.base, stmt);
1945 try block.statements.append(t.gpa, result);
1946 return;
1947 },
1948 .break_stmt => {
1949 try block.statements.append(t.gpa, ZigTag.@"break".init());
1950 return;
1951 },
19522082 .case_stmt => |case_stmt| {
19532083 var sub = case_stmt.body;
19542084 while (true) switch (sub.get(t.tree)) {
......@@ -1959,7 +2089,7 @@ fn transSwitchProngStmtInline(
19592089 const result = try t.transStmt(&block.base, sub);
19602090 assert(result.tag() != .declaration);
19612091 try block.statements.append(t.gpa, result);
1962 if (result.isNoreturn(true)) return;
2092 if (result.isNoreturn()) return;
19632093 },
19642094 .default_stmt => |default_stmt| {
19652095 var sub = default_stmt.body;
......@@ -1971,18 +2101,16 @@ fn transSwitchProngStmtInline(
19712101 const result = try t.transStmt(&block.base, sub);
19722102 assert(result.tag() != .declaration);
19732103 try block.statements.append(t.gpa, result);
1974 if (result.isNoreturn(true)) return;
1975 },
1976 .compound_stmt => |compound_stmt| {
1977 const result = try t.transCompoundStmt(&block.base, compound_stmt);
1978 try block.statements.append(t.gpa, result);
1979 if (result.isNoreturn(true)) return;
2104 if (result.isNoreturn()) return;
19802105 },
19812106 else => {
19822107 const result = try t.transStmt(&block.base, stmt);
19832108 switch (result.tag()) {
19842109 .declaration, .empty_block => {},
1985 else => try block.statements.append(t.gpa, result),
2110 else => {
2111 try block.statements.append(t.gpa, result);
2112 if (result.isNoreturn()) return;
2113 },
19862114 }
19872115 },
19882116 }
......@@ -2015,7 +2143,14 @@ fn transExpr(t: *Translator, scope: *Scope, expr: Node.Index, used: ResultUsed)
20152143 break :res try ZigTag.deref.create(t.arena, try t.transExpr(scope, deref_expr.operand, .used));
20162144 },
20172145 .bool_not_expr => |bool_not_expr| try ZigTag.not.create(t.arena, try t.transBoolExpr(scope, bool_not_expr.operand)),
2018 .bit_not_expr => |bit_not_expr| try ZigTag.bit_not.create(t.arena, try t.transExpr(scope, bit_not_expr.operand, .used)),
2146 .bit_not_expr => |bit_not_expr| try ZigTag.bit_not.create(t.arena, op: {
2147 const operand = try t.transExpr(scope, bit_not_expr.operand, .used);
2148 if (!operand.isBoolRes()) break :op operand;
2149
2150 const casted = try ZigTag.int_from_bool.create(t.arena, operand);
2151 const ty = try t.transType(scope, bit_not_expr.qt, bit_not_expr.op_tok);
2152 break :op try ZigTag.as.create(t.arena, .{ .lhs = ty, .rhs = casted });
2153 }),
20192154 .plus_expr => |plus_expr| return t.transExpr(scope, plus_expr.operand, used),
20202155 .negate_expr => |negate_expr| res: {
20212156 const operand_qt = negate_expr.operand.qt(t.tree);
......@@ -2109,8 +2244,8 @@ fn transExpr(t: *Translator, scope: *Scope, expr: Node.Index, used: ResultUsed)
21092244 .shl_expr => |shl_expr| try t.transShiftExpr(scope, shl_expr, .shl),
21102245 .shr_expr => |shr_expr| try t.transShiftExpr(scope, shr_expr, .shr),
21112246
2112 .member_access_expr => |member_access| try t.transMemberAccess(scope, .normal, member_access, null),
2113 .member_access_ptr_expr => |member_access| try t.transMemberAccess(scope, .ptr, member_access, null),
2247 .member_access_expr => |member_access| try t.transMemberAccess(scope, .normal, member_access, null, .accessor),
2248 .member_access_ptr_expr => |member_access| try t.transMemberAccess(scope, .ptr, member_access, null, .accessor),
21142249 .array_access_expr => |array_access| try t.transArrayAccess(scope, array_access, null),
21152250
21162251 .builtin_ref => unreachable,
......@@ -2195,6 +2330,10 @@ fn transExpr(t: *Translator, scope: *Scope, expr: Node.Index, used: ResultUsed)
21952330 .builtin_convertvector => |convertvector| try t.transConvertvectorExpr(scope, convertvector),
21962331 .builtin_shufflevector => |shufflevector| try t.transShufflevectorExpr(scope, shufflevector),
21972332
2333 .builtin_va_arg_pack, .builtin_va_arg_pack_len => |va_arg_pack| {
2334 return t.fail(error.UnsupportedTranslation, va_arg_pack.builtin_tok, "TODO va arg pack", .{});
2335 },
2336
21982337 .compound_stmt,
21992338 .static_assert,
22002339 .return_stmt,
......@@ -2293,6 +2432,12 @@ fn transBoolExpr(t: *Translator, scope: *Scope, expr: Node.Index) TransError!Zig
22932432 return t.finishBoolExpr(expr.qt(t.tree), maybe_bool_res);
22942433}
22952434
2435fn toNonBool(t: *Translator, node: ZigNode, qt: QualType) Error!ZigNode {
2436 if (!node.isBoolRes()) return node;
2437 if (qt.is(t.comp, .bool)) return node;
2438 return ZigTag.int_from_bool.create(t.arena, node);
2439}
2440
22962441fn finishBoolExpr(t: *Translator, qt: QualType, node: ZigNode) TransError!ZigNode {
22972442 const sk = qt.scalarKind(t.comp);
22982443 if (sk == .bool) return node;
......@@ -2385,8 +2530,22 @@ fn transCastExpr(
23852530 else => {},
23862531 }
23872532
2388 if (cast.operand.qt(t.tree).arrayLen(t.comp) == null) {
2389 return try t.transExpr(scope, cast.operand, used);
2533 // Flexible array members are translated as member functions returning
2534 // [*c]T, so no address-of + @ptrCast wrapping is needed.
2535 flexible: {
2536 if (cast.operand.qt(t.tree).arrayLen(t.comp) == null) {
2537 return try t.transExpr(scope, cast.operand, used);
2538 }
2539
2540 const member_index, const base_qt = switch (cast.operand.get(t.tree)) {
2541 .member_access_expr => |ma| .{ ma.member_index, ma.base.qt(t.tree) },
2542 .member_access_ptr_expr => |ma| .{ ma.member_index, ma.base.qt(t.tree).childType(t.comp) },
2543 else => break :flexible,
2544 };
2545 const record = base_qt.getRecord(t.comp) orelse break :flexible;
2546 if (member_index != record.fields.len - 1 and base_qt.base(t.comp).type != .@"union") break :flexible;
2547 const array_ty = record.fields[member_index].qt.get(t.comp, .array) orelse break :flexible;
2548 if (t.isFlexibleArrayLen(array_ty.len)) return try t.transExpr(scope, cast.operand, used);
23902549 }
23912550
23922551 const sub_expr_node = try t.transExpr(scope, cast.operand, .used);
......@@ -2402,6 +2561,8 @@ fn transCastExpr(
24022561 .lhs = try ZigTag.type.create(t.arena, "usize"),
24032562 .rhs = try ZigTag.int_cast.create(t.arena, sub_expr_node),
24042563 });
2564 } else if (sub_expr_node.isBoolRes()) {
2565 sub_expr_node = try ZigTag.int_from_bool.create(t.arena, sub_expr_node);
24052566 }
24062567 break :int_to_pointer try ZigTag.ptr_from_int.create(t.arena, sub_expr_node);
24072568 },
......@@ -2560,6 +2721,8 @@ fn transPointerCastExpr(t: *Translator, scope: *Scope, expr: Node.Index) TransEr
25602721}
25612722
25622723fn transDeclRefExpr(t: *Translator, scope: *Scope, decl_ref: Node.DeclRef) TransError!ZigNode {
2724 if (t.wip_var_inits.contains(decl_ref.decl)) return error.SelfReferential;
2725
25632726 const name = t.tree.tokSlice(decl_ref.name_tok);
25642727 const maybe_alias = scope.getAlias(name);
25652728 const mangled_name = maybe_alias orelse name;
......@@ -2631,7 +2794,7 @@ fn transShiftExpr(t: *Translator, scope: *Scope, bin: Node.Binary, op_id: ZigTag
26312794 // lhs >> @intCast(rh)
26322795 const lhs = try t.transExpr(scope, bin.lhs, .used);
26332796
2634 const rhs = try t.transExprCoercing(scope, bin.rhs, .used);
2797 const rhs = try t.transExpr(scope, bin.rhs, .used);
26352798 const rhs_casted = try ZigTag.int_cast.create(t.arena, rhs);
26362799
26372800 return t.createBinOpNode(op_id, lhs, rhs_casted);
......@@ -2758,7 +2921,7 @@ fn transCommaExpr(t: *Translator, scope: *Scope, bin: Node.Binary, used: ResultU
27582921 const rhs = try t.transExprCoercing(&block_scope.base, bin.rhs, .used);
27592922 const break_node = try ZigTag.break_val.create(t.arena, .{
27602923 .label = block_scope.label,
2761 .val = rhs,
2924 .val = try t.toNonBool(rhs, bin.qt),
27622925 });
27632926 try block_scope.statements.append(t.gpa, break_node);
27642927
......@@ -2768,14 +2931,10 @@ fn transCommaExpr(t: *Translator, scope: *Scope, bin: Node.Binary, used: ResultU
27682931fn transAssignExpr(t: *Translator, scope: *Scope, bin: Node.Binary, used: ResultUsed) !ZigNode {
27692932 if (used == .unused) {
27702933 const lhs = try t.transExpr(scope, bin.lhs, .used);
2771 var rhs = try t.transExprCoercing(scope, bin.rhs, .used);
2934 const rhs = try t.transExprCoercing(scope, bin.rhs, .used);
27722935
27732936 const lhs_qt = bin.lhs.qt(t.tree);
2774 if (rhs.isBoolRes() and !lhs_qt.is(t.comp, .bool)) {
2775 rhs = try ZigTag.int_from_bool.create(t.arena, rhs);
2776 }
2777
2778 return t.createBinOpNode(.assign, lhs, rhs);
2937 return t.createBinOpNode(.assign, lhs, try t.toNonBool(rhs, lhs_qt));
27792938 }
27802939
27812940 var block_scope = try Scope.Block.init(t, scope, true);
......@@ -2783,13 +2942,12 @@ fn transAssignExpr(t: *Translator, scope: *Scope, bin: Node.Binary, used: Result
27832942
27842943 const tmp = try block_scope.reserveMangledName("tmp");
27852944
2786 var rhs = try t.transExpr(&block_scope.base, bin.rhs, .used);
2945 const rhs = try t.transExpr(&block_scope.base, bin.rhs, .used);
27872946 const lhs_qt = bin.lhs.qt(t.tree);
2788 if (rhs.isBoolRes() and !lhs_qt.is(t.comp, .bool)) {
2789 rhs = try ZigTag.int_from_bool.create(t.arena, rhs);
2790 }
2791
2792 const tmp_decl = try ZigTag.var_simple.create(t.arena, .{ .name = tmp, .init = rhs });
2947 const tmp_decl = try ZigTag.var_simple.create(t.arena, .{
2948 .name = tmp,
2949 .init = try t.toNonBool(rhs, lhs_qt),
2950 });
27932951 try block_scope.statements.append(t.gpa, tmp_decl);
27942952
27952953 const lhs = try t.transExprCoercing(&block_scope.base, bin.lhs, .used);
......@@ -3040,6 +3198,7 @@ fn transMemberAccess(
30403198 kind: enum { normal, ptr },
30413199 member_access: Node.MemberAccess,
30423200 opt_base: ?ZigNode,
3201 flex_array_mode: enum { accessor, backing },
30433202) TransError!ZigNode {
30443203 const base_info = switch (kind) {
30453204 .normal => member_access.base.qt(t.tree),
......@@ -3068,8 +3227,14 @@ fn transMemberAccess(
30683227 // Flexible array members are translated as member functions.
30693228 if (member_access.member_index == record.fields.len - 1 or base_info.base(t.comp).type == .@"union") {
30703229 if (field.qt.get(t.comp, .array)) |array_ty| {
3071 if (array_ty.len == .incomplete or (array_ty.len == .fixed and array_ty.len.fixed == 0)) {
3072 return ZigTag.call.create(t.arena, .{ .lhs = field_access, .args = &.{} });
3230 if (t.isFlexibleArrayLen(array_ty.len)) {
3231 switch (flex_array_mode) {
3232 .accessor => return ZigTag.call.create(t.arena, .{ .lhs = field_access, .args = &.{} }),
3233 .backing => {
3234 const backing_name = try std.fmt.allocPrint(t.arena, "_{s}", .{field_name});
3235 return ZigTag.field_access.create(t.arena, .{ .lhs = lhs, .field_name = backing_name });
3236 },
3237 }
30733238 }
30743239 }
30753240 }
......@@ -3091,7 +3256,7 @@ fn transArrayAccess(t: *Translator, scope: *Scope, array_access: Node.ArrayAcces
30913256 const index = index: {
30923257 const index = try t.transExpr(scope, array_access.index, .used);
30933258 const index_qt = array_access.index.qt(t.tree);
3094 const maybe_bigger_than_usize = switch (index_qt.base(t.comp).type) {
3259 const maybe_bigger_than_usize = type: switch (index_qt.base(t.comp).type) {
30953260 .bool => {
30963261 break :index try ZigTag.int_from_bool.create(t.arena, index);
30973262 },
......@@ -3100,6 +3265,7 @@ fn transArrayAccess(t: *Translator, scope: *Scope, array_access: Node.ArrayAcces
31003265 else => false,
31013266 },
31023267 .bit_int => |bit_int| bit_int.bits > t.comp.target.ptrBitWidth(),
3268 .@"enum" => |e| if (e.tag) |tag| continue :type tag.base(t.comp).type else false,
31033269 else => unreachable,
31043270 };
31053271
......@@ -3158,7 +3324,10 @@ fn transMemberDesignator(t: *Translator, scope: *Scope, arg: Node.Index) TransEr
31583324 },
31593325 .member_access_expr => |access| {
31603326 const base = try t.transMemberDesignator(scope, access.base);
3161 return t.transMemberAccess(scope, .normal, access, base);
3327 // In offsetof context, flexible array members must be accessed via
3328 // the backing field (`_name`) rather than the accessor function,
3329 // because you can't take the address of a function call result.
3330 return t.transMemberAccess(scope, .normal, access, base, .backing);
31623331 },
31633332 .cast => |cast| {
31643333 assert(cast.kind == .array_to_pointer);
......@@ -3292,6 +3461,51 @@ fn transCall(
32923461
32933462const SuppressCast = enum { with_as, no_as };
32943463
3464/// Attempt to translate literal as the name of the simple macro
3465/// it was expanded from.
3466fn checkLiteralMacro(t: *Translator, tok: TokenIndex, used: ResultUsed) !?ZigNode {
3467 if (!t.keep_macro_literals) return null;
3468 const expansion_locs = t.pp.expansionSlice(tok);
3469 if (expansion_locs.len == 0) return null;
3470
3471 const last_expand = expansion_locs[0];
3472 const source = t.comp.getSource(last_expand.id);
3473 var tokenizer: aro.Tokenizer = .{
3474 .buf = source.buf,
3475 .langopts = t.comp.langopts,
3476 .source = last_expand.id,
3477 .index = last_expand.byte_offset,
3478 .splice_locs = &.{},
3479 };
3480 const name_tok = tokenizer.next();
3481 if (!name_tok.id.isMacroIdentifier()) return null;
3482
3483 const name = t.pp.tokSlice(name_tok);
3484 if (t.global_scope.containsNow(name)) return null;
3485 const macro = t.pp.defines.get(name) orelse return null;
3486 if (macro.is_func) return null;
3487 if (macro.isBuiltin()) return null;
3488
3489 var tok_count: u8 = 0;
3490 for (macro.tokens) |macro_tok| {
3491 switch (macro_tok.id) {
3492 .invalid => continue,
3493 .whitespace => continue,
3494 .comment => continue,
3495 .macro_ws => continue,
3496 else => {
3497 if (tok_count != 0) return null;
3498 tok_count += 1;
3499 },
3500 }
3501 }
3502
3503 if (t.checkTranslatableMacro(macro.tokens, macro.params) != null) return null;
3504
3505 const ident = try ZigTag.identifier.create(t.arena, name);
3506 return try t.maybeSuppressResult(used, ident);
3507}
3508
32953509fn transIntLiteral(
32963510 t: *Translator,
32973511 scope: *Scope,
......@@ -3299,6 +3513,7 @@ fn transIntLiteral(
32993513 used: ResultUsed,
33003514 suppress_as: SuppressCast,
33013515) TransError!ZigNode {
3516 if (try t.checkLiteralMacro(literal_index.tok(t.tree), used)) |node| return node;
33023517 const val = t.tree.value_map.get(literal_index).?;
33033518 const int_lit_node = try t.createIntNode(val);
33043519 if (suppress_as == .no_as) {
......@@ -3325,6 +3540,7 @@ fn transCharLiteral(
33253540 used: ResultUsed,
33263541 suppress_as: SuppressCast,
33273542) TransError!ZigNode {
3543 if (try t.checkLiteralMacro(literal_index.tok(t.tree), used)) |node| return node;
33283544 const val = t.tree.value_map.get(literal_index).?;
33293545 const char_literal = literal_index.get(t.tree).char_literal;
33303546 const narrow = char_literal.kind == .ascii or char_literal.kind == .utf8;
......@@ -3333,7 +3549,7 @@ fn transCharLiteral(
33333549 // e.g. 'abcd'
33343550 const int_value = val.toInt(u32, t.comp).?;
33353551 const int_lit_node = if (char_literal.kind == .ascii and int_value > 255)
3336 try t.createNumberNode(int_value, .int)
3552 try t.createNumberNode(int_value)
33373553 else
33383554 try t.createCharLiteralNode(narrow, int_value);
33393555
......@@ -3357,12 +3573,16 @@ fn transFloatLiteral(
33573573 used: ResultUsed,
33583574 suppress_as: SuppressCast,
33593575) TransError!ZigNode {
3576 if (try t.checkLiteralMacro(literal_index.tok(t.tree), used)) |node| return node;
33603577 const val = t.tree.value_map.get(literal_index).?;
33613578 const float_literal = literal_index.get(t.tree).float_literal;
33623579
33633580 var allocating: std.Io.Writer.Allocating = .init(t.gpa);
33643581 defer allocating.deinit();
33653582 _ = val.print(float_literal.qt, t.comp, &allocating.writer) catch return error.OutOfMemory;
3583 if (mem.findScalar(u8, allocating.written(), '.') == null) {
3584 allocating.writer.writeAll(".0") catch return error.OutOfMemory;
3585 }
33663586
33673587 const float_lit_node = try ZigTag.float_literal.create(t.arena, try t.arena.dupe(u8, allocating.written()));
33683588 if (suppress_as == .no_as) {
......@@ -3588,7 +3808,7 @@ fn transArrayInit(
35883808 while (i < array_init.items.len) : (i += 1) {
35893809 if (array_init.items[i].get(t.tree) == .array_filler_expr) break;
35903810 const expr = try t.transExprCoercing(scope, array_init.items[i], .used);
3591 try val_list.append(t.gpa, expr);
3811 try val_list.append(t.gpa, try t.toNonBool(expr, array_item_qt));
35923812 }
35933813 const array_type = try ZigTag.array_type.create(t.arena, .{
35943814 .elem_type = array_item_type,
......@@ -3638,7 +3858,7 @@ fn transUnionInit(
36383858 const field_init = try t.arena.create(ast.Payload.ContainerInit.Initializer);
36393859 field_init.* = .{
36403860 .name = field_name,
3641 .value = try t.transExprCoercing(scope, init_expr, .used),
3861 .value = try t.toNonBool(try t.transExprCoercing(scope, init_expr, .used), field.qt),
36423862 };
36433863 const container_init = try ZigTag.container_init.create(t.arena, .{
36443864 .lhs = union_type,
......@@ -3669,7 +3889,7 @@ fn transStructInit(
36693889 }).? else field.name.lookup(t.comp);
36703890 init.* = .{
36713891 .name = field_name,
3672 .value = try t.transExprCoercing(scope, field_expr, .used),
3892 .value = try t.toNonBool(try t.transExprCoercing(scope, field_expr, .used), field.qt),
36733893 };
36743894 }
36753895
......@@ -3766,7 +3986,7 @@ fn transConvertvectorExpr(
37663986 for (items, 0..dest_vec_ty.len) |*item, i| {
37673987 const value = try ZigTag.array_access.create(t.arena, .{
37683988 .lhs = tmp_ident,
3769 .rhs = try t.createNumberNode(i, .int),
3989 .rhs = try t.createNumberNode(i),
37703990 });
37713991
37723992 if (src_elem_sk == .float and dest_elem_sk == .float) {
......@@ -3812,7 +4032,7 @@ fn transShufflevectorExpr(
38124032 const mask_len = shufflevector.indexes.len;
38134033
38144034 const mask_type = try ZigTag.vector.create(t.arena, .{
3815 .lhs = try t.createNumberNode(mask_len, .int),
4035 .lhs = try t.createNumberNode(mask_len),
38164036 .rhs = try ZigTag.type.create(t.arena, "i32"),
38174037 });
38184038
......@@ -3882,16 +4102,9 @@ fn createIntNode(t: *Translator, int: aro.Value) !ZigNode {
38824102 return res;
38834103}
38844104
3885fn createNumberNode(t: *Translator, num: anytype, num_kind: enum { int, float }) !ZigNode {
3886 const fmt_s = switch (@typeInfo(@TypeOf(num))) {
3887 .int, .comptime_int => "{d}",
3888 else => "{s}",
3889 };
3890 const str = try std.fmt.allocPrint(t.arena, fmt_s, .{num});
3891 if (num_kind == .float)
3892 return ZigTag.float_literal.create(t.arena, str)
3893 else
3894 return ZigTag.integer_literal.create(t.arena, str);
4105fn createNumberNode(t: *Translator, num: anytype) !ZigNode {
4106 const str = try std.fmt.allocPrint(t.arena, "{d}", .{num});
4107 return ZigTag.integer_literal.create(t.arena, str);
38954108}
38964109
38974110fn createCharLiteralNode(t: *Translator, narrow: bool, val: u32) TransError!ZigNode {
......@@ -3953,6 +4166,25 @@ fn vectorTypeInfo(t: *Translator, vec_node: ZigNode, field: []const u8) TransErr
39534166 return ZigTag.field_access.create(t.arena, .{ .lhs = vector_type_info, .field_name = field });
39544167}
39554168
4169/// Returns true if the given array length qualifies as a flexible array member
4170/// under the current -fstrict-flex-arrays level.
4171fn isFlexibleArrayLen(t: *const Translator, len: anytype) bool {
4172 return switch (t.strict_flex_arrays) {
4173 .@"0" => true,
4174 .@"1" => switch (len) {
4175 .incomplete => true,
4176 .fixed => |n| n <= 1,
4177 else => false,
4178 },
4179 .@"2" => switch (len) {
4180 .incomplete => true,
4181 .fixed => |n| n == 0,
4182 else => false,
4183 },
4184 .@"3" => len == .incomplete,
4185 };
4186}
4187
39564188/// Build a getter function for a flexible array field in a C record
39574189/// e.g. `T items[]` or `T items[0]`. The generated function returns a [*c] pointer
39584190/// to the flexible array with the correct const and volatile qualifiers
......@@ -3961,7 +4193,13 @@ fn createFlexibleMemberFn(
39614193 member_name: []const u8,
39624194 field_name: []const u8,
39634195) Error!ZigNode {
3964 const self_param_name = "self";
4196 // Use `_self` instead of the conventional `self` to avoid the Zig error
4197 // "function parameter shadows declaration of 'self'".
4198 // `processContainerMemberFns` merges C functions matching a struct's name
4199 // prefix into the struct as `pub const` aliases (e.g. `foo_self()` becomes
4200 // `pub const self = __root.foo_self`). A parameter also named `self` would
4201 // then shadow that declaration, which Zig rejects.
4202 const self_param_name = "_self";
39654203 const self_param = try ZigTag.identifier.create(t.arena, self_param_name);
39664204 const self_type = try ZigTag.typeof.create(t.arena, self_param);
39674205
lib/compiler/translate-c/ast.zig+19-11
......@@ -50,6 +50,7 @@ pub const Node = extern union {
5050 break_val,
5151 @"return",
5252 field_access,
53 field_builtin,
5354 array_access,
5455 call,
5556 var_decl,
......@@ -371,6 +372,7 @@ pub const Node = extern union {
371372 .div_exact,
372373 .offset_of,
373374 .static_assert,
375 .field_builtin,
374376 => Payload.BinOp,
375377
376378 .integer_literal,
......@@ -455,14 +457,14 @@ pub const Node = extern union {
455457 return .{ .ptr_otherwise = payload };
456458 }
457459
458 pub fn isNoreturn(node: Node, break_counts: bool) bool {
459 switch (node.tag()) {
460 pub fn isNoreturn(node: Node) bool {
461 return switch (node.tag()) {
460462 .block => {
461463 const block_node = node.castTag(.block).?;
462464 if (block_node.data.stmts.len == 0) return false;
463465
464466 const last = block_node.data.stmts[block_node.data.stmts.len - 1];
465 return last.isNoreturn(break_counts);
467 return last.isNoreturn();
466468 },
467469 .@"switch" => {
468470 const switch_node = node.castTag(.@"switch").?;
......@@ -475,15 +477,16 @@ pub const Node = extern union {
475477 else
476478 unreachable;
477479
478 if (!body.isNoreturn(break_counts)) return false;
480 if (!body.isNoreturn()) return false;
479481 }
480482 return true;
481483 },
482 .@"return", .return_void => return true,
483 .@"break" => if (break_counts) return true,
484 else => {},
485 }
486 return false;
484 .@"return", .return_void => true,
485 .@"break" => true,
486 .@"continue" => true,
487 .@"unreachable" => true,
488 else => false,
489 };
487490 }
488491
489492 pub fn isBoolRes(res: Node) bool {
......@@ -2015,6 +2018,10 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
20152018 const lhs = try renderNodeGrouped(c, payload.lhs);
20162019 return renderFieldAccess(c, lhs, payload.field_name);
20172020 },
2021 .field_builtin => {
2022 const payload = node.castTag(.field_builtin).?.data;
2023 return renderBuiltinCall(c, "@field", &.{ payload.lhs, payload.rhs });
2024 },
20182025 .@"struct", .@"union", .@"opaque" => return renderContainer(c, node),
20192026 .enum_constant => {
20202027 const payload = node.castTag(.enum_constant).?.data;
......@@ -2424,7 +2431,7 @@ fn renderNullSentinelArrayType(c: *Context, len: u64, elem_type: Node) !NodeInde
24242431fn addSemicolonIfNeeded(c: *Context, node: Node) !void {
24252432 switch (node.tag()) {
24262433 .warning => unreachable,
2427 .var_decl, .var_simple, .arg_redecl, .alias, .block, .empty_block, .block_single, .@"switch", .wrapped_local, .mut_str => {},
2434 .static_assert, .var_decl, .var_simple, .arg_redecl, .alias, .block, .empty_block, .block_single, .@"switch", .wrapped_local, .mut_str => {},
24282435 .while_true => {
24292436 const payload = node.castTag(.while_true).?.data;
24302437 return addSemicolonIfNotBlock(c, payload);
......@@ -2532,6 +2539,8 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
25322539 .trunc,
25332540 .floor,
25342541 .root_ref,
2542 .field_builtin,
2543 .@"switch",
25352544 => {
25362545 // no grouping needed
25372546 return renderNode(c, node);
......@@ -2594,7 +2603,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
25942603 .pub_var_simple,
25952604 .enum_constant,
25962605 .@"while",
2597 .@"switch",
25982606 .@"break",
25992607 .break_val,
26002608 .pub_inline_fn,
lib/compiler/translate-c/main.zig+75-16
......@@ -1,15 +1,17 @@
11const std = @import("std");
2const Io = std.Io;
32const assert = std.debug.assert;
43const mem = std.mem;
54const process = std.process;
5const Io = std.Io;
6
67const aro = @import("aro");
78const compiler_util = @import("../util.zig");
9
810const Translator = @import("Translator.zig");
911
1012const fast_exit = @import("builtin").mode != .Debug;
1113
12pub fn main(init: std.process.Init) u8 {
14pub fn main(init: process.Init) u8 {
1315 const gpa = init.gpa;
1416 const arena = init.arena.allocator();
1517 const io = init.io;
......@@ -33,16 +35,20 @@ pub fn main(init: std.process.Init) u8 {
3335 var stderr = Io.File.stderr().writer(io, &stderr_buf);
3436 var diagnostics: aro.Diagnostics = switch (zig_integration) {
3537 false => .{ .output = .{ .to_writer = .{
36 .mode = Io.Terminal.Mode.detect(io, stderr.file, NO_COLOR, CLICOLOR_FORCE) catch unreachable,
38 .mode = Io.Terminal.Mode.detect(io, stderr.file, NO_COLOR, CLICOLOR_FORCE) catch .no_color,
3739 .writer = &stderr.interface,
3840 } } },
39 true => .{ .output = .{ .to_list = .{
40 .arena = .init(gpa),
41 } } },
41 true => .{ .output = .{ .to_list = .{ .arena = .init(gpa) } } },
4242 };
4343 defer diagnostics.deinit();
4444
45 var comp = aro.Compilation.initDefault(gpa, arena, io, &diagnostics, .cwd(), environ_map) catch |err| switch (err) {
45 var comp = aro.Compilation.init(.{
46 .gpa = gpa,
47 .arena = arena,
48 .io = io,
49 .diagnostics = &diagnostics,
50 .environ_map = environ_map,
51 }) catch |err| switch (err) {
4652 error.OutOfMemory => {
4753 std.debug.print("ran out of memory initializing C compilation\n", .{});
4854 if (fast_exit) process.exit(1);
......@@ -82,7 +88,6 @@ pub fn main(init: std.process.Init) u8 {
8288 return 1;
8389 },
8490 };
85
8691 assert(comp.diagnostics.errors == 0 or !zig_integration);
8792 if (fast_exit) process.exit(@intFromBool(comp.diagnostics.errors != 0));
8893 return @intFromBool(comp.diagnostics.errors != 0);
......@@ -107,10 +112,23 @@ pub const usage =
107112 \\Usage {s}: [options] file [CC options]
108113 \\
109114 \\Options:
110 \\ --help Print this message
111 \\ --version Print translate-c version
112 \\ -fmodule-libs Import libraries as modules
113 \\ -fno-module-libs (default) Install libraries next to output file
115 \\ --help Print this message
116 \\ --version Print translate-c version
117 \\ -fmodule-libs Import libraries as modules
118 \\ -fno-module-libs (default) Install libraries next to output file
119 \\ -fpub-static (default) Translate static functions as pub
120 \\ -fno-pub-static Do not translate static functions as pub
121 \\ -ffunc-bodies (default) Translate function bodies
122 \\ -fno-func-bodies Do not translate function bodies
123 \\ -fkeep-macro-literals (default) Preserve macro names for literals
124 \\ -fno-keep-macro-literals Do not preserve macro names for literals
125 \\ -fdefault-init Default initialize struct fields
126 \\ -fno-default-init (default) Do not default initialize struct fields
127 \\ -fstrict-flex-arrays=<n> Control when to treat a trailing array as a flexible array member (default: 2)
128 \\ 0: any trailing array
129 \\ 1: size [0]/[1]/[]
130 \\ 2: size [0]/[]
131 \\ 3: [] only
114132 \\
115133 \\
116134;
......@@ -119,7 +137,14 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig
119137 const gpa = d.comp.gpa;
120138 const io = d.comp.io;
121139
122 var aro_args: std.ArrayList([:0]const u8) = .empty;
140 var module_libs = true;
141 var pub_static = true;
142 var func_bodies = true;
143 var keep_macro_literals = true;
144 var default_init = true;
145 var strict_flex_arrays: Translator.StrictFlexArraysLevel = .@"2";
146
147 var aro_args: std.ArrayList([:0]const u8) = try .initCapacity(gpa, args.len);
123148 defer aro_args.deinit(gpa);
124149
125150 for (args, 0..) |arg, i| {
......@@ -139,8 +164,34 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig
139164 } else if (mem.eql(u8, arg, "--zig-integration")) {
140165 if (i != 1 or !zig_integration)
141166 return d.fatal("--zig-integration must be the first argument", .{});
167 } else if (mem.eql(u8, arg, "-fmodule-libs")) {
168 module_libs = true;
169 } else if (mem.eql(u8, arg, "-fno-module-libs")) {
170 module_libs = false;
171 } else if (mem.eql(u8, arg, "-fpub-static")) {
172 pub_static = true;
173 } else if (mem.eql(u8, arg, "-fno-pub-static")) {
174 pub_static = false;
175 } else if (mem.eql(u8, arg, "-ffunc-bodies")) {
176 func_bodies = true;
177 } else if (mem.eql(u8, arg, "-fno-func-bodies")) {
178 func_bodies = false;
179 } else if (mem.eql(u8, arg, "-fkeep-macro-literals")) {
180 keep_macro_literals = true;
181 } else if (mem.eql(u8, arg, "-fno-keep-macro-literals")) {
182 keep_macro_literals = false;
183 } else if (mem.eql(u8, arg, "-fdefault-init")) {
184 default_init = true;
185 } else if (mem.eql(u8, arg, "-fno-default-init")) {
186 default_init = false;
187 } else if (mem.startsWith(u8, arg, "-fstrict-flex-arrays=")) {
188 const val_str = arg["-fstrict-flex-arrays=".len..];
189 if (val_str.len != 1 or val_str[0] < '0' or val_str[0] > '3') {
190 return d.fatal("-fstrict-flex-arrays= requires a value of '0', '1', '2', or '3'", .{});
191 }
192 strict_flex_arrays = @enumFromInt(val_str[0] - '0');
142193 } else {
143 try aro_args.append(gpa, arg);
194 aro_args.appendAssumeCapacity(arg);
144195 }
145196 }
146197 const user_macros = macros: {
......@@ -148,7 +199,7 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig
148199 defer macro_buf.deinit(gpa);
149200
150201 var discard_buf: [256]u8 = undefined;
151 var discarding: std.Io.Writer.Discarding = .init(&discard_buf);
202 var discarding: Io.Writer.Discarding = .init(&discard_buf);
152203 assert(!try d.parseArgs(&discarding.writer, &macro_buf, aro_args.items));
153204 if (macro_buf.items.len > std.math.maxInt(u32)) {
154205 return d.fatal("user provided macro source exceeded max size", .{});
......@@ -185,7 +236,9 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig
185236 else => |e| return e,
186237 };
187238
188 var pp = try aro.Preprocessor.initDefault(d.comp);
239 var pp = try aro.Preprocessor.init(d.comp, .{
240 .base_file = source.id,
241 });
189242 defer pp.deinit();
190243
191244 var name_buf: [std.fs.max_name_bytes]u8 = undefined;
......@@ -235,6 +288,12 @@ fn translate(d: *aro.Driver, tc: *aro.Toolchain, args: []const [:0]const u8, zig
235288 .comp = d.comp,
236289 .pp = &pp,
237290 .tree = &c_tree,
291 .module_libs = module_libs,
292 .pub_static = pub_static,
293 .func_bodies = func_bodies,
294 .keep_macro_literals = keep_macro_literals,
295 .default_init = default_init,
296 .strict_flex_arrays = strict_flex_arrays,
238297 });
239298 defer gpa.free(rendered_zig);
240299
lib/std/zig/c_translation/helpers.zig+14-9
......@@ -81,15 +81,20 @@ fn ToUnsigned(comptime T: type) type {
8181}
8282
8383/// Constructs a [*c] pointer with the const and volatile annotations
84/// from Self for pointing to a C flexible array of Element.
85pub fn FlexibleArrayType(comptime Self: type, comptime Element: type) type {
86 return switch (@typeInfo(Self)) {
87 .pointer => |ptr| @Pointer(.c, .{
88 .@"const" = ptr.is_const,
89 .@"volatile" = ptr.is_volatile,
90 }, Element, null),
91 else => |info| @compileError("Invalid self type \"" ++ @tagName(info) ++ "\" for flexible array getter: " ++ @typeName(Self)),
92 };
84/// from SelfType for pointing to a C flexible array of ElementType.
85pub fn FlexibleArrayType(comptime SelfType: type, comptime ElementType: type) type {
86 switch (@typeInfo(SelfType)) {
87 .pointer => |ptr| {
88 return @Pointer(.c, .{
89 .@"const" = ptr.is_const,
90 .@"volatile" = ptr.is_volatile,
91 .@"allowzero" = true,
92 .@"addrspace" = .generic,
93 .@"align" = null,
94 }, ElementType, null);
95 },
96 else => |info| @compileError("Invalid self type \"" ++ @tagName(info) ++ "\" for flexible array getter: " ++ @typeName(SelfType)),
97 }
9398}
9499
95100/// Promote the type of an integer literal until it fits as C would.
src/libs/mingw.zig+8-2
......@@ -279,7 +279,13 @@ pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void {
279279 .output = .{ .to_list = .{ .arena = .init(gpa) } },
280280 };
281281 defer diagnostics.deinit();
282 var aro_comp = aro.Compilation.init(gpa, arena, io, &diagnostics, Io.Dir.cwd());
282 var aro_comp = try aro.Compilation.init(.{
283 .gpa = gpa,
284 .arena = arena,
285 .io = io,
286 .diagnostics = &diagnostics,
287 .environ_map = null,
288 });
283289 defer aro_comp.deinit();
284290
285291 aro_comp.target = .fromZigTarget(target.*);
......@@ -304,7 +310,7 @@ pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void {
304310 const builtin_macros = try aro_comp.generateBuiltinMacros(.include_system_defines);
305311 const def_file_source = try aro_comp.addSourceFromPath(def_file_path);
306312
307 var pp = aro.Preprocessor.init(&aro_comp, .{ .provided = 0 });
313 var pp = try aro.Preprocessor.init(&aro_comp, .{ .base_file = .unused });
308314 defer pp.deinit();
309315 pp.linemarkers = .none;
310316 pp.preserve_whitespace = true;