summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorItamar <itamar8910@gmail.com>2021-06-19 11:39:51 +0300
committerAndreas Kling <kling@serenityos.org>2021-06-19 14:51:18 +0200
commita5f69efa5c3ffd7f26fc0c69b3079c9f40edff71 (patch)
tree425b8940014140b61687dccf6fc874c104ab2c94
parent84609aecc1a2f944b8d037af4459cd3c7a2bf756 (diff)
downloadserenity-a5f69efa5c3ffd7f26fc0c69b3079c9f40edff71.zip
LibDebug: Store optional parent_offset in Dwarf::DIE objects
In the current implementation, only DIE objects that are created via DIE::for_each_child() will have parent offsets. DIE objects that are created with CompilationUnit::get_die_at_offset() do not currently store a parent offset. We may improve this in the future, but this is enough for what we currently need.
-rw-r--r--Userland/Libraries/LibDebug/Dwarf/DIE.cpp11
-rw-r--r--Userland/Libraries/LibDebug/Dwarf/DIE.h4
2 files changed, 9 insertions, 6 deletions
diff --git a/Userland/Libraries/LibDebug/Dwarf/DIE.cpp b/Userland/Libraries/LibDebug/Dwarf/DIE.cpp
index 65c5353a53..e80835b2ff 100644
--- a/Userland/Libraries/LibDebug/Dwarf/DIE.cpp
+++ b/Userland/Libraries/LibDebug/Dwarf/DIE.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
+ * Copyright (c) 2020-2021, Itamar S. <itamar8910@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -12,7 +12,7 @@
namespace Debug::Dwarf {
-DIE::DIE(const CompilationUnit& unit, u32 offset)
+DIE::DIE(const CompilationUnit& unit, u32 offset, Optional<u32> parent_offset)
: m_compilation_unit(unit)
, m_offset(offset)
{
@@ -37,6 +37,7 @@ DIE::DIE(const CompilationUnit& unit, u32 offset)
}
}
m_size = stream.offset() - m_offset;
+ m_parent_offset = parent_offset;
}
Optional<AttributeValue> DIE::get_attribute(const Attribute& attribute) const
@@ -61,13 +62,13 @@ void DIE::for_each_child(Function<void(const DIE& child)> callback) const
if (!m_has_children)
return;
- NonnullOwnPtr<DIE> current_child = make<DIE>(m_compilation_unit, m_offset + m_size);
+ NonnullOwnPtr<DIE> current_child = make<DIE>(m_compilation_unit, m_offset + m_size, m_offset);
while (true) {
callback(*current_child);
if (current_child->is_null())
break;
if (!current_child->has_children()) {
- current_child = make<DIE>(m_compilation_unit, current_child->offset() + current_child->size());
+ current_child = make<DIE>(m_compilation_unit, current_child->offset() + current_child->size(), m_offset);
continue;
}
@@ -84,7 +85,7 @@ void DIE::for_each_child(Function<void(const DIE& child)> callback) const
sibling_offset = sub_child.offset() + sub_child.size();
});
}
- current_child = make<DIE>(m_compilation_unit, sibling_offset);
+ current_child = make<DIE>(m_compilation_unit, sibling_offset, m_offset);
}
}
diff --git a/Userland/Libraries/LibDebug/Dwarf/DIE.h b/Userland/Libraries/LibDebug/Dwarf/DIE.h
index 67fc1e1e2e..5ee98c6a29 100644
--- a/Userland/Libraries/LibDebug/Dwarf/DIE.h
+++ b/Userland/Libraries/LibDebug/Dwarf/DIE.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
+ * Copyright (c) 2020-2021, Itamar S. <itamar8910@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -33,6 +33,7 @@ public:
bool is_null() const { return m_tag == EntryTag::None; }
const CompilationUnit& compilation_unit() const { return m_compilation_unit; }
+ Optional<u32> parent_offset() const { return m_parent_offset; }
private:
const CompilationUnit& m_compilation_unit;
@@ -42,6 +43,7 @@ private:
EntryTag m_tag { EntryTag::None };
bool m_has_children { false };
u32 m_size { 0 };
+ Optional<u32> m_parent_offset;
};
}