From ac4d633ed691159ea61130182a1b51635a95e228 Mon Sep 17 00:00:00 2001 From: mlugg Date: Mon, 8 Sep 2025 15:31:09 +0100 Subject: [PATCH] std: fix debug.Info and debug.Coverage --- lib/std/debug/Coverage.zig | 3 ++- lib/std/debug/Dwarf.zig | 4 ++-- lib/std/debug/Info.zig | 13 ++++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/std/debug/Coverage.zig b/lib/std/debug/Coverage.zig index 58e600dc63..f1621c0e12 100644 --- a/lib/std/debug/Coverage.zig +++ b/lib/std/debug/Coverage.zig @@ -145,6 +145,7 @@ pub const ResolveAddressesDwarfError = Dwarf.ScanError; pub fn resolveAddressesDwarf( cov: *Coverage, gpa: Allocator, + endian: std.builtin.Endian, /// Asserts the addresses are in ascending order. sorted_pc_addrs: []const u64, /// Asserts its length equals length of `sorted_pc_addrs`. @@ -184,7 +185,7 @@ pub fn resolveAddressesDwarf( if (cu.src_loc_cache == null) { cov.mutex.unlock(); defer cov.mutex.lock(); - d.populateSrcLocCache(gpa, cu) catch |err| switch (err) { + d.populateSrcLocCache(gpa, endian, cu) catch |err| switch (err) { error.MissingDebugInfo, error.InvalidDebugInfo => { out.* = SourceLocation.invalid; continue :next_pc; diff --git a/lib/std/debug/Dwarf.zig b/lib/std/debug/Dwarf.zig index e9ed9077af..5bc751e1aa 100644 --- a/lib/std/debug/Dwarf.zig +++ b/lib/std/debug/Dwarf.zig @@ -652,7 +652,7 @@ fn scanAllCompileUnits(di: *Dwarf, allocator: Allocator, endian: Endian) ScanErr } } -pub fn populateRanges(d: *Dwarf, gpa: Allocator) ScanError!void { +pub fn populateRanges(d: *Dwarf, gpa: Allocator, endian: Endian) ScanError!void { assert(d.ranges.items.len == 0); for (d.compile_unit_list.items, 0..) |*cu, cu_index| { @@ -665,7 +665,7 @@ pub fn populateRanges(d: *Dwarf, gpa: Allocator) ScanError!void { continue; } const ranges_value = cu.die.getAttr(AT.ranges) orelse continue; - var iter = DebugRangeIterator.init(ranges_value, d, cu) catch continue; + var iter = DebugRangeIterator.init(ranges_value, d, endian, cu) catch continue; while (try iter.next()) |range| { // Not sure why LLVM thinks it's OK to emit these... if (range.start == range.end) continue; diff --git a/lib/std/debug/Info.zig b/lib/std/debug/Info.zig index e38645e1f9..bc8efc71b4 100644 --- a/lib/std/debug/Info.zig +++ b/lib/std/debug/Info.zig @@ -24,14 +24,15 @@ coverage: *Coverage, pub const LoadError = Dwarf.ElfModule.LoadError; pub fn load(gpa: Allocator, path: Path, coverage: *Coverage) LoadError!Info { - var sections: Dwarf.SectionArray = Dwarf.null_section_array; - var elf_module = try Dwarf.ElfModule.load(gpa, path, null, null, §ions, null); - try elf_module.dwarf.populateRanges(gpa); + var elf_module = try Dwarf.ElfModule.load(gpa, path, null, null, null, null); + // This is correct because `Dwarf.ElfModule` currently only supports native-endian ELF files. + const endian = @import("builtin").target.cpu.arch.endian(); + try elf_module.dwarf.populateRanges(gpa, endian); var info: Info = .{ .address_map = .{}, .coverage = coverage, }; - try info.address_map.put(gpa, elf_module.base_address, elf_module); + try info.address_map.put(gpa, 0, elf_module); return info; } @@ -58,5 +59,7 @@ pub fn resolveAddresses( assert(sorted_pc_addrs.len == output.len); if (info.address_map.entries.len != 1) @panic("TODO"); const elf_module = &info.address_map.values()[0]; - return info.coverage.resolveAddressesDwarf(gpa, sorted_pc_addrs, output, &elf_module.dwarf); + // This is correct because `Dwarf.ElfModule` currently only supports native-endian ELF files. + const endian = @import("builtin").target.cpu.arch.endian(); + return info.coverage.resolveAddressesDwarf(gpa, endian, sorted_pc_addrs, output, &elf_module.dwarf); }