Serenity Operating System
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}