diff options
author | Andreas Kling <kling@serenityos.org> | 2021-01-12 12:17:30 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-01-12 12:17:46 +0100 |
commit | 13d7c09125f8eec703d0a43a9a87fc8aa08f7319 (patch) | |
tree | 70fd643c429cea5c1f9362c2674511d17a53f3b5 /Userland/Libraries/LibDebug/Dwarf/DIE.h | |
parent | dc28c07fa526841e05e16161c74a6c23984f1dd5 (diff) | |
download | serenity-13d7c09125f8eec703d0a43a9a87fc8aa08f7319.zip |
Libraries: Move to Userland/Libraries/
Diffstat (limited to 'Userland/Libraries/LibDebug/Dwarf/DIE.h')
-rw-r--r-- | Userland/Libraries/LibDebug/Dwarf/DIE.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/Userland/Libraries/LibDebug/Dwarf/DIE.h b/Userland/Libraries/LibDebug/Dwarf/DIE.h new file mode 100644 index 0000000000..3ba68eafa8 --- /dev/null +++ b/Userland/Libraries/LibDebug/Dwarf/DIE.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "CompilationUnit.h" +#include "DwarfTypes.h" +#include <AK/Function.h> +#include <AK/NonnullOwnPtr.h> +#include <AK/Optional.h> +#include <AK/Types.h> + +namespace Debug::Dwarf { + +class CompilationUnit; + +// DIE = Debugging Information Entry +class DIE { +public: + DIE(const CompilationUnit&, u32 offset); + + struct AttributeValue { + enum class Type : u8 { + UnsignedNumber, + SignedNumber, + String, + DieReference, // Reference to another DIE in the same compilation unit + Boolean, + DwarfExpression, + SecOffset, + RawBytes, + } type; + + union { + u32 as_u32; + i32 as_i32; + const char* as_string; // points to bytes in the memory mapped elf image + bool as_bool; + struct { + u32 length; + const u8* bytes; // points to bytes in the memory mapped elf image + } as_raw_bytes; + } data {}; + }; + + u32 offset() const { return m_offset; } + u32 size() const { return m_size; } + bool has_children() const { return m_has_children; } + EntryTag tag() const { return m_tag; } + + Optional<AttributeValue> get_attribute(const Attribute&) const; + + void for_each_child(Function<void(const DIE& child)> callback) const; + + bool is_null() const { return m_tag == EntryTag::None; } + + DIE get_die_at_offset(u32 offset) const; + +private: + AttributeValue get_attribute_value(AttributeDataForm form, + InputMemoryStream& debug_info_stream) const; + + const CompilationUnit& m_compilation_unit; + u32 m_offset { 0 }; + u32 m_data_offset { 0 }; + size_t m_abbreviation_code { 0 }; + EntryTag m_tag { EntryTag::None }; + bool m_has_children { false }; + u32 m_size { 0 }; +}; + +} |