From ead3f128aab7509c33eccaac46e478654b5c2483 Mon Sep 17 00:00:00 2001 From: Jeremy Rifkin <51220084+jeremy-rifkin@users.noreply.github.com> Date: Mon, 17 Feb 2025 13:50:06 -0600 Subject: [PATCH] Make line_table_info serve as a raii utility for dwarf line table stuff --- src/symbols/dwarf/dwarf_resolver.cpp | 29 +++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/symbols/dwarf/dwarf_resolver.cpp b/src/symbols/dwarf/dwarf_resolver.cpp index b127e3d..0cfbf3b 100644 --- a/src/symbols/dwarf/dwarf_resolver.cpp +++ b/src/symbols/dwarf/dwarf_resolver.cpp @@ -63,10 +63,32 @@ namespace libdwarf { struct line_table_info { Dwarf_Unsigned version; - Dwarf_Line_Context line_context; + Dwarf_Line_Context line_context = nullptr; // sorted by low_addr // TODO: Make this optional at some point, it may not be generated if cache mode switches during program exec... std::vector line_entries; + + line_table_info( + Dwarf_Unsigned version, + Dwarf_Line_Context line_context, + std::vector&& line_entries + ) : version(version), line_context(line_context), line_entries(std::move(line_entries)) {} + ~line_table_info() { + dwarf_srclines_dealloc_b(line_context); + } + line_table_info(const line_table_info&) = delete; + line_table_info(line_table_info&& other) { + std::swap(version, other.version); + std::swap(line_context, other.line_context); + std::swap(line_entries, other.line_entries); + } + line_table_info& operator=(const line_table_info&) = delete; + line_table_info& operator=(line_table_info&& other) { + std::swap(version, other.version); + std::swap(line_context, other.line_context); + std::swap(line_entries, other.line_entries); + return *this; + } }; class dwarf_resolver; @@ -203,9 +225,6 @@ namespace libdwarf { CPPTRACE_FORCE_NO_INLINE_FOR_PROFILING ~dwarf_resolver() override { - for(auto& entry : line_tables) { - dwarf_srclines_dealloc_b(entry.second.line_context); - } if(aranges) { for(int i = 0; i < arange_count; i++) { dwarf_dealloc(dbg, aranges[i], DW_DLA_ARANGE); @@ -689,7 +708,7 @@ namespace libdwarf { }); } - it = line_tables.insert({off, {version, line_context, std::move(line_entries)}}).first; + it = line_tables.insert({off, line_table_info{version, line_context, std::move(line_entries)}}).first; return it->second; } }