std: fix debug.Info and debug.Coverage

This commit is contained in:
mlugg 2025-09-08 15:31:09 +01:00
parent f40fbdb3b3
commit ac4d633ed6
No known key found for this signature in database
GPG Key ID: 3F5B7DCCBF4AF02E
3 changed files with 12 additions and 8 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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, &sections, 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);
}