diff --git a/src/Air.zig b/src/Air.zig index bcb4d43f37..8e867e4b41 100644 --- a/src/Air.zig +++ b/src/Air.zig @@ -1043,7 +1043,7 @@ pub const Inst = struct { inferred_alloc: InferredAlloc, pub const InferredAllocComptime = struct { - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, alignment: InternPool.Alignment, is_const: bool, }; diff --git a/src/Compilation.zig b/src/Compilation.zig index 1beeaa36d4..598f7a5a8b 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -254,19 +254,19 @@ pub const RcIncludes = enum { const Job = union(enum) { /// Write the constant value for a Decl to the output file. - codegen_decl: Module.Decl.Index, + codegen_decl: InternPool.DeclIndex, /// Write the machine code for a function to the output file. /// This will either be a non-generic `func_decl` or a `func_instance`. codegen_func: InternPool.Index, /// Render the .h file snippet for the Decl. - emit_h_decl: Module.Decl.Index, + emit_h_decl: InternPool.DeclIndex, /// The Decl needs to be analyzed and possibly export itself. /// It may have already be analyzed, or it may have been determined /// to be outdated; in this case perform semantic analysis again. - analyze_decl: Module.Decl.Index, + analyze_decl: InternPool.DeclIndex, /// The source file containing the Decl has been updated, and so the /// Decl may need its line number information updated in the debug info. - update_line_number: Module.Decl.Index, + update_line_number: InternPool.DeclIndex, /// The main source file for the module needs to be analyzed. analyze_mod: *Package.Module, diff --git a/src/InternPool.zig b/src/InternPool.zig index 1b0a85436a..e06597373e 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -32,12 +32,12 @@ string_bytes: std.ArrayListUnmanaged(u8) = .{}, /// multi-threaded contention on an atomic counter. allocated_decls: std.SegmentedList(Module.Decl, 0) = .{}, /// When a Decl object is freed from `allocated_decls`, it is pushed into this stack. -decls_free_list: std.ArrayListUnmanaged(Module.Decl.Index) = .{}, +decls_free_list: std.ArrayListUnmanaged(DeclIndex) = .{}, /// Same pattern as with `allocated_decls`. allocated_namespaces: std.SegmentedList(Module.Namespace, 0) = .{}, /// Same pattern as with `decls_free_list`. -namespaces_free_list: std.ArrayListUnmanaged(Module.Namespace.Index) = .{}, +namespaces_free_list: std.ArrayListUnmanaged(NamespaceIndex) = .{}, /// Some types such as enums, structs, and unions need to store mappings from field names /// to field index, or value to field index. In such cases, they will store the underlying @@ -68,7 +68,6 @@ const Hash = std.hash.Wyhash; const InternPool = @This(); const Module = @import("Module.zig"); const Zir = @import("Zir.zig"); -const Sema = @import("Sema.zig"); const KeyAdapter = struct { intern_pool: *const InternPool, @@ -113,6 +112,50 @@ pub const RuntimeIndex = enum(u32) { } }; +pub const DeclIndex = enum(u32) { + _, + + pub fn toOptional(i: DeclIndex) OptionalDeclIndex { + return @enumFromInt(@intFromEnum(i)); + } +}; + +pub const OptionalDeclIndex = enum(u32) { + none = std.math.maxInt(u32), + _, + + pub fn init(oi: ?DeclIndex) OptionalDeclIndex { + return @enumFromInt(@intFromEnum(oi orelse return .none)); + } + + pub fn unwrap(oi: OptionalDeclIndex) ?DeclIndex { + if (oi == .none) return null; + return @enumFromInt(@intFromEnum(oi)); + } +}; + +pub const NamespaceIndex = enum(u32) { + _, + + pub fn toOptional(i: NamespaceIndex) OptionalNamespaceIndex { + return @enumFromInt(@intFromEnum(i)); + } +}; + +pub const OptionalNamespaceIndex = enum(u32) { + none = std.math.maxInt(u32), + _, + + pub fn init(oi: ?NamespaceIndex) OptionalNamespaceIndex { + return @enumFromInt(@intFromEnum(oi orelse return .none)); + } + + pub fn unwrap(oi: OptionalNamespaceIndex) ?NamespaceIndex { + if (oi == .none) return null; + return @enumFromInt(@intFromEnum(oi)); + } +}; + /// An index into `string_bytes`. pub const String = enum(u32) { _, @@ -351,9 +394,9 @@ pub const Key = union(enum) { pub const OpaqueType = extern struct { /// The Decl that corresponds to the opaque itself. - decl: Module.Decl.Index, + decl: DeclIndex, /// Represents the declarations inside this opaque. - namespace: Module.Namespace.Index, + namespace: NamespaceIndex, }; /// Although packed structs and non-packed structs are encoded differently, @@ -362,9 +405,9 @@ pub const Key = union(enum) { pub const StructType = struct { extra_index: u32, /// `none` when the struct is `@TypeOf(.{})`. - decl: Module.Decl.OptionalIndex, + decl: OptionalDeclIndex, /// `none` when the struct has no declarations. - namespace: Module.Namespace.OptionalIndex, + namespace: OptionalNamespaceIndex, /// Index of the struct_decl ZIR instruction. zir_index: Zir.Inst.Index, layout: std.builtin.Type.ContainerLayout, @@ -718,11 +761,11 @@ pub const Key = union(enum) { /// * Provide the other fields that do not require chasing the enum type. pub const UnionType = struct { /// The Decl that corresponds to the union itself. - decl: Module.Decl.Index, + decl: DeclIndex, /// The index of the `Tag.TypeUnion` payload. Ignored by `get`, /// populated by `indexToKey`. extra_index: u32, - namespace: Module.Namespace.Index, + namespace: NamespaceIndex, flags: Tag.TypeUnion.Flags, /// The enum that provides the list of field names and values. enum_tag_ty: Index, @@ -796,9 +839,9 @@ pub const Key = union(enum) { pub const EnumType = struct { /// The Decl that corresponds to the enum itself. - decl: Module.Decl.Index, + decl: DeclIndex, /// Represents the declarations inside this enum. - namespace: Module.Namespace.OptionalIndex, + namespace: OptionalNamespaceIndex, /// An integer type which is used for the numerical value of the enum. /// This field is present regardless of whether the enum has an /// explicitly provided tag type or auto-numbered. @@ -866,9 +909,9 @@ pub const Key = union(enum) { pub const IncompleteEnumType = struct { /// Same as corresponding `EnumType` field. - decl: Module.Decl.Index, + decl: DeclIndex, /// Same as corresponding `EnumType` field. - namespace: Module.Namespace.OptionalIndex, + namespace: OptionalNamespaceIndex, /// The field names and field values are not known yet, but /// the number of fields must be known ahead of time. fields_len: u32, @@ -961,7 +1004,7 @@ pub const Key = union(enum) { pub const Variable = struct { ty: Index, init: Index, - decl: Module.Decl.Index, + decl: DeclIndex, lib_name: OptionalNullTerminatedString = .none, is_extern: bool = false, is_const: bool = false, @@ -972,7 +1015,7 @@ pub const Key = union(enum) { pub const ExternFunc = struct { ty: Index, /// The Decl that corresponds to the function itself. - decl: Module.Decl.Index, + decl: DeclIndex, /// Library name if specified. /// For example `extern "c" fn write(...) usize` would have 'c' as library name. /// Index into the string table bytes. @@ -1008,7 +1051,7 @@ pub const Key = union(enum) { /// This will be 0 when the function is not a generic function instantiation. branch_quota_extra_index: u32, /// The Decl that corresponds to the function itself. - owner_decl: Module.Decl.Index, + owner_decl: DeclIndex, /// The ZIR instruction that is a function instruction. Use this to find /// the body. We store this rather than the body directly so that when ZIR /// is regenerated on update(), we can map this to the new corresponding @@ -1130,7 +1173,7 @@ pub const Key = union(enum) { pub const Addr = union(enum) { const Tag = @typeInfo(Addr).Union.tag_type.?; - decl: Module.Decl.Index, + decl: DeclIndex, mut_decl: MutDecl, anon_decl: AnonDecl, comptime_field: Index, @@ -1141,7 +1184,7 @@ pub const Key = union(enum) { field: BaseIndex, pub const MutDecl = struct { - decl: Module.Decl.Index, + decl: DeclIndex, runtime_index: RuntimeIndex, }; pub const BaseIndex = struct { @@ -1796,9 +1839,9 @@ pub const RequiresComptime = enum(u2) { no, yes, unknown, wip }; // needed by semantic analysis. pub const UnionType = struct { /// The Decl that corresponds to the union itself. - decl: Module.Decl.Index, + decl: DeclIndex, /// Represents the declarations inside this union. - namespace: Module.Namespace.Index, + namespace: NamespaceIndex, /// The enum tag type. enum_tag_ty: Index, /// The integer tag type of the enum. @@ -2168,7 +2211,7 @@ pub const Index = enum(u32) { simple_type: struct { data: SimpleType }, type_opaque: struct { data: *Key.OpaqueType }, type_struct: struct { data: *Tag.TypeStruct }, - type_struct_ns: struct { data: Module.Namespace.Index }, + type_struct_ns: struct { data: NamespaceIndex }, type_struct_anon: DataIsExtraIndexOfTypeStructAnon, type_struct_packed: struct { data: *Tag.TypeStructPacked }, type_struct_packed_inits: struct { data: *Tag.TypeStructPacked }, @@ -2609,7 +2652,7 @@ pub const Tag = enum(u8) { /// data == 0 represents `@TypeOf(.{})`. type_struct, /// A non-packed struct type that has only a namespace; no fields. - /// data is Module.Namespace.Index. + /// data is NamespaceIndex. type_struct_ns, /// An AnonStructType which stores types, names, and values for fields. /// data is extra index of `TypeStructAnon`. @@ -2902,7 +2945,7 @@ pub const Tag = enum(u8) { ty: Index, /// May be `none`. init: Index, - decl: Module.Decl.Index, + decl: DeclIndex, /// Library name if specified. /// For example `extern "c" var stderrp = ...` would have 'c' as library name. lib_name: OptionalNullTerminatedString, @@ -2931,7 +2974,7 @@ pub const Tag = enum(u8) { /// A `none` value marks that the inferred error set is not resolved yet. pub const FuncDecl = struct { analysis: FuncAnalysis, - owner_decl: Module.Decl.Index, + owner_decl: DeclIndex, ty: Index, zir_body_inst: Zir.Inst.Index, lbrace_line: u32, @@ -2948,7 +2991,7 @@ pub const Tag = enum(u8) { pub const FuncInstance = struct { analysis: FuncAnalysis, // Needed by the linker for codegen. Not part of hashing or equality. - owner_decl: Module.Decl.Index, + owner_decl: DeclIndex, ty: Index, branch_quota: u32, /// Points to a `FuncDecl`. @@ -3003,8 +3046,8 @@ pub const Tag = enum(u8) { size: u32, /// Only valid after .have_layout padding: u32, - decl: Module.Decl.Index, - namespace: Module.Namespace.Index, + decl: DeclIndex, + namespace: NamespaceIndex, /// The enum that provides the list of field names and values. tag_ty: Index, zir_index: Zir.Inst.Index, @@ -3028,10 +3071,10 @@ pub const Tag = enum(u8) { /// 1. name: NullTerminatedString for each fields_len /// 2. init: Index for each fields_len // if tag is type_struct_packed_inits pub const TypeStructPacked = struct { - decl: Module.Decl.Index, + decl: DeclIndex, zir_index: Zir.Inst.Index, fields_len: u32, - namespace: Module.Namespace.OptionalIndex, + namespace: OptionalNamespaceIndex, backing_int_ty: Index, names_map: MapIndex, flags: Flags, @@ -3066,7 +3109,7 @@ pub const Tag = enum(u8) { /// 2. if any_default_inits: /// init: Index // for each field in declared order /// 3. if has_namespace: - /// namespace: Module.Namespace.Index + /// namespace: NamespaceIndex /// 4. if any_aligned_fields: /// align: Alignment // for each field in declared order /// 5. if any_comptime_fields: @@ -3075,7 +3118,7 @@ pub const Tag = enum(u8) { /// field_index: RuntimeOrder // for each field in runtime order /// 7. field_offset: u32 // for each field in declared order, undef until layout_resolved pub const TypeStruct = struct { - decl: Module.Decl.Index, + decl: DeclIndex, zir_index: Zir.Inst.Index, fields_len: u32, flags: Flags, @@ -3418,9 +3461,9 @@ pub const Array = struct { /// 1. tag value: Index for each fields_len; declaration order pub const EnumExplicit = struct { /// The Decl that corresponds to the enum itself. - decl: Module.Decl.Index, + decl: DeclIndex, /// This may be `none` if there are no declarations. - namespace: Module.Namespace.OptionalIndex, + namespace: OptionalNamespaceIndex, /// An integer type which is used for the numerical value of the enum, which /// has been explicitly provided by the enum declaration. int_tag_type: Index, @@ -3437,9 +3480,9 @@ pub const EnumExplicit = struct { /// 0. field name: NullTerminatedString for each fields_len; declaration order pub const EnumAuto = struct { /// The Decl that corresponds to the enum itself. - decl: Module.Decl.Index, + decl: DeclIndex, /// This may be `none` if there are no declarations. - namespace: Module.Namespace.OptionalIndex, + namespace: OptionalNamespaceIndex, /// An integer type which is used for the numerical value of the enum, which /// was inferred by Zig based on the number of tags. int_tag_type: Index, @@ -3463,7 +3506,7 @@ pub const PackedU64 = packed struct(u64) { pub const PtrDecl = struct { ty: Index, - decl: Module.Decl.Index, + decl: DeclIndex, }; pub const PtrAnonDecl = struct { @@ -3480,7 +3523,7 @@ pub const PtrAnonDeclAligned = struct { pub const PtrMutDecl = struct { ty: Index, - decl: Module.Decl.Index, + decl: DeclIndex, runtime_index: RuntimeIndex, }; @@ -3754,7 +3797,7 @@ pub fn indexToKey(ip: *const InternPool, index: Index) Key { .type_struct_ns => .{ .struct_type = .{ .extra_index = 0, - .namespace = @as(Module.Namespace.Index, @enumFromInt(data)).toOptional(), + .namespace = @as(NamespaceIndex, @enumFromInt(data)).toOptional(), .decl = .none, .zir_index = undefined, .layout = .Auto, @@ -4280,7 +4323,7 @@ fn extraStructType(ip: *const InternPool, extra_index: u32) Key.StructType { }; const namespace = t: { if (!s.data.flags.has_namespace) break :t .none; - const namespace: Module.Namespace.Index = @enumFromInt(ip.extra.items[index]); + const namespace: NamespaceIndex = @enumFromInt(ip.extra.items[index]); index += 1; break :t namespace.toOptional(); }; @@ -5313,8 +5356,8 @@ pub fn get(ip: *InternPool, gpa: Allocator, key: Key) Allocator.Error!Index { pub const UnionTypeInit = struct { flags: Tag.TypeUnion.Flags, - decl: Module.Decl.Index, - namespace: Module.Namespace.Index, + decl: DeclIndex, + namespace: NamespaceIndex, zir_index: Zir.Inst.Index, fields_len: u32, enum_tag_ty: Index, @@ -5384,8 +5427,8 @@ pub fn getUnionType(ip: *InternPool, gpa: Allocator, ini: UnionTypeInit) Allocat } pub const StructTypeInit = struct { - decl: Module.Decl.Index, - namespace: Module.Namespace.OptionalIndex, + decl: DeclIndex, + namespace: OptionalNamespaceIndex, layout: std.builtin.Type.ContainerLayout, zir_index: Zir.Inst.Index, fields_len: u32, @@ -5659,7 +5702,7 @@ pub fn getExternFunc(ip: *InternPool, gpa: Allocator, key: Key.ExternFunc) Alloc } pub const GetFuncDeclKey = struct { - owner_decl: Module.Decl.Index, + owner_decl: DeclIndex, ty: Index, zir_body_inst: Zir.Inst.Index, lbrace_line: u32, @@ -5716,7 +5759,7 @@ pub fn getFuncDecl(ip: *InternPool, gpa: Allocator, key: GetFuncDeclKey) Allocat } pub const GetFuncDeclIesKey = struct { - owner_decl: Module.Decl.Index, + owner_decl: DeclIndex, param_types: []Index, noalias_bits: u32, comptime_bits: u32, @@ -6321,8 +6364,8 @@ fn getIncompleteEnumExplicit( } pub const GetEnumInit = struct { - decl: Module.Decl.Index, - namespace: Module.Namespace.OptionalIndex, + decl: DeclIndex, + namespace: OptionalNamespaceIndex, tag_ty: Index, names: []const NullTerminatedString, values: []const Index, @@ -6484,9 +6527,9 @@ fn addExtraAssumeCapacity(ip: *InternPool, extra: anytype) u32 { inline for (@typeInfo(@TypeOf(extra)).Struct.fields) |field| { ip.extra.appendAssumeCapacity(switch (field.type) { Index, - Module.Decl.Index, - Module.Namespace.Index, - Module.Namespace.OptionalIndex, + DeclIndex, + NamespaceIndex, + OptionalNamespaceIndex, MapIndex, OptionalMapIndex, RuntimeIndex, @@ -6560,9 +6603,9 @@ fn extraDataTrail(ip: *const InternPool, comptime T: type, index: usize) struct const int32 = ip.extra.items[i + index]; @field(result, field.name) = switch (field.type) { Index, - Module.Decl.Index, - Module.Namespace.Index, - Module.Namespace.OptionalIndex, + DeclIndex, + NamespaceIndex, + OptionalNamespaceIndex, MapIndex, OptionalMapIndex, RuntimeIndex, @@ -7554,15 +7597,15 @@ pub fn dumpGenericInstancesFallible(ip: *const InternPool, allocator: Allocator) try bw.flush(); } -pub fn declPtr(ip: *InternPool, index: Module.Decl.Index) *Module.Decl { +pub fn declPtr(ip: *InternPool, index: DeclIndex) *Module.Decl { return ip.allocated_decls.at(@intFromEnum(index)); } -pub fn declPtrConst(ip: *const InternPool, index: Module.Decl.Index) *const Module.Decl { +pub fn declPtrConst(ip: *const InternPool, index: DeclIndex) *const Module.Decl { return ip.allocated_decls.at(@intFromEnum(index)); } -pub fn namespacePtr(ip: *InternPool, index: Module.Namespace.Index) *Module.Namespace { +pub fn namespacePtr(ip: *InternPool, index: NamespaceIndex) *Module.Namespace { return ip.allocated_namespaces.at(@intFromEnum(index)); } @@ -7570,7 +7613,7 @@ pub fn createDecl( ip: *InternPool, gpa: Allocator, initialization: Module.Decl, -) Allocator.Error!Module.Decl.Index { +) Allocator.Error!DeclIndex { if (ip.decls_free_list.popOrNull()) |index| { ip.allocated_decls.at(@intFromEnum(index)).* = initialization; return index; @@ -7580,7 +7623,7 @@ pub fn createDecl( return @enumFromInt(ip.allocated_decls.len - 1); } -pub fn destroyDecl(ip: *InternPool, gpa: Allocator, index: Module.Decl.Index) void { +pub fn destroyDecl(ip: *InternPool, gpa: Allocator, index: DeclIndex) void { ip.declPtr(index).* = undefined; ip.decls_free_list.append(gpa, index) catch { // In order to keep `destroyDecl` a non-fallible function, we ignore memory @@ -7592,7 +7635,7 @@ pub fn createNamespace( ip: *InternPool, gpa: Allocator, initialization: Module.Namespace, -) Allocator.Error!Module.Namespace.Index { +) Allocator.Error!NamespaceIndex { if (ip.namespaces_free_list.popOrNull()) |index| { ip.allocated_namespaces.at(@intFromEnum(index)).* = initialization; return index; @@ -7602,7 +7645,7 @@ pub fn createNamespace( return @enumFromInt(ip.allocated_namespaces.len - 1); } -pub fn destroyNamespace(ip: *InternPool, gpa: Allocator, index: Module.Namespace.Index) void { +pub fn destroyNamespace(ip: *InternPool, gpa: Allocator, index: NamespaceIndex) void { ip.namespacePtr(index).* = .{ .parent = undefined, .file_scope = undefined, @@ -7984,7 +8027,7 @@ pub fn isVariable(ip: *const InternPool, val: Index) bool { return ip.items.items(.tag)[@intFromEnum(val)] == .variable; } -pub fn getBackingDecl(ip: *const InternPool, val: Index) Module.Decl.OptionalIndex { +pub fn getBackingDecl(ip: *const InternPool, val: Index) OptionalDeclIndex { var base = @intFromEnum(val); while (true) { switch (ip.items.items(.tag)[base]) { @@ -8358,7 +8401,7 @@ pub fn funcDeclInfo(ip: *const InternPool, i: Index) Key.Func { return extraFuncDecl(ip, datas[@intFromEnum(i)]); } -pub fn funcDeclOwner(ip: *const InternPool, i: Index) Module.Decl.Index { +pub fn funcDeclOwner(ip: *const InternPool, i: Index) DeclIndex { return funcDeclInfo(ip, i).owner_decl; } @@ -8424,7 +8467,7 @@ pub fn anonStructFieldsLen(ip: *const InternPool, i: Index) u32 { } /// Asserts the type is a struct. -pub fn structDecl(ip: *const InternPool, i: Index) Module.Decl.OptionalIndex { +pub fn structDecl(ip: *const InternPool, i: Index) OptionalDeclIndex { return switch (ip.indexToKey(i)) { .struct_type => |t| t.decl, else => unreachable, diff --git a/src/Module.zig b/src/Module.zig index fd5bb5b5dc..f5850d7a3a 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -464,27 +464,8 @@ pub const Decl = struct { anon, }; - pub const Index = enum(u32) { - _, - - pub fn toOptional(i: Index) OptionalIndex { - return @as(OptionalIndex, @enumFromInt(@intFromEnum(i))); - } - }; - - pub const OptionalIndex = enum(u32) { - none = std.math.maxInt(u32), - _, - - pub fn init(oi: ?Index) OptionalIndex { - return @as(OptionalIndex, @enumFromInt(@intFromEnum(oi orelse return .none))); - } - - pub fn unwrap(oi: OptionalIndex) ?Index { - if (oi == .none) return null; - return @as(Index, @enumFromInt(@intFromEnum(oi))); - } - }; + const Index = InternPool.DeclIndex; + const OptionalIndex = InternPool.OptionalDeclIndex; pub const DepsTable = std.AutoArrayHashMapUnmanaged(Decl.Index, DepType); @@ -828,27 +809,8 @@ pub const Namespace = struct { /// Value is whether the usingnamespace decl is marked `pub`. usingnamespace_set: std.AutoHashMapUnmanaged(Decl.Index, bool) = .{}, - pub const Index = enum(u32) { - _, - - pub fn toOptional(i: Index) OptionalIndex { - return @as(OptionalIndex, @enumFromInt(@intFromEnum(i))); - } - }; - - pub const OptionalIndex = enum(u32) { - none = std.math.maxInt(u32), - _, - - pub fn init(oi: ?Index) OptionalIndex { - return @as(OptionalIndex, @enumFromInt(@intFromEnum(oi orelse return .none))); - } - - pub fn unwrap(oi: OptionalIndex) ?Index { - if (oi == .none) return null; - return @as(Index, @enumFromInt(@intFromEnum(oi))); - } - }; + const Index = InternPool.NamespaceIndex; + const OptionalIndex = InternPool.OptionalNamespaceIndex; const DeclContext = struct { module: *Module, diff --git a/src/Sema.zig b/src/Sema.zig index 4a30c6d695..55bd531f96 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -20,7 +20,7 @@ inst_map: InstMap = .{}, /// and `src_decl` of `Block` is the `Decl` of the callee. /// This `Decl` owns the arena memory of this `Sema`. owner_decl: *Decl, -owner_decl_index: Decl.Index, +owner_decl_index: InternPool.DeclIndex, /// For an inline or comptime function call, this will be the root parent function /// which contains the callsite. Corresponds to `owner_decl`. /// This could be `none`, a `func_decl`, or a `func_instance`. @@ -54,7 +54,7 @@ comptime_break_inst: Zir.Inst.Index = undefined, /// access to the source location set by the previous instruction which did /// contain a mapped source location. src: LazySrcLoc = .{ .token_offset = 0 }, -decl_val_table: std.AutoHashMapUnmanaged(Decl.Index, Air.Inst.Ref) = .{}, +decl_val_table: std.AutoHashMapUnmanaged(InternPool.DeclIndex, Air.Inst.Ref) = .{}, /// When doing a generic function instantiation, this array collects a value /// for each parameter of the generic owner. `none` for non-comptime parameters. /// This is a separate array from `block.params` so that it can be passed @@ -71,7 +71,7 @@ generic_owner: InternPool.Index = .none, /// declaration site. generic_call_src: LazySrcLoc = .unneeded, /// Corresponds to `generic_call_src`. -generic_call_decl: Decl.OptionalIndex = .none, +generic_call_decl: InternPool.OptionalDeclIndex = .none, /// The key is types that must be fully resolved prior to machine code /// generation pass. Types are added to this set when resolving them /// immediately could cause a dependency loop, but they do need to be resolved @@ -101,7 +101,7 @@ unresolved_inferred_allocs: std.AutoHashMapUnmanaged(Air.Inst.Index, InferredAll /// TODO: this is a workaround for memory bugs triggered by the removal of /// Decl.value_arena. A better solution needs to be found. Probably this will /// involve transitioning comptime-mutable memory away from using Decls at all. -comptime_mutable_decls: *std.ArrayList(Decl.Index), +comptime_mutable_decls: *std.ArrayList(InternPool.DeclIndex), /// This is populated when `@setAlignStack` occurs so that if there is a duplicate /// one encountered, the conflicting source location can be shown. @@ -323,7 +323,7 @@ pub const Block = struct { sema: *Sema, /// The namespace to use for lookups from this source block /// When analyzing fields, this is different from src_decl.src_namespace. - namespace: Namespace.Index, + namespace: InternPool.NamespaceIndex, /// The AIR instructions generated for this block. instructions: std.ArrayListUnmanaged(Air.Inst.Index), // `param` instructions are collected here to be used by the `func` instruction. @@ -345,7 +345,7 @@ pub const Block = struct { /// This Decl is the Decl according to the Zig source code corresponding to this Block. /// This can vary during inline or comptime function calls. See `Sema.owner_decl` /// for the one that will be the same for all Block instances. - src_decl: Decl.Index, + src_decl: InternPool.DeclIndex, /// Non zero if a non-inline loop or a runtime conditional have been encountered. /// Stores to comptime variables are only allowed when var.runtime_index <= runtime_index. runtime_index: Value.RuntimeIndex = .zero, @@ -800,7 +800,7 @@ pub const Block = struct { } /// `alignment` value of 0 means to use ABI alignment. - pub fn finish(wad: *WipAnonDecl, ty: Type, val: Value, alignment: Alignment) !Decl.Index { + pub fn finish(wad: *WipAnonDecl, ty: Type, val: Value, alignment: Alignment) !InternPool.DeclIndex { const sema = wad.block.sema; // Do this ahead of time because `createAnonymousDecl` depends on calling // `type.hasRuntimeBits()`. @@ -2505,7 +2505,7 @@ fn failWithOwnedErrorMsg(sema: *Sema, block: ?*Block, err_msg: *Module.ErrorMsg) defer reference_stack.deinit(); // Avoid infinite loops. - var seen = std.AutoHashMap(Decl.Index, void).init(gpa); + var seen = std.AutoHashMap(InternPool.DeclIndex, void).init(gpa); defer seen.deinit(); while (mod.reference_table.get(referenced_by)) |ref| { @@ -2652,8 +2652,8 @@ fn analyzeAsInt( pub fn getStructType( sema: *Sema, - decl: Module.Decl.Index, - namespace: Module.Namespace.Index, + decl: InternPool.DeclIndex, + namespace: InternPool.NamespaceIndex, zir_index: Zir.Inst.Index, ) !InternPool.Index { const mod = sema.mod; @@ -2768,7 +2768,7 @@ fn createAnonymousDeclTypeNamed( name_strategy: Zir.Inst.NameStrategy, anon_prefix: []const u8, inst: ?Zir.Inst.Index, -) !Decl.Index { +) !InternPool.DeclIndex { const mod = sema.mod; const ip = &mod.intern_pool; const gpa = sema.gpa; @@ -6065,7 +6065,7 @@ pub fn analyzeExport( block: *Block, src: LazySrcLoc, options: Module.Export.Options, - exported_decl_index: Decl.Index, + exported_decl_index: InternPool.DeclIndex, ) !void { const gpa = sema.gpa; const mod = sema.mod; @@ -6380,7 +6380,7 @@ fn zirDeclVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air return sema.analyzeDeclVal(block, src, decl); } -fn lookupIdentifier(sema: *Sema, block: *Block, src: LazySrcLoc, name: InternPool.NullTerminatedString) !Decl.Index { +fn lookupIdentifier(sema: *Sema, block: *Block, src: LazySrcLoc, name: InternPool.NullTerminatedString) !InternPool.DeclIndex { const mod = sema.mod; var namespace = block.namespace; while (true) { @@ -6398,10 +6398,10 @@ fn lookupInNamespace( sema: *Sema, block: *Block, src: LazySrcLoc, - namespace_index: Namespace.Index, + namespace_index: InternPool.NamespaceIndex, ident_name: InternPool.NullTerminatedString, observe_usingnamespace: bool, -) CompileError!?Decl.Index { +) CompileError!?InternPool.DeclIndex { const mod = sema.mod; const namespace = mod.namespacePtr(namespace_index); @@ -6419,7 +6419,7 @@ fn lookupInNamespace( defer checked_namespaces.deinit(gpa); // Keep track of name conflicts for error notes. - var candidates: std.ArrayListUnmanaged(Decl.Index) = .{}; + var candidates: std.ArrayListUnmanaged(InternPool.DeclIndex) = .{}; defer candidates.deinit(gpa); try checked_namespaces.put(gpa, namespace, namespace.file_scope == src_file); @@ -7034,7 +7034,7 @@ const InlineCallSema = struct { other_error_return_trace_index_on_fn_entry: Air.Inst.Ref, other_generic_owner: InternPool.Index, other_generic_call_src: LazySrcLoc, - other_generic_call_decl: Decl.OptionalIndex, + other_generic_call_decl: InternPool.OptionalDeclIndex, /// Sema should currently be set up for the caller (i.e. unchanged yet). This init will not /// change that. The other parameters contain data for the callee Sema. The other modified @@ -7104,7 +7104,7 @@ const InlineCallSema = struct { std.mem.swap(InstMap, &ics.sema.inst_map, &ics.other_inst_map); std.mem.swap(InternPool.Index, &ics.sema.generic_owner, &ics.other_generic_owner); std.mem.swap(LazySrcLoc, &ics.sema.generic_call_src, &ics.other_generic_call_src); - std.mem.swap(Decl.OptionalIndex, &ics.sema.generic_call_decl, &ics.other_generic_call_decl); + std.mem.swap(InternPool.OptionalDeclIndex, &ics.sema.generic_call_decl, &ics.other_generic_call_decl); std.mem.swap(Air.Inst.Ref, &ics.sema.error_return_trace_index_on_fn_entry, &ics.other_error_return_trace_index_on_fn_entry); // zig fmt: on } @@ -17825,7 +17825,7 @@ fn typeInfoDecls( block: *Block, src: LazySrcLoc, type_info_ty: Type, - opt_namespace: Module.Namespace.OptionalIndex, + opt_namespace: InternPool.OptionalNamespaceIndex, ) CompileError!InternPool.Index { const mod = sema.mod; const gpa = sema.gpa; @@ -25760,7 +25760,7 @@ fn prepareSimplePanic(sema: *Sema, block: *Block) !void { /// Backends depend on panic decls being available when lowering safety-checked /// instructions. This function ensures the panic function will be available to /// be called during that time. -fn preparePanicId(sema: *Sema, block: *Block, panic_id: Module.PanicId) !Module.Decl.Index { +fn preparePanicId(sema: *Sema, block: *Block, panic_id: Module.PanicId) !InternPool.DeclIndex { const mod = sema.mod; const gpa = sema.gpa; if (mod.panic_messages[@intFromEnum(panic_id)].unwrap()) |x| return x; @@ -26685,9 +26685,9 @@ fn namespaceLookup( sema: *Sema, block: *Block, src: LazySrcLoc, - namespace: Namespace.Index, + namespace: InternPool.NamespaceIndex, decl_name: InternPool.NullTerminatedString, -) CompileError!?Decl.Index { +) CompileError!?InternPool.DeclIndex { const mod = sema.mod; const gpa = sema.gpa; if (try sema.lookupInNamespace(block, src, namespace, decl_name, true)) |decl_index| { @@ -26712,7 +26712,7 @@ fn namespaceLookupRef( sema: *Sema, block: *Block, src: LazySrcLoc, - namespace: Namespace.Index, + namespace: InternPool.NamespaceIndex, decl_name: InternPool.NullTerminatedString, ) CompileError!?Air.Inst.Ref { const decl = (try sema.namespaceLookup(block, src, namespace, decl_name)) orelse return null; @@ -26724,7 +26724,7 @@ fn namespaceLookupVal( sema: *Sema, block: *Block, src: LazySrcLoc, - namespace: Namespace.Index, + namespace: InternPool.NamespaceIndex, decl_name: InternPool.NullTerminatedString, ) CompileError!?Air.Inst.Ref { const decl = (try sema.namespaceLookup(block, src, namespace, decl_name)) orelse return null; @@ -31589,7 +31589,7 @@ fn analyzeDeclVal( sema: *Sema, block: *Block, src: LazySrcLoc, - decl_index: Decl.Index, + decl_index: InternPool.DeclIndex, ) CompileError!Air.Inst.Ref { try sema.addReferencedBy(block, src, decl_index); if (sema.decl_val_table.get(decl_index)) |result| { @@ -31609,7 +31609,7 @@ fn addReferencedBy( sema: *Sema, block: *Block, src: LazySrcLoc, - decl_index: Decl.Index, + decl_index: InternPool.DeclIndex, ) !void { if (sema.mod.comp.reference_trace == 0) return; if (src == .unneeded) { @@ -31626,7 +31626,7 @@ fn addReferencedBy( }); } -fn ensureDeclAnalyzed(sema: *Sema, decl_index: Decl.Index) CompileError!void { +fn ensureDeclAnalyzed(sema: *Sema, decl_index: InternPool.DeclIndex) CompileError!void { const mod = sema.mod; const ip = &mod.intern_pool; const decl = mod.declPtr(decl_index); @@ -31670,7 +31670,7 @@ fn optRefValue(sema: *Sema, opt_val: ?Value) !Value { } }))); } -fn analyzeDeclRef(sema: *Sema, decl_index: Decl.Index) CompileError!Air.Inst.Ref { +fn analyzeDeclRef(sema: *Sema, decl_index: InternPool.DeclIndex) CompileError!Air.Inst.Ref { return sema.analyzeDeclRefInner(decl_index, true); } @@ -31678,7 +31678,7 @@ fn analyzeDeclRef(sema: *Sema, decl_index: Decl.Index) CompileError!Air.Inst.Ref /// only triggers analysis for function bodies if `analyze_fn_body` is true. If it's possible for a /// decl_ref to end up in runtime code, the function body must be analyzed: `analyzeDeclRef` wraps /// this function with `analyze_fn_body` set to true. -fn analyzeDeclRefInner(sema: *Sema, decl_index: Decl.Index, analyze_fn_body: bool) CompileError!Air.Inst.Ref { +fn analyzeDeclRefInner(sema: *Sema, decl_index: InternPool.DeclIndex, analyze_fn_body: bool) CompileError!Air.Inst.Ref { const mod = sema.mod; try sema.ensureDeclAnalyzed(decl_index); @@ -31701,7 +31701,7 @@ fn analyzeDeclRefInner(sema: *Sema, decl_index: Decl.Index, analyze_fn_body: boo } }))); } -fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: Decl.Index) !void { +fn maybeQueueFuncBodyAnalysis(sema: *Sema, decl_index: InternPool.DeclIndex) !void { const mod = sema.mod; const decl = mod.declPtr(decl_index); const tv = try decl.typedValue(); @@ -34861,7 +34861,7 @@ fn semaBackingIntType(mod: *Module, struct_type: InternPool.Key.StructType) Comp var analysis_arena = std.heap.ArenaAllocator.init(gpa); defer analysis_arena.deinit(); - var comptime_mutable_decls = std.ArrayList(Decl.Index).init(gpa); + var comptime_mutable_decls = std.ArrayList(InternPool.DeclIndex).init(gpa); defer comptime_mutable_decls.deinit(); var sema: Sema = .{ @@ -35683,7 +35683,7 @@ fn semaStructFields( }, }; - var comptime_mutable_decls = std.ArrayList(Decl.Index).init(gpa); + var comptime_mutable_decls = std.ArrayList(InternPool.DeclIndex).init(gpa); defer comptime_mutable_decls.deinit(); var sema: Sema = .{ @@ -35949,7 +35949,7 @@ fn semaStructFieldInits( const zir_index = struct_type.zir_index; const fields_len, const small, var extra_index = structZirInfo(zir, zir_index); - var comptime_mutable_decls = std.ArrayList(Decl.Index).init(gpa); + var comptime_mutable_decls = std.ArrayList(InternPool.DeclIndex).init(gpa); defer comptime_mutable_decls.deinit(); var sema: Sema = .{ @@ -36133,7 +36133,7 @@ fn semaUnionFields(mod: *Module, arena: Allocator, union_type: InternPool.Key.Un const decl = mod.declPtr(decl_index); - var comptime_mutable_decls = std.ArrayList(Decl.Index).init(gpa); + var comptime_mutable_decls = std.ArrayList(InternPool.DeclIndex).init(gpa); defer comptime_mutable_decls.deinit(); var sema: Sema = .{ @@ -36561,7 +36561,7 @@ fn generateUnionTagTypeSimple( sema: *Sema, block: *Block, enum_field_names: []const InternPool.NullTerminatedString, - maybe_decl_index: Module.Decl.OptionalIndex, + maybe_decl_index: InternPool.OptionalDeclIndex, ) !InternPool.Index { const mod = sema.mod; const ip = &mod.intern_pool; @@ -36630,7 +36630,7 @@ fn getBuiltin(sema: *Sema, name: []const u8) CompileError!Air.Inst.Ref { return sema.analyzeDeclVal(&block, src, decl_index); } -fn getBuiltinDecl(sema: *Sema, block: *Block, name: []const u8) CompileError!Module.Decl.Index { +fn getBuiltinDecl(sema: *Sema, block: *Block, name: []const u8) CompileError!InternPool.DeclIndex { const gpa = sema.gpa; const src = LazySrcLoc.nodeOffset(0); diff --git a/src/Zir.zig b/src/Zir.zig index 1f1da17949..8d885ff692 100644 --- a/src/Zir.zig +++ b/src/Zir.zig @@ -21,9 +21,6 @@ const Ast = std.zig.Ast; const InternPool = @import("InternPool.zig"); const Zir = @This(); -const Type = @import("type.zig").Type; -const Value = @import("value.zig").Value; -const TypedValue = @import("TypedValue.zig"); const Module = @import("Module.zig"); const LazySrcLoc = Module.LazySrcLoc; diff --git a/src/arch/aarch64/CodeGen.zig b/src/arch/aarch64/CodeGen.zig index f06a4fc459..611eb267c2 100644 --- a/src/arch/aarch64/CodeGen.zig +++ b/src/arch/aarch64/CodeGen.zig @@ -52,7 +52,7 @@ bin_file: *link.File, debug_output: DebugInfoOutput, target: *const std.Target, func_index: InternPool.Index, -owner_decl: Module.Decl.Index, +owner_decl: InternPool.DeclIndex, err_msg: ?*ErrorMsg, args: []MCValue, ret_mcv: MCValue, diff --git a/src/arch/wasm/CodeGen.zig b/src/arch/wasm/CodeGen.zig index 7be2b2e2d3..caa71fe7ea 100644 --- a/src/arch/wasm/CodeGen.zig +++ b/src/arch/wasm/CodeGen.zig @@ -643,7 +643,7 @@ const CodeGen = @This(); /// Reference to the function declaration the code /// section belongs to decl: *Decl, -decl_index: Decl.Index, +decl_index: InternPool.DeclIndex, /// Current block depth. Used to calculate the relative difference between a break /// and block block_depth: u32 = 0, @@ -2194,7 +2194,7 @@ fn airCall(func: *CodeGen, inst: Air.Inst.Index, modifier: std.builtin.CallModif const fn_info = mod.typeToFunc(fn_ty).?; const first_param_sret = firstParamSRet(fn_info.cc, Type.fromInterned(fn_info.return_type), mod); - const callee: ?Decl.Index = blk: { + const callee: ?InternPool.DeclIndex = blk: { const func_val = (try func.air.value(pl_op.operand, mod)) orelse break :blk null; if (func_val.getFunction(mod)) |function| { @@ -3131,7 +3131,7 @@ fn lowerParentPtr(func: *CodeGen, ptr_val: Value, offset: u32) InnerError!WValue } } -fn lowerParentPtrDecl(func: *CodeGen, ptr_val: Value, decl_index: Module.Decl.Index, offset: u32) InnerError!WValue { +fn lowerParentPtrDecl(func: *CodeGen, ptr_val: Value, decl_index: InternPool.DeclIndex, offset: u32) InnerError!WValue { const mod = func.bin_file.base.options.module.?; const decl = mod.declPtr(decl_index); try mod.markDeclAlive(decl); @@ -3171,7 +3171,7 @@ fn lowerAnonDeclRef( } else return WValue{ .memory_offset = .{ .pointer = target_sym_index, .offset = offset } }; } -fn lowerDeclRefValue(func: *CodeGen, tv: TypedValue, decl_index: Module.Decl.Index, offset: u32) InnerError!WValue { +fn lowerDeclRefValue(func: *CodeGen, tv: TypedValue, decl_index: InternPool.DeclIndex, offset: u32) InnerError!WValue { const mod = func.bin_file.base.options.module.?; if (tv.ty.isSlice(mod)) { return WValue{ .memory = try func.bin_file.lowerUnnamedConst(tv, decl_index) }; diff --git a/src/arch/wasm/Emit.zig b/src/arch/wasm/Emit.zig index 1d0c461c96..d1b7114b12 100644 --- a/src/arch/wasm/Emit.zig +++ b/src/arch/wasm/Emit.zig @@ -6,6 +6,7 @@ const std = @import("std"); const Mir = @import("Mir.zig"); const link = @import("../../link.zig"); const Module = @import("../../Module.zig"); +const InternPool = @import("../../InternPool.zig"); const codegen = @import("../../codegen.zig"); const leb128 = std.leb; @@ -21,7 +22,7 @@ code: *std.ArrayList(u8), /// List of allocated locals. locals: []const u8, /// The declaration that code is being generated for. -decl_index: Module.Decl.Index, +decl_index: InternPool.DeclIndex, // Debug information /// Holds the debug information for this emission diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 4a2f63514e..478a1f7120 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -121,7 +121,7 @@ const Owner = union(enum) { func_index: InternPool.Index, lazy_sym: link.File.LazySymbol, - fn getDecl(owner: Owner, mod: *Module) Module.Decl.Index { + fn getDecl(owner: Owner, mod: *Module) InternPool.DeclIndex { return switch (owner) { .func_index => |func_index| mod.funcOwnerDeclIndex(func_index), .lazy_sym => |lazy_sym| lazy_sym.ty.getOwnerDecl(mod), @@ -1048,7 +1048,7 @@ pub fn generateLazy( const FormatDeclData = struct { mod: *Module, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, }; fn formatDecl( data: FormatDeclData, @@ -1058,7 +1058,7 @@ fn formatDecl( ) @TypeOf(writer).Error!void { try data.mod.declPtr(data.decl_index).renderFullyQualifiedName(data.mod, writer); } -fn fmtDecl(self: *Self, decl_index: Module.Decl.Index) std.fmt.Formatter(formatDecl) { +fn fmtDecl(self: *Self, decl_index: InternPool.DeclIndex) std.fmt.Formatter(formatDecl) { return .{ .data = .{ .mod = self.bin_file.options.module.?, .decl_index = decl_index, diff --git a/src/codegen.zig b/src/codegen.zig index ed5ac8ff0a..b7f50c2174 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -757,7 +757,7 @@ fn lowerAnonDeclRef( fn lowerDeclRef( bin_file: *link.File, src_loc: Module.SrcLoc, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, code: *std.ArrayList(u8), debug_output: DebugInfoOutput, reloc_info: RelocInfo, @@ -853,7 +853,7 @@ fn genDeclRef( bin_file: *link.File, src_loc: Module.SrcLoc, tv: TypedValue, - ptr_decl_index: Module.Decl.Index, + ptr_decl_index: InternPool.DeclIndex, ) CodeGenError!GenResult { const mod = bin_file.options.module.?; log.debug("genDeclRef: ty = {}, val = {}", .{ tv.ty.fmt(mod), tv.val.fmtValue(tv.ty, mod) }); @@ -959,7 +959,7 @@ fn genUnnamedConst( bin_file: *link.File, src_loc: Module.SrcLoc, tv: TypedValue, - owner_decl_index: Module.Decl.Index, + owner_decl_index: InternPool.DeclIndex, ) CodeGenError!GenResult { const mod = bin_file.options.module.?; log.debug("genUnnamedConst: ty = {}, val = {}", .{ tv.ty.fmt(mod), tv.val.fmtValue(tv.ty, mod) }); @@ -987,7 +987,7 @@ pub fn genTypedValue( bin_file: *link.File, src_loc: Module.SrcLoc, arg_tv: TypedValue, - owner_decl_index: Module.Decl.Index, + owner_decl_index: InternPool.DeclIndex, ) CodeGenError!GenResult { const mod = bin_file.options.module.?; const typed_value = arg_tv; diff --git a/src/codegen/c.zig b/src/codegen/c.zig index 5d0e0f4246..5e326336a5 100644 --- a/src/codegen/c.zig +++ b/src/codegen/c.zig @@ -39,8 +39,8 @@ pub const CValue = union(enum) { /// Index into a tuple's fields field: usize, /// By-value - decl: Decl.Index, - decl_ref: Decl.Index, + decl: InternPool.DeclIndex, + decl_ref: InternPool.DeclIndex, /// An undefined value (cannot be dereferenced) undef: Type, /// Render the slice as an identifier (using fmtIdent) @@ -57,9 +57,9 @@ const BlockData = struct { pub const CValueMap = std.AutoHashMap(Air.Inst.Ref, CValue); pub const LazyFnKey = union(enum) { - tag_name: Decl.Index, - never_tail: Decl.Index, - never_inline: Decl.Index, + tag_name: InternPool.DeclIndex, + never_tail: InternPool.DeclIndex, + never_inline: InternPool.DeclIndex, }; pub const LazyFnValue = struct { fn_name: []const u8, @@ -534,7 +534,7 @@ pub const DeclGen = struct { aligned_anon_decls: std.AutoArrayHashMapUnmanaged(InternPool.Index, Alignment), pub const Pass = union(enum) { - decl: Decl.Index, + decl: InternPool.DeclIndex, anon: InternPool.Index, flush, }; @@ -624,7 +624,7 @@ pub const DeclGen = struct { writer: anytype, ty: Type, val: Value, - decl_index: Decl.Index, + decl_index: InternPool.DeclIndex, location: ValueRenderLocation, ) error{ OutOfMemory, AnalysisFail }!void { const mod = dg.module; @@ -1585,7 +1585,7 @@ pub const DeclGen = struct { fn renderFunctionSignature( dg: *DeclGen, w: anytype, - fn_decl_index: Decl.Index, + fn_decl_index: InternPool.DeclIndex, kind: CType.Kind, name: union(enum) { export_index: u32, @@ -1926,7 +1926,7 @@ pub const DeclGen = struct { try dg.writeCValue(writer, member); } - fn renderFwdDecl(dg: *DeclGen, decl_index: Decl.Index, variable: InternPool.Key.Variable) !void { + fn renderFwdDecl(dg: *DeclGen, decl_index: InternPool.DeclIndex, variable: InternPool.Key.Variable) !void { const decl = dg.module.declPtr(decl_index); const fwd = dg.fwd_decl.writer(); const is_global = dg.declIsGlobal(.{ .ty = decl.ty, .val = decl.val }) or variable.is_extern; @@ -1948,7 +1948,7 @@ pub const DeclGen = struct { try fwd.writeAll(";\n"); } - fn renderDeclName(dg: *DeclGen, writer: anytype, decl_index: Decl.Index, export_index: u32) !void { + fn renderDeclName(dg: *DeclGen, writer: anytype, decl_index: InternPool.DeclIndex, export_index: u32) !void { const mod = dg.module; const decl = mod.declPtr(decl_index); try mod.markDeclAlive(decl); diff --git a/src/codegen/c/type.zig b/src/codegen/c/type.zig index 9b082eb0d5..57b6b97d75 100644 --- a/src/codegen/c/type.zig +++ b/src/codegen/c/type.zig @@ -7,6 +7,7 @@ const Target = std.Target; const Alignment = @import("../../InternPool.zig").Alignment; const Module = @import("../../Module.zig"); +const InternPool = @import("../../InternPool.zig"); const Type = @import("../../type.zig").Type; pub const CType = extern union { @@ -238,7 +239,7 @@ pub const CType = extern union { pub const FwdDecl = struct { base: Payload, - data: Module.Decl.Index, + data: InternPool.DeclIndex, }; pub const Fields = struct { @@ -257,7 +258,7 @@ pub const CType = extern union { base: Payload, data: struct { fields: Fields.Data, - owner_decl: Module.Decl.Index, + owner_decl: InternPool.DeclIndex, id: u32, }, }; diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 2299117990..a179b4cc1b 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -809,11 +809,11 @@ pub const Object = struct { /// version of the name and incorrectly get function not found in the llvm module. /// * it works for functions not all globals. /// Therefore, this table keeps track of the mapping. - decl_map: std.AutoHashMapUnmanaged(Module.Decl.Index, Builder.Global.Index), + decl_map: std.AutoHashMapUnmanaged(InternPool.DeclIndex, Builder.Global.Index), /// Same deal as `decl_map` but for anonymous declarations, which are always global constants. anon_decl_map: std.AutoHashMapUnmanaged(InternPool.Index, Builder.Global.Index), /// Serves the same purpose as `decl_map` but only used for the `is_named_enum_value` instruction. - named_enum_map: std.AutoHashMapUnmanaged(Module.Decl.Index, Builder.Function.Index), + named_enum_map: std.AutoHashMapUnmanaged(InternPool.DeclIndex, Builder.Function.Index), /// Maps Zig types to LLVM types. The table memory is backed by the GPA of /// the compiler. /// TODO when InternPool garbage collection is implemented, this map needs @@ -827,7 +827,7 @@ pub const Object = struct { /// This map is usually very close to empty. It tracks only the cases when a /// second extern Decl could not be emitted with the correct name due to a /// name collision. - extern_collisions: std.AutoArrayHashMapUnmanaged(Module.Decl.Index, void), + extern_collisions: std.AutoArrayHashMapUnmanaged(InternPool.DeclIndex, void), /// Memoizes a null `?usize` value. null_opt_usize: Builder.Constant, @@ -1660,7 +1660,7 @@ pub const Object = struct { try o.updateExports(mod, .{ .decl_index = decl_index }, mod.getDeclExports(decl_index)); } - pub fn updateDecl(self: *Object, module: *Module, decl_index: Module.Decl.Index) !void { + pub fn updateDecl(self: *Object, module: *Module, decl_index: InternPool.DeclIndex) !void { const decl = module.declPtr(decl_index); var dg: DeclGen = .{ .object = self, @@ -1893,7 +1893,7 @@ pub const Object = struct { } } - pub fn freeDecl(self: *Object, decl_index: Module.Decl.Index) void { + pub fn freeDecl(self: *Object, decl_index: InternPool.DeclIndex) void { const global = self.decl_map.get(decl_index) orelse return; global.delete(&self.builder); } @@ -2860,7 +2860,7 @@ pub const Object = struct { } } - fn namespaceToDebugScope(o: *Object, namespace_index: Module.Namespace.Index) !*llvm.DIScope { + fn namespaceToDebugScope(o: *Object, namespace_index: InternPool.NamespaceIndex) !*llvm.DIScope { const mod = o.module; const namespace = mod.namespacePtr(namespace_index); if (namespace.parent == .none) { @@ -2874,7 +2874,7 @@ pub const Object = struct { /// This is to be used instead of void for debug info types, to avoid tripping /// Assertion `!isa(Scope) && "shouldn't make a namespace scope for a type"' /// when targeting CodeView (Windows). - fn makeEmptyNamespaceDIType(o: *Object, decl_index: Module.Decl.Index) !*llvm.DIType { + fn makeEmptyNamespaceDIType(o: *Object, decl_index: InternPool.DeclIndex) !*llvm.DIType { const mod = o.module; const decl = mod.declPtr(decl_index); const fields: [0]*llvm.DIType = .{}; @@ -2932,7 +2932,7 @@ pub const Object = struct { /// completed, so if any attributes rely on that, they must be done in updateFunc, not here. fn resolveLlvmFunction( o: *Object, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, ) Allocator.Error!Builder.Function.Index { const mod = o.module; const ip = &mod.intern_pool; @@ -3152,7 +3152,7 @@ pub const Object = struct { fn resolveGlobalDecl( o: *Object, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, ) Allocator.Error!Builder.Variable.Index { const gop = try o.decl_map.getOrPut(o.gpa, decl_index); if (gop.found_existing) return gop.value_ptr.ptr(&o.builder).kind.variable; @@ -4330,7 +4330,7 @@ pub const Object = struct { return o.builder.bigIntConst(try o.builder.intType(ty.intInfo(mod).bits), bigint); } - fn lowerParentPtrDecl(o: *Object, decl_index: Module.Decl.Index) Allocator.Error!Builder.Constant { + fn lowerParentPtrDecl(o: *Object, decl_index: InternPool.DeclIndex) Allocator.Error!Builder.Constant { const mod = o.module; const decl = mod.declPtr(decl_index); try mod.markDeclAlive(decl); @@ -4505,7 +4505,7 @@ pub const Object = struct { } else .unneeded, llvm_val, try o.lowerType(ptr_ty)); } - fn lowerDeclRefValue(o: *Object, ty: Type, decl_index: Module.Decl.Index) Allocator.Error!Builder.Constant { + fn lowerDeclRefValue(o: *Object, ty: Type, decl_index: InternPool.DeclIndex) Allocator.Error!Builder.Constant { const mod = o.module; // In the case of something like: @@ -4653,7 +4653,7 @@ pub const Object = struct { pub const DeclGen = struct { object: *Object, decl: *Module.Decl, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, err_msg: ?*Module.ErrorMsg, fn todo(dg: *DeclGen, comptime format: []const u8, args: anytype) Error { diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig index 79ae4f1143..92e4b9b704 100644 --- a/src/codegen/spirv.zig +++ b/src/codegen/spirv.zig @@ -156,7 +156,7 @@ pub const Object = struct { /// The Zig module that this object file is generated for. /// A map of Zig decl indices to SPIR-V decl indices. - decl_link: std.AutoHashMapUnmanaged(Decl.Index, SpvModule.Decl.Index) = .{}, + decl_link: std.AutoHashMapUnmanaged(InternPool.DeclIndex, SpvModule.Decl.Index) = .{}, /// A map of Zig InternPool indices for anonymous decls to SPIR-V decl indices. anon_decl_link: std.AutoHashMapUnmanaged(struct { InternPool.Index, StorageClass }, SpvModule.Decl.Index) = .{}, @@ -187,7 +187,7 @@ pub const Object = struct { fn genDecl( self: *Object, mod: *Module, - decl_index: Decl.Index, + decl_index: InternPool.DeclIndex, air: Air, liveness: Liveness, ) !void { @@ -247,14 +247,14 @@ pub const Object = struct { pub fn updateDecl( self: *Object, mod: *Module, - decl_index: Decl.Index, + decl_index: InternPool.DeclIndex, ) !void { try self.genDecl(mod, decl_index, undefined, undefined); } /// Fetch or allocate a result id for decl index. This function also marks the decl as alive. /// Note: Function does not actually generate the decl, it just allocates an index. - pub fn resolveDecl(self: *Object, mod: *Module, decl_index: Decl.Index) !SpvModule.Decl.Index { + pub fn resolveDecl(self: *Object, mod: *Module, decl_index: InternPool.DeclIndex) !SpvModule.Decl.Index { const decl = mod.declPtr(decl_index); try mod.markDeclAlive(decl); @@ -289,7 +289,7 @@ const DeclGen = struct { spv: *SpvModule, /// The decl we are currently generating code for. - decl_index: Decl.Index, + decl_index: InternPool.DeclIndex, /// The intermediate code of the declaration we are currently generating. Note: If /// the declaration is not a function, this value will be undefined! @@ -1115,7 +1115,7 @@ const DeclGen = struct { } } - fn constantDeclRef(self: *DeclGen, ty: Type, decl_index: Decl.Index) !IdRef { + fn constantDeclRef(self: *DeclGen, ty: Type, decl_index: InternPool.DeclIndex) !IdRef { const mod = self.module; const ty_ref = try self.resolveType(ty, .direct); const ty_id = self.typeId(ty_ref); diff --git a/src/link.zig b/src/link.zig index c6b946ddc4..2c5b0f6656 100644 --- a/src/link.zig +++ b/src/link.zig @@ -552,7 +552,7 @@ pub const File = struct { /// Called from within the CodeGen to lower a local variable instantion as an unnamed /// constant. Returns the symbol index of the lowered constant in the read-only section /// of the final binary. - pub fn lowerUnnamedConst(base: *File, tv: TypedValue, decl_index: Module.Decl.Index) UpdateDeclError!u32 { + pub fn lowerUnnamedConst(base: *File, tv: TypedValue, decl_index: InternPool.DeclIndex) UpdateDeclError!u32 { if (build_options.only_c) @compileError("unreachable"); switch (base.tag) { // zig fmt: off @@ -591,7 +591,7 @@ pub const File = struct { } /// May be called before or after updateExports for any given Decl. - pub fn updateDecl(base: *File, module: *Module, decl_index: Module.Decl.Index) UpdateDeclError!void { + pub fn updateDecl(base: *File, module: *Module, decl_index: InternPool.DeclIndex) UpdateDeclError!void { const decl = module.declPtr(decl_index); assert(decl.has_tv); if (build_options.only_c) { @@ -632,7 +632,7 @@ pub const File = struct { } } - pub fn updateDeclLineNumber(base: *File, module: *Module, decl_index: Module.Decl.Index) UpdateDeclError!void { + pub fn updateDeclLineNumber(base: *File, module: *Module, decl_index: InternPool.DeclIndex) UpdateDeclError!void { const decl = module.declPtr(decl_index); assert(decl.has_tv); if (build_options.only_c) { @@ -849,7 +849,7 @@ pub const File = struct { } /// Called when a Decl is deleted from the Module. - pub fn freeDecl(base: *File, decl_index: Module.Decl.Index) void { + pub fn freeDecl(base: *File, decl_index: InternPool.DeclIndex) void { if (build_options.only_c) { assert(base.tag == .c); return @fieldParentPtr(C, "base", base).freeDecl(decl_index); @@ -928,7 +928,7 @@ pub const File = struct { /// `Decl`'s address was not yet resolved, or the containing atom gets moved in virtual memory. /// May be called before or after updateFunc/updateDecl therefore it is up to the linker to allocate /// the block/atom. - pub fn getDeclVAddr(base: *File, decl_index: Module.Decl.Index, reloc_info: RelocInfo) !u64 { + pub fn getDeclVAddr(base: *File, decl_index: InternPool.DeclIndex, reloc_info: RelocInfo) !u64 { if (build_options.only_c) unreachable; switch (base.tag) { .coff => return @fieldParentPtr(Coff, "base", base).getDeclVAddr(decl_index, reloc_info), @@ -972,7 +972,7 @@ pub const File = struct { } } - pub fn deleteDeclExport(base: *File, decl_index: Module.Decl.Index, name: InternPool.NullTerminatedString) !void { + pub fn deleteDeclExport(base: *File, decl_index: InternPool.DeclIndex, name: InternPool.NullTerminatedString) !void { if (build_options.only_c) unreachable; switch (base.tag) { .coff => return @fieldParentPtr(Coff, "base", base).deleteDeclExport(decl_index, name), @@ -1225,15 +1225,15 @@ pub const File = struct { kind: Kind, ty: Type, - pub fn initDecl(kind: Kind, decl: ?Module.Decl.Index, mod: *Module) LazySymbol { + pub fn initDecl(kind: Kind, decl: ?InternPool.DeclIndex, mod: *Module) LazySymbol { return .{ .kind = kind, .ty = if (decl) |decl_index| mod.declPtr(decl_index).val.toType() else Type.anyerror }; } - pub fn getDecl(self: LazySymbol, mod: *Module) Module.Decl.OptionalIndex { - return Module.Decl.OptionalIndex.init(self.ty.getOwnerDeclOrNull(mod)); + pub fn getDecl(self: LazySymbol, mod: *Module) InternPool.OptionalDeclIndex { + return InternPool.OptionalDeclIndex.init(self.ty.getOwnerDeclOrNull(mod)); } }; diff --git a/src/link/C.zig b/src/link/C.zig index 3632029418..a8721a0c02 100644 --- a/src/link/C.zig +++ b/src/link/C.zig @@ -24,7 +24,7 @@ base: link.File, /// This linker backend does not try to incrementally link output C source code. /// Instead, it tracks all declarations in this table, and iterates over it /// in the flush function, stitching pre-rendered pieces of C code together. -decl_table: std.AutoArrayHashMapUnmanaged(Module.Decl.Index, DeclBlock) = .{}, +decl_table: std.AutoArrayHashMapUnmanaged(InternPool.DeclIndex, DeclBlock) = .{}, /// All the string bytes of rendered C code, all squished into one array. /// While in progress, a separate buffer is used, and then when finished, the /// buffer is copied into this one. @@ -138,7 +138,7 @@ pub fn deinit(self: *C) void { self.code_buf.deinit(gpa); } -pub fn freeDecl(self: *C, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *C, decl_index: InternPool.DeclIndex) void { const gpa = self.base.allocator; if (self.decl_table.fetchSwapRemove(decl_index)) |kv| { var decl_block = kv.value; @@ -279,7 +279,7 @@ fn updateAnonDecl(self: *C, module: *Module, i: usize) !void { }; } -pub fn updateDecl(self: *C, module: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDecl(self: *C, module: *Module, decl_index: InternPool.DeclIndex) !void { const tracy = trace(@src()); defer tracy.end(); @@ -337,7 +337,7 @@ pub fn updateDecl(self: *C, module: *Module, decl_index: Module.Decl.Index) !voi gop.value_ptr.fwd_decl = try self.addString(object.dg.fwd_decl.items); } -pub fn updateDeclLineNumber(self: *C, module: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDeclLineNumber(self: *C, module: *Module, decl_index: InternPool.DeclIndex) !void { // The C backend does not have the ability to fix line numbers without re-generating // the entire Decl. _ = self; diff --git a/src/link/Coff.zig b/src/link/Coff.zig index fc60fc6b48..44b329d5b9 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -109,11 +109,11 @@ const HotUpdateState = struct { loaded_base_address: ?std.os.windows.HMODULE = null, }; -const DeclTable = std.AutoArrayHashMapUnmanaged(Module.Decl.Index, DeclMetadata); +const DeclTable = std.AutoArrayHashMapUnmanaged(InternPool.DeclIndex, DeclMetadata); const AnonDeclTable = std.AutoHashMapUnmanaged(InternPool.Index, DeclMetadata); const RelocTable = std.AutoArrayHashMapUnmanaged(Atom.Index, std.ArrayListUnmanaged(Relocation)); const BaseRelocationTable = std.AutoArrayHashMapUnmanaged(Atom.Index, std.ArrayListUnmanaged(u32)); -const UnnamedConstTable = std.AutoArrayHashMapUnmanaged(Module.Decl.Index, std.ArrayListUnmanaged(Atom.Index)); +const UnnamedConstTable = std.AutoArrayHashMapUnmanaged(InternPool.DeclIndex, std.ArrayListUnmanaged(Atom.Index)); const default_file_alignment: u16 = 0x200; const default_size_of_stack_reserve: u32 = 0x1000000; @@ -144,7 +144,7 @@ const Section = struct { free_list: std.ArrayListUnmanaged(Atom.Index) = .{}, }; -const LazySymbolTable = std.AutoArrayHashMapUnmanaged(Module.Decl.OptionalIndex, LazySymbolMetadata); +const LazySymbolTable = std.AutoArrayHashMapUnmanaged(InternPool.OptionalDeclIndex, LazySymbolMetadata); const LazySymbolMetadata = struct { const State = enum { unused, pending_flush, flushed }; @@ -1087,7 +1087,7 @@ pub fn updateFunc(self: *Coff, mod: *Module, func_index: InternPool.Index, air: return self.updateExports(mod, .{ .decl_index = decl_index }, mod.getDeclExports(decl_index)); } -pub fn lowerUnnamedConst(self: *Coff, tv: TypedValue, decl_index: Module.Decl.Index) !u32 { +pub fn lowerUnnamedConst(self: *Coff, tv: TypedValue, decl_index: InternPool.DeclIndex) !u32 { const gpa = self.base.allocator; const mod = self.base.options.module.?; const decl = mod.declPtr(decl_index); @@ -1157,7 +1157,7 @@ fn lowerConst(self: *Coff, name: []const u8, tv: TypedValue, required_alignment: pub fn updateDecl( self: *Coff, mod: *Module, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, ) link.File.UpdateDeclError!void { if (build_options.skip_non_native and builtin.object_format != .coff) { @panic("Attempted to compile for object format that was disabled by build configuration"); @@ -1302,7 +1302,7 @@ pub fn getOrCreateAtomForLazySymbol(self: *Coff, sym: link.File.LazySymbol) !Ato return atom; } -pub fn getOrCreateAtomForDecl(self: *Coff, decl_index: Module.Decl.Index) !Atom.Index { +pub fn getOrCreateAtomForDecl(self: *Coff, decl_index: InternPool.DeclIndex) !Atom.Index { const gop = try self.decls.getOrPut(self.base.allocator, decl_index); if (!gop.found_existing) { gop.value_ptr.* = .{ @@ -1314,7 +1314,7 @@ pub fn getOrCreateAtomForDecl(self: *Coff, decl_index: Module.Decl.Index) !Atom. return gop.value_ptr.atom; } -fn getDeclOutputSection(self: *Coff, decl_index: Module.Decl.Index) u16 { +fn getDeclOutputSection(self: *Coff, decl_index: InternPool.DeclIndex) u16 { const decl = self.base.options.module.?.declPtr(decl_index); const ty = decl.ty; const mod = self.base.options.module.?; @@ -1340,7 +1340,7 @@ fn getDeclOutputSection(self: *Coff, decl_index: Module.Decl.Index) u16 { return index; } -fn updateDeclCode(self: *Coff, decl_index: Module.Decl.Index, code: []u8, complex_type: coff.ComplexType) !void { +fn updateDeclCode(self: *Coff, decl_index: InternPool.DeclIndex, code: []u8, complex_type: coff.ComplexType) !void { const mod = self.base.options.module.?; const decl = mod.declPtr(decl_index); @@ -1398,7 +1398,7 @@ fn updateDeclCode(self: *Coff, decl_index: Module.Decl.Index, code: []u8, comple try self.writeAtom(atom_index, code); } -fn freeUnnamedConsts(self: *Coff, decl_index: Module.Decl.Index) void { +fn freeUnnamedConsts(self: *Coff, decl_index: InternPool.DeclIndex) void { const gpa = self.base.allocator; const unnamed_consts = self.unnamed_const_atoms.getPtr(decl_index) orelse return; for (unnamed_consts.items) |atom_index| { @@ -1407,7 +1407,7 @@ fn freeUnnamedConsts(self: *Coff, decl_index: Module.Decl.Index) void { unnamed_consts.clearAndFree(gpa); } -pub fn freeDecl(self: *Coff, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *Coff, decl_index: InternPool.DeclIndex) void { if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index); const mod = self.base.options.module.?; @@ -1563,7 +1563,7 @@ pub fn updateExports( pub fn deleteDeclExport( self: *Coff, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, name_ip: InternPool.NullTerminatedString, ) void { if (self.llvm_object) |_| return; @@ -1766,7 +1766,7 @@ pub fn flushModule(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod assert(!self.imports_count_dirty); } -pub fn getDeclVAddr(self: *Coff, decl_index: Module.Decl.Index, reloc_info: link.File.RelocInfo) !u64 { +pub fn getDeclVAddr(self: *Coff, decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo) !u64 { assert(self.llvm_object == null); const this_atom_index = try self.getOrCreateAtomForDecl(decl_index); @@ -1882,7 +1882,7 @@ pub fn getGlobalSymbol(self: *Coff, name: []const u8, lib_name_name: ?[]const u8 return global_index; } -pub fn updateDeclLineNumber(self: *Coff, module: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDeclLineNumber(self: *Coff, module: *Module, decl_index: InternPool.DeclIndex) !void { _ = self; _ = module; _ = decl_index; diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig index f9fe41c029..ef803a45f1 100644 --- a/src/link/Dwarf.zig +++ b/src/link/Dwarf.zig @@ -35,7 +35,7 @@ di_files: std.AutoArrayHashMapUnmanaged(*const Module.File, void) = .{}, global_abbrev_relocs: std.ArrayListUnmanaged(AbbrevRelocation) = .{}, -const AtomTable = std.AutoHashMapUnmanaged(Module.Decl.Index, Atom.Index); +const AtomTable = std.AutoHashMapUnmanaged(InternPool.DeclIndex, Atom.Index); const Atom = struct { /// Offset into .debug_info pointing to the tag for this Decl, or @@ -555,7 +555,7 @@ pub const DeclState = struct { self: *DeclState, name: [:0]const u8, ty: Type, - owner_decl: Module.Decl.Index, + owner_decl: InternPool.DeclIndex, loc: DbgInfoLoc, ) error{OutOfMemory}!void { const dbg_info = &self.dbg_info; @@ -669,7 +669,7 @@ pub const DeclState = struct { self: *DeclState, name: [:0]const u8, ty: Type, - owner_decl: Module.Decl.Index, + owner_decl: InternPool.DeclIndex, is_ptr: bool, loc: DbgInfoLoc, ) error{OutOfMemory}!void { @@ -1073,7 +1073,7 @@ pub fn deinit(self: *Dwarf) void { /// Initializes Decl's state and its matching output buffers. /// Call this before `commitDeclState`. -pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: Module.Decl.Index) !DeclState { +pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: InternPool.DeclIndex) !DeclState { const tracy = trace(@src()); defer tracy.end(); @@ -1191,7 +1191,7 @@ pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: Module.Decl.Index) pub fn commitDeclState( self: *Dwarf, mod: *Module, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, sym_addr: u64, sym_size: u64, decl_state: *DeclState, @@ -1640,7 +1640,7 @@ fn writeDeclDebugInfo(self: *Dwarf, atom_index: Atom.Index, dbg_info_buf: []cons } } -pub fn updateDeclLineNumber(self: *Dwarf, mod: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDeclLineNumber(self: *Dwarf, mod: *Module, decl_index: InternPool.DeclIndex) !void { const tracy = trace(@src()); defer tracy.end(); @@ -1682,7 +1682,7 @@ pub fn updateDeclLineNumber(self: *Dwarf, mod: *Module, decl_index: Module.Decl. } } -pub fn freeDecl(self: *Dwarf, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *Dwarf, decl_index: InternPool.DeclIndex) void { const gpa = self.allocator; // Free SrcFn atom @@ -2627,7 +2627,7 @@ pub fn flushModule(self: *Dwarf, module: *Module) !void { } } -fn addDIFile(self: *Dwarf, mod: *Module, decl_index: Module.Decl.Index) !u28 { +fn addDIFile(self: *Dwarf, mod: *Module, decl_index: InternPool.DeclIndex) !u28 { const decl = mod.declPtr(decl_index); const file_scope = decl.getFileScope(mod); const gop = try self.di_files.getOrPut(self.allocator, file_scope); @@ -2771,7 +2771,7 @@ fn createAtom(self: *Dwarf, comptime kind: Kind) !Atom.Index { return index; } -fn getOrCreateAtomForDecl(self: *Dwarf, comptime kind: Kind, decl_index: Module.Decl.Index) !Atom.Index { +fn getOrCreateAtomForDecl(self: *Dwarf, comptime kind: Kind, decl_index: InternPool.DeclIndex) !Atom.Index { switch (kind) { .src_fn => { const gop = try self.src_fn_decls.getOrPut(self.allocator, decl_index); diff --git a/src/link/Elf.zig b/src/link/Elf.zig index e64ad222ad..7c1e46dd89 100644 --- a/src/link/Elf.zig +++ b/src/link/Elf.zig @@ -400,7 +400,7 @@ pub fn deinit(self: *Elf) void { self.comdat_group_sections.deinit(gpa); } -pub fn getDeclVAddr(self: *Elf, decl_index: Module.Decl.Index, reloc_info: link.File.RelocInfo) !u64 { +pub fn getDeclVAddr(self: *Elf, decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo) !u64 { assert(self.llvm_object == null); return self.zigObjectPtr().?.getDeclVAddr(self, decl_index, reloc_info); } @@ -3127,7 +3127,7 @@ fn writeElfHeader(self: *Elf) !void { try self.base.file.?.pwriteAll(hdr_buf[0..index], 0); } -pub fn freeDecl(self: *Elf, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *Elf, decl_index: InternPool.DeclIndex) void { if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index); return self.zigObjectPtr().?.freeDecl(self, decl_index); } @@ -3143,7 +3143,7 @@ pub fn updateFunc(self: *Elf, mod: *Module, func_index: InternPool.Index, air: A pub fn updateDecl( self: *Elf, mod: *Module, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, ) link.File.UpdateDeclError!void { if (build_options.skip_non_native and builtin.object_format != .elf) { @panic("Attempted to compile for object format that was disabled by build configuration"); @@ -3152,7 +3152,7 @@ pub fn updateDecl( return self.zigObjectPtr().?.updateDecl(self, mod, decl_index); } -pub fn lowerUnnamedConst(self: *Elf, typed_value: TypedValue, decl_index: Module.Decl.Index) !u32 { +pub fn lowerUnnamedConst(self: *Elf, typed_value: TypedValue, decl_index: InternPool.DeclIndex) !u32 { return self.zigObjectPtr().?.lowerUnnamedConst(self, typed_value, decl_index); } @@ -3170,14 +3170,14 @@ pub fn updateExports( return self.zigObjectPtr().?.updateExports(self, mod, exported, exports); } -pub fn updateDeclLineNumber(self: *Elf, mod: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDeclLineNumber(self: *Elf, mod: *Module, decl_index: InternPool.DeclIndex) !void { if (self.llvm_object) |_| return; return self.zigObjectPtr().?.updateDeclLineNumber(mod, decl_index); } pub fn deleteDeclExport( self: *Elf, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, name: InternPool.NullTerminatedString, ) void { if (self.llvm_object) |_| return; diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig index ae546c5d62..ef029c7702 100644 --- a/src/link/Elf/ZigObject.zig +++ b/src/link/Elf/ZigObject.zig @@ -618,7 +618,7 @@ pub fn codeAlloc(self: ZigObject, elf_file: *Elf, atom_index: Atom.Index) ![]u8 pub fn getDeclVAddr( self: *ZigObject, elf_file: *Elf, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo, ) !u64 { const this_sym_index = try self.getOrCreateMetadataForDecl(elf_file, decl_index); @@ -741,7 +741,7 @@ pub fn getOrCreateMetadataForLazySymbol( return symbol_index; } -fn freeUnnamedConsts(self: *ZigObject, elf_file: *Elf, decl_index: Module.Decl.Index) void { +fn freeUnnamedConsts(self: *ZigObject, elf_file: *Elf, decl_index: InternPool.DeclIndex) void { const unnamed_consts = self.unnamed_consts.getPtr(decl_index) orelse return; for (unnamed_consts.items) |sym_index| { self.freeDeclMetadata(elf_file, sym_index); @@ -759,7 +759,7 @@ fn freeDeclMetadata(self: *ZigObject, elf_file: *Elf, sym_index: Symbol.Index) v // TODO free GOT entry here } -pub fn freeDecl(self: *ZigObject, elf_file: *Elf, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *ZigObject, elf_file: *Elf, decl_index: InternPool.DeclIndex) void { const mod = elf_file.base.options.module.?; const decl = mod.declPtr(decl_index); @@ -781,7 +781,7 @@ pub fn freeDecl(self: *ZigObject, elf_file: *Elf, decl_index: Module.Decl.Index) pub fn getOrCreateMetadataForDecl( self: *ZigObject, elf_file: *Elf, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, ) !Symbol.Index { const gop = try self.decls.getOrPut(elf_file.base.allocator, decl_index); if (!gop.found_existing) { @@ -857,7 +857,7 @@ fn getDeclShdrIndex( fn updateDeclCode( self: *ZigObject, elf_file: *Elf, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, sym_index: Symbol.Index, shdr_index: u16, code: []const u8, @@ -956,7 +956,7 @@ fn updateDeclCode( fn updateTlv( self: *ZigObject, elf_file: *Elf, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, sym_index: Symbol.Index, shndx: u16, code: []const u8, @@ -1083,7 +1083,7 @@ pub fn updateDecl( self: *ZigObject, elf_file: *Elf, mod: *Module, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, ) link.File.UpdateDeclError!void { const tracy = trace(@src()); defer tracy.end(); @@ -1249,7 +1249,7 @@ pub fn lowerUnnamedConst( self: *ZigObject, elf_file: *Elf, typed_value: TypedValue, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, ) !u32 { const gpa = elf_file.base.allocator; const mod = elf_file.base.options.module.?; @@ -1435,7 +1435,7 @@ pub fn updateExports( pub fn updateDeclLineNumber( self: *ZigObject, mod: *Module, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, ) !void { const tracy = trace(@src()); defer tracy.end(); @@ -1453,7 +1453,7 @@ pub fn updateDeclLineNumber( pub fn deleteDeclExport( self: *ZigObject, elf_file: *Elf, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, name: InternPool.NullTerminatedString, ) void { const metadata = self.decls.getPtr(decl_index) orelse return; @@ -1584,10 +1584,10 @@ const TlsVariable = struct { }; const AtomList = std.ArrayListUnmanaged(Atom.Index); -const UnnamedConstTable = std.AutoHashMapUnmanaged(Module.Decl.Index, std.ArrayListUnmanaged(Symbol.Index)); -const DeclTable = std.AutoHashMapUnmanaged(Module.Decl.Index, DeclMetadata); +const UnnamedConstTable = std.AutoHashMapUnmanaged(InternPool.DeclIndex, std.ArrayListUnmanaged(Symbol.Index)); +const DeclTable = std.AutoHashMapUnmanaged(InternPool.DeclIndex, DeclMetadata); const AnonDeclTable = std.AutoHashMapUnmanaged(InternPool.Index, DeclMetadata); -const LazySymbolTable = std.AutoArrayHashMapUnmanaged(Module.Decl.OptionalIndex, LazySymbolMetadata); +const LazySymbolTable = std.AutoArrayHashMapUnmanaged(InternPool.OptionalDeclIndex, LazySymbolMetadata); const TlsTable = std.AutoArrayHashMapUnmanaged(Atom.Index, TlsVariable); const assert = std.debug.assert; diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 9d30c374dc..61446b3300 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -2278,7 +2278,7 @@ pub fn updateFunc(self: *MachO, mod: *Module, func_index: InternPool.Index, air: try self.updateExports(mod, .{ .decl_index = decl_index }, mod.getDeclExports(decl_index)); } -pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl_index: Module.Decl.Index) !u32 { +pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl_index: InternPool.DeclIndex) !u32 { const gpa = self.base.allocator; const mod = self.base.options.module.?; const gop = try self.unnamed_const_atoms.getOrPut(gpa, decl_index); @@ -2358,7 +2358,7 @@ fn lowerConst( return .{ .ok = atom_index }; } -pub fn updateDecl(self: *MachO, mod: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDecl(self: *MachO, mod: *Module, decl_index: InternPool.DeclIndex) !void { if (build_options.skip_non_native and builtin.object_format != .macho) { @panic("Attempted to compile for object format that was disabled by build configuration"); } @@ -2544,7 +2544,7 @@ pub fn getOrCreateAtomForLazySymbol(self: *MachO, sym: File.LazySymbol) !Atom.In return atom; } -fn updateThreadlocalVariable(self: *MachO, module: *Module, decl_index: Module.Decl.Index) !void { +fn updateThreadlocalVariable(self: *MachO, module: *Module, decl_index: InternPool.DeclIndex) !void { const mod = self.base.options.module.?; // Lowering a TLV on macOS involves two stages: // 1. first we lower the initializer into appopriate section (__thread_data or __thread_bss) @@ -2639,7 +2639,7 @@ fn updateThreadlocalVariable(self: *MachO, module: *Module, decl_index: Module.D self.markRelocsDirtyByTarget(init_atom_sym_loc); } -pub fn getOrCreateAtomForDecl(self: *MachO, decl_index: Module.Decl.Index) !Atom.Index { +pub fn getOrCreateAtomForDecl(self: *MachO, decl_index: InternPool.DeclIndex) !Atom.Index { const gop = try self.decls.getOrPut(self.base.allocator, decl_index); if (!gop.found_existing) { const sym_index = try self.allocateSymbol(); @@ -2654,7 +2654,7 @@ pub fn getOrCreateAtomForDecl(self: *MachO, decl_index: Module.Decl.Index) !Atom return gop.value_ptr.atom; } -fn getDeclOutputSection(self: *MachO, decl_index: Module.Decl.Index) u8 { +fn getDeclOutputSection(self: *MachO, decl_index: InternPool.DeclIndex) u8 { const decl = self.base.options.module.?.declPtr(decl_index); const ty = decl.ty; const val = decl.val; @@ -2693,7 +2693,7 @@ fn getDeclOutputSection(self: *MachO, decl_index: Module.Decl.Index) u8 { return sect_id; } -fn updateDeclCode(self: *MachO, decl_index: Module.Decl.Index, code: []u8) !u64 { +fn updateDeclCode(self: *MachO, decl_index: InternPool.DeclIndex, code: []u8) !u64 { const gpa = self.base.allocator; const mod = self.base.options.module.?; const decl = mod.declPtr(decl_index); @@ -2764,7 +2764,7 @@ fn updateDeclCode(self: *MachO, decl_index: Module.Decl.Index, code: []u8) !u64 return atom.getSymbol(self).n_value; } -pub fn updateDeclLineNumber(self: *MachO, module: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDeclLineNumber(self: *MachO, module: *Module, decl_index: InternPool.DeclIndex) !void { if (self.d_sym) |*d_sym| { try d_sym.dwarf.updateDeclLineNumber(module, decl_index); } @@ -2906,7 +2906,7 @@ pub fn updateExports( pub fn deleteDeclExport( self: *MachO, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, name: InternPool.NullTerminatedString, ) Allocator.Error!void { if (self.llvm_object) |_| return; @@ -2940,7 +2940,7 @@ pub fn deleteDeclExport( sym_index.* = 0; } -fn freeUnnamedConsts(self: *MachO, decl_index: Module.Decl.Index) void { +fn freeUnnamedConsts(self: *MachO, decl_index: InternPool.DeclIndex) void { const gpa = self.base.allocator; const unnamed_consts = self.unnamed_const_atoms.getPtr(decl_index) orelse return; for (unnamed_consts.items) |atom| { @@ -2949,7 +2949,7 @@ fn freeUnnamedConsts(self: *MachO, decl_index: Module.Decl.Index) void { unnamed_consts.clearAndFree(gpa); } -pub fn freeDecl(self: *MachO, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *MachO, decl_index: InternPool.DeclIndex) void { if (self.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index); const mod = self.base.options.module.?; const decl = mod.declPtr(decl_index); @@ -2968,7 +2968,7 @@ pub fn freeDecl(self: *MachO, decl_index: Module.Decl.Index) void { } } -pub fn getDeclVAddr(self: *MachO, decl_index: Module.Decl.Index, reloc_info: File.RelocInfo) !u64 { +pub fn getDeclVAddr(self: *MachO, decl_index: InternPool.DeclIndex, reloc_info: File.RelocInfo) !u64 { assert(self.llvm_object == null); const this_atom_index = try self.getOrCreateAtomForDecl(decl_index); @@ -5667,7 +5667,7 @@ const is_hot_update_compatible = switch (builtin.target.os.tag) { else => false, }; -const LazySymbolTable = std.AutoArrayHashMapUnmanaged(Module.Decl.OptionalIndex, LazySymbolMetadata); +const LazySymbolTable = std.AutoArrayHashMapUnmanaged(InternPool.OptionalDeclIndex, LazySymbolMetadata); const LazySymbolMetadata = struct { const State = enum { unused, pending_flush, flushed }; @@ -5701,10 +5701,10 @@ const DeclMetadata = struct { } }; -const DeclTable = std.AutoArrayHashMapUnmanaged(Module.Decl.Index, DeclMetadata); +const DeclTable = std.AutoArrayHashMapUnmanaged(InternPool.DeclIndex, DeclMetadata); const AnonDeclTable = std.AutoHashMapUnmanaged(InternPool.Index, DeclMetadata); const BindingTable = std.AutoArrayHashMapUnmanaged(Atom.Index, std.ArrayListUnmanaged(Atom.Binding)); -const UnnamedConstTable = std.AutoArrayHashMapUnmanaged(Module.Decl.Index, std.ArrayListUnmanaged(Atom.Index)); +const UnnamedConstTable = std.AutoArrayHashMapUnmanaged(InternPool.DeclIndex, std.ArrayListUnmanaged(Atom.Index)); const RebaseTable = std.AutoArrayHashMapUnmanaged(Atom.Index, std.ArrayListUnmanaged(u32)); const RelocationTable = std.AutoArrayHashMapUnmanaged(Atom.Index, std.ArrayListUnmanaged(Relocation)); const ActionTable = std.AutoHashMapUnmanaged(u32, RelocFlags); diff --git a/src/link/NvPtx.zig b/src/link/NvPtx.zig index 5ccdb7218a..606c5f1237 100644 --- a/src/link/NvPtx.zig +++ b/src/link/NvPtx.zig @@ -70,7 +70,7 @@ pub fn updateFunc(self: *NvPtx, module: *Module, func_index: InternPool.Index, a try self.llvm_object.updateFunc(module, func_index, air, liveness); } -pub fn updateDecl(self: *NvPtx, module: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDecl(self: *NvPtx, module: *Module, decl_index: InternPool.DeclIndex) !void { return self.llvm_object.updateDecl(module, decl_index); } @@ -86,7 +86,7 @@ pub fn updateExports( return self.llvm_object.updateExports(module, exported, exports); } -pub fn freeDecl(self: *NvPtx, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *NvPtx, decl_index: InternPool.DeclIndex) void { return self.llvm_object.freeDecl(decl_index); } diff --git a/src/link/Plan9.zig b/src/link/Plan9.zig index 0d29cae6dc..b608b29161 100644 --- a/src/link/Plan9.zig +++ b/src/link/Plan9.zig @@ -56,10 +56,10 @@ path_arena: std.heap.ArenaAllocator, /// If we group the decls by file, it makes it really easy to do this (put the symbol in the correct place) fn_decl_table: std.AutoArrayHashMapUnmanaged( *Module.File, - struct { sym_index: u32, functions: std.AutoArrayHashMapUnmanaged(Module.Decl.Index, FnDeclOutput) = .{} }, + struct { sym_index: u32, functions: std.AutoArrayHashMapUnmanaged(InternPool.DeclIndex, FnDeclOutput) = .{} }, ) = .{}, /// the code is modified when relocated, so that is why it is mutable -data_decl_table: std.AutoArrayHashMapUnmanaged(Module.Decl.Index, []u8) = .{}, +data_decl_table: std.AutoArrayHashMapUnmanaged(InternPool.DeclIndex, []u8) = .{}, /// Table of unnamed constants associated with a parent `Decl`. /// We store them here so that we can free the constants whenever the `Decl` @@ -102,7 +102,7 @@ got_index_free_list: std.ArrayListUnmanaged(usize) = .{}, syms_index_free_list: std.ArrayListUnmanaged(usize) = .{}, atoms: std.ArrayListUnmanaged(Atom) = .{}, -decls: std.AutoHashMapUnmanaged(Module.Decl.Index, DeclMetadata) = .{}, +decls: std.AutoHashMapUnmanaged(InternPool.DeclIndex, DeclMetadata) = .{}, /// Indices of the three "special" symbols into atoms etext_edata_end_atom_indices: [3]?Atom.Index = .{ null, null, null }, @@ -129,9 +129,9 @@ const Bases = struct { data: u64, }; -const UnnamedConstTable = std.AutoHashMapUnmanaged(Module.Decl.Index, std.ArrayListUnmanaged(Atom.Index)); +const UnnamedConstTable = std.AutoHashMapUnmanaged(InternPool.DeclIndex, std.ArrayListUnmanaged(Atom.Index)); -const LazySymbolTable = std.AutoArrayHashMapUnmanaged(Module.Decl.OptionalIndex, LazySymbolMetadata); +const LazySymbolTable = std.AutoArrayHashMapUnmanaged(InternPool.OptionalDeclIndex, LazySymbolMetadata); const LazySymbolMetadata = struct { const State = enum { unused, pending_flush, flushed }; @@ -168,7 +168,7 @@ pub const Atom = struct { code_ptr: ?[*]u8, other: union { code_len: usize, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, }, fn fromSlice(slice: []u8) CodePtr { return .{ .code_ptr = slice.ptr, .other = .{ .code_len = slice.len } }; @@ -322,7 +322,7 @@ pub fn createEmpty(gpa: Allocator, options: link.Options) !*Plan9 { return self; } -fn putFn(self: *Plan9, decl_index: Module.Decl.Index, out: FnDeclOutput) !void { +fn putFn(self: *Plan9, decl_index: InternPool.DeclIndex, out: FnDeclOutput) !void { const gpa = self.base.allocator; const mod = self.base.options.module.?; const decl = mod.declPtr(decl_index); @@ -447,7 +447,7 @@ pub fn updateFunc(self: *Plan9, mod: *Module, func_index: InternPool.Index, air: return self.updateFinish(decl_index); } -pub fn lowerUnnamedConst(self: *Plan9, tv: TypedValue, decl_index: Module.Decl.Index) !u32 { +pub fn lowerUnnamedConst(self: *Plan9, tv: TypedValue, decl_index: InternPool.DeclIndex) !u32 { _ = try self.seeDecl(decl_index); var code_buffer = std.ArrayList(u8).init(self.base.allocator); defer code_buffer.deinit(); @@ -508,7 +508,7 @@ pub fn lowerUnnamedConst(self: *Plan9, tv: TypedValue, decl_index: Module.Decl.I return new_atom_idx; } -pub fn updateDecl(self: *Plan9, mod: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDecl(self: *Plan9, mod: *Module, decl_index: InternPool.DeclIndex) !void { const decl = mod.declPtr(decl_index); if (decl.isExtern(mod)) { @@ -544,7 +544,7 @@ pub fn updateDecl(self: *Plan9, mod: *Module, decl_index: Module.Decl.Index) !vo return self.updateFinish(decl_index); } /// called at the end of update{Decl,Func} -fn updateFinish(self: *Plan9, decl_index: Module.Decl.Index) !void { +fn updateFinish(self: *Plan9, decl_index: InternPool.DeclIndex) !void { const mod = self.base.options.module.?; const decl = mod.declPtr(decl_index); const is_fn = (decl.ty.zigTypeTag(mod) == .Fn); @@ -982,7 +982,7 @@ pub fn flushModule(self: *Plan9, comp: *Compilation, prog_node: *std.Progress.No fn addDeclExports( self: *Plan9, mod: *Module, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, exports: []const *Module.Export, ) !void { const metadata = self.decls.getPtr(decl_index).?; @@ -1017,7 +1017,7 @@ fn addDeclExports( } } -pub fn freeDecl(self: *Plan9, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *Plan9, decl_index: InternPool.DeclIndex) void { // TODO audit the lifetimes of decls table entries. It's possible to get // freeDecl without any updateDecl in between. // However that is planned to change, see the TODO comment in Module.zig @@ -1063,7 +1063,7 @@ pub fn freeDecl(self: *Plan9, decl_index: Module.Decl.Index) void { assert(self.relocs.remove(atom_index)); } } -fn freeUnnamedConsts(self: *Plan9, decl_index: Module.Decl.Index) void { +fn freeUnnamedConsts(self: *Plan9, decl_index: InternPool.DeclIndex) void { const unnamed_consts = self.unnamed_const_atoms.getPtr(decl_index) orelse return; for (unnamed_consts.items) |atom_idx| { const atom = self.getAtom(atom_idx); @@ -1088,7 +1088,7 @@ fn createAtom(self: *Plan9) !Atom.Index { return index; } -pub fn seeDecl(self: *Plan9, decl_index: Module.Decl.Index) !Atom.Index { +pub fn seeDecl(self: *Plan9, decl_index: InternPool.DeclIndex) !Atom.Index { const gop = try self.decls.getOrPut(self.base.allocator, decl_index); if (!gop.found_existing) { const index = try self.createAtom(); @@ -1428,7 +1428,7 @@ pub fn writeSyms(self: *Plan9, buf: *std.ArrayList(u8)) !void { } /// Must be called only after a successful call to `updateDecl`. -pub fn updateDeclLineNumber(self: *Plan9, mod: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDeclLineNumber(self: *Plan9, mod: *Module, decl_index: InternPool.DeclIndex) !void { _ = self; _ = mod; _ = decl_index; @@ -1436,7 +1436,7 @@ pub fn updateDeclLineNumber(self: *Plan9, mod: *Module, decl_index: Module.Decl. pub fn getDeclVAddr( self: *Plan9, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo, ) !u64 { const mod = self.base.options.module.?; diff --git a/src/link/SpirV.zig b/src/link/SpirV.zig index d897029f24..ac36a391ec 100644 --- a/src/link/SpirV.zig +++ b/src/link/SpirV.zig @@ -109,7 +109,7 @@ pub fn updateFunc(self: *SpirV, module: *Module, func_index: InternPool.Index, a try self.object.updateFunc(module, func_index, air, liveness); } -pub fn updateDecl(self: *SpirV, module: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDecl(self: *SpirV, module: *Module, decl_index: InternPool.DeclIndex) !void { if (build_options.skip_non_native) { @panic("Attempted to compile for architecture that was disabled by build configuration"); } @@ -144,7 +144,7 @@ pub fn updateExports( // TODO: Export regular functions, variables, etc using Linkage attributes. } -pub fn freeDecl(self: *SpirV, decl_index: Module.Decl.Index) void { +pub fn freeDecl(self: *SpirV, decl_index: InternPool.DeclIndex) void { _ = self; _ = decl_index; } diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig index 8b1039497c..82f9f9f20d 100644 --- a/src/link/Wasm.zig +++ b/src/link/Wasm.zig @@ -48,7 +48,7 @@ llvm_object: ?*LlvmObject = null, host_name: []const u8 = "env", /// List of all `Decl` that are currently alive. /// Each index maps to the corresponding `Atom.Index`. -decls: std.AutoHashMapUnmanaged(Module.Decl.Index, Atom.Index) = .{}, +decls: std.AutoHashMapUnmanaged(InternPool.DeclIndex, Atom.Index) = .{}, /// Mapping between an `Atom` and its type index representing the Wasm /// type of the function signature. atom_types: std.AutoHashMapUnmanaged(Atom.Index, u32) = .{}, @@ -598,10 +598,10 @@ fn parseObjectFile(wasm: *Wasm, path: []const u8) !bool { return true; } -/// For a given `Module.Decl.Index` returns its corresponding `Atom.Index`. +/// For a given `InternPool.DeclIndex` returns its corresponding `Atom.Index`. /// When the index was not found, a new `Atom` will be created, and its index will be returned. /// The newly created Atom is empty with default fields as specified by `Atom.empty`. -pub fn getOrCreateAtomForDecl(wasm: *Wasm, decl_index: Module.Decl.Index) !Atom.Index { +pub fn getOrCreateAtomForDecl(wasm: *Wasm, decl_index: InternPool.DeclIndex) !Atom.Index { const gop = try wasm.decls.getOrPut(wasm.base.allocator, decl_index); if (!gop.found_existing) { const atom_index = try wasm.createAtom(); @@ -1427,7 +1427,7 @@ pub fn updateFunc(wasm: *Wasm, mod: *Module, func_index: InternPool.Index, air: // Generate code for the Decl, storing it in memory to be later written to // the file on flush(). -pub fn updateDecl(wasm: *Wasm, mod: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDecl(wasm: *Wasm, mod: *Module, decl_index: InternPool.DeclIndex) !void { if (build_options.skip_non_native and builtin.object_format != .wasm) { @panic("Attempted to compile for object format that was disabled by build configuration"); } @@ -1479,7 +1479,7 @@ pub fn updateDecl(wasm: *Wasm, mod: *Module, decl_index: Module.Decl.Index) !voi return wasm.finishUpdateDecl(decl_index, code, .data); } -pub fn updateDeclLineNumber(wasm: *Wasm, mod: *Module, decl_index: Module.Decl.Index) !void { +pub fn updateDeclLineNumber(wasm: *Wasm, mod: *Module, decl_index: InternPool.DeclIndex) !void { if (wasm.llvm_object) |_| return; if (wasm.dwarf) |*dw| { const tracy = trace(@src()); @@ -1493,7 +1493,7 @@ pub fn updateDeclLineNumber(wasm: *Wasm, mod: *Module, decl_index: Module.Decl.I } } -fn finishUpdateDecl(wasm: *Wasm, decl_index: Module.Decl.Index, code: []const u8, symbol_tag: Symbol.Tag) !void { +fn finishUpdateDecl(wasm: *Wasm, decl_index: InternPool.DeclIndex, code: []const u8, symbol_tag: Symbol.Tag) !void { const mod = wasm.base.options.module.?; const decl = mod.declPtr(decl_index); const atom_index = wasm.decls.get(decl_index).?; @@ -1556,7 +1556,7 @@ fn getFunctionSignature(wasm: *const Wasm, loc: SymbolLoc) std.wasm.Type { /// Lowers a constant typed value to a local symbol and atom. /// Returns the symbol index of the local /// The given `decl` is the parent decl whom owns the constant. -pub fn lowerUnnamedConst(wasm: *Wasm, tv: TypedValue, decl_index: Module.Decl.Index) !u32 { +pub fn lowerUnnamedConst(wasm: *Wasm, tv: TypedValue, decl_index: InternPool.DeclIndex) !u32 { const mod = wasm.base.options.module.?; assert(tv.ty.zigTypeTag(mod) != .Fn); // cannot create local symbols for functions const decl = mod.declPtr(decl_index); @@ -1672,7 +1672,7 @@ pub fn getGlobalSymbol(wasm: *Wasm, name: []const u8, lib_name: ?[]const u8) !u3 /// Returns the given pointer address pub fn getDeclVAddr( wasm: *Wasm, - decl_index: Module.Decl.Index, + decl_index: InternPool.DeclIndex, reloc_info: link.File.RelocInfo, ) !u64 { const mod = wasm.base.options.module.?; @@ -1780,7 +1780,7 @@ pub fn getAnonDeclVAddr(wasm: *Wasm, decl_val: InternPool.Index, reloc_info: lin return target_symbol_index; } -pub fn deleteDeclExport(wasm: *Wasm, decl_index: Module.Decl.Index) void { +pub fn deleteDeclExport(wasm: *Wasm, decl_index: InternPool.DeclIndex) void { if (wasm.llvm_object) |_| return; const atom_index = wasm.decls.get(decl_index) orelse return; const sym_index = wasm.getAtom(atom_index).sym_index; @@ -1923,7 +1923,7 @@ pub fn updateExports( } } -pub fn freeDecl(wasm: *Wasm, decl_index: Module.Decl.Index) void { +pub fn freeDecl(wasm: *Wasm, decl_index: InternPool.DeclIndex) void { if (wasm.llvm_object) |llvm_object| return llvm_object.freeDecl(decl_index); const mod = wasm.base.options.module.?; const decl = mod.declPtr(decl_index); @@ -5012,7 +5012,7 @@ pub fn putOrGetFuncType(wasm: *Wasm, func_type: std.wasm.Type) !u32 { /// For the given `decl_index`, stores the corresponding type representing the function signature. /// Asserts declaration has an associated `Atom`. /// Returns the index into the list of types. -pub fn storeDeclType(wasm: *Wasm, decl_index: Module.Decl.Index, func_type: std.wasm.Type) !u32 { +pub fn storeDeclType(wasm: *Wasm, decl_index: InternPool.DeclIndex, func_type: std.wasm.Type) !u32 { const atom_index = wasm.decls.get(decl_index).?; const index = try wasm.putOrGetFuncType(func_type); try wasm.atom_types.put(wasm.base.allocator, atom_index, index); diff --git a/src/type.zig b/src/type.zig index b914432793..dbf73c0eb2 100644 --- a/src/type.zig +++ b/src/type.zig @@ -2778,7 +2778,7 @@ pub const Type = struct { } /// Returns null if the type has no namespace. - pub fn getNamespaceIndex(ty: Type, mod: *Module) Module.Namespace.OptionalIndex { + pub fn getNamespaceIndex(ty: Type, mod: *Module) InternPool.OptionalNamespaceIndex { return switch (mod.intern_pool.indexToKey(ty.toIntern())) { .opaque_type => |opaque_type| opaque_type.namespace.toOptional(), .struct_type => |struct_type| struct_type.namespace, @@ -3123,11 +3123,11 @@ pub const Type = struct { }; } - pub fn getOwnerDecl(ty: Type, mod: *Module) Module.Decl.Index { + pub fn getOwnerDecl(ty: Type, mod: *Module) InternPool.DeclIndex { return ty.getOwnerDeclOrNull(mod) orelse unreachable; } - pub fn getOwnerDeclOrNull(ty: Type, mod: *Module) ?Module.Decl.Index { + pub fn getOwnerDeclOrNull(ty: Type, mod: *Module) ?InternPool.DeclIndex { return switch (mod.intern_pool.indexToKey(ty.toIntern())) { .struct_type => |struct_type| struct_type.decl.unwrap(), .union_type => |union_type| union_type.decl, diff --git a/src/value.zig b/src/value.zig index eacdc96c28..f046b9ae3d 100644 --- a/src/value.zig +++ b/src/value.zig @@ -1556,7 +1556,7 @@ pub const Value = struct { /// Gets the decl referenced by this pointer. If the pointer does not point /// to a decl, or if it points to some part of a decl (like field_ptr or element_ptr), /// this function returns null. - pub fn pointerDecl(val: Value, mod: *Module) ?Module.Decl.Index { + pub fn pointerDecl(val: Value, mod: *Module) ?InternPool.DeclIndex { return switch (mod.intern_pool.indexToKey(val.toIntern())) { .variable => |variable| variable.decl, .extern_func => |extern_func| extern_func.decl,