Serenity Operating System
at master 67 lines 2.0 kB view raw
1/* 2 * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include "AbbreviationsMap.h" 10#include <AK/Noncopyable.h> 11#include <AK/NonnullOwnPtr.h> 12#include <AK/Types.h> 13 14namespace Debug::Dwarf { 15 16class DwarfInfo; 17class DIE; 18class LineProgram; 19 20class CompilationUnit { 21 AK_MAKE_NONCOPYABLE(CompilationUnit); 22 AK_MAKE_NONMOVABLE(CompilationUnit); 23 24public: 25 CompilationUnit(DwarfInfo const& dwarf_info, u32 offset, CompilationUnitHeader const&, NonnullOwnPtr<LineProgram>&& line_program); 26 ~CompilationUnit(); 27 28 u32 offset() const { return m_offset; } 29 u32 size() const { return m_header.length() + sizeof(u32); } 30 31 DIE root_die() const; 32 DIE get_die_at_offset(u32 offset) const; 33 34 ErrorOr<FlatPtr> get_address(size_t index) const; 35 ErrorOr<char const*> get_string(size_t index) const; 36 37 u8 dwarf_version() const { return m_header.version(); } 38 39 DwarfInfo const& dwarf_info() const { return m_dwarf_info; } 40 AbbreviationsMap const& abbreviations_map() const { return m_abbreviations; } 41 LineProgram const& line_program() const; 42 ErrorOr<Optional<FlatPtr>> base_address() const; 43 44 // DW_AT_addr_base 45 ErrorOr<u64> address_table_base() const; 46 // DW_AT_str_offsets_base 47 ErrorOr<u64> string_offsets_base() const; 48 // DW_AT_rnglists_base 49 ErrorOr<u64> range_lists_base() const; 50 51private: 52 DwarfInfo const& m_dwarf_info; 53 u32 m_offset { 0 }; 54 CompilationUnitHeader m_header; 55 AbbreviationsMap m_abbreviations; 56 NonnullOwnPtr<LineProgram> m_line_program; 57 mutable bool m_has_cached_base_address : 1 { false }; 58 mutable bool m_has_cached_address_table_base : 1 { false }; 59 mutable bool m_has_cached_string_offsets_base : 1 { false }; 60 mutable bool m_has_cached_range_lists_base : 1 { false }; 61 mutable Optional<FlatPtr> m_cached_base_address; 62 mutable u64 m_cached_address_table_base { 0 }; 63 mutable u64 m_cached_string_offsets_base { 0 }; 64 mutable u64 m_cached_range_lists_base { 0 }; 65}; 66 67}