authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-20 14:03:55-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-20 14:03:55-07:00
log328ec15d9cae0373c1f973699c392db5b63ab886
tree2c81e060907538a5668ffe03b54a114b56e2fe03
parent6dc45e7d3186f81b1329c71b6380ff3ddd5dec41

Revert "make distinct error limit configurable"

This reverts commit 78855bd21866b515018259a2194e036e4b3120df. This commit did not replace uses of `Type.err_int` of which there are currently 60 uses. Re-opens #786

5 files changed, 28 insertions(+), 81 deletions(-)

src/Compilation.zig-23
...@@ -739,7 +739,6 @@ pub const InitOptions = struct {...@@ -739,7 +739,6 @@ pub const InitOptions = struct {
739 pdb_source_path: ?[]const u8 = null,739 pdb_source_path: ?[]const u8 = null,
740 /// (Windows) PDB output path740 /// (Windows) PDB output path
741 pdb_out_path: ?[]const u8 = null,741 pdb_out_path: ?[]const u8 = null,
742 error_limit: ?Module.ErrorInt = null,
743};742};
744743
745fn addModuleTableToCacheHash(744fn addModuleTableToCacheHash(
...@@ -1433,7 +1432,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {...@@ -1433,7 +1432,6 @@ pub fn create(gpa: Allocator, options: InitOptions) !*Compilation {
1433 .local_zir_cache = local_zir_cache,1432 .local_zir_cache = local_zir_cache,
1434 .emit_h = emit_h,1433 .emit_h = emit_h,
1435 .tmp_hack_arena = std.heap.ArenaAllocator.init(gpa),1434 .tmp_hack_arena = std.heap.ArenaAllocator.init(gpa),
1436 .error_limit = options.error_limit orelse (std.math.maxInt(u16) - 1),
1437 };1435 };
1438 try module.init();1436 try module.init();
14391437
...@@ -2488,7 +2486,6 @@ fn addNonIncrementalStuffToCacheManifest(comp: *Compilation, man: *Cache.Manifes...@@ -2488,7 +2486,6 @@ fn addNonIncrementalStuffToCacheManifest(comp: *Compilation, man: *Cache.Manifes
2488 man.hash.add(comp.bin_file.options.skip_linker_dependencies);2486 man.hash.add(comp.bin_file.options.skip_linker_dependencies);
2489 man.hash.add(comp.bin_file.options.parent_compilation_link_libc);2487 man.hash.add(comp.bin_file.options.parent_compilation_link_libc);
2490 man.hash.add(mod.emit_h != null);2488 man.hash.add(mod.emit_h != null);
2491 man.hash.add(mod.error_limit);
2492 }2489 }
24932490
2494 try man.addOptionalFile(comp.bin_file.options.linker_script);2491 try man.addOptionalFile(comp.bin_file.options.linker_script);
...@@ -2869,10 +2866,6 @@ pub fn totalErrorCount(self: *Compilation) u32 {...@@ -2869,10 +2866,6 @@ pub fn totalErrorCount(self: *Compilation) u32 {
2869 }2866 }
2870 }2867 }
2871 }2868 }
2872
2873 if (module.global_error_set.entries.len - 1 > module.error_limit) {
2874 total += 1;
2875 }
2876 }2869 }
28772870
2878 // The "no entry point found" error only counts if there are no semantic analysis errors.2871 // The "no entry point found" error only counts if there are no semantic analysis errors.
...@@ -3023,22 +3016,6 @@ pub fn getAllErrorsAlloc(self: *Compilation) !ErrorBundle {...@@ -3023,22 +3016,6 @@ pub fn getAllErrorsAlloc(self: *Compilation) !ErrorBundle {
3023 for (module.failed_exports.values()) |value| {3016 for (module.failed_exports.values()) |value| {
3024 try addModuleErrorMsg(module, &bundle, value.*);3017 try addModuleErrorMsg(module, &bundle, value.*);
3025 }3018 }
3026
3027 const actual_error_count = module.global_error_set.entries.len - 1;
3028 if (actual_error_count > module.error_limit) {
3029 try bundle.addRootErrorMessage(.{
3030 .msg = try bundle.printString("module used more errors than possible: used {d}, max {d}", .{
3031 actual_error_count, module.error_limit,
3032 }),
3033 .notes_len = 1,
3034 });
3035 const notes_start = try bundle.reserveNotes(1);
3036 bundle.extra.items[notes_start] = @intFromEnum(try bundle.addErrorMessage(.{
3037 .msg = try bundle.printString("use '--error-limit {d}' to increase limit", .{
3038 actual_error_count,
3039 }),
3040 }));
3041 }
3042 }3019 }
30433020
3044 if (bundle.root_list.items.len == 0) {3021 if (bundle.root_list.items.len == 0) {
src/Module.zig-8
...@@ -137,9 +137,6 @@ deletion_set: std.AutoArrayHashMapUnmanaged(Decl.Index, void) = .{},...@@ -137,9 +137,6 @@ deletion_set: std.AutoArrayHashMapUnmanaged(Decl.Index, void) = .{},
137/// Key is the error name, index is the error tag value. Index 0 has a length-0 string.137/// Key is the error name, index is the error tag value. Index 0 has a length-0 string.
138global_error_set: GlobalErrorSet = .{},138global_error_set: GlobalErrorSet = .{},
139139
140/// Maximum amount of distinct error values, set by --error-limit
141error_limit: ErrorInt,
142
143/// Incrementing integer used to compare against the corresponding Decl140/// Incrementing integer used to compare against the corresponding Decl
144/// field to determine whether a Decl's status applies to an ongoing update, or a141/// field to determine whether a Decl's status applies to an ongoing update, or a
145/// previous analysis.142/// previous analysis.
...@@ -5023,11 +5020,6 @@ pub fn getErrorValueFromSlice(...@@ -5023,11 +5020,6 @@ pub fn getErrorValueFromSlice(
5023 return getErrorValue(mod, interned_name);5020 return getErrorValue(mod, interned_name);
5024}5021}
50255022
5026pub fn errorSetBits(mod: *Module) u16 {
5027 if (mod.error_limit == 0) return 0;
5028 return std.math.log2_int_ceil(ErrorInt, mod.error_limit + 1); // +1 for no error
5029}
5030
5031pub fn createAnonymousDecl(mod: *Module, block: *Sema.Block, typed_value: TypedValue) !Decl.Index {5023pub fn createAnonymousDecl(mod: *Module, block: *Sema.Block, typed_value: TypedValue) !Decl.Index {
5032 const src_decl = mod.declPtr(block.src_decl);5024 const src_decl = mod.declPtr(block.src_decl);
5033 return mod.createAnonymousDeclFromDecl(src_decl, block.namespace, block.wip_capture_scope, typed_value);5025 return mod.createAnonymousDeclFromDecl(src_decl, block.namespace, block.wip_capture_scope, typed_value);
src/main.zig-9
...@@ -421,7 +421,6 @@ const usage_build_generic =...@@ -421,7 +421,6 @@ const usage_build_generic =
421 \\ --deps [dep],[dep],... Set dependency names for the root package421 \\ --deps [dep],[dep],... Set dependency names for the root package
422 \\ dep: [[import=]name]422 \\ dep: [[import=]name]
423 \\ --main-mod-path Set the directory of the root module423 \\ --main-mod-path Set the directory of the root module
424 \\ --error-limit [num] Set the maximum amount of distinct error values
425 \\ -fPIC Force-enable Position Independent Code424 \\ -fPIC Force-enable Position Independent Code
426 \\ -fno-PIC Force-disable Position Independent Code425 \\ -fno-PIC Force-disable Position Independent Code
427 \\ -fPIE Force-enable Position Independent Executable426 \\ -fPIE Force-enable Position Independent Executable
...@@ -912,8 +911,6 @@ fn buildOutputType(...@@ -912,8 +911,6 @@ fn buildOutputType(
912 var error_tracing: ?bool = null;911 var error_tracing: ?bool = null;
913 var pdb_out_path: ?[]const u8 = null;912 var pdb_out_path: ?[]const u8 = null;
914 var dwarf_format: ?std.dwarf.Format = null;913 var dwarf_format: ?std.dwarf.Format = null;
915 var error_limit: ?Module.ErrorInt = null;
916
917 // e.g. -m3dnow or -mno-outline-atomics. They correspond to std.Target llvm cpu feature names.914 // e.g. -m3dnow or -mno-outline-atomics. They correspond to std.Target llvm cpu feature names.
918 // This array is populated by zig cc frontend and then has to be converted to zig-style915 // This array is populated by zig cc frontend and then has to be converted to zig-style
919 // CPU features.916 // CPU features.
...@@ -1043,11 +1040,6 @@ fn buildOutputType(...@@ -1043,11 +1040,6 @@ fn buildOutputType(
1043 root_deps_str = args_iter.nextOrFatal();1040 root_deps_str = args_iter.nextOrFatal();
1044 } else if (mem.eql(u8, arg, "--main-mod-path")) {1041 } else if (mem.eql(u8, arg, "--main-mod-path")) {
1045 main_mod_path = args_iter.nextOrFatal();1042 main_mod_path = args_iter.nextOrFatal();
1046 } else if (mem.eql(u8, arg, "--error-limit")) {
1047 const next_arg = args_iter.nextOrFatal();
1048 error_limit = std.fmt.parseUnsigned(Module.ErrorInt, next_arg, 0) catch |err| {
1049 fatal("unable to parse error limit '{s}': {s}", .{ next_arg, @errorName(err) });
1050 };
1051 } else if (mem.eql(u8, arg, "-cflags")) {1043 } else if (mem.eql(u8, arg, "-cflags")) {
1052 extra_cflags.shrinkRetainingCapacity(0);1044 extra_cflags.shrinkRetainingCapacity(0);
1053 while (true) {1045 while (true) {
...@@ -3554,7 +3546,6 @@ fn buildOutputType(...@@ -3554,7 +3546,6 @@ fn buildOutputType(
3554 .reference_trace = reference_trace,3546 .reference_trace = reference_trace,
3555 .error_tracing = error_tracing,3547 .error_tracing = error_tracing,
3556 .pdb_out_path = pdb_out_path,3548 .pdb_out_path = pdb_out_path,
3557 .error_limit = error_limit,
3558 }) catch |err| switch (err) {3549 }) catch |err| switch (err) {
3559 error.LibCUnavailable => {3550 error.LibCUnavailable => {
3560 const target = target_info.target;3551 const target = target_info.target;
src/type.zig+20-26
...@@ -905,11 +905,8 @@ pub const Type = struct {...@@ -905,11 +905,8 @@ pub const Type = struct {
905 .opt_type => return abiAlignmentAdvancedOptional(ty, mod, strat),905 .opt_type => return abiAlignmentAdvancedOptional(ty, mod, strat),
906 .error_union_type => |info| return abiAlignmentAdvancedErrorUnion(ty, mod, strat, info.payload_type.toType()),906 .error_union_type => |info| return abiAlignmentAdvancedErrorUnion(ty, mod, strat, info.payload_type.toType()),
907907
908 .error_set_type, .inferred_error_set_type => {908 // TODO revisit this when we have the concept of the error tag type
909 const bits = mod.errorSetBits();909 .error_set_type, .inferred_error_set_type => return .{ .scalar = .@"2" },
910 if (bits == 0) return AbiAlignmentAdvanced{ .scalar = .@"1" };
911 return .{ .scalar = intAbiAlignment(bits, target) };
912 },
913910
914 // represents machine code; not a pointer911 // represents machine code; not a pointer
915 .func_type => |func_type| return .{912 .func_type => |func_type| return .{
...@@ -970,11 +967,10 @@ pub const Type = struct {...@@ -970,11 +967,10 @@ pub const Type = struct {
970 else => return .{ .scalar = .@"16" },967 else => return .{ .scalar = .@"16" },
971 },968 },
972969
973 .anyerror, .adhoc_inferred_error_set => {970 // TODO revisit this when we have the concept of the error tag type
974 const bits = mod.errorSetBits();971 .anyerror,
975 if (bits == 0) return AbiAlignmentAdvanced{ .scalar = .@"1" };972 .adhoc_inferred_error_set,
976 return .{ .scalar = intAbiAlignment(bits, target) };973 => return .{ .scalar = .@"2" },
977 },
978974
979 .void,975 .void,
980 .type,976 .type,
...@@ -1288,11 +1284,8 @@ pub const Type = struct {...@@ -1288,11 +1284,8 @@ pub const Type = struct {
12881284
1289 .opt_type => return ty.abiSizeAdvancedOptional(mod, strat),1285 .opt_type => return ty.abiSizeAdvancedOptional(mod, strat),
12901286
1291 .error_set_type, .inferred_error_set_type => {1287 // TODO revisit this when we have the concept of the error tag type
1292 const bits = mod.errorSetBits();1288 .error_set_type, .inferred_error_set_type => return AbiSizeAdvanced{ .scalar = 2 },
1293 if (bits == 0) return AbiSizeAdvanced{ .scalar = 0 };
1294 return AbiSizeAdvanced{ .scalar = intAbiSize(bits, target) };
1295 },
12961289
1297 .error_union_type => |error_union_type| {1290 .error_union_type => |error_union_type| {
1298 const payload_ty = error_union_type.payload_type.toType();1291 const payload_ty = error_union_type.payload_type.toType();
...@@ -1386,11 +1379,10 @@ pub const Type = struct {...@@ -1386,11 +1379,10 @@ pub const Type = struct {
1386 .enum_literal,1379 .enum_literal,
1387 => return AbiSizeAdvanced{ .scalar = 0 },1380 => return AbiSizeAdvanced{ .scalar = 0 },
13881381
1389 .anyerror, .adhoc_inferred_error_set => {1382 // TODO revisit this when we have the concept of the error tag type
1390 const bits = mod.errorSetBits();1383 .anyerror,
1391 if (bits == 0) return AbiSizeAdvanced{ .scalar = 0 };1384 .adhoc_inferred_error_set,
1392 return AbiSizeAdvanced{ .scalar = intAbiSize(bits, target) };1385 => return AbiSizeAdvanced{ .scalar = 2 },
1393 },
13941386
1395 .prefetch_options => unreachable, // missing call to resolveTypeFields1387 .prefetch_options => unreachable, // missing call to resolveTypeFields
1396 .export_options => unreachable, // missing call to resolveTypeFields1388 .export_options => unreachable, // missing call to resolveTypeFields
...@@ -1584,7 +1576,8 @@ pub const Type = struct {...@@ -1584,7 +1576,8 @@ pub const Type = struct {
1584 return (try abiSizeAdvanced(ty, mod, strat)).scalar * 8;1576 return (try abiSizeAdvanced(ty, mod, strat)).scalar * 8;
1585 },1577 },
15861578
1587 .error_set_type, .inferred_error_set_type => return mod.errorSetBits(),1579 // TODO revisit this when we have the concept of the error tag type
1580 .error_set_type, .inferred_error_set_type => return 16,
15881581
1589 .error_union_type => {1582 .error_union_type => {
1590 // Optionals and error unions are not packed so their bitsize1583 // Optionals and error unions are not packed so their bitsize
...@@ -1617,9 +1610,10 @@ pub const Type = struct {...@@ -1617,9 +1610,10 @@ pub const Type = struct {
1617 .bool => return 1,1610 .bool => return 1,
1618 .void => return 0,1611 .void => return 0,
16191612
1613 // TODO revisit this when we have the concept of the error tag type
1620 .anyerror,1614 .anyerror,
1621 .adhoc_inferred_error_set,1615 .adhoc_inferred_error_set,
1622 => return mod.errorSetBits(),1616 => return 16,
16231617
1624 .anyopaque => unreachable,1618 .anyopaque => unreachable,
1625 .type => unreachable,1619 .type => unreachable,
...@@ -2178,7 +2172,8 @@ pub const Type = struct {...@@ -2178,7 +2172,8 @@ pub const Type = struct {
21782172
2179 while (true) switch (ty.toIntern()) {2173 while (true) switch (ty.toIntern()) {
2180 .anyerror_type, .adhoc_inferred_error_set_type => {2174 .anyerror_type, .adhoc_inferred_error_set_type => {
2181 return .{ .signedness = .unsigned, .bits = mod.errorSetBits() };2175 // TODO revisit this when error sets support custom int types
2176 return .{ .signedness = .unsigned, .bits = 16 };
2182 },2177 },
2183 .usize_type => return .{ .signedness = .unsigned, .bits = target.ptrBitWidth() },2178 .usize_type => return .{ .signedness = .unsigned, .bits = target.ptrBitWidth() },
2184 .isize_type => return .{ .signedness = .signed, .bits = target.ptrBitWidth() },2179 .isize_type => return .{ .signedness = .signed, .bits = target.ptrBitWidth() },
...@@ -2197,9 +2192,8 @@ pub const Type = struct {...@@ -2197,9 +2192,8 @@ pub const Type = struct {
2197 .enum_type => |enum_type| ty = enum_type.tag_ty.toType(),2192 .enum_type => |enum_type| ty = enum_type.tag_ty.toType(),
2198 .vector_type => |vector_type| ty = vector_type.child.toType(),2193 .vector_type => |vector_type| ty = vector_type.child.toType(),
21992194
2200 .error_set_type, .inferred_error_set_type => {2195 // TODO revisit this when error sets support custom int types
2201 return .{ .signedness = .unsigned, .bits = mod.errorSetBits() };2196 .error_set_type, .inferred_error_set_type => return .{ .signedness = .unsigned, .bits = 16 },
2202 },
22032197
2204 .anon_struct_type => unreachable,2198 .anon_struct_type => unreachable,
22052199
src/value.zig+8-15
...@@ -701,20 +701,15 @@ pub const Value = struct {...@@ -701,20 +701,15 @@ pub const Value = struct {
701 }701 }
702 },702 },
703 .ErrorSet => {703 .ErrorSet => {
704 const bits = mod.errorSetBits();704 // TODO revisit this when we have the concept of the error tag type
705 const byte_count: u16 = @intCast((@as(u17, bits) + 7) / 8);705 const Int = u16;
706
707 const name = switch (ip.indexToKey(val.toIntern())) {706 const name = switch (ip.indexToKey(val.toIntern())) {
708 .err => |err| err.name,707 .err => |err| err.name,
709 .error_union => |error_union| error_union.val.err_name,708 .error_union => |error_union| error_union.val.err_name,
710 else => unreachable,709 else => unreachable,
711 };710 };
712 var bigint_buffer: BigIntSpace = undefined;711 const int = @as(Module.ErrorInt, @intCast(mod.global_error_set.getIndex(name).?));
713 const bigint = BigIntMutable.init(712 std.mem.writeInt(Int, buffer[0..@sizeOf(Int)], @as(Int, @intCast(int)), endian);
714 &bigint_buffer.limbs,
715 mod.global_error_set.getIndex(name).?,
716 ).toConst();
717 bigint.writeTwosComplement(buffer[0..byte_count], endian);
718 },713 },
719 .Union => switch (ty.containerLayout(mod)) {714 .Union => switch (ty.containerLayout(mod)) {
720 .Auto => return error.IllDefinedMemoryLayout, // Sema is supposed to have emitted a compile error already715 .Auto => return error.IllDefinedMemoryLayout, // Sema is supposed to have emitted a compile error already
...@@ -992,12 +987,10 @@ pub const Value = struct {...@@ -992,12 +987,10 @@ pub const Value = struct {
992 }987 }
993 },988 },
994 .ErrorSet => {989 .ErrorSet => {
995 const bits = mod.errorSetBits();990 // TODO revisit this when we have the concept of the error tag type
996 const byte_count: u16 = @intCast((@as(u17, bits) + 7) / 8);991 const Int = u16;
997 const int = std.mem.readVarInt(u64, buffer[0..byte_count], endian);992 const int = std.mem.readInt(Int, buffer[0..@sizeOf(Int)], endian);
998 const index = (int << @as(u6, @intCast(64 - bits))) >> @as(u6, @intCast(64 - bits));993 const name = mod.global_error_set.keys()[@as(usize, @intCast(int))];
999 const name = mod.global_error_set.keys()[@intCast(index)];
1000
1001 return (try mod.intern(.{ .err = .{994 return (try mod.intern(.{ .err = .{
1002 .ty = ty.toIntern(),995 .ty = ty.toIntern(),
1003 .name = name,996 .name = name,