DwarfInfo.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright (c) 2020-2021, Itamar S. <itamar8910@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include "AttributeValue.h"
  8. #include "CompilationUnit.h"
  9. #include "DwarfTypes.h"
  10. #include <AK/ByteBuffer.h>
  11. #include <AK/NonnullOwnPtrVector.h>
  12. #include <AK/NonnullRefPtr.h>
  13. #include <AK/RedBlackTree.h>
  14. #include <AK/RefCounted.h>
  15. #include <AK/String.h>
  16. #include <LibELF/Image.h>
  17. namespace Debug::Dwarf {
  18. class DwarfInfo {
  19. AK_MAKE_NONCOPYABLE(DwarfInfo);
  20. AK_MAKE_NONMOVABLE(DwarfInfo);
  21. public:
  22. explicit DwarfInfo(ELF::Image const&);
  23. ReadonlyBytes debug_info_data() const { return m_debug_info_data; }
  24. ReadonlyBytes abbreviation_data() const { return m_abbreviation_data; }
  25. ReadonlyBytes debug_strings_data() const { return m_debug_strings_data; }
  26. ReadonlyBytes debug_line_strings_data() const { return m_debug_line_strings_data; }
  27. template<typename Callback>
  28. void for_each_compilation_unit(Callback) const;
  29. AttributeValue get_attribute_value(AttributeDataForm form, ssize_t implicit_const_value,
  30. InputMemoryStream& debug_info_stream, const CompilationUnit* unit = nullptr) const;
  31. Optional<DIE> get_die_at_address(FlatPtr) const;
  32. // Note that even if there is a DIE at the given offset,
  33. // but it does not exist in the DIE cache (because for example
  34. // it does not contain an address range), then this function will not return it.
  35. // To get any DIE object at a given offset in a compilation unit,
  36. // use CompilationUnit::get_die_at_offset.
  37. Optional<DIE> get_cached_die_at_offset(FlatPtr) const;
  38. private:
  39. void populate_compilation_units();
  40. void build_cached_dies() const;
  41. ReadonlyBytes section_data(StringView const& section_name) const;
  42. ELF::Image const& m_elf;
  43. ReadonlyBytes m_debug_info_data;
  44. ReadonlyBytes m_abbreviation_data;
  45. ReadonlyBytes m_debug_strings_data;
  46. ReadonlyBytes m_debug_line_data;
  47. ReadonlyBytes m_debug_line_strings_data;
  48. NonnullOwnPtrVector<Dwarf::CompilationUnit> m_compilation_units;
  49. struct DIERange {
  50. FlatPtr start_address { 0 };
  51. FlatPtr end_address { 0 };
  52. };
  53. struct DIEAndRange {
  54. DIE die;
  55. DIERange range;
  56. };
  57. using DIEStartAddress = FlatPtr;
  58. mutable RedBlackTree<DIEStartAddress, DIEAndRange> m_cached_dies_by_range;
  59. mutable RedBlackTree<FlatPtr, DIE> m_cached_dies_by_offset;
  60. mutable bool m_built_cached_dies { false };
  61. };
  62. template<typename Callback>
  63. void DwarfInfo::for_each_compilation_unit(Callback callback) const
  64. {
  65. for (const auto& unit : m_compilation_units) {
  66. callback(unit);
  67. }
  68. }
  69. }