AbbreviationsMap.cpp 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * Copyright (c) 2020, Itamar S. <itamar8910@gmail.com>
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright notice, this
  9. * list of conditions and the following disclaimer.
  10. *
  11. * 2. Redistributions in binary form must reproduce the above copyright notice,
  12. * this list of conditions and the following disclaimer in the documentation
  13. * and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  16. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  18. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  19. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  21. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  22. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  23. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  24. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #include "AbbreviationsMap.h"
  27. #include "DwarfInfo.h"
  28. #include <AK/Stream.h>
  29. namespace Dwarf {
  30. AbbreviationsMap::AbbreviationsMap(const DwarfInfo& dwarf_info, u32 offset)
  31. : m_dwarf_info(dwarf_info)
  32. , m_offset(offset)
  33. {
  34. populate_map();
  35. }
  36. void AbbreviationsMap::populate_map()
  37. {
  38. InputMemoryStream abbreviation_stream(m_dwarf_info.abbreviation_data().span());
  39. abbreviation_stream.discard_or_error(m_offset);
  40. while (!abbreviation_stream.eof()) {
  41. size_t abbreviation_code = 0;
  42. abbreviation_stream.read_LEB128_unsigned(abbreviation_code);
  43. // An abbrevation code of 0 marks the end of the
  44. // abbrevations for a given compilation unit
  45. if (abbreviation_code == 0)
  46. break;
  47. size_t tag {};
  48. abbreviation_stream.read_LEB128_unsigned(tag);
  49. u8 has_children = 0;
  50. abbreviation_stream >> has_children;
  51. AbbreviationEntry abbrevation_entry {};
  52. abbrevation_entry.tag = static_cast<EntryTag>(tag);
  53. abbrevation_entry.has_children = (has_children == 1);
  54. AttributeSpecification current_attribute_specification {};
  55. do {
  56. size_t attribute_value = 0;
  57. size_t form_value = 0;
  58. abbreviation_stream.read_LEB128_unsigned(attribute_value);
  59. abbreviation_stream.read_LEB128_unsigned(form_value);
  60. current_attribute_specification.attribute = static_cast<Attribute>(attribute_value);
  61. current_attribute_specification.form = static_cast<AttributeDataForm>(form_value);
  62. if (current_attribute_specification.attribute != Attribute::None) {
  63. abbrevation_entry.attribute_specifications.append(current_attribute_specification);
  64. }
  65. } while (current_attribute_specification.attribute != Attribute::None || current_attribute_specification.form != AttributeDataForm::None);
  66. m_entries.set((u32)abbreviation_code, abbrevation_entry);
  67. }
  68. }
  69. Optional<AbbreviationsMap::AbbreviationEntry> AbbreviationsMap::get(u32 code) const
  70. {
  71. return m_entries.get(code);
  72. }
  73. }