diff options
| author | Matthew Lugg <mlugg@mlugg.co.uk> | 2024-06-20 11:07:17 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-20 11:07:17 +0100 |
| commit | f73be120f4254c080c48081dfc5834a7ebc9d9cf (patch) | |
| tree | e70598bed09659eb61c230620c1ddf88c14db905 /src/link | |
| parent | ccd3cc3266762c1fea93cdc0190eaf71718d9e6a (diff) | |
| parent | 2b677d1660018434757f9c9efec3c712675e6c47 (diff) | |
| download | zig-f73be120f4254c080c48081dfc5834a7ebc9d9cf.tar.gz zig-f73be120f4254c080c48081dfc5834a7ebc9d9cf.zip | |
Merge pull request #20299 from mlugg/the-great-decl-split
The Great Decl Split (preliminary work): refactor source locations and eliminate `Sema.Block.src_decl`.
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/Coff.zig | 12 | ||||
| -rw-r--r-- | src/link/Elf/ZigObject.zig | 16 | ||||
| -rw-r--r-- | src/link/MachO/ZigObject.zig | 12 | ||||
| -rw-r--r-- | src/link/Plan9.zig | 14 | ||||
| -rw-r--r-- | src/link/Wasm/ZigObject.zig | 20 |
5 files changed, 42 insertions, 32 deletions
diff --git a/src/link/Coff.zig b/src/link/Coff.zig index d24d69d913..4a58e970c1 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -1144,7 +1144,7 @@ pub fn updateFunc(self: *Coff, mod: *Module, func_index: InternPool.Index, air: const res = try codegen.generateFunction( &self.base, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), func_index, air, liveness, @@ -1181,7 +1181,7 @@ pub fn lowerUnnamedConst(self: *Coff, val: Value, decl_index: InternPool.DeclInd const sym_name = try std.fmt.allocPrint(gpa, "__unnamed_{}_{d}", .{ decl_name.fmt(&mod.intern_pool), index }); defer gpa.free(sym_name); const ty = val.typeOf(mod); - const atom_index = switch (try self.lowerConst(sym_name, val, ty.abiAlignment(mod), self.rdata_section_index.?, decl.srcLoc(mod))) { + const atom_index = switch (try self.lowerConst(sym_name, val, ty.abiAlignment(mod), self.rdata_section_index.?, decl.navSrcLoc(mod).upgrade(mod))) { .ok => |atom_index| atom_index, .fail => |em| { decl.analysis = .codegen_failure; @@ -1272,7 +1272,7 @@ pub fn updateDecl( defer code_buffer.deinit(); const decl_val = if (decl.val.getVariable(mod)) |variable| Value.fromInterned(variable.init) else decl.val; - const res = try codegen.generateSymbol(&self.base, decl.srcLoc(mod), decl_val, &code_buffer, .none, .{ + const res = try codegen.generateSymbol(&self.base, decl.navSrcLoc(mod).upgrade(mod), decl_val, &code_buffer, .none, .{ .parent_atom_index = atom.getSymbolIndex().?, }); const code = switch (res) { @@ -1313,12 +1313,12 @@ fn updateLazySymbolAtom( const atom = self.getAtomPtr(atom_index); const local_sym_index = atom.getSymbolIndex().?; - const src = if (sym.ty.getOwnerDeclOrNull(mod)) |owner_decl| - mod.declPtr(owner_decl).srcLoc(mod) + const src = if (sym.ty.srcLocOrNull(mod)) |src| + src.upgrade(mod) else Module.SrcLoc{ .file_scope = undefined, - .parent_decl_node = undefined, + .base_node = undefined, .lazy = .unneeded, }; const res = try codegen.generateLazySymbol( diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig index 451c363f56..0ee141ec4c 100644 --- a/src/link/Elf/ZigObject.zig +++ b/src/link/Elf/ZigObject.zig @@ -1074,7 +1074,7 @@ pub fn updateFunc( const res = if (decl_state) |*ds| try codegen.generateFunction( &elf_file.base, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), func_index, air, liveness, @@ -1084,7 +1084,7 @@ pub fn updateFunc( else try codegen.generateFunction( &elf_file.base, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), func_index, air, liveness, @@ -1158,13 +1158,13 @@ pub fn updateDecl( // TODO implement .debug_info for global variables const decl_val = if (decl.val.getVariable(mod)) |variable| Value.fromInterned(variable.init) else decl.val; const res = if (decl_state) |*ds| - try codegen.generateSymbol(&elf_file.base, decl.srcLoc(mod), decl_val, &code_buffer, .{ + try codegen.generateSymbol(&elf_file.base, decl.navSrcLoc(mod).upgrade(mod), decl_val, &code_buffer, .{ .dwarf = ds, }, .{ .parent_atom_index = sym_index, }) else - try codegen.generateSymbol(&elf_file.base, decl.srcLoc(mod), decl_val, &code_buffer, .none, .{ + try codegen.generateSymbol(&elf_file.base, decl.navSrcLoc(mod).upgrade(mod), decl_val, &code_buffer, .none, .{ .parent_atom_index = sym_index, }); @@ -1221,12 +1221,12 @@ fn updateLazySymbol( break :blk try self.strtab.insert(gpa, name); }; - const src = if (sym.ty.getOwnerDeclOrNull(mod)) |owner_decl| - mod.declPtr(owner_decl).srcLoc(mod) + const src = if (sym.ty.srcLocOrNull(mod)) |src| + src.upgrade(mod) else Module.SrcLoc{ .file_scope = undefined, - .parent_decl_node = undefined, + .base_node = undefined, .lazy = .unneeded, }; const res = try codegen.generateLazySymbol( @@ -1306,7 +1306,7 @@ pub fn lowerUnnamedConst( val, ty.abiAlignment(mod), elf_file.zig_data_rel_ro_section_index.?, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), )) { .ok => |sym_index| sym_index, .fail => |em| { diff --git a/src/link/MachO/ZigObject.zig b/src/link/MachO/ZigObject.zig index 6168d40d96..cf92503f5a 100644 --- a/src/link/MachO/ZigObject.zig +++ b/src/link/MachO/ZigObject.zig @@ -682,7 +682,7 @@ pub fn updateFunc( const dio: codegen.DebugInfoOutput = if (decl_state) |*ds| .{ .dwarf = ds } else .none; const res = try codegen.generateFunction( &macho_file.base, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), func_index, air, liveness, @@ -756,7 +756,7 @@ pub fn updateDecl( const decl_val = if (decl.val.getVariable(mod)) |variable| Value.fromInterned(variable.init) else decl.val; const dio: codegen.DebugInfoOutput = if (decl_state) |*ds| .{ .dwarf = ds } else .none; - const res = try codegen.generateSymbol(&macho_file.base, decl.srcLoc(mod), decl_val, &code_buffer, dio, .{ + const res = try codegen.generateSymbol(&macho_file.base, decl.navSrcLoc(mod).upgrade(mod), decl_val, &code_buffer, dio, .{ .parent_atom_index = sym_index, }); @@ -1104,7 +1104,7 @@ pub fn lowerUnnamedConst( val, val.typeOf(mod).abiAlignment(mod), macho_file.zig_const_sect_index.?, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), )) { .ok => |sym_index| sym_index, .fail => |em| { @@ -1294,12 +1294,12 @@ fn updateLazySymbol( break :blk try self.strtab.insert(gpa, name); }; - const src = if (lazy_sym.ty.getOwnerDeclOrNull(mod)) |owner_decl| - mod.declPtr(owner_decl).srcLoc(mod) + const src = if (lazy_sym.ty.srcLocOrNull(mod)) |src| + src.upgrade(mod) else Module.SrcLoc{ .file_scope = undefined, - .parent_decl_node = undefined, + .base_node = undefined, .lazy = .unneeded, }; const res = try codegen.generateLazySymbol( diff --git a/src/link/Plan9.zig b/src/link/Plan9.zig index ec5278e62b..ac6ae6752c 100644 --- a/src/link/Plan9.zig +++ b/src/link/Plan9.zig @@ -433,7 +433,7 @@ pub fn updateFunc(self: *Plan9, mod: *Module, func_index: InternPool.Index, air: const res = try codegen.generateFunction( &self.base, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), func_index, air, liveness, @@ -499,7 +499,7 @@ pub fn lowerUnnamedConst(self: *Plan9, val: Value, decl_index: InternPool.DeclIn }; self.syms.items[info.sym_index.?] = sym; - const res = try codegen.generateSymbol(&self.base, decl.srcLoc(mod), val, &code_buffer, .{ + const res = try codegen.generateSymbol(&self.base, decl.navSrcLoc(mod).upgrade(mod), val, &code_buffer, .{ .none = {}, }, .{ .parent_atom_index = new_atom_idx, @@ -538,7 +538,7 @@ pub fn updateDecl(self: *Plan9, mod: *Module, decl_index: InternPool.DeclIndex) defer code_buffer.deinit(); const decl_val = if (decl.val.getVariable(mod)) |variable| Value.fromInterned(variable.init) else decl.val; // TODO we need the symbol index for symbol in the table of locals for the containing atom - const res = try codegen.generateSymbol(&self.base, decl.srcLoc(mod), decl_val, &code_buffer, .{ .none = {} }, .{ + const res = try codegen.generateSymbol(&self.base, decl.navSrcLoc(mod).upgrade(mod), decl_val, &code_buffer, .{ .none = {} }, .{ .parent_atom_index = @as(Atom.Index, @intCast(atom_idx)), }); const code = switch (res) { @@ -1020,7 +1020,7 @@ fn addDeclExports( { try mod.failed_exports.put(mod.gpa, exp, try Module.ErrorMsg.create( gpa, - mod.declPtr(decl_index).srcLoc(mod), + mod.declPtr(decl_index).navSrcLoc(mod).upgrade(mod), "plan9 does not support extra sections", .{}, )); @@ -1212,12 +1212,12 @@ fn updateLazySymbolAtom(self: *Plan9, sym: File.LazySymbol, atom_index: Atom.Ind self.syms.items[self.getAtomPtr(atom_index).sym_index.?] = symbol; // generate the code - const src = if (sym.ty.getOwnerDeclOrNull(mod)) |owner_decl| - mod.declPtr(owner_decl).srcLoc(mod) + const src = if (sym.ty.srcLocOrNull(mod)) |src| + src.upgrade(mod) else Module.SrcLoc{ .file_scope = undefined, - .parent_decl_node = undefined, + .base_node = undefined, .lazy = .unneeded, }; const res = try codegen.generateLazySymbol( diff --git a/src/link/Wasm/ZigObject.zig b/src/link/Wasm/ZigObject.zig index dc49fffaa3..cced85f800 100644 --- a/src/link/Wasm/ZigObject.zig +++ b/src/link/Wasm/ZigObject.zig @@ -269,7 +269,7 @@ pub fn updateDecl( const res = try codegen.generateSymbol( &wasm_file.base, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), val, &code_writer, .none, @@ -308,7 +308,7 @@ pub fn updateFunc( defer code_writer.deinit(); const result = try codegen.generateFunction( &wasm_file.base, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), func_index, air, liveness, @@ -484,7 +484,17 @@ pub fn lowerUnnamedConst(zig_object: *ZigObject, wasm_file: *Wasm, val: Value, d }); defer gpa.free(name); - switch (try zig_object.lowerConst(wasm_file, name, val, decl.srcLoc(mod))) { + // We want to lower the source location of `decl`. However, when generating + // lazy functions (for e.g. `@tagName`), `decl` may correspond to a type + // rather than a `Nav`! + // The future split of `Decl` into `Nav` and `Cau` may require rethinking this + // logic. For now, just get the source location conditionally as needed. + const decl_src = if (decl.typeOf(mod).toIntern() == .type_type) + decl.val.toType().srcLoc(mod) + else + decl.navSrcLoc(mod); + + switch (try zig_object.lowerConst(wasm_file, name, val, decl_src.upgrade(mod))) { .ok => |atom_index| { try wasm_file.getAtomPtr(parent_atom_index).locals.append(gpa, atom_index); return @intFromEnum(wasm_file.getAtom(atom_index).sym_index); @@ -867,7 +877,7 @@ pub fn updateExports( if (exp.opts.section.toSlice(&mod.intern_pool)) |section| { try mod.failed_exports.putNoClobber(gpa, exp, try Module.ErrorMsg.create( gpa, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), "Unimplemented: ExportOptions.section '{s}'", .{section}, )); @@ -900,7 +910,7 @@ pub fn updateExports( .link_once => { try mod.failed_exports.putNoClobber(gpa, exp, try Module.ErrorMsg.create( gpa, - decl.srcLoc(mod), + decl.navSrcLoc(mod).upgrade(mod), "Unimplemented: LinkOnce", .{}, )); |
