DwarfInfo.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 "DwarfTypes.h"
  9. #include <AK/ByteBuffer.h>
  10. #include <AK/NonnullRefPtr.h>
  11. #include <AK/RedBlackTree.h>
  12. #include <AK/RefCounted.h>
  13. #include <LibDebug/Dwarf/DIE.h>
  14. #include <LibELF/Image.h>
  15. namespace Debug::Dwarf {
  16. class CompilationUnit;
  17. class DwarfInfo {
  18. AK_MAKE_NONCOPYABLE(DwarfInfo);
  19. AK_MAKE_NONMOVABLE(DwarfInfo);
  20. public:
  21. explicit DwarfInfo(ELF::Image const&);
  22. ~DwarfInfo();
  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. ReadonlyBytes debug_range_lists_data() const { return m_debug_range_lists_data; }
  28. ReadonlyBytes debug_str_offsets_data() const { return m_debug_str_offsets_data; }
  29. ReadonlyBytes debug_addr_data() const { return m_debug_addr_data; }
  30. ReadonlyBytes debug_ranges_data() const { return m_debug_ranges_data; }
  31. template<typename Callback>
  32. ErrorOr<void> for_each_compilation_unit(Callback) const;
  33. ErrorOr<AttributeValue> get_attribute_value(AttributeDataForm form, ssize_t implicit_const_value,
  34. SeekableStream& debug_info_stream, CompilationUnit const* unit = nullptr) const;
  35. ErrorOr<Optional<DIE>> get_die_at_address(FlatPtr) const;
  36. // Note that even if there is a DIE at the given offset,
  37. // but it does not exist in the DIE cache (because for example
  38. // it does not contain an address range), then this function will not return it.
  39. // To get any DIE object at a given offset in a compilation unit,
  40. // use CompilationUnit::get_die_at_offset.
  41. ErrorOr<Optional<DIE>> get_cached_die_at_offset(FlatPtr) const;
  42. private:
  43. ErrorOr<void> populate_compilation_units();
  44. ErrorOr<void> build_cached_dies() const;
  45. ReadonlyBytes section_data(StringView section_name) const;
  46. ELF::Image const& m_elf;
  47. ReadonlyBytes m_debug_info_data;
  48. ReadonlyBytes m_abbreviation_data;
  49. ReadonlyBytes m_debug_strings_data;
  50. ReadonlyBytes m_debug_line_data;
  51. ReadonlyBytes m_debug_line_strings_data;
  52. ReadonlyBytes m_debug_range_lists_data;
  53. ReadonlyBytes m_debug_str_offsets_data;
  54. ReadonlyBytes m_debug_addr_data;
  55. ReadonlyBytes m_debug_ranges_data;
  56. Vector<NonnullOwnPtr<Dwarf::CompilationUnit>> m_compilation_units;
  57. struct DIERange {
  58. FlatPtr start_address { 0 };
  59. FlatPtr end_address { 0 };
  60. };
  61. struct DIEAndRange {
  62. DIE die;
  63. DIERange range;
  64. };
  65. using DIEStartAddress = FlatPtr;
  66. mutable RedBlackTree<DIEStartAddress, DIEAndRange> m_cached_dies_by_range;
  67. mutable RedBlackTree<FlatPtr, DIE> m_cached_dies_by_offset;
  68. mutable bool m_built_cached_dies { false };
  69. };
  70. template<typename Callback>
  71. ErrorOr<void> DwarfInfo::for_each_compilation_unit(Callback callback) const
  72. {
  73. for (auto const& unit : m_compilation_units) {
  74. TRY(callback(*unit));
  75. }
  76. return {};
  77. }
  78. }