diff --git a/Userland/Libraries/LibDebug/Dwarf/CompilationUnit.cpp b/Userland/Libraries/LibDebug/Dwarf/CompilationUnit.cpp index 07ffc30993..d78472cc7b 100644 --- a/Userland/Libraries/LibDebug/Dwarf/CompilationUnit.cpp +++ b/Userland/Libraries/LibDebug/Dwarf/CompilationUnit.cpp @@ -30,4 +30,18 @@ DIE CompilationUnit::get_die_at_offset(u32 die_offset) const return DIE(*this, die_offset); } +Optional CompilationUnit::base_address() const +{ + if (m_has_cached_base_address) + return m_cached_base_address; + + auto die = root_die(); + auto res = die.get_attribute(Attribute::LowPc); + if (res.has_value()) { + m_cached_base_address = res->data.as_addr; + } + m_has_cached_base_address = true; + return m_cached_base_address; +} + } diff --git a/Userland/Libraries/LibDebug/Dwarf/CompilationUnit.h b/Userland/Libraries/LibDebug/Dwarf/CompilationUnit.h index 5acb1a2088..c860d1237a 100644 --- a/Userland/Libraries/LibDebug/Dwarf/CompilationUnit.h +++ b/Userland/Libraries/LibDebug/Dwarf/CompilationUnit.h @@ -34,6 +34,7 @@ public: DwarfInfo const& dwarf_info() const { return m_dwarf_info; } AbbreviationsMap const& abbreviations_map() const { return m_abbreviations; } LineProgram const& line_program() const { return *m_line_program; } + Optional base_address() const; private: DwarfInfo const& m_dwarf_info; @@ -41,6 +42,8 @@ private: CompilationUnitHeader m_header; AbbreviationsMap m_abbreviations; NonnullOwnPtr m_line_program; + mutable bool m_has_cached_base_address { false }; + mutable Optional m_cached_base_address; }; }