From 6d62936c7b04b12402c6bc8a02ac977448edd30c Mon Sep 17 00:00:00 2001 From: Jeremy <51220084+jeremy-rifkin@users.noreply.github.com> Date: Tue, 7 Nov 2023 00:05:32 -0500 Subject: [PATCH] cache path and line number --- src/symbols/symbols_with_libdwarf.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/symbols/symbols_with_libdwarf.cpp b/src/symbols/symbols_with_libdwarf.cpp index 96c383e..dcec7e0 100644 --- a/src/symbols/symbols_with_libdwarf.cpp +++ b/src/symbols/symbols_with_libdwarf.cpp @@ -571,16 +571,22 @@ namespace libdwarf { // If the vector has been empty this can happen if(table_it != line_entries.end()) { Dwarf_Line line = table_it->line; - Dwarf_Unsigned line_number = 0; - VERIFY(wrap(dwarf_lineno, line, &line_number) == DW_DLV_OK); - frame.line = static_cast(line_number); - char* filename = nullptr; - VERIFY(wrap(dwarf_linesrc, line, &filename) == DW_DLV_OK); - auto wrapper = raii_wrap( - filename, - [this] (char* str) { if(str) dwarf_dealloc(dbg, str, DW_DLA_STRING); } - ); - frame.filename = filename; + if(!table_it->line_number) { + Dwarf_Unsigned line_number = 0; + VERIFY(wrap(dwarf_lineno, line, &line_number) == DW_DLV_OK); + table_it->line_number = static_cast(line_number); + } + frame.line = table_it->line_number.unwrap(); + if(!table_it->path) { + char* filename = nullptr; + VERIFY(wrap(dwarf_linesrc, line, &filename) == DW_DLV_OK); + auto wrapper = raii_wrap( + filename, + [this] (char* str) { if(str) dwarf_dealloc(dbg, str, DW_DLA_STRING); } + ); + table_it->path = filename; + } + frame.filename = table_it->path.unwrap(); } } else { Dwarf_Line_Context line_context = table_info.line_context;