diff --git a/lib/std/debug/SelfInfo/Elf.zig b/lib/std/debug/SelfInfo/Elf.zig index 4e7fba60796adbb2f78a53b795aed5724eecd096..7a81b4cba894fd238d72e5e1c74cdc3df8ae176a 100644 --- a/lib/std/debug/SelfInfo/Elf.zig +++ b/lib/std/debug/SelfInfo/Elf.zig @@ -46,20 +46,30 @@ pub fn getSymbols( const vaddr = address - module.load_offset; const loaded_elf = try module.getLoadedElf(gpa, io); - if (loaded_elf.file.dwarf) |*dwarf| { - if (!loaded_elf.scanned_dwarf) { - dwarf.open(gpa, native_endian) catch |err| switch (err) { + const dwarf_err: ?Error = err: { + const dwarf = &(loaded_elf.file.dwarf orelse break :err null); + switch (loaded_elf.dwarf) { + .not_scanned => if (dwarf.open(gpa, native_endian)) { + loaded_elf.dwarf = .ok; + } else |err| switch (err) { error.InvalidDebugInfo, - error.MissingDebugInfo, - error.OutOfMemory, - => |e| return e, error.EndOfStream, error.Overflow, error.ReadFailed, error.StreamTooLong, - => return error.InvalidDebugInfo, - }; - loaded_elf.scanned_dwarf = true; + => { + loaded_elf.dwarf = .invalid; + break :err error.InvalidDebugInfo; + }, + error.MissingDebugInfo => { + loaded_elf.dwarf = .missing; + break :err error.MissingDebugInfo; + }, + error.OutOfMemory => |e| return e, + }, + .invalid => break :err error.InvalidDebugInfo, + .missing => break :err error.MissingDebugInfo, + .ok => {}, } return dwarf.getSymbols( symbol_allocator, @@ -68,14 +78,27 @@ pub fn getSymbols( vaddr, resolve_inline_callers, symbols, - ); - } + ) catch |err| switch (err) { + error.InvalidDebugInfo, + error.MissingDebugInfo, + error.UnsupportedDebugInfo, + => |e| break :err e, + + error.ReadFailed, + error.OutOfMemory, + error.Canceled, + error.Unexpected, + => |e| return e, + }; + }; // When DWARF is unavailable, fall back to searching the symtab. try symbols.append(symbol_allocator, loaded_elf.file.searchSymtab(gpa, vaddr) catch |err| switch (err) { error.NoSymtab, error.NoStrtab => return error.MissingDebugInfo, error.BadSymtab => return error.InvalidDebugInfo, error.OutOfMemory => |e| return e, }); + // After searching the symtab, still report the DWARF error. + if (dwarf_err) |e| return e; } pub fn getModuleName(si: *SelfInfo, io: Io, address: usize) Error![]const u8 { const gpa = std.debug.getDebugInfoAllocator(); @@ -251,7 +274,7 @@ const Module = struct { const LoadedElf = struct { file: std.debug.ElfFile, - scanned_dwarf: bool, + dwarf: enum { not_scanned, invalid, missing, ok }, }; const UnwindSections = struct { @@ -377,7 +400,7 @@ const Module = struct { return .{ .file = elf_file, - .scanned_dwarf = false, + .dwarf = .not_scanned, }; } };