diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2024-12-16 15:11:15 -0500 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2024-12-16 17:25:52 -0500 |
| commit | 8c0628d0e290c7c1168c52c3adb408b48b48f8d0 (patch) | |
| tree | 6af53c90432621a72e37062e2e11e528a621b0b7 /src/InternPool.zig | |
| parent | 5af740465597c3bcee3d26adbc7b1994d40df0f1 (diff) | |
| download | zig-8c0628d0e290c7c1168c52c3adb408b48b48f8d0.tar.gz zig-8c0628d0e290c7c1168c52c3adb408b48b48f8d0.zip | |
Dwarf: include comptime-only values in debug info
Diffstat (limited to 'src/InternPool.zig')
| -rw-r--r-- | src/InternPool.zig | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/src/InternPool.zig b/src/InternPool.zig index 1dbfbb24e1..9dbcc3cef5 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -4704,9 +4704,45 @@ pub const Index = enum(u32) { } comptime { - if (builtin.zig_backend == .stage2_llvm and !builtin.strip_debug_info) { - _ = &dbHelper; - } + if (!builtin.strip_debug_info) switch (builtin.zig_backend) { + .stage2_llvm => _ = &dbHelper, + .stage2_x86_64 => { + for (@typeInfo(Tag).@"enum".fields) |tag| { + if (!@hasField(@TypeOf(Tag.encodings), tag.name)) { + if (false) @compileLog("missing: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name); + continue; + } + const encoding = @field(Tag.encodings, tag.name); + for (@typeInfo(encoding.trailing).@"struct".fields) |field| { + struct { + fn checkConfig(name: []const u8) void { + if (!@hasField(@TypeOf(encoding.config), name)) @compileError("missing field: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ ".config.@\"" ++ name ++ "\""); + const FieldType = @TypeOf(@field(encoding.config, name)); + if (@typeInfo(FieldType) != .enum_literal) @compileError("expected enum literal: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ ".config.@\"" ++ name ++ "\": " ++ @typeName(FieldType)); + } + fn checkField(name: []const u8, Type: type) void { + switch (@typeInfo(Type)) { + .int => {}, + .@"enum" => {}, + .@"struct" => |info| assert(info.layout == .@"packed"), + .optional => |info| { + checkConfig(name ++ ".?"); + checkField(name ++ ".?", info.child); + }, + .pointer => |info| { + assert(info.size == .Slice); + checkConfig(name ++ ".len"); + checkField(name ++ "[0]", info.child); + }, + else => @compileError("unsupported type: " ++ @typeName(Tag) ++ ".encodings." ++ tag.name ++ "." ++ name ++ ": " ++ @typeName(Type)), + } + } + }.checkField("trailing." ++ field.name, field.type); + } + } + }, + else => {}, + }; } }; @@ -5302,6 +5338,39 @@ pub const Tag = enum(u8) { }; } + const encodings = .{ + .type_struct = .{ + .payload = TypeStruct, + .trailing = struct { + captures_len: ?u32, + captures: ?[]CaptureValue, + type_hash: ?u64, + field_types: []Index, + field_inits: ?[]Index, + field_aligns: ?[]Alignment, + field_is_comptime_bits: ?[]u32, + field_index: ?[]LoadedStructType.RuntimeOrder, + field_offset: []u32, + }, + .config = .{ + .@"trailing.captures_len.?" = .@"payload.flags.any_captures", + .@"trailing.captures.?" = .@"payload.flags.any_captures", + .@"trailing.captures.?.len" = .@"trailing.captures_len", + .@"trailing.type_hash.?" = .@"payload.flags.is_reified", + .@"trailing.field_types.len" = .@"payload.fields_len", + .@"trailing.field_inits.?" = .@"payload.flags.any_default_inits", + .@"trailing.field_inits.?.len" = .@"payload.fields_len", + .@"trailing.field_aligns.?" = .@"payload.flags.any_aligned_fields", + .@"trailing.field_aligns.?.len" = .@"payload.fields_len", + .@"trailing.field_is_comptime_bits.?" = .@"payload.flags.any_comptime_fields", + .@"trailing.field_is_comptime_bits.?.len" = .@"(payload.fields_len + 31) / 32", + .@"trailing.field_index.?" = .@"!payload.flags.is_extern", + .@"trailing.field_index.?.len" = .@"!payload.flags.is_extern", + .@"trailing.field_offset.len" = .@"payload.fields_len", + }, + }, + }; + pub const Variable = struct { ty: Index, /// May be `none`. |
