aboutsummaryrefslogtreecommitdiff
path: root/src/link
diff options
context:
space:
mode:
authorMatthew Lugg <mlugg@mlugg.co.uk>2024-06-20 11:07:17 +0100
committerGitHub <noreply@github.com>2024-06-20 11:07:17 +0100
commitf73be120f4254c080c48081dfc5834a7ebc9d9cf (patch)
treee70598bed09659eb61c230620c1ddf88c14db905 /src/link
parentccd3cc3266762c1fea93cdc0190eaf71718d9e6a (diff)
parent2b677d1660018434757f9c9efec3c712675e6c47 (diff)
downloadzig-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.zig12
-rw-r--r--src/link/Elf/ZigObject.zig16
-rw-r--r--src/link/MachO/ZigObject.zig12
-rw-r--r--src/link/Plan9.zig14
-rw-r--r--src/link/Wasm/ZigObject.zig20
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",
.{},
));