DwarfInfo.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. /*
  2. * Copyright (c) 2020-2021, Itamar S. <itamar8910@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "DwarfInfo.h"
  7. #include "AddressRanges.h"
  8. #include "AttributeValue.h"
  9. #include "CompilationUnit.h"
  10. #include <AK/MemoryStream.h>
  11. #include <LibDebug/DebugInfo.h>
  12. namespace Debug::Dwarf {
  13. DwarfInfo::DwarfInfo(ELF::Image const& elf)
  14. : m_elf(elf)
  15. {
  16. m_debug_info_data = section_data(".debug_info"sv);
  17. m_abbreviation_data = section_data(".debug_abbrev"sv);
  18. m_debug_strings_data = section_data(".debug_str"sv);
  19. m_debug_line_data = section_data(".debug_line"sv);
  20. m_debug_line_strings_data = section_data(".debug_line_str"sv);
  21. m_debug_range_lists_data = section_data(".debug_rnglists"sv);
  22. m_debug_str_offsets_data = section_data(".debug_str_offsets"sv);
  23. m_debug_addr_data = section_data(".debug_addr"sv);
  24. populate_compilation_units();
  25. }
  26. ReadonlyBytes DwarfInfo::section_data(StringView const& section_name) const
  27. {
  28. auto section = m_elf.lookup_section(section_name);
  29. if (!section.has_value())
  30. return {};
  31. return section->bytes();
  32. }
  33. void DwarfInfo::populate_compilation_units()
  34. {
  35. if (!m_debug_info_data.data())
  36. return;
  37. InputMemoryStream debug_info_stream { m_debug_info_data };
  38. InputMemoryStream line_info_stream { m_debug_line_data };
  39. while (!debug_info_stream.eof()) {
  40. auto unit_offset = debug_info_stream.offset();
  41. CompilationUnitHeader compilation_unit_header {};
  42. debug_info_stream >> compilation_unit_header;
  43. VERIFY(compilation_unit_header.common.version <= 5);
  44. VERIFY(compilation_unit_header.address_size() == sizeof(FlatPtr));
  45. u32 length_after_header = compilation_unit_header.length() - (compilation_unit_header.header_size() - offsetof(CompilationUnitHeader, common.version));
  46. auto line_program = make<LineProgram>(*this, line_info_stream);
  47. m_compilation_units.append(make<CompilationUnit>(*this, unit_offset, compilation_unit_header, move(line_program)));
  48. debug_info_stream.discard_or_error(length_after_header);
  49. }
  50. VERIFY(line_info_stream.eof());
  51. }
  52. AttributeValue DwarfInfo::get_attribute_value(AttributeDataForm form, ssize_t implicit_const_value,
  53. InputMemoryStream& debug_info_stream, const CompilationUnit* unit) const
  54. {
  55. AttributeValue value;
  56. value.m_form = form;
  57. value.m_compilation_unit = unit;
  58. auto assign_raw_bytes_value = [&](size_t length) {
  59. value.m_data.as_raw_bytes = { reinterpret_cast<const u8*>(debug_info_data().data() + debug_info_stream.offset()), length };
  60. debug_info_stream.discard_or_error(length);
  61. VERIFY(!debug_info_stream.has_any_error());
  62. };
  63. switch (form) {
  64. case AttributeDataForm::StringPointer: {
  65. u32 offset;
  66. debug_info_stream >> offset;
  67. VERIFY(!debug_info_stream.has_any_error());
  68. value.m_type = AttributeValue::Type::String;
  69. auto strings_data = debug_strings_data();
  70. value.m_data.as_string = reinterpret_cast<const char*>(strings_data.data() + offset);
  71. break;
  72. }
  73. case AttributeDataForm::Data1: {
  74. u8 data;
  75. debug_info_stream >> data;
  76. VERIFY(!debug_info_stream.has_any_error());
  77. value.m_type = AttributeValue::Type::UnsignedNumber;
  78. value.m_data.as_unsigned = data;
  79. break;
  80. }
  81. case AttributeDataForm::Data2: {
  82. u16 data;
  83. debug_info_stream >> data;
  84. VERIFY(!debug_info_stream.has_any_error());
  85. value.m_type = AttributeValue::Type::UnsignedNumber;
  86. value.m_data.as_signed = data;
  87. break;
  88. }
  89. case AttributeDataForm::Addr: {
  90. FlatPtr address;
  91. debug_info_stream >> address;
  92. VERIFY(!debug_info_stream.has_any_error());
  93. value.m_type = AttributeValue::Type::Address;
  94. value.m_data.as_addr = address;
  95. break;
  96. }
  97. case AttributeDataForm::SData: {
  98. i64 data;
  99. debug_info_stream.read_LEB128_signed(data);
  100. VERIFY(!debug_info_stream.has_any_error());
  101. value.m_type = AttributeValue::Type::SignedNumber;
  102. value.m_data.as_signed = data;
  103. break;
  104. }
  105. case AttributeDataForm::UData: {
  106. u64 data;
  107. debug_info_stream.read_LEB128_unsigned(data);
  108. VERIFY(!debug_info_stream.has_any_error());
  109. value.m_type = AttributeValue::Type::UnsignedNumber;
  110. value.m_data.as_unsigned = data;
  111. break;
  112. }
  113. case AttributeDataForm::SecOffset: {
  114. u32 data;
  115. debug_info_stream >> data;
  116. VERIFY(!debug_info_stream.has_any_error());
  117. value.m_type = AttributeValue::Type::SecOffset;
  118. value.m_data.as_unsigned = data;
  119. break;
  120. }
  121. case AttributeDataForm::Data4: {
  122. u32 data;
  123. debug_info_stream >> data;
  124. VERIFY(!debug_info_stream.has_any_error());
  125. value.m_type = AttributeValue::Type::UnsignedNumber;
  126. value.m_data.as_unsigned = data;
  127. break;
  128. }
  129. case AttributeDataForm::Data8: {
  130. u64 data;
  131. debug_info_stream >> data;
  132. VERIFY(!debug_info_stream.has_any_error());
  133. value.m_type = AttributeValue::Type::UnsignedNumber;
  134. value.m_data.as_unsigned = data;
  135. break;
  136. }
  137. case AttributeDataForm::Data16: {
  138. value.m_type = AttributeValue::Type::RawBytes;
  139. assign_raw_bytes_value(16);
  140. VERIFY(!debug_info_stream.has_any_error());
  141. break;
  142. }
  143. case AttributeDataForm::Ref4: {
  144. u32 data;
  145. debug_info_stream >> data;
  146. VERIFY(!debug_info_stream.has_any_error());
  147. value.m_type = AttributeValue::Type::DieReference;
  148. VERIFY(unit);
  149. value.m_data.as_unsigned = data + unit->offset();
  150. break;
  151. }
  152. case AttributeDataForm::FlagPresent: {
  153. value.m_type = AttributeValue::Type::Boolean;
  154. value.m_data.as_bool = true;
  155. break;
  156. }
  157. case AttributeDataForm::ExprLoc: {
  158. size_t length;
  159. debug_info_stream.read_LEB128_unsigned(length);
  160. VERIFY(!debug_info_stream.has_any_error());
  161. value.m_type = AttributeValue::Type::DwarfExpression;
  162. assign_raw_bytes_value(length);
  163. break;
  164. }
  165. case AttributeDataForm::String: {
  166. String str;
  167. u32 str_offset = debug_info_stream.offset();
  168. debug_info_stream >> str;
  169. VERIFY(!debug_info_stream.has_any_error());
  170. value.m_type = AttributeValue::Type::String;
  171. value.m_data.as_string = reinterpret_cast<const char*>(str_offset + debug_info_data().data());
  172. break;
  173. }
  174. case AttributeDataForm::Block1: {
  175. value.m_type = AttributeValue::Type::RawBytes;
  176. u8 length;
  177. debug_info_stream >> length;
  178. VERIFY(!debug_info_stream.has_any_error());
  179. assign_raw_bytes_value(length);
  180. break;
  181. }
  182. case AttributeDataForm::Block2: {
  183. value.m_type = AttributeValue::Type::RawBytes;
  184. u16 length;
  185. debug_info_stream >> length;
  186. VERIFY(!debug_info_stream.has_any_error());
  187. assign_raw_bytes_value(length);
  188. break;
  189. }
  190. case AttributeDataForm::Block4: {
  191. value.m_type = AttributeValue::Type::RawBytes;
  192. u32 length;
  193. debug_info_stream >> length;
  194. VERIFY(!debug_info_stream.has_any_error());
  195. assign_raw_bytes_value(length);
  196. break;
  197. }
  198. case AttributeDataForm::Block: {
  199. value.m_type = AttributeValue::Type::RawBytes;
  200. size_t length;
  201. debug_info_stream.read_LEB128_unsigned(length);
  202. VERIFY(!debug_info_stream.has_any_error());
  203. assign_raw_bytes_value(length);
  204. break;
  205. }
  206. case AttributeDataForm::LineStrP: {
  207. u32 offset;
  208. debug_info_stream >> offset;
  209. VERIFY(!debug_info_stream.has_any_error());
  210. value.m_type = AttributeValue::Type::String;
  211. auto strings_data = debug_line_strings_data();
  212. value.m_data.as_string = reinterpret_cast<const char*>(strings_data.data() + offset);
  213. break;
  214. }
  215. case AttributeDataForm::ImplicitConst: {
  216. /* Value is part of the abbreviation record. */
  217. value.m_type = AttributeValue::Type::SignedNumber;
  218. value.m_data.as_signed = implicit_const_value;
  219. break;
  220. }
  221. case AttributeDataForm::StrX1: {
  222. u8 index;
  223. debug_info_stream >> index;
  224. VERIFY(!debug_info_stream.has_any_error());
  225. value.m_type = AttributeValue::Type::String;
  226. value.m_data.as_unsigned = index;
  227. break;
  228. }
  229. case AttributeDataForm::StrX2: {
  230. u16 index;
  231. debug_info_stream >> index;
  232. VERIFY(!debug_info_stream.has_any_error());
  233. value.m_type = AttributeValue::Type::String;
  234. value.m_data.as_unsigned = index;
  235. break;
  236. }
  237. case AttributeDataForm::StrX4: {
  238. u32 index;
  239. debug_info_stream >> index;
  240. VERIFY(!debug_info_stream.has_any_error());
  241. value.m_type = AttributeValue::Type::String;
  242. value.m_data.as_unsigned = index;
  243. break;
  244. }
  245. case AttributeDataForm::StrX: {
  246. size_t index;
  247. debug_info_stream.read_LEB128_unsigned(index);
  248. VERIFY(!debug_info_stream.has_any_error());
  249. value.m_type = AttributeValue::Type::String;
  250. value.m_data.as_unsigned = index;
  251. break;
  252. }
  253. case AttributeDataForm::AddrX1: {
  254. u8 index;
  255. debug_info_stream >> index;
  256. VERIFY(!debug_info_stream.has_any_error());
  257. value.m_type = AttributeValue::Type::Address;
  258. value.m_data.as_unsigned = index;
  259. break;
  260. }
  261. case AttributeDataForm::AddrX2: {
  262. u16 index;
  263. debug_info_stream >> index;
  264. VERIFY(!debug_info_stream.has_any_error());
  265. value.m_type = AttributeValue::Type::Address;
  266. value.m_data.as_unsigned = index;
  267. break;
  268. }
  269. case AttributeDataForm::AddrX4: {
  270. u32 index;
  271. debug_info_stream >> index;
  272. VERIFY(!debug_info_stream.has_any_error());
  273. value.m_type = AttributeValue::Type::Address;
  274. value.m_data.as_unsigned = index;
  275. break;
  276. }
  277. case AttributeDataForm::AddrX: {
  278. size_t index;
  279. debug_info_stream.read_LEB128_unsigned(index);
  280. VERIFY(!debug_info_stream.has_any_error());
  281. value.m_type = AttributeValue::Type::Address;
  282. value.m_data.as_unsigned = index;
  283. break;
  284. }
  285. case AttributeDataForm::RngListX: {
  286. size_t index;
  287. debug_info_stream.read_LEB128_unsigned(index);
  288. VERIFY(!debug_info_stream.has_any_error());
  289. value.m_type = AttributeValue::Type::UnsignedNumber;
  290. value.m_data.as_unsigned = index;
  291. break;
  292. }
  293. default:
  294. dbgln("Unimplemented AttributeDataForm: {}", (u32)form);
  295. VERIFY_NOT_REACHED();
  296. }
  297. return value;
  298. }
  299. void DwarfInfo::build_cached_dies() const
  300. {
  301. auto insert_to_cache = [this](DIE const& die, DIERange const& range) {
  302. m_cached_dies_by_range.insert(range.start_address, DIEAndRange { die, range });
  303. m_cached_dies_by_offset.insert(die.offset(), die);
  304. };
  305. auto get_ranges_of_die = [this](DIE const& die) -> Vector<DIERange> {
  306. auto ranges = die.get_attribute(Attribute::Ranges);
  307. if (ranges.has_value()) {
  308. size_t offset;
  309. if (ranges->form() == AttributeDataForm::SecOffset) {
  310. offset = ranges->as_unsigned();
  311. } else {
  312. auto index = ranges->as_unsigned();
  313. auto base = die.compilation_unit().range_lists_base();
  314. // FIXME: This assumes that the format is DWARf32
  315. auto offsets = reinterpret_cast<u32 const*>(debug_range_lists_data().offset(base));
  316. offset = offsets[index] + base;
  317. }
  318. AddressRanges address_ranges(debug_range_lists_data(), offset, die.compilation_unit());
  319. Vector<DIERange> entries;
  320. address_ranges.for_each_range([&entries](auto range) {
  321. entries.empend(range.start, range.end);
  322. });
  323. return entries;
  324. }
  325. auto start = die.get_attribute(Attribute::LowPc);
  326. auto end = die.get_attribute(Attribute::HighPc);
  327. if (!start.has_value() || !end.has_value())
  328. return {};
  329. VERIFY(start->type() == Dwarf::AttributeValue::Type::Address);
  330. // DW_AT_high_pc attribute can have different meanings depending on the attribute form.
  331. // (Dwarf version 5, section 2.17.2).
  332. uint32_t range_end = 0;
  333. if (end->form() == Dwarf::AttributeDataForm::Addr)
  334. range_end = end->as_addr();
  335. else
  336. range_end = start->as_addr() + end->as_unsigned();
  337. return { DIERange { start.value().as_addr(), range_end } };
  338. };
  339. // If we simply use a lambda, type deduction fails because it's used recursively.
  340. Function<void(DIE const& die)> insert_to_cache_recursively;
  341. insert_to_cache_recursively = [&](DIE const& die) {
  342. if (die.offset() == 0 || die.parent_offset().has_value()) {
  343. auto ranges = get_ranges_of_die(die);
  344. for (auto& range : ranges) {
  345. insert_to_cache(die, range);
  346. }
  347. }
  348. die.for_each_child([&](DIE const& child) {
  349. if (!child.is_null()) {
  350. insert_to_cache_recursively(child);
  351. }
  352. });
  353. };
  354. for_each_compilation_unit([&](CompilationUnit const& compilation_unit) {
  355. insert_to_cache_recursively(compilation_unit.root_die());
  356. });
  357. m_built_cached_dies = true;
  358. }
  359. Optional<DIE> DwarfInfo::get_die_at_address(FlatPtr address) const
  360. {
  361. if (!m_built_cached_dies)
  362. build_cached_dies();
  363. auto iter = m_cached_dies_by_range.find_largest_not_above_iterator(address);
  364. while (!iter.is_end() && !iter.is_begin() && iter->range.end_address < address) {
  365. --iter;
  366. }
  367. if (iter.is_end())
  368. return {};
  369. if (iter->range.start_address > address || iter->range.end_address < address) {
  370. return {};
  371. }
  372. return iter->die;
  373. }
  374. Optional<DIE> DwarfInfo::get_cached_die_at_offset(FlatPtr offset) const
  375. {
  376. if (!m_built_cached_dies)
  377. build_cached_dies();
  378. auto* die = m_cached_dies_by_offset.find(offset);
  379. if (!die)
  380. return {};
  381. return *die;
  382. }
  383. }