33 if (m_form == DW_FORM_implicit_const)
36 bool indirect =
false;
37 bool is_block =
false;
38 m_value.data =
nullptr;
39 uint8_t ref_addr_size;
51 m_value.value.uval = data.
GetU8(offset_ptr);
55 m_value.value.uval = data.
GetU16(offset_ptr);
59 m_value.value.uval = data.
GetU32(offset_ptr);
63 m_value.value.uval = 16;
68 m_value.value.uval = data.
GetULEB128(offset_ptr);
72 m_value.value.cstr = data.
GetCStr(offset_ptr);
75 m_value.value.sval = data.
GetSLEB128(offset_ptr);
78 case DW_FORM_line_strp:
79 case DW_FORM_sec_offset:
80 m_value.value.uval = data.
GetMaxU64(offset_ptr, 4);
87 m_value.value.uval = data.
GetU8(offset_ptr);
93 m_value.value.uval = data.
GetU16(offset_ptr);
97 m_value.value.uval = data.
GetMaxU64(offset_ptr, 3);
103 m_value.value.uval = data.
GetU32(offset_ptr);
107 case DW_FORM_ref_sig8:
108 m_value.value.uval = data.
GetU64(offset_ptr);
111 case DW_FORM_loclistx:
112 case DW_FORM_rnglistx:
115 case DW_FORM_ref_udata:
116 case DW_FORM_GNU_str_index:
117 case DW_FORM_GNU_addr_index:
118 m_value.value.uval = data.
GetULEB128(offset_ptr);
120 case DW_FORM_ref_addr:
122 if (m_unit->GetVersion() <= 2)
123 ref_addr_size = m_unit->GetAddressByteSize();
126 m_value.value.uval = data.
GetMaxU64(offset_ptr, ref_addr_size);
128 case DW_FORM_indirect:
132 case DW_FORM_flag_present:
133 m_value.value.uval = 1;
141 m_value.data = data.
PeekData(*offset_ptr, m_value.value.uval);
142 if (m_value.data !=
nullptr) {
143 *offset_ptr += m_value.value.uval;
190 llvm::Optional<uint8_t>
192 if (form <= DW_FORM_ref_sig8 &&
g_form_sizes[form].valid)
194 if (form == DW_FORM_addr && u)
200 return GetFixedSize(m_form, m_unit);
212 uint8_t ref_addr_size;
216 case DW_FORM_exprloc:
217 case DW_FORM_block: {
222 case DW_FORM_block1: {
227 case DW_FORM_block2: {
232 case DW_FORM_block4: {
240 debug_info_data.
GetCStr(offset_ptr);
248 case DW_FORM_ref_addr:
256 *offset_ptr += ref_addr_size;
260 case DW_FORM_flag_present:
261 case DW_FORM_implicit_const:
288 case DW_FORM_sec_offset:
290 case DW_FORM_line_strp:
305 case DW_FORM_ref_sig8:
311 case DW_FORM_loclistx:
312 case DW_FORM_rnglistx:
315 case DW_FORM_ref_udata:
316 case DW_FORM_GNU_addr_index:
317 case DW_FORM_GNU_str_index:
322 case DW_FORM_indirect: {
335 uint64_t uvalue = Unsigned();
336 bool unit_relative_offset =
false;
349 case DW_FORM_sec_offset:
353 case DW_FORM_ref_sig8:
360 case DW_FORM_exprloc:
367 case DW_FORM_exprloc:
369 s.
Printf(
"<0x%" PRIx64
"> ", uvalue);
372 s.
Printf(
"<0x%2.2x> ", (uint8_t)uvalue);
384 const uint8_t *data_ptr = m_value.data;
386 const uint8_t *end_data_ptr =
388 while (data_ptr < end_data_ptr) {
389 s.
Printf(
"%2.2x ", *data_ptr);
404 case DW_FORM_line_strp: {
405 const char *dbg_str = AsCString();
413 case DW_FORM_ref_addr: {
416 if (m_unit->GetVersion() <= 2)
425 unit_relative_offset =
true;
428 unit_relative_offset =
true;
431 unit_relative_offset =
true;
434 unit_relative_offset =
true;
436 case DW_FORM_ref_udata:
437 unit_relative_offset =
true;
442 case DW_FORM_indirect:
445 case DW_FORM_flag_present:
448 s.
Printf(
"DW_FORM(0x%4.4x)", m_form);
452 if (unit_relative_offset) {
455 s.
Printf(
"{0x%8.8" PRIx64
"}", uvalue + m_unit->GetOffset());
460 DWARFContext &context = m_unit->GetSymbolFileDWARF().GetDWARFContext();
462 if (m_form == DW_FORM_string)
463 return m_value.value.cstr;
464 if (m_form == DW_FORM_strp)
467 if (m_form == DW_FORM_GNU_str_index || m_form == DW_FORM_strx ||
468 m_form == DW_FORM_strx1 || m_form == DW_FORM_strx2 ||
469 m_form == DW_FORM_strx3 || m_form == DW_FORM_strx4) {
471 llvm::Optional<uint64_t> offset =
472 m_unit->GetStringOffsetSectionItem(m_value.value.uval);
478 if (m_form == DW_FORM_line_strp)
487 if (m_form == DW_FORM_addr)
491 assert(m_form == DW_FORM_GNU_addr_index || m_form == DW_FORM_addrx ||
492 m_form == DW_FORM_addrx1 || m_form == DW_FORM_addrx2 ||
493 m_form == DW_FORM_addrx3 || m_form == DW_FORM_addrx4);
495 uint32_t index_size = m_unit->GetAddressByteSize();
497 lldb::offset_t offset = addr_base + m_value.value.uval * index_size;
499 &offset, index_size);
503 uint64_t value = m_value.value.uval;
509 case DW_FORM_ref_udata:
512 value += m_unit->GetOffset();
513 if (!m_unit->ContainsDIEOffset(value)) {
514 m_unit->GetSymbolFileDWARF().GetObjectFile()->GetModule()->ReportError(
515 "DW_FORM_ref* DIE reference 0x%" PRIx64
" is outside of its CU",
519 return const_cast<DWARFUnit *
>(m_unit)->GetDIE(value);
521 case DW_FORM_ref_addr: {
524 DIERef::Section::DebugInfo, value);
527 "DW_FORM_ref_addr DIE reference 0x%" PRIx64
" has no matching CU",
531 return ref_cu->
GetDIE(value);
534 case DW_FORM_ref_sig8: {
548 uint64_t value = m_value.value.uval;
554 case DW_FORM_ref_udata:
555 return value + base_offset;
557 case DW_FORM_ref_addr:
558 case DW_FORM_ref_sig8:
559 case DW_FORM_GNU_ref_alt:
571 case DW_FORM_exprloc:
598 case DW_FORM_loclistx:
599 case DW_FORM_rnglistx:
612 case DW_FORM_line_strp:
619 case DW_FORM_ref_addr:
624 case DW_FORM_ref_udata:
625 case DW_FORM_indirect:
626 case DW_FORM_sec_offset:
627 case DW_FORM_exprloc:
628 case DW_FORM_flag_present:
629 case DW_FORM_ref_sig8:
630 case DW_FORM_GNU_str_index:
631 case DW_FORM_GNU_addr_index:
632 case DW_FORM_implicit_const: