aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-12-04 18:54:18 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-12-05 14:19:22 +0100
commit8796da028320b97a4b67a401109dce1137ee2bbf (patch)
treeeac0ec8d74fe773619bec1e67b87fa620a78849c /src
parent3575048c0ae8b5bae2cd5c6fd3dbc9cb569c4b1f (diff)
downloadzig-8796da028320b97a4b67a401109dce1137ee2bbf.tar.gz
zig-8796da028320b97a4b67a401109dce1137ee2bbf.zip
dwarf: reuse getDbgInfoAtom helper in all of Dwarf.zig
We need to access it outside of `DeclState` too so why not reuse the helper anyway.
Diffstat (limited to 'src')
-rw-r--r--src/link/Dwarf.zig45
-rw-r--r--src/link/Elf.zig8
-rw-r--r--src/link/MachO.zig8
-rw-r--r--src/link/Wasm.zig4
4 files changed, 28 insertions, 37 deletions
diff --git a/src/link/Dwarf.zig b/src/link/Dwarf.zig
index 3249bae86b..c0a61d057f 100644
--- a/src/link/Dwarf.zig
+++ b/src/link/Dwarf.zig
@@ -586,7 +586,7 @@ pub const DeclState = struct {
loc: DbgInfoLoc,
) error{OutOfMemory}!void {
const dbg_info = &self.dbg_info;
- const atom = self.getDbgInfoAtom(tag, owner_decl);
+ const atom = getDbgInfoAtom(tag, self.mod, owner_decl);
const name_with_null = name.ptr[0 .. name.len + 1];
switch (loc) {
@@ -645,7 +645,7 @@ pub const DeclState = struct {
loc: DbgInfoLoc,
) error{OutOfMemory}!void {
const dbg_info = &self.dbg_info;
- const atom = self.getDbgInfoAtom(tag, owner_decl);
+ const atom = getDbgInfoAtom(tag, self.mod, owner_decl);
const name_with_null = name.ptr[0 .. name.len + 1];
try dbg_info.append(@enumToInt(AbbrevKind.variable));
const target = self.mod.getTarget();
@@ -778,16 +778,6 @@ pub const DeclState = struct {
try self.addTypeRelocGlobal(atom, child_ty, @intCast(u32, index));
dbg_info.appendSliceAssumeCapacity(name_with_null); // DW.AT.name, DW.FORM.string
}
-
- fn getDbgInfoAtom(self: *DeclState, tag: File.Tag, decl_index: Module.Decl.Index) *Atom {
- const decl = self.mod.declPtr(decl_index);
- return switch (tag) {
- .elf => &decl.link.elf.dbg_info_atom,
- .macho => &decl.link.macho.dbg_info_atom,
- .wasm => &decl.link.wasm.dbg_info_atom,
- else => unreachable,
- };
- }
};
pub const AbbrevEntry = struct {
@@ -899,10 +889,11 @@ 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: *Module.Decl) !DeclState {
+pub fn initDeclState(self: *Dwarf, mod: *Module, decl_index: Module.Decl.Index) !DeclState {
const tracy = trace(@src());
defer tracy.end();
+ const decl = mod.declPtr(decl_index);
const decl_name = try decl.getFullyQualifiedName(mod);
defer self.allocator.free(decl_name);
@@ -977,12 +968,7 @@ pub fn initDeclState(self: *Dwarf, mod: *Module, decl: *Module.Decl) !DeclState
dbg_info_buffer.items.len += 4; // DW.AT.high_pc, DW.FORM.data4
//
if (fn_ret_has_bits) {
- const atom = switch (self.tag) {
- .elf => &decl.link.elf.dbg_info_atom,
- .macho => &decl.link.macho.dbg_info_atom,
- .wasm => &decl.link.wasm.dbg_info_atom,
- else => unreachable,
- };
+ const atom = getDbgInfoAtom(self.tag, mod, decl_index);
try decl_state.addTypeRelocGlobal(atom, fn_ret_type, @intCast(u32, dbg_info_buffer.items.len));
dbg_info_buffer.items.len += 4; // DW.AT.type, DW.FORM.ref4
}
@@ -1002,7 +988,7 @@ pub fn commitDeclState(
self: *Dwarf,
file: *File,
module: *Module,
- decl: *Module.Decl,
+ decl_index: Module.Decl.Index,
sym_addr: u64,
sym_size: u64,
decl_state: *DeclState,
@@ -1013,6 +999,7 @@ pub fn commitDeclState(
const gpa = self.allocator;
var dbg_line_buffer = &decl_state.dbg_line;
var dbg_info_buffer = &decl_state.dbg_info;
+ const decl = module.declPtr(decl_index);
const target_endian = self.target.cpu.arch.endian();
@@ -1233,13 +1220,7 @@ pub fn commitDeclState(
if (dbg_info_buffer.items.len == 0)
return;
- const atom = switch (self.tag) {
- .elf => &decl.link.elf.dbg_info_atom,
- .macho => &decl.link.macho.dbg_info_atom,
- .wasm => &decl.link.wasm.dbg_info_atom,
- else => unreachable,
- };
-
+ const atom = getDbgInfoAtom(self.tag, module, decl_index);
if (decl_state.abbrev_table.items.len > 0) {
// Now we emit the .debug_info types of the Decl. These will count towards the size of
// the buffer, so we have to do it before computing the offset, and we can't perform the actual
@@ -2563,3 +2544,13 @@ fn addDbgInfoErrorSet(
// DW.AT.enumeration_type delimit children
try dbg_info_buffer.append(0);
}
+
+fn getDbgInfoAtom(tag: File.Tag, mod: *Module, decl_index: Module.Decl.Index) *Atom {
+ const decl = mod.declPtr(decl_index);
+ return switch (tag) {
+ .elf => &decl.link.elf.dbg_info_atom,
+ .macho => &decl.link.macho.dbg_info_atom,
+ .wasm => &decl.link.wasm.dbg_info_atom,
+ else => unreachable,
+ };
+}
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
index 67b3df9e37..f98e33e58b 100644
--- a/src/link/Elf.zig
+++ b/src/link/Elf.zig
@@ -2420,7 +2420,7 @@ pub fn updateFunc(self: *Elf, module: *Module, func: *Module.Fn, air: Air, liven
const decl = module.declPtr(decl_index);
self.freeUnnamedConsts(decl_index);
- var decl_state: ?Dwarf.DeclState = if (self.dwarf) |*dw| try dw.initDeclState(module, decl) else null;
+ var decl_state: ?Dwarf.DeclState = if (self.dwarf) |*dw| try dw.initDeclState(module, decl_index) else null;
defer if (decl_state) |*ds| ds.deinit();
const res = if (decl_state) |*ds|
@@ -2443,7 +2443,7 @@ pub fn updateFunc(self: *Elf, module: *Module, func: *Module.Fn, air: Air, liven
try self.dwarf.?.commitDeclState(
&self.base,
module,
- decl,
+ decl_index,
local_sym.st_value,
local_sym.st_size,
ds,
@@ -2483,7 +2483,7 @@ pub fn updateDecl(self: *Elf, module: *Module, decl_index: Module.Decl.Index) !v
var code_buffer = std.ArrayList(u8).init(self.base.allocator);
defer code_buffer.deinit();
- var decl_state: ?Dwarf.DeclState = if (self.dwarf) |*dw| try dw.initDeclState(module, decl) else null;
+ var decl_state: ?Dwarf.DeclState = if (self.dwarf) |*dw| try dw.initDeclState(module, decl_index) else null;
defer if (decl_state) |*ds| ds.deinit();
// TODO implement .debug_info for global variables
@@ -2520,7 +2520,7 @@ pub fn updateDecl(self: *Elf, module: *Module, decl_index: Module.Decl.Index) !v
try self.dwarf.?.commitDeclState(
&self.base,
module,
- decl,
+ decl_index,
local_sym.st_value,
local_sym.st_size,
ds,
diff --git a/src/link/MachO.zig b/src/link/MachO.zig
index 74e574e49c..fb651edbe3 100644
--- a/src/link/MachO.zig
+++ b/src/link/MachO.zig
@@ -2190,7 +2190,7 @@ pub fn updateFunc(self: *MachO, module: *Module, func: *Module.Fn, air: Air, liv
defer code_buffer.deinit();
var decl_state = if (self.d_sym) |*d_sym|
- try d_sym.dwarf.initDeclState(module, decl)
+ try d_sym.dwarf.initDeclState(module, decl_index)
else
null;
defer if (decl_state) |*ds| ds.deinit();
@@ -2217,7 +2217,7 @@ pub fn updateFunc(self: *MachO, module: *Module, func: *Module.Fn, air: Air, liv
try self.d_sym.?.dwarf.commitDeclState(
&self.base,
module,
- decl,
+ decl_index,
addr,
decl.link.macho.size,
ds,
@@ -2330,7 +2330,7 @@ pub fn updateDecl(self: *MachO, module: *Module, decl_index: Module.Decl.Index)
defer code_buffer.deinit();
var decl_state: ?Dwarf.DeclState = if (self.d_sym) |*d_sym|
- try d_sym.dwarf.initDeclState(module, decl)
+ try d_sym.dwarf.initDeclState(module, decl_index)
else
null;
defer if (decl_state) |*ds| ds.deinit();
@@ -2368,7 +2368,7 @@ pub fn updateDecl(self: *MachO, module: *Module, decl_index: Module.Decl.Index)
try self.d_sym.?.dwarf.commitDeclState(
&self.base,
module,
- decl,
+ decl_index,
addr,
decl.link.macho.size,
ds,
diff --git a/src/link/Wasm.zig b/src/link/Wasm.zig
index 04b3e42db5..adcb539bd6 100644
--- a/src/link/Wasm.zig
+++ b/src/link/Wasm.zig
@@ -885,7 +885,7 @@ pub fn updateFunc(wasm: *Wasm, mod: *Module, func: *Module.Fn, air: Air, livenes
decl.link.wasm.clear();
- var decl_state: ?Dwarf.DeclState = if (wasm.dwarf) |*dwarf| try dwarf.initDeclState(mod, decl) else null;
+ var decl_state: ?Dwarf.DeclState = if (wasm.dwarf) |*dwarf| try dwarf.initDeclState(mod, decl_index) else null;
defer if (decl_state) |*ds| ds.deinit();
var code_writer = std.ArrayList(u8).init(wasm.base.allocator);
@@ -913,7 +913,7 @@ pub fn updateFunc(wasm: *Wasm, mod: *Module, func: *Module.Fn, air: Air, livenes
try dwarf.commitDeclState(
&wasm.base,
mod,
- decl,
+ decl_index,
// Actual value will be written after relocation.
// For Wasm, this is the offset relative to the code section
// which isn't known until flush().